Bündeln von Werten im MQTT-Payload via JSON

Ich möchte wie in Eurer Anleitung beschrieben die INSTAR-Kamera stärker mit Home Assistant vernetzen und beispielsweise mehrere AlarmArea-Konfigurationen verwalten (Tag- und Nacht-Konfiguration). Aktuell sendet INSTAR nur einen Wert pro Topic, und diesen dann noch als JSON aufgepumpt, was eigentlich nicht notwednig wäre, zum Beispiel

Topic: instar/cam1/status/alarm/area2/sensitivity
Payload: {„val“:„60“}

Es wäre schön, wenn der Payload die Werte eines Knotenpunkts via JSON zusammenfasst, für ein AlarmArea zum Beispiel:

Topic: instar/cam1/status/alarm/area1
Payload: {„enable“:„1“, sensitivity: „75“, xorigin: „330“, yorigin: „260“, height: „700“, wdith: „300“}

Somit wäre der Kommunikationsaufwand geringer (schöner Nebeneffekt). Vor allem könnte ich aber die Werte in Home Assistant als Attribute zum zugehörigen Switch „AlarmArea 1“ definieren.
Aktuell habe ich einen Switch (MQTT-Wert enable) und 5 Sensoren (sensitivity, xorigin, yorigin, height, width) für nur ein AlarmArea! Bei der Vielzahl der Paramter wird das schnell sehr unübersichtlich. Andere MQTT-Sender bieten hierfür die Wahl, ob raw (Einzelwerte) oder via JSON übertragen werden soll. Wäre das auch für INSTAR denkbar?

Man kann RAW (also ohne JSON) senden (Command Topics). Die Kamera versendet aber immer nur JSON Payloads über den Status. Aber das ist ja eigentlich auch kein Problem?

Im Gegensatz zu den CGI Befehlen, wo Variablen zu Gruppen zusammengeschlossen werden, ist beim MQTT jede Variable ein Topic. Das gibt einem die meiste Kontrolle - man kann sich die Topics selber verschachteln.

Ich hatte hier ein Beispiel für ioBroker gepostet. Dabei werden alle Datenpunkte in den Objektbaum eingetragen und ich erstelle dann ein übergeordnetes Topic mit dem ich eine Reihe von Topics mit einem Knopdruck (oder anderen Trigger) gleichzeitig aktualisieren:

D.h. man startet mit hunderten von Datenpunkten. Legt sich davon nur die 5,6,7 interessanten in einen Korb und bindet alle an einen Trigger.

Home Assistant muß ich mir noch ansehen - da wird sich ja auch wieder einiges geändert haben. Zur Zeit bin ich noch mit OpenHab dran - aber auch da kann man Kanäle (MQTT Topics) and Items binden. Also ähnlich wie in Home Assistant.

Vielen Dank für die schnelle Antwort.

Eine n:1-Zuordnung nach dem Empfang wäre am interessant, d. h. mehrere MQTT-Nachrichten werden mit einer Entity verknüpft. Hierzu habe ich aber bei meiner bisherigen Suche in der HA-Community keine Hinweise gefunden.
Attribute werden in den Beispielen nur aus jeweils einem Payload (vorzugsweise im JSON-Format) gezogen. Somit lassen sich die Werte in der Anzeige (Objektbrowser) von Home Assistant wunderbar gruppieren und inhaltlich leichter zuordnen als wenn dies über ein Namensscheck im Kopf erfolgt.

Sowohl für HA-, aber auch für OpenHAB- und *ioBroker-*Nutzer wäre auch ein MQTT-Auto Discovery sehr charmant. Aktuell behelfe ich mir selbst, indem ich ein vorgefertigtes JSON-Konfigurationspaket via mosquitto_pub absetze. Vorteil: Die InStar-Kamera wird als Gerät in Home Assistant angezeigt, alle Sensoren und Automatisierungen zugeordnet. Das sieht viel seriöser aus als eine Liste von MQTT-Befehlen, die man mühsam Button-Up suchen muss. Vielleicht auch zur Unterstützung der eigenen Marke ganz interessant :wink:

Ist das Auto-Discovery nicht rein auf der Smarthome-seite? In OpenHAB hat der MQTT Client dieses Homie Konzept integriert. D.h. wenn man das MQTT Prefix auf homie setzt in der Weboberfläche der Kamera, werden aus den MQTT Topics automatisch Kanäle erzeugt. D.h. man hat den Broker als Thing hinzugefügt und bekommt dann automatisch Kanäle an die man Items, wie Switches, binden kann

Ja, man muß das Kamera MQTT-Prefix auf Home Assistant stellen. Dann werden die verfügbaren Topics automatisch hinzugefügt:

Das ist vergleichbar zu der Integration im ioBroker - dort kann man Wildcard Subscriptions anlegen myprefix/# und dann werden die Datenpunkte automatisch hinzugefügt.

Ich kenne mich mit OpenHAB und ioBroker nicht so gut aus, hatte nur kurz gesucht, ob sie auch MQTT Discovery unterstützen, aber nicht wie sie dies im Detail machen.

In Home Assistant gibt es in der Tat ein „Ankündigungs-Topic“. Dort werden die Definitionen der Geräte sowie der zugehörigen MQTT-Nachrichten erwartet. Daraus baut HA dann die Objekte auf. Hier ein Beispiel:

mosquitto_pub -u mqtt-explorer -P xxxxx -h localhost -t "homeassistant/switch/instar_cam1_area1/config" -m '{
  "device": {
    "identifiers": "instar_IN9008",
    "manufacturer": "InStar",
    "model": "Full-HD Überwachungskamera mit PoE-Stromversorgung",
    "name": "IN 9008"
  },
  "unique_id": "in9008_alarmarea1",
  "name": "InStar IN9008 AlarmArea1",
  "command_topic": "instar/cam1/alarm/area1/enable",
  "payload_on": "{val:1}",
  "payload_off": "{val:0}",
  "state_topic": "instar/cam1/status/alarm/area1/enable",
  "state_on": 1,
  "state_off": 0,
  "value_template": "{{ value_json.val }}",
  "qos": 1
}'

Sowas ließe sich relativ einfach hinzufügen - wo ist dieses Topic denn dokumentiert?

Vorsicht - da ist das Broker Password mit ins Copy&Paste geraten :wink:

1 „Gefällt mir“

Das wäre super komfortabel: Kein Editieren einer yaml-Konfigurationsdatei mehr und alle Werte schön ordentlich einem Geräte als oberste Objektinstanz zugeordnet.

Hier gibt es zumindest für HA die Doku.

Die Konfiguration unterscheidet sich nicht wesentlich von der yaml-Definition. Allerdings kann man - und auch nur im AutoDiscovery - eine übergeordnete Device-Definition mitgeben, die dann das oben gezeigte Gerät erzeugt.

Die Liste von Sensoren wird dann zwar sehr lang. Vielleicht kann ich Euch ja doch noch zum JSON-Container für mehrere Attribute überreden :wink:

Vom überfliegen hört sich das so an, als müsste man einfach ein retained Topic auf der Kamera hinterlegen mit einem JSON Payload, der alle „Sensoren“ der Kamera definiert. Wenn das wirklich alles sein sollte, ist das relativ schnell hinzugefügt. Mal schauen - ist am Ende ja meistens doch etwas komplizierter :slight_smile:

Aber Home Assistant wollte ich mir als nächstes nochmal anschauen. Dann werde ich sehen, ob man sowas zum Laufen bekommt.

1 „Gefällt mir“

Exakt … einen eindeutigen Identifier (Seriennummer oder Mac-Adresse) zuordnen und alle Attribute publizieren bzw. Switches erstellen. Große Arbeitserleichterung insbesondere für Nicht-Techies (in HA kann man dann die nicht gewünschten Entities per GUI abwählen).

In v2.0 wäre dann noch die Anpassbarkeit des „AutoConfigure“-Topics überlegenswert, da sich 0,0001 Prozent vielleicht nicht an den Standardnamen homeassistant halten werden.

Dürfte weiter nicht schlimm sein, es liegt ja keine 9600 Baud-Übertragung vor. So hat man alle Infos komplett im Paket vorliegen.

Schön wär’s. Wenn im JSON nur ein „Val“-Parameter steht ist selbst der JSON-Container „oversized“. Dafür bietet MQTT ja auch das raw-Format.

Du streamst doch nicht dauerhaft Topics über MQTT, oder doch? :open_mouth:

Den Overhead in der Verarbeitung+Kommunikation kann ich zumindest bei den InStar-Kameras vernachlässigen.
Mein Wunsch betrifft das Bünden inhaltlich zusammengehöriger Werte (zum Beispiel eines Knotens) in einem JSON. Dies erlaubt es, zumindest in Home Assistant die Struktur (Instanzen und Attribute) zu wahren.

Ok, oben hatte ich ja schon das ioBroker Beispiel verlinkt. Jetzt hatte ich es mir nochmal in OpenHab angeschaut. Und auch da ist es sauber gelöst. Das ist das Config Beispiel - das ganze läßt sich auch über die UI zusammenklicken:

