jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Nutzung von XML RPC, Remote Script, JSON RPC, XMLAPI

Moderator: Co-Administratoren

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Beitrag von didiator » 02.04.2020, 10:55

Hallo zusammen,

ich möchte eine recht komplexe Thematik mit einem Windows Service unter C# realisieren. Dazu müsste der Windows Service aktiv von der CCU mit jeglichen Änderungsnachrichten an vorhandenen Geräten versorgt werden. Ständiges Pollen der Geräteeigenschaften vom Windows Service aus soll damit vermieden werden. Der Windows Service liest beim Start die Eigenschaften aller Geräte einmal ein (das kann ich schon) und soll sie dann nur noch bei Änderung erneut und dann nur noch für das geänderte Gerät holen (Ereignis - getrieben).

Kennt jemand eine Möglichkeit, wie man die Änderung von Werten oder Stati in generischer Weise erkennen kann? "Gerät XYZ hat eine Änderung. Bitte Werte aktualisieren". Wenn der Windows Service diese Meldung bekommt, könnte er dann aktiv über die API die CCU nach den aktuellen Werten dieses konkreten Gerätes fragen und daraufhin dann ggf. reagieren.

Klar könnte man für jedes Gerät ein CCU Programm hinterlegen, die Änderung detektieren und dann eine TCP-Nachricht an das externe Programm schicken. In meinem Fall wären das dann für über hundert Geräte logischerweise über hundert Programme... unpraktisch... Aber geht das auch generisch ohne vorher das Gerät, das sich ändert kennen zu müssen?
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

SoerenR
Beiträge: 656
Registriert: 19.03.2019, 10:10
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 44 Mal
Danksagung erhalten: 57 Mal

Re: jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Beitrag von SoerenR » 02.04.2020, 11:41

Evtl ioBroker dazu nutzen?
Gruß Sören

RaspberryMatic // Philips Hue // KNX // HomeKit // und ein paar Spielerreien

Benutzeravatar
Black
Beiträge: 5463
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 418 Mal
Danksagung erhalten: 1069 Mal
Kontaktdaten:

Re: jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Beitrag von Black » 02.04.2020, 11:41

in c die xmlrpc library besorgen und dann an den jeweiligen rpc schnittstellenprozessen der CCU anmelden... dann bekommst du von den geräten bei änderungen via push von den schnittstellenprozessen die benachrichtigung und kannst auf das event reagieren (geht nicht bei der rega, sysvars musst du weiterhin pollen)


Black

alternativ kannst auch iobroker nehmen, da hast du diese rpc anbindung direkt drin und kannst recht einfach auf änderungen via event triggern
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

Re: jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Beitrag von didiator » 02.04.2020, 12:13

Vielen Dank für die Hinweise soweit. Allerdings bringt mich das erstmal noch nicht voran. ioBroker habe ich nicht im Einsatz und es ist auch immer etwas problematisch wegen einer Aufgabenstellung gleich eine komplette zusätzliche Umgebung einzusetzen. Habt Ihr da noch eine andere Variante?
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

Mathias
Beiträge: 1767
Registriert: 03.11.2010, 10:25
System: CCU
Wohnort: Aachen
Hat sich bedankt: 58 Mal
Danksagung erhalten: 253 Mal
Kontaktdaten:

Re: jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Beitrag von Mathias » 02.04.2020, 12:59

Genau für diesen Anwendungsfall, die einfache Anbindung von eigenen Applikationen an die CCU, wurde der CCU-Jack entwickelt. Die Remote-Script-API und die XML-RPC-Schnittstellen der CCU haben so Ihre "Eigenarten", womit sich nicht jeder neue Entwickler immer wieder auf das Neue beschäftigen sollte.

Der CCU-Jack bietet für die Erkundung von Datenpunkten und deren Eigenschaften eine wirklich einfache REST-API. Und falls ereignisbasiert Wertänderungen von allen Geräten benötigt werden, wie in Deinem Fall, können Sie über das verbereitete MQTT-Protokoll beim CCU-Jack abonniert werden.

Also schau Dir den CCU-Jack auf jeden Fall mal an.

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

Re: jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Beitrag von didiator » 02.04.2020, 16:32

Hallo Matthias,

vielen Dank für den Tipp. Ich habe das mal überflogen und es stellt sich mir die Frage, ob in diesem Szenario wirklich die CCU bei einer Werteänderung aktiv etwas meldet. soweit ich das gelesen habe, pollen die Server auch nur die CCU und melden dann bei einer Änderung etwas an ein Clientprogramm. Das ist es, was ich eigentlich nicht will. Ich will nicht, dass irgendein Prozess ständig die CCU belastet und versucht herauszufinden, ob sich da was geändert hat. Die CCU soll das selbst aktiv melden. In Windows-Umgebungen kann man Ereignisse abonieren. Der Hauptprozess (CCU) stellt ein Ereignis zur Verfügung und ich kann dies in meinem Clientprogramm abonieren und einen Handler dafür schreiben. So etwas suche ich.
Habe ich das bei CCU-Jack falsch verstanden? Oder sehe ich das richtig, dass CCU-Jack auch nur pollt?
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

Mathias
Beiträge: 1767
Registriert: 03.11.2010, 10:25
System: CCU
Wohnort: Aachen
Hat sich bedankt: 58 Mal
Danksagung erhalten: 253 Mal
Kontaktdaten:

Re: jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Beitrag von Mathias » 02.04.2020, 23:54

