Homebridge INSTAR MQTT zu Homekit
- Vorbereiten des Homebridge-Docker-Images
- Schreiben Sie Ihre Änderungen in das Docker-Image
- Hombridge-Konfigurationsvorlage
Homebridge ist ein leichtgewichtiger NodeJS-Server, den Sie in Ihrem Heimnetzwerk ausführen können und der die iOS HomeKit-API emuliert. Er unterstützt Plugins, d.h. von der Gemeinschaft beigesteuerte Module, die eine grundlegende Brücke von HomeKit zu verschiedenen APIs von Drittanbietern bilden, die von Herstellern von "Smart Home"-Geräten bereitgestellt werden.
Die folgende Anleitung verwendet die INSTAR MQTT Schnittstelle zum Anbinden der Kamera an die Homebridge. Diese Schnittstelle steht nur bei Full HD Kameras zur Verfügung. Sie können die Anbindung aber genauso gut über CGI Befehle durchführen. Eine Anleitung dafür finden Sie in den FAQs.
Vorbereiten des Homebridge-Docker-Images
Download
Beginnen Sie mit dem Herunterladen des Docker-Images vom Docker-Hub. Es wird empfohlen, die latest-Version zu verwenden:
docker pull oznu/homebridge:latest
Wie man den Container verwendet
Homebridge erfordert vollen Zugriff auf Ihr lokales Netzwerk, um korrekt zu funktionieren, was mit der --net=host
Flag erreicht wird. Derzeit funktioniert dieses Image nicht, wenn Sie Docker für macOS oder Docker für Windows verwenden.
Sie können das Image mit dem folgenden Befehl ausführen:
docker run \
--net=host \
--name=homebridge \
-e PUID=<UID> -e PGID=<GID> \
-e TZ=Europe/Berlin \
-e HOMEBRIDGE_CONFIG_UI=1 \
-e HOMEBRIDGE_CONFIG_UI_PORT=8080 \
-e HOMEBRIDGE_INSECURE=1 \
-v </path/to/config>:/homebridge \
oznu/homebridge
Der </path/to/config>
muss auf Ihrem Host-System erstellt werden, z.B. :
mkdir /opt/homebridge
chmod 775 /opt/homebridge
Manchmal können bei der Verwendung von Docker Yolumen (-v-Flags) Berechtigungsprobleme zwischen dem Host-Betriebssystem und dem Container auftreten. Wir vermeiden dieses Problem, indem wir Ihnen erlauben, die Benutzer-PUID und die Gruppen-PGID anzugeben. Stellen Sie sicher, dass das Datenträgerverzeichnis auf dem Host demselben Benutzer gehört, mit dem Sie Docker ausführen, und es wird "einfach funktionieren".
Im Fall unten sind PUID=1001 und PGID=1001. Um die Ihre ID zu finden, führen Sie bitte den folgenden Befehl aus:
id <dockeruser>
uid=1001(dockeruser) gid=1001(dockergroup) groups=1001(dockergroup)
Konfiguration
Erstellen Sie einen Datei mit dem Namen config.json
innerhalb des eben erstellten Verzeichnis /opt/homebridge
. Eine Vorlage für diese Datei finden Sie am Ende dieses Tutorials. Diese Konfigurationsdatei fügt 10 MQTT-Buttons für eine Full-HD-Kamera mit der IP-Adresse 192.168.2.117
, dem Admin Login admin
/ instar
und den MQTT Broker auf dem Port 1883
mit dem Broker-Login admin
/ instar
hinzu. Bitte ändern Sie diese Informationen innerhalb der Konfigurationsdatei, bevor Sie sie in das Verzeichnis kopieren.
Aber wir können diese Vorlage noch nicht verwenden, da sie ein Plugin erfordert, das wir zuerst installieren müssen. Beginnen wir also erstmal mit einer leeren Vorlage, um Homebridge zu starten und dieses Plugin installieren.
{
"bridge": {
"name": "Homebridge",
"username": "CC:22:3D:E3:CE:35",
"manufacturer": "homebridge.io",
"model": "homebridge",
"port": 51826,
"pin": "031-45-155"
},
"description": "This is an example configuration file with one fake accessory and one fake platform. You can use this as a template for creating your own configuration file containing devices you actually own.",
"ports": {
"start": 52100,
"end": 52150,
"comment": "This section is used to control the range of ports that separate accessory (like camera or television) should be bind to."
},
"accessories": [],
"platforms": [
{
"name": "Config",
"port": 8080,
"auth": "form",
"theme": "dark-mode",
"tempUnits": "c",
"lang": "auto",
"sudo": false,
"accessoryControl": {
"debug": true
},
"platform": "config"
}
]
}
Diesen Inhalt müssen Sie zu hinzufügen /opt/homebridge/config.json
:
nano /opt/homebridge/config.json
chmod 775 /opt/homebridge/*
Container ausführen
Da Sie das Image bereits heruntergeladen haben, können Sie jetzt die Image-ID abfragen und den Container ausführen:
docker images
REPOSITORY TAG IMAGE ID SIZE
localhost/oznu/homebridge debian-no-avahi f0039cfe89f4 726 MB
Fügen Sie Ihre Image-ID, Docker-Benutzer- und Gruppen-ID, Zeitzone und Konfigurationsverzeichnis auf den folgenden Befehl hinzu:
docker run \
--net=host \
--name=homebridge \
--privileged \
--rm \
-e PUID=0 -e PGID=0 \
-e TZ=Europe/Berlin \
-e HOMEBRIDGE_CONFIG_UI=1 \
-e HOMEBRIDGE_CONFIG_UI_PORT=8080 \
-e HOMEBRIDGE_INSECURE=1 \
-v /opt/homebridge:/homebridge \
-ti -u root f0039cfe89f4 /bin/bash
Einrichten von Homebridge
Warten Sie, bis die Homebridge-UI auf Port 8080
hochgefahren ist und melden Sie sich mit admin
/ admin
an.:
Sie können die folgenden Plugins über die Hombridge-Benutzeroberfläche installieren:
- homebridge-mqttthing
Wenn das MQTT-Plugin installiert ist, können wir die MQTT-Buttons im Abschnitt Accessories
der Konfigurationsdatei importieren - den notwendigen Code finden Sie am Ende dieses Tutorials. Dieser Code ist geschrieben für die Kamera mit der folgenden Konfiguration und muss entsprechend für Ihre Kamera angepasst werden:
- Kamera LAN IP
192.168.2.117
- MQTT Broker Port
1883
- MQTT Benutzer
admin
- MQTT Kennwort
instar
Fügen Sie den kompletten Abschnitt accessories
in Ihre Datei ein, um alle MQTT-Buttons hinzuzufügen:
Schreiben Sie Ihre Änderungen in das Docker-Image
Melden Sie sich von einem neuen Terminalfenster an Ihrem Host-Rechner an und finden Sie die Container-ID heraus, die dem Homebridge-Container zugewiesen wurde:
docker ps -a
CONTAINER ID IMAGE NAMES
5b4bd0d0189d localhost/oznu/homebridge:debian-no-avahi homebridge
In diesem Fall lautet die Container-ID 5b4bd0d0189d
und ich möchte das Image, das alle unsere Änderungen enthalten wird, instar-mqtt-homebridge
nennen:
docker commit 5b4bd0d0189d instar-mqtt-homebridge
Wir können nun das Original-Image stoppen und zu unserem neu erstellten Image wechseln:
docker images
REPOSITORY IMAGE ID
localhost/instar-mqtt-homebridge 42e1bcaed5e6
Der alte Container hat die ID 5b4bd0d0189d
- also können wir das jetzt beenden und stattdessen das neue Image mit der Image-ID 42e1bcaed5e6
laufen lassen:
docker stop 5b4bd0d0189d
Um das neue Image auszuführen, müssen Sie den folgenden Befehl wie zuvor modifizieren - aber diesmal entweder die Image-ID 42e1bcaed5e6
oder den Repository-Namen localhost/instar-mqtt-homebridge
verwenden, die Sie Ihrem neuen Image zugewiesen hatten:
docker run \
--net=host \
--name=instar-mqtt-homebridge \
--privileged \
--rm \
-e PUID=0 -e PGID=0 \
-e TZ=Europe/Berlin \
-e HOMEBRIDGE_CONFIG_UI=1 \
-e HOMEBRIDGE_CONFIG_UI_PORT=8080 \
-e HOMEBRIDGE_INSECURE=1 \
-v /opt/homebridge:/homebridge \
-ti -u root 42e1bcaed5e6 /bin/bash
Wenn Sie auf das Homebridge-Dashboard zugreifen, sollten Sie jetzt alle MQTT-Schaltflächen unter der Registerkarte Accessories finden (Klicken Sie darauf und konfigurieren Sie sie, wenn Sie sie zu Ihrer Haupt-Dashboard-Seite hinzufügen möchten):
Hombridge-Konfigurationsvorlage
{
"bridge": {
"name": "Homebridge",
"username": "CC:22:3D:E3:CE:35",
"manufacturer": "homebridge.io",
"model": "homebridge",
"port": 51826,
"pin": "031-45-155"
},
"description": "This is an example configuration file with one fake accessory and one fake platform. You can use this as a template for creating your own configuration file containing devices you actually own.",
"ports": {
"start": 52100,
"end": 52150,
"comment": "This section is used to control the range of ports that separate accessory (like camera or television) should be bind to."
},
"accessories": [
{
"accessory": "mqttthing",
"type": "switch",
"name": "Alarm Area 1",
"manufacturer": "INSTAR",
"model": "IN-8015 FullHD",
"serialNumber": "1234567889",
"firmwareRevision": "0.1",
"url": "http://192.168.2.117:1883",
"username": "admin",
"password": "instar",
"caption": "Alarm Area 1",
"mqttOptions": {
"keepalive": 30
},
"mqttPubOptions": {
"retain": true
},
"logMqtt": true,
"topics": {
"getOn": {
"topic": "instar/local/status/alarm/area1/enable",
"apply": "return JSON.parse(message).val;"
},
"setOn": {
"topic": "instar/local/alarm/area1/enable",
"apply": "return JSON.stringify({val: (message)})"
}
},
"onValue": "1",
"offValue": "0",
"confirmationPeriodms": 1000,
"retryLimit": 3
},
{
"accessory": "mqttthing",
"type": "switch",
"name": "Alarm Area 2",
"manufacturer": "INSTAR",
"model": "IN-8015 FullHD",
"serialNumber": "1234567891",
"firmwareRevision": "0.1",
"url": "http://192.168.2.117:1883",
"username": "admin",
"password": "instar",
"caption": "Alarm Area 2",
"mqttOptions": {
"keepalive": 30
},
"mqttPubOptions": {
"retain": true
},
"logMqtt": true,
"topics": {
"getOn": {
"topic": "instar/local/status/alarm/area2/enable",
"apply": "return JSON.parse(message).val;"
},
"setOn": {
"topic": "instar/local/alarm/area2/enable",
"apply": "return JSON.stringify({val: (message)})"
}
},
"onValue": "1",
"offValue": "0",
"confirmationPeriodms": 1000,
"retryLimit": 3
},
{
"accessory": "mqttthing",
"type": "switch",
"name": "Alarm Area 3",
"manufacturer": "INSTAR",
"model": "IN-8015 FullHD",
"serialNumber": "1234567892",
"firmwareRevision": "0.1",
"url": "http://192.168.2.117:1883",
"username": "admin",
"password": "instar",
"caption": "Alarm Area 3",
"mqttOptions": {
"keepalive": 30
},
"mqttPubOptions": {
"retain": true
},
"logMqtt": true,
"topics": {
"getOn": {
"topic": "instar/local/status/alarm/area3/enable",
"apply": "return JSON.parse(message).val;"
},
"setOn": {
"topic": "instar/local/alarm/area3/enable",
"apply": "return JSON.stringify({val: (message)})"
}
},
"onValue": "1",
"offValue": "0",
"confirmationPeriodms": 1000,
"retryLimit": 3
},
{
"accessory": "mqttthing",
"type": "switch",
"name": "Alarm Area 4",
"manufacturer": "INSTAR",
"model": "IN-8015 FullHD",
"serialNumber": "1234567893",
"firmwareRevision": "0.1",
"url": "http://192.168.2.117:1883",
"username": "admin",
"password": "instar",
"caption": "Alarm Area 4",
"mqttOptions": {
"keepalive": 30
},
"mqttPubOptions": {
"retain": true
},
"logMqtt": true,
"topics": {
"getOn": {
"topic": "instar/local/status/alarm/area4/enable",
"apply": "return JSON.parse(message).val;"
},
"setOn": {
"topic": "instar/local/alarm/area4/enable",
"apply": "return JSON.stringify({val: (message)})"
}
},
"onValue": "1",
"offValue": "0",
"confirmationPeriodms": 1000,
"retryLimit": 3
},
{
"accessory": "mqttthing",
"type": "switch",
"name": "PIR Sensor",
"manufacturer": "INSTAR",
"model": "IN-8015 FullHD",
"serialNumber": "1234567894",
"firmwareRevision": "0.1",
"url": "http://192.168.2.117:1883",
"username": "admin",
"password": "instar",
"caption": "PIR Sensor",
"mqttOptions": {
"keepalive": 30
},
"mqttPubOptions": {
"retain": true
},
"logMqtt": true,
"topics": {
"getOn": {
"topic": "instar/local/status/alarm/actions/pir/enable",
"apply": "return JSON.parse(message).val;"
},
"setOn": {
"topic": "instar/local/alarm/actions/pir/enable",
"apply": "return JSON.stringify({val: (message)})"
}
},
"onValue": "1",
"offValue": "0",
"confirmationPeriodms": 1000,
"retryLimit": 3
},
{
"accessory": "mqttthing",
"type": "switch",
"name": "Link Areas",
"manufacturer": "INSTAR",
"model": "IN-8015 FullHD",
"serialNumber": "1234567895",
"firmwareRevision": "0.1",
"url": "http://192.168.2.117:1883",
"username": "admin",
"password": "instar",
"caption": "Link Areas",
"mqttOptions": {
"keepalive": 30
},
"mqttPubOptions": {
"retain": true
},
"logMqtt": true,
"topics": {
"getOn": {
"topic": "instar/local/status/alarm/actions/linkareas",
"apply": "return JSON.parse(message).val;"
},
"setOn": {
"topic": "instar/local/alarm/actions/linkareas",
"apply": "return JSON.stringify({val: (message)})"
}
},
"onValue": "on",
"offValue": "off",
"confirmationPeriodms": 1000,
"retryLimit": 3
},
{
"accessory": "mqttthing",
"type": "switch",
"name": "Alarm Email",
"manufacturer": "INSTAR",
"model": "IN-8015 FullHD",
"serialNumber": "1234567896",
"firmwareRevision": "0.1",
"url": "http://192.168.2.117:1883",
"username": "admin",
"password": "instar",
"caption": "Alarm Email",
"mqttOptions": {
"keepalive": 30
},
"mqttPubOptions": {
"retain": true
},
"logMqtt": true,
"topics": {
"getOn": {
"topic": "instar/local/status/alarm/actions/email",
"apply": "return JSON.parse(message).val;"
},
"setOn": {
"topic": "instar/local/alarm/actions/email",
"apply": "return JSON.stringify({val: (message)})"
}
},
"onValue": "on",
"offValue": "off",
"confirmationPeriodms": 1000,
"retryLimit": 3
},
{
"accessory": "mqttthing",
"type": "switch",
"name": "Alarm Push",
"manufacturer": "INSTAR",
"model": "IN-8015 FullHD",
"serialNumber": "1234567897",
"firmwareRevision": "0.1",
"url": "http://192.168.2.117:1883",
"username": "admin",
"password": "instar",
"caption": "Alarm Push",
"mqttOptions": {
"keepalive": 30
},
"mqttPubOptions": {
"retain": true
},
"logMqtt": true,
"topics": {
"getOn": {
"topic": "instar/local/status/alarm/push/enable",
"apply": "return JSON.parse(message).val;"
},
"setOn": {
"topic": "instar/local/alarm/push/enable",
"apply": "return JSON.stringify({val: (message)})"
}
},
"onValue": "on",
"offValue": "off",
"confirmationPeriodms": 1000,
"retryLimit": 3
},
{
"accessory": "mqttthing",
"type": "switch",
"name": "Audio",
"manufacturer": "INSTAR",
"model": "IN-8015 FullHD",
"serialNumber": "1234567898",
"firmwareRevision": "0.1",
"url": "http://192.168.2.117:1883",
"username": "admin",
"password": "instar",
"caption": "Audio",
"mqttOptions": {
"keepalive": 30
},
"mqttPubOptions": {
"retain": true
},
"logMqtt": true,
"topics": {
"getOn": {
"topic": "instar/local/status/multimedia/audio/enable/high",
"apply": "return JSON.parse(message).val;"
},
"setOn": {
"topic": "instar/local/multimedia/audio/enable/high",
"apply": "return JSON.stringify({val: (message)})"
}
},
"onValue": "1",
"offValue": "0",
"confirmationPeriodms": 1000,
"retryLimit": 3
},
{
"accessory": "mqttthing",
"type": "switch",
"name": "Preset Position",
"manufacturer": "INSTAR",
"model": "IN-8015 FullHD",
"serialNumber": "1234567899",
"firmwareRevision": "0.1",
"url": "http://192.168.2.117:1883",
"username": "admin",
"password": "instar",
"caption": "Preset Position",
"mqttOptions": {
"keepalive": 30
},
"mqttPubOptions": {
"retain": true
},
"logMqtt": true,
"topics": {
"getOn": {
"topic": "instar/local/status/features/ptz/preset",
"apply": "return JSON.parse(message).val;"
},
"setOn": {
"topic": "instar/local/features/ptz/preset",
"apply": "return JSON.stringify({val: (message)})"
}
},
"onValue": "1",
"offValue": "0",
"confirmationPeriodms": 1000,
"retryLimit": 3
}
],
"platforms": [
{
"name": "Config",
"port": 8080,
"auth": "form",
"theme": "dark-mode",
"tempUnits": "c",
"lang": "auto",
"sudo": false,
"accessoryControl": {
"debug": true
},
"platform": "config"
}
]
}