Die Home Control Unit (HCU) in Node-RED integrieren – Teil 2

In der ersten Folge dieser Serie habe ich gezeigt, wie man aus Node-Red direkt auf die HCU zugreift und ein Objekt mit allen HMIP-Daten abfragt. In diesem Teil der Serie erkläre ich die Datenstruktur, mit der sich der Status von Geräten abfragen lässt. Das wesentliche Dokument für alle folgenden Schritte ist dabei die Homematic IP Connect API Dokumentation.

Datenstruktur verstehen

Mithilfe des debug93-Nodes aus dem letzten Beitrag wurde die gesamte Datenstruktur der HCU ausgegeben. Bevor weitere Funktionen ergänzt werden, ist es wichtig, die Grundstruktur zu verstehen. Ich fokussiere mich hier nur auf die Geräte und deren besondere Attribute (Gruppen oder Clients werden nicht betrachtet). HMIP-Geräte werden als Devices bezeichnet.

Die Datenwerte eines Geräts werden in der HCU als Features bezeichnet (z. B. Temperatur), die einen Wert beinhalten können. Jedes Device besitzt einen „Type”, der genau angibt, welche Features obligatorisch oder optional zu einem Device-Objekt gehören.

Die Struktur des HCU-Datenobjektes mit den relevanten Daten zum Auslesen und Verarbeiten von Geräten ist in der folgenden Grafik dargestellt (blaue Kästchen sind Objekte, weiße Kästchen sind Attribute):

Bei Änderungen schickt die HCU nur die geänderten Objekte. Der Gedanke dahinter ist, dass die Kommunikation deutlich schneller funktioniert, wenn nur die Änderungen übermittelt werden. Die Datenstruktur mit den Änderungen ist leicht anders und wird in folgender Grafik dargestellt (blaue Kästchen sind Objekte, weiße Kästchen Attribute):

Device Eigenschaften

Jedes Gerät besitzt das Attribut „type“, das angibt, welche „Features“ es unterstützt. Mit den Features sind in der Regel die Daten der Sensorwerte, der Zustand eines Schalters etc. gemeint.

Die möglichen Features ergeben sich aus den Beschreibungen in Kapitel 6.6.5 der Connect-API-Dokumentation.

Für den HMIP-Bewegungsmelder (HMIP-SMI) vom Typ „OCCUPANCY_SENSOR” sind dies beispielsweise die Features:

  • presenceDetected (true oder false)
  • unreach (true oder false, gehört zum Feature Maintenance)
  • lowbat (true oder false, gehört zum Feature Maintenance)
  • sabotage (true oder false, gehört zum Feature Maintenance)

Diese stehen in einem zweidimensionalen Array im Objektbereich "Functional Channels".

Plugin Messages auswerten

Wenn eine Nachricht von der HCU an Node-Red übermittelt wird, dann wird auch immer der Typ der Nachricht (PluginMessageType) übertragen. Dieser steht unter payload.type. Im Folgenden sind zunächst nur die folgenden Werte interessant (weitere Typen sind in Kapitel 6.4 der API erläutert):

PluginMessageType

Beschreibung
PLUGIN_STATE_RQUEST Wenn eine solche Nachricht ankommt, möchte die HCU eine Statusinformation des Plug-ins bzw. ein Lebenszeichen erhalten. Die Antwort darauf ist immer eine Nachricht an die HCU mit dem Payload-Typ PLUGIN_STATE_RESPONSE.
HMIP_SYSTEM_RESPONSE Diese Nachricht beinhaltet den Status eines oder mehrerer Datenobjekte bzw. aller Daten in der HCU. Der Status wird erst dann gesendet, wenn zuvor ein HMIP_SYSTEM_REQUEST gesendet wurde.
HMIP_SYSTEM_EVENT In dieser Nachricht befindet sich ein Update des HMIP-Systems. Wichtig ist, dass nicht immer der gesamte Status übertragen wird, sondern nur die geänderten Teile.

Zwischenspeicherung der HCU-Daten

eQ3 empfiehlt, den gesamten Status aller Objekte (Devices, Gruppen etc.) auf der HCU nur einmal nach Aufbau der Verbindung abzuholen und in einem Cache zwischenzuspeichern. Gibt es Änderungen an den Daten, schickt die HCU nur die geänderten Objekte. Dahinter steckt der Gedanke, dass die Kommunikation deutlich schneller funktioniert, wenn nur Änderungen übermittelt werden. Daher empfiehlt eQ3 auch, die initialen HCU-Daten zwischenzuspeichern und bei jedem Update den geänderten Teil zu ersetzen. Damit sind im Speicher immer alle Daten der HCU auf dem aktuellen Stand verfügbar.

Um die Daten nach dem Aufbau der Websocket-Verbindung abfragen zu können, nutze ich einen Input-Node, der zwei Sekunden nach dem Start eine HMIP_SYSTE_REQUEST-Nachricht in der folgenden Form verschickt:

Copy to Clipboard

Ich realisiere dies einfach durch Abfrage des PluginMessageType.  Hat dieser den Wert "HMIP_SYSTEM_RESPONSE", dann speichere ich den payload Wert in meiner Node-Red Flow-Variablen "f_systemresponse". Ich ergänze dies in meinem Flow am Ende des Beitrag1 Mit Node-RED auf die HMIP Home Control Unit (HCU) zugreifen Teil 1

Status eines Device abfragen

Auf Basis der in den vorigen Abschnitten beschriebenen Grundlagen kann nun die Statusabfrage eines Geräts erfolgen. Ich möchte beispielsweise für einen Bewegungsmelder abfragen, ob er eine Bewegung erkannt hat oder nicht. Dazu verwende ich einen Input-Node, in dem ich die Seriennummer angebe sowie das Feature „presenceDetected”, welches zu diesem Gerätetyp bereitgestellt wird.

Copy to Clipboard

Anschließend verwende ich die Daten in einem Function-Node. Nach diversen Prüfungen führt dieser die Suche nach der normierten Seriennummer durch, holt sich das passende Device-Objekt aus dem HCU-Objekt und extrahiert das Feature bzw. den Wert des Attributs.

Copy to Clipboard

Anschließend sieht das Ergebnis wie folgt aus:

Im nächsten Beitrag werde ich zeigen, wie die zwischengespeicherten HCU-Daten aktualisiert werden. Auf dieser Grundlage wird es dann auch möglich sein, sich Statusänderungen von Geräten automatisch ausgeben zu lassen.