Ich behaupt mal, dass der CCU-Jack die technisch geringstmögliche Belastung der CCU für die Anbindung von Fremdapplikationen realisiert. Das hat mehrere Gründe:
  • Der CCU-Jack registriert sich natürlich bei den Schnittstellenprozessen der CCU, damit die CCU nur bei Wertänderungen mit dem CCU-Jack kommuniziert. Der CCU-Jack fragt also nicht zyklisch die Datenpunkte ab. Dies ist technisch aber nur bei Gerätedatenpunkten möglich. Systemvariablen werden nur zyklisch vom CCU-Jack gelesen, wenn Systemvariablen speziell für MQTT ausgewählt sind.
  • Die gemeldeten Wertänderungen der CCU werden sofort vom CCU-Jack bestätigt, bevor sie im CCU-Jack weiter verarbeitet werden.
  • Alle Wertänderungen werden vom CCU-Jack gecached, falls eine Fremdapplikation doch pollen möchte. Falls 100 Datenpunkte (von Geräten) jede Sekunde von einer Fremdapplikation gelesen werden, bekommt die CCU mit ihren Schnittstellenprozessen, der ReGaHss und dem Web-Server davon gar nichts mit.
  • Da der CCU-Jack lokal auf der CCU läuft, entfällt jegliche Netzwerkkommunikation. Die CCU bekommt die Wertänderungen sehr viel schneller ausgeliefert.
  • Falls Fremdapplikationen sich über das Netzwerk bei den Schnittstellenprozessen registrieren, wirken sich Netzwerkfehler oder Fehler in den Fremdapplikationen direkt auf die Schnittstellenprozesse aus. Wenn ein Schnittstellenprozess eine Wertänderung nicht übermitteln kann, blockiert er. Wenn ein Schnittstellenprozess der CCU blockiert, blockiert u.U. auch die Logikschicht der CCU (ReGaHss). Nach einem Timeout läuft zwar alles weiter, die CCU ist aber in dieser Zeit quasi tot.
  • Die ganzen Informationen zu Datenpunkten (Min, Max, Einheit, ...) werden vom CCU-Jack einmal gelesen und gecached. Wenn Fremdapplikationen sie anfragen, bekommt die CCU davon nichts mit.
  • Der CCU-Jack ist sehr effizient und ressourcenschonend. Er kann mehrere 100000 Wertänderungen pro Sekunde, was in der Realität niemals vorkommt, ohne Probleme auf einer CCU3 (RaspberryPi) verarbeiten.

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

Re: jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Beitrag von didiator » 03.04.2020, 09:27

Hallo Mathias,

das kling ja alles wirklich recht gut. Vielen Dank für Deine ausführliche Antwort. Ich werde mich dann damit einmal näher befassen. Du scheinst das ja sehr gut zu kennen und kannst mir vielleicht noch etwas den Start erleichtern:
- CCU-Jack läuft direkt auf der CCU schreibst Du. Sind da Probleme mit einer X86-Umgebung bekannt? Ich möchte gern auf einem QNAP NAS in einer dort installierten Raspberry-VM arbeiten. Das dürfte doch keine Probleme bringen, oder?
- Gibt es eine Doku für die Nutzung und Anbindung, die Du empfehlen könntest?
- Gibt es ein Beispielprojekt? Vielleicht sogar, wie man das unter C# ansprechen kann?

Und dann noch eine Frage... Wenn ich CCU-Jack nutze, ist das für mich eine strategische Entscheidung. Ich werde sehr viel Arbeit in die Programmierung meiner Services stecken, z.B. eine intelligente Steuerung meiner Heizung (Nibe Wärmepumpe), meiner Photovoltaik, meines wasserführenden Kamins und meines Fernwärmeanschlusses durch einen gemeinsamen Service. Wie zukunftssicher ist CCU-Jack?

Vielen Dank für Deine Mühe im Voraus...
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

Marrom77
Beiträge: 73
Registriert: 27.02.2018, 22:43
Hat sich bedankt: 2 Mal
Danksagung erhalten: 4 Mal

Re: jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Beitrag von Marrom77 » 04.04.2020, 00:05

Servus,

Anforderungen und Lösungsansätze sind vielschichtig wie das wahre Leben. Ich bin IT-ler und beschäftige mich beruflich mit komplexen Infrastrukturen. In diesem Umfeld hat sich die Publish-Subscribe-Lösung über Message-Broker einfach als Super-Lösung für Integrationsaufgaben erwiesen. Damit möchte ich nochmal den Hinweis von SoerenR oben aufgreifen und auch ioBroker in Erinnerung rufen. Nur als Idee. Dieses Tool hat sich als sehr zuverlässig erwiesen und ist recht einfach zu managen. Wenn du eh eine virtualisierte Platform nutzt, ist es ohne grossen zusätzlichen Ressourcenverbrauch machbar, einen solchen Service einzubinden. Zumindest für meine Anforderungen hat das bislang gut geklappt.

VG
Marcel

Benutzeravatar
Psi
Beiträge: 512
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg
Hat sich bedankt: 27 Mal
Danksagung erhalten: 90 Mal

Re: jede Werteänderung an irgendeinem Gerät soll an externes Programm gemeldet werden

Beitrag von Psi » 04.04.2020, 00:35

Na dann schmeiß ich mal noch RedMatic (NodeRED) in den Raum. Hier hast du Nodes um Flows zu bei fast allen CCU Events zu triggern und dies könnte dann zB über nen WebSocket oder HTTP-Call an deinen Service geschickt werden. Vllt willst du dich ja nicht zu 100% auf ne CCU festlegen?
Dann könnte RedMatic für dich einen MQTT bestücken und dein Service subscribed die für ihn relevanten Topics.

Wie du siehst, gibt viele Wege. Fraglich nur wie low-level du mit der CCU arbeiten willst.

Antworten

Zurück zu „Softwareentwicklung von externen Applikationen“