Zuerst wird das Thing definiert und darin für jedes MQTT Topic, das man verwenden möchte, ein Channel angelegt:

Thing mqtt:topic:home "Camera 118" (mqtt:broker:cameraBroker118) [ availabilityTopic="cameras/118/status/testament", payloadAvailable="{"val":"alive"}", payloadNotAvailable="{"val":"dead"}" ] {
    Channels:
    Type switch    : PrivacyArea1   [ stateTopic="cameras/118/status/multimedia/privacy/region1/enable",
                                    commandTopic="cameras/118/multimedia/privacy/region1/enable",
                                    transformationPattern="JSONPATH:$.val",
                                    formatBeforePublish="{"val":"%s"}",
                                    on="1",
                                    off="0" ]
    Type switch    : PrivacyArea2   [ stateTopic="cameras/118/status/multimedia/privacy/region2/enable",
                                    commandTopic="cameras/118/multimedia/privacy/region2/enable",
                                    transformationPattern="JSONPATH:$.val",
                                    formatBeforePublish="{"val":"%s"}",
                                    on="1",
                                    off="0" ]
    Type switch    : PrivacyArea3   [ stateTopic="cameras/118/status/multimedia/privacy/region3/enable",
                                    commandTopic="cameras/118/multimedia/privacy/region3/enable",
                                    transformationPattern="JSONPATH:$.val",
                                    formatBeforePublish="{"val":"%s"}",
                                    on="1",
                                    off="0" ]
    Type switch    : PrivacyArea4   [ stateTopic="cameras/118/status/multimedia/privacy/region4/enable",
                                    commandTopic="cameras/118/multimedia/privacy/region4/enable",
                                    transformationPattern="JSONPATH:$.val",
                                    formatBeforePublish="{"val":"%s"}",
                                    on="1",
                                    off="0" ]
}

Jetzt kann man sich ein Item, z.B. einen Switch, der alle Topics auf einmal schaltet:

Switch  PrivacyAreas   "All Privacy Areas" {channel="mqtt:topic:home:PrivacyArea1, mqtt:topic:home:PrivacyArea2,mqtt:topic:home:PrivacyArea3,mqtt:topic:home:PrivacyArea4"}

Also recht übersichtlich.

Es ist natürlich richtig. Bislang haben alle Topics bei unseren Kameras nur einen Wert im Payload - JSON ist somit nicht unbeding notwendig. Aber das ist natürlich vorausschauend gemacht wurden - es werden schon sehr bald weiter Payloads dazukommen. Ich bin immer noch der Meinung, dass das Bündeln auf der Smarthome-seite passieren sollte - da wo man sich das Bündel genau so zusammenstellen kann wie man es braucht. Mal schauen ob Home Assistant da umstimmen kann :smile:

Bündeln kann ich Switches in HA ebenso. Die Dinger heißen dort Groups und werden gemeinsam geschaltet. Mein „Problem“ sind eher die Sensoren und die Werte, die diese korrespondierend setzen. Das sind sehr viele und es wäre gut - da sie inhaltlich zusammengehören - sie auch einem Objekt als Attribute zuzuordnen und bei der Kommunikation in einem JSON zu verpacken. Gern kann ich hierzu in HA einen Mockup erstellen.

Ihr habt in Eurem exzellenten Tutorial für die HA-Integration die Nutzung unterschiedlicher AlarmArea-Konfigurationen (Tag, Nacht) genannt. Genau dieses habe ich umgesetzt. Um ein komplettes Setup (4 Bereiche) abzuspeichern, brauche ich 4*6 Service-Calls (=MQTT-Aufrufe). YAML ist nicht besonders kompakt. Das Skript ist riesig.
Vielleicht eher akademisch ist folgende Frage: Was passiert, wenn die Werte für x und y gesetzt werden konnten, vor dem Setzen von Höhe und Breite aber eine Störung dazwischenkommt. Für mich ist ein Area ein „Objekt“ und am besten als ein JSON repräsentiert. Aber genug darüber diskutiert … vielleicht gibt es auf Eurer Roadmap dafür etwas Platz.

Prinzipiell ist Eure Integrationsfähigkeit in Fremdsysteme ein Unique Selling Point und für mich DAS Entscheidungskriterium für eine Anschaffung schlechthin!

BTW: Beim Testen habe ich die InStar-Kamera einige Male mit einem inkonsistenen Payload (JSON) „versorgt“. Damit konnte ich wohl den MQTT-Client nachhaltig beschädigen. Erst durch einen Neustart hat die Kamera-Software wieder auf MQTT-Kommandos korrekt reagiert.

1 „Gefällt mir“

