Domoticz is a lightweight smart home platform replacing proprietary hubs with local automation, multi-protocol device support, and low resource use.
A homelab administrator running a mix of vintage 433 MHz temperature sensors, modern Zigbee relays, and smart utility meters quickly discovers that commercial hubs refuse to speak to mismatched protocols. Domoticz unifies those disparate peripherals under an on-premises controller that executes automation logic entirely without cloud infrastructure. Written in C++, it delivers responsive sensor management and local event processing while consuming negligible system resources.
Apple Home requires accessories to be certified for Apple HomeKit or Matter, operates through Apple hubs, and confines users strictly to the Apple ecosystem. It delivers polished iOS notifications, widgets, and Siri commands, but locks out non-certified hardware, legacy RF sensors, custom microcontroller nodes, and raw MQTT telemetry. Integrating older gear requires third-party bridge daemons, leaving homelab users at the mercy of platform restrictions and cloud account dependencies.
Domoticz treats protocol heterogeneity as a baseline rather than an exception. It interfaces directly with USB coordinators, 433 MHz RFXtrx transceivers, Z-Wave dongles, and local MQTT brokers without cloud mediation or corporate certification gates. Dutch P1 energy meters, 1-Wire thermal sensors, and DIY ESP8266 devices link directly into its dashboard. The compromise is client polish: accessing Domoticz from an iPhone requires a reverse proxy, a third-party client, or bridging devices back into Apple Home via Homebridge.
Domoticz vs Apple Home — which should I choose? Apple Home suits users dedicated to the iOS ecosystem who prioritize polished mobile interfaces and Siri voice commands. Domoticz suits homelab operators who need local control over mixed hardware protocols, custom sensor logging, and zero reliance on cloud relays.
Is Domoticz free for commercial use? Yes, Domoticz is open-source software with no licensing fees or paid tiers, requiring only your own hosting hardware.
Can Domoticz run completely offline? Yes, device polling, automation execution, and data logging occur entirely on the local network without internet access.
Domoticz is the ideal platform when you need a lightweight, self-contained automation hub for diverse radio protocols and utility meters, but it is the wrong tool if your priority is a polished native mobile experience out of the box. Active upstream maintenance alongside a copyleft GPL-3.0 license ensures long-term independence from proprietary smart home vendors.
We started this exact setup from scratch in a clean Linux machine on Nov 3, 2026 and checked it through Domoticz's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p domoticz && cd domoticz
curl -fsSL https://open-source.store/tools/domoticz/compose.yml -o compose.ymlcat > .env <<EOF
DOMOTICZ_ADMIN_PASSWORD=$(openssl rand -hex 12)
TZ=UTC
EOFDOMOTICZ_ADMIN_PASSWORD — Initial administrator password for Domoticz. Generated above; keep it secret.TZ — Time zone for Domoticz timers and scheduling.docker compose up -dservices:
domoticz:
image: domoticz/domoticz:2026.4
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- domoticz-data:/opt/domoticz/userdata
environment:
TZ: ${TZ}
DOMOTICZ_ADMIN_PASSWORD: ${DOMOTICZ_ADMIN_PASSWORD}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8080/ || exit 1"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
volumes:
domoticz-data:
Go, gRPC and Protobuf done right, LLM agents in production, and the hard parts of shipping a first product.
Show that Domoticz is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 204 s: domoticz/domoticz:2026.4.
Based on the upstream setup. Official compose from domoticz-docker. Pinned image to 2026.4, persisted userdata to a named volume, added healthcheck, and moved admin password and timezone to .env. Serial hardware passthrough (USB Zigbee/Z-Wave dongles) and host networking were omitted.
domoticz-1 | 2026-11-03T06:53:20.428562382Z 2026-11-03 06:53:20.428 Launch: Begin container self-repair domoticz-1 | 2026-11-03T06:53:20.431399965Z created 1 directory for /opt/domoticz/userdata/plugins domoticz-1 | 2026-11-03T06:53:20.431962423Z cd+++++++++ examples/ domoticz-1 | 2026-11-03T06:53:20.431967965Z >f+++++++++ examples/BaseTemplate.py domoticz-1 | 2026-11-03T06:53:20.431969090Z >f+++++++++ examples/DenonMarantz.py domoticz-1 | 2026-11-03T06:53:20.431969715Z >f+++++++++ examples/Dlink DSP-W215.py domoticz-1 | 2026-11-03T06:53:20.431970257Z >f+++++++++ examples/HTTP Listener.py domoticz-1 | 2026-11-03T06:53:20.431970798Z >f+++++++++ examples/HTTP.py domoticz-1 | 2026-11-03T06:53:20.431971298Z >f+++++++++ examples/Kodi.py domoticz-1 | 2026-11-03T06:53:20.431971840Z >f+++++++++ examples/MQTT Publish.py domoticz-1 | 2026-11-03T06:53:20.431972340Z >f+++++++++ examples/MQTT Subscribe.py domoticz-1 | 2026-11-03T06:53:20.431972840Z >f+++++++++ examples/Mutli-Threaded.py domoticz-1 | 2026-11-03T06:53:20.431973340Z >f+++++++++ examples/Pinger.py domoticz-1 | 2026-11-03T06:53:20.431973840Z >f+++++++++ examples/RAVEn.py domoticz-1 | 2026-11-03T06:53:20.431974340Z >f+++++++++ examples/UDP Discovery.py domoticz-1 | 2026-11-03T06:53:20.431974840Z >f+++++++++ examples/Web Socket Client.py domoticz-1 | 2026-11-03T06:53:20.431975382Z cd+++++++++ examples/CalibrationTest/ domoticz-1 | 2026-11-03T06:53:20.431987923Z >f+++++++++ examples/CalibrationTest/plugin.py domoticz-1 | 2026-11-03T06:53:20.431989132Z cd+++++++++ examples/TestExtendedSettings/ domoticz-1 | 2026-11-03T06:53:20.431989715Z >f+++++++++ examples/TestExtendedSettings/plugin.py domoticz-1 | 2026-11-03T06:53:20.431990215Z cd+++++++++ examples/TestWebsocketFragmentation/ domoticz-1 | 2026-11-03T06:53:20.431990757Z >f+++++++++ examples/TestWebsocketFragmentation/plugin.py domoticz-1 | 2026-11-03T06:53:20.431991298Z cd+++++++++ examples/WebSocketChannelTest/ domoticz-1 | 2026-11-03T06:53:20.431991798Z >f+++++++++ examples/WebSocketChannelTest/plugin.py domoticz-1 | 2026-11-03T06:53:20.431992340Z >f+++++++++ examples/WebSocketChannelTest/wschanneltest.html domoticz-1 | 2026-11-03T06:53:20.475147632Z >f+++++++++ customstart.sh domoticz-1 | 2026-11-03T06:53:20.520435757Z created 1 directory for /opt/domoticz/userdata/www domoticz-1 | 2026-11-03T06:53:20.520446132Z cd+++++++++ templates/ domoticz-1 | 2026-11-03T06:53:20.520447049Z >f+++++++++ templates/angular.example domoticz-1 | 2026-11-03T06:53:20.520447965Z >f+++++++++ templates/custom.example domoticz-1 | 2026-11-03T06:53:20.520448715Z >f+++++++++ templates/readme.txt domoticz-1 | 2026-11-03T06:53:20.561042090Z created 2 directories for /opt/domoticz/userdata/scripts/dzVents domoticz-1 | 2026-11-03T06:53:20.561203507Z cd+++++++++ examples/ domoticz-1 | 2026-11-03T06:53:20.561207299Z >f+++++++++ examples/calc temp delta.lua domoticz-1 | 2026-11-03T06:53:20.561224257Z >f+++++++++ examples/check battery levels.lua domoticz-1 | 2026-11-03T06:53:20.561225507Z >f+++++++++ examples/check dead devices by desc.lua domoticz-1 | 2026-11-03T06:53:20.561228424Z >f+++++++++ examples/check dead devices.lua domoticz-1 | 2026-11-03T06:53:20.561229007Z >f+++++++++ examples/external_light.lua domoticz-1 | 2026-11-03T06:53:20.561229507Z >f+++++++++ examples/fake presence.lua domoticz-1 | 2026-11-03T06:53:20.561230007Z >f+++++++++ examples/garage door.lua domoticz-1 | 2026-11-03T06:53:20.561230507Z >f+++++++++ examples/get sensor values.lua domoticz-1 | 2026-11-03T06:53:20.561231007Z >f+++++++++ examples/intruder alert.lua domoticz-1 | 2026-11-03T06:53:20.561231507Z >f+++++++++ examples/leak_detection.lua domoticz-1 | 2026-11-03T06:53:20.561264882Z >f+++++++++ examples/notify for dead system-alive check devices.lua domoticz-1 | 2026-11-03T06:53:20.561267049Z >f+++++++++ examples/only run script when button pressed.lua domoticz-1 | 2026-11-03T06:53:20.561267757Z >f+++++++++ examples/plant watering notification.lua domoticz-1 | 2026-11-03T06:53:20.561268340Z >f+++++++++ examples/random night light.lua domoticz-1 | 2026-11-03T06:53:20.561268882Z >f+++++++++ examples/respond to switch.lua domoticz-1 | 2026-11-03T06:53:20.561269424Z >f+++++++++ examples/schedule fish pond pump.lua domoticz-1 | 2026-11-03T06:53:20.561283924Z >f+++++++++ examples/simple room heating with hysteresis control.lua domoticz-1 | 2026-11-03T06:53:20.561284965Z >f+++++++++ examples/sunscreen.lua domoticz-1 | 2026-11-03T06:53:20.603330132Z 2026-11-03 06:53:20.603 Launch: End container self-repair domoticz-1 | 2026-11-03T06:53:20.603608507Z 2026-11-03 06:53:20.603 Launch: Running customstart.sh domoticz-1 | 2026-11-03T06:53:20.609340965Z 2026-11-03 06:53:20.609 Status: Domoticz V2026.4-stable (c)2012-2026 GizMoCuz domoticz-1 | 2026-11-03T06:53:20.609353590Z 2026-11-03 06:53:20.609 Status: Build Hash: cc668a12b, Date: 2026-10-01 04:59:44 domoticz-1 | 2026-11-03T06:53:20.609354382Z 2026-11-03 06:53:20.609 Status: Startup Path: /opt/domoticz/ domoticz-1 | 2026-11-03T06:53:20.609355007Z 2026-11-03 06:53:20.609 Status: Model Context Protocol (MCP) Support enabled (/mcp) for use with AI Agents. domoticz-1 | 2026-11-03T06:53:20.614858674Z 2026-11-03 06:53:20.614 Status: Admin user 'admin' created from environment variables domoticz-1 | 2026-11-03T06:53:20.624502840Z 2026-11-03 06:53:20.623 Status: PluginSystem: Started, Python version '3.13.5', 0 plugin definitions loaded. domoticz-1 | 2026-11-03T06:53:20.624511507Z 2026-11-03 06:53:20.624 Active notification Subsystems: http (1/13) domoticz-1 | 2026-11-03T06:53:20.624512382Z 2026-11-03 06:53:20.624 Status: WebServer(HTTP) started on address: :: with port 8080 domoticz-1 | 2026-11-03T06:53:20.626077715Z 2026-11-03 06:53:20.625 Status: WebServer(SSL) started on address: :: with port 443 domoticz-1 | 2026-11-03T06:53:20.626329299Z 2026-11-03 06:53:20.626 Starting shared server on: :::6144 domoticz-1 | 2026-11-03T06:53:20.626369840Z 2026-11-03 06:53:20.626 Status: mDNS: Service started domoticz-1 | 2026-11-03T06:53:20.626545299Z 2026-11-03 06:53:20.626 Status: RxQueue: queue worker started... domoticz-1 | 2026-11-03T06:53:20.626547549Z 2026-11-03 06:53:20.626 Status: TCPServer: shared server started... domoticz-1 | 2026-11-03T06:53:20.626548215Z 2026-11-03 06:53:20.626 mDNS: Service: _http._tcp.local.:443 for Hostname: domoticz (1 socket) domoticz-1 | 2026-11-03T06:53:22.630784966Z 2026-11-03 06:53:22.630 Status: NotificationSystem: thread started... domoticz-1 | 2026-11-03T06:53:22.631863591Z 2026-11-03 06:53:22.631 Status: EventSystem: reset all events... domoticz-1 | 2026-11-03T06:53:22.632066091Z 2026-11-03 06:53:22.631 Status: EventSystem: reset all device statuses... domoticz-1 | 2026-11-03T06:53:22.644350425Z 2026-11-03 06:53:22.644 Status: Python EventSystem: Initializing event module. domoticz-1 | 2026-11-03T06:53:22.644371008Z 2026-11-03 06:53:22.644 Status: Python EventSystem: Initializing event module. domoticz-1 | 2026-11-03T06:53:22.644536966Z 2026-11-03 06:53:22.644 Status: EventSystem: Started domoticz-1 | 2026-11-03T06:53:22.644625383Z 2026-11-03 06:53:22.644 Status: EventSystem: Queue thread started... domoticz-1 | 2026-11-03T06:53:23.536680383Z 2026-11-03 06:53:23.536 Status: [web:8080] Incoming connection from: 172.18.0.1 domoticz-1 | 2026-11-03T06:53:23.615823758Z 2026-11-03 06:53:23.615 Status: Login successful from 172.18.0.1 for user 'admin' domoticz-1 | 2026-11-03T06:53:23.758361050Z 2026-11-03 06:53:23.758 Status: [web:8080] Incoming connection from: 192.168.65.211 domoticz-1 | 2026-11-03T06:53:25.466021759Z 2026-11-03 06:53:25.465 Status: [web:8080] Incoming connection from: ::1 domoticz-1 | 2026-11-03T06:53:32.891003763Z 2026-11-03 06:53:32.890 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:53:32.901999263Z 2026-11-03 06:53:32.901 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:53:37.917736292Z 2026-11-03 06:53:37.917 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:53:37.919495042Z 2026-11-03 06:53:37.919 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:53:39.929945793Z 2026-11-03 06:53:39.929 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:53:39.933407293Z 2026-11-03 06:53:39.933 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:53:48.931680630Z 2026-11-03 06:53:48.931 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:53:48.931699005Z 2026-11-03 06:53:48.931 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:54:28.894154760Z 2026-11-03 06:54:28.883 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:54:28.894194218Z 2026-11-03 06:54:28.886 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:55:18.915179670Z 2026-11-03 06:55:18.914 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted domoticz-1 | 2026-11-03T06:55:18.916255211Z 2026-11-03 06:55:18.915 Status: [web:8080] Proxy header present but no usable client address survived filtering; treating origin as untrusted