Was für Topics/Payloads waren das? Wenn wir es nachstellen können, können wir mal schauen woran es liegt.

Ich konnte das Verhalten leider nicht 100%ig nachstellen. Bei meinen Tests hatte ich u.a. die Anführungszeichen beim Wertenamen vergessen {val: 10}. Einmal ist es mir auch „geglückt“ das Verhalten zu erzwingen, mehre Male aber auch nicht. Deshalb keine Zeit investieren …

Ich hatte mir das jetzt einmal anschauen können. Aber damit lassen sich die Topics doch genauso bündeln - wie bei OpenHab und ioBroker:

Ich muß nur noch rausfinden wie man Slider einbauen kann - z.B. für die Alarm Bereich Empfindlichkeit. Dann bekommt man eigentlich alles gleich ins Auto Discovery rein.

1 „Gefällt mir“

Ok, es gibt dann drei relevante Gruppen die man braucht, um alles unterzubringen:

Buttons

Alarm :: Trigger Alarm

  • Configuration topic: homeassistant/button/in9408_garden/alarm_trigger/config
  • Payload:
{
    "device": {
        "identifiers": "in9408_garden",
        "manufacturer": "INSTAR Deutschland GmbH",
        "model": "INSTAR 2k+ IN-9408 WLAN",
        "name": "IN-9408 2k+ Garden"
    },
    "configuration_url": "http://192.168.2.115:80",
    "availability": {
      "topic": "cameras/115/status/testament",
      "payload_available": "{\"val\":\"alive\"}",
      "payload_not_available": "{\"val\":\"dead\"}"
    },
    "object_id":"in9408_garden_alarm_trigger",
    "unique_id": "in9408_garden_alarm_trigger",
    "name": "IN-9408 2k+ Garden Alarm Trigger",
    "icon": "mdi:alarm-light",
    "command_topic": "cameras/115/alarm/pushalarm",
    "payload_press": "{\"val\":\"1\"}",
    "qos": 2
}

Switches

Alarm :: Alarm Actions

  • Configuration topic: homeassistant/switch/in9408_garden/alarm/config

  • Payload:

{
    "device": {
        "identifiers": "in9408_garden",
        "manufacturer": "INSTAR Deutschland GmbH",
        "model": "INSTAR 2k+ IN-9408 WLAN",
        "name": "IN-9408 2k+ Garden"
    },
    "configuration_url": "http://192.168.2.115:80",
    "availability": {
      "topic": "cameras/115/status/testament",
      "payload_available": "{\"val\":\"alive\"}",
      "payload_not_available": "{\"val\":\"dead\"}"
    },
    "object_id":"in9408_garden_alarm",
    "unique_id": "in9408_garden_alarm",
    "name": "IN-9408 2k+ Garden Alarm",
    "icon": "mdi:shield-home-outline",
    "command_topic": "cameras/115/alarm/actions/enable",
    "payload_on": "{\"val\":\"1\"}",
    "payload_off": "{\"val\":\"0\"}",
    "state_topic": "cameras/115/status/alarm/actions/enable",
    "state_on": 1,
    "state_off": 0,
    "value_template": "{{ value_json.val }}",
    "qos": 1
}

Numbers

Alarm :: Red Alarm Area Sensitivity

  • Configuration topic: homeassistant/number/in9408_garden/red_area_sense/config

  • Payload:

{
    "device": {
        "identifiers": "in9408_garden",
        "manufacturer": "INSTAR Deutschland GmbH",
        "model": "INSTAR 2k+ IN-9408 WLAN",
        "name": "IN-9408 2k+ Garden"
    },
    "configuration_url": "http://192.168.2.115:80",
    "availability": {
      "topic": "cameras/115/status/testament",
      "payload_available": "{\"val\":\"alive\"}",
      "payload_not_available": "{\"val\":\"dead\"}"
    },
    "object_id":"in9408_garden_red_area_sense",
    "unique_id": "in9408_garden_red_area_sense",
    "name": "IN-9408 2k+ Garden Red Alarm Area Sensitivity",
    "icon": "mdi:cctv-off",
    "command_topic": "cameras/115/alarm/areas/red/sensitivity",
    "state_topic": "cameras/115/status/alarm/areas/red/sensitivity",
    "value_template": "{{ value_json.val }}",
    "command_template": "{\"val\":\"{{ value }}\"}",
    "min": 0,
    "max": 100,
    "step": 1,
    "unit_of_measurement": "%",
    "qos": 1
}

Sehr schick! Danke für die schnelle Realisierung!
Bin gespannt, wenn die Attribute/Parameter für einen AlarmArea dazukommen :wink: