FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Bootscreen am 09 November 2019, 02:06:26

Titel: Events von FHEM in C# oder JavaScript
Beitrag von: Bootscreen am 09 November 2019, 02:06:26
Moin moin,

ich bräuchte mal euren Rat, Hilfe, Anleitung. Ich möchte ein Plugin für mein Stream Deck schreiben. Entweder in C# oder JavaScript, das hängt hauptsächlich davon ab wie die Anbindung an FHEM am besten klappt, da ich nicht nur Befehle senden möchte sondern auch den Status bzw. Readings in Echtzeit anzeigen lassen möchte. Ich würde hier gerne darauf verzichten den Status alle x Sekunden abzufragen.
Ich habe in dem Bezug immer wieder von Websocket gelesen, aber leider nirgends herausfinden können, wie ich eine Websocket Verbindung zu einer FHEMWEB Instanz aufbauen kann, bzw. Wie die Befehle formatiert sein müssen damit ich auch eine Antwort bekomme.

Hoffe ihr könnt mir helfen.

Viele Grüße
Bootacreen
Titel: Antw:Events von FHEM in C# oder JavaScript
Beitrag von: rudolfkoenig am 09 November 2019, 11:08:32
Um mit FHEM zu kommunizieren gibt es mehrere Moeglichkeiten. Hier sind die, die mir gerade einfallen:

- telnet. Das ist eigentlich "plain" TCP/IP, was man als Endbenutzer am einfachsten mit einem telnet Programm bedienen kann. Befehle werden mit Newline abgeschlossen, benachrichtigt wird man, nachdem man den Befehl inform abgesetzt hat. Wird ueber das telnet FHEM Modul angeboten.

- HTTP/longpoll. Wird ueber das FHEMWEB Modul angeboten. Laeuft ueber CGI (GET oder PUT), ein Befehl wird mit cmd uebermittelt, wenn man keine HTML-Seite als Anwort will, setzt man XHR=1. Wg. CSRF muss man den csrfToken (ist im HTTP Header oder im body als Attribut vorhanden) als fwcsrf CGI Parameter uebergeben. Benachrichtigt wird man, indem man den CGI Parameter inform=type=status;filter=<FILTER>;fmt=JSON schickt, wobei <FILTER> ein devspec ist (z.Bsp .*). Die Benachrichtigung erfolgt auf dem klassischen longpoll weg, d.h. die Seite wird nie komplett abgeschickt, sondern Stueckweise, wenn eine Nachricht eintrifft. fhemweb.js verwendet diese Art der Kommunikation, aber auch (optional) websocket, s.u.

- HTTP/websocket, auch ueber FHEMWEB. Die Benachrichtigung muss aehnlich wie beim HTTP/longpoll per CGI / GET bestellt werden. Relativ neu (heisst wenig getestet): alles, was ueber websocket empfangen wird, wird als Befehl (wie im telnet) ausgefuehrt. Die Antwort wird als JSON verpackt zurueckgeschickt. Achtung: iOS unterstuetzt kein BasicAuth ueber websocket, d.h Authorisierung mit allowed (s.u.) faellt aus.

- MQTT: mit (MQTT2_SERVER oder (MQTT2_CLIENT und mosquitto)) und (notify oder DOIF oder MQTT2_GENERIC_BRIDGE) kann man auch eine Kommunikation samt Benachrichtigung realisieren. Wenn man Befehle  Ausfuehren will, muss man entweder in FHEM ein notify/DOIF bauen, oder den Befehl ueber einen anderen Kanal (telnet/HTTP) versenden.

Alle diese Wege koennen verschluesselt werden (Stichwort SSL/HTTPS), und authentifiziert+authorisiert werden (Stichwort allowed Modul, was per validFor der telnet/FHEMWEB/MQTT2_SERVER Instanz zugeordnet werden muss).

Das war als Ideengeber und nicht als vollstaendige Referenz gedacht.
Titel: Antw:Events von FHEM in C# oder JavaScript
Beitrag von: Bootscreen am 14 November 2019, 10:21:17
Vielen Dank für die gute Auflistung.

Ich habs jetzt mit HTTP/Longpoll hinbekommen. Aber eine Frage dazu noch kann ich den Filter in "inform=type=status;filter=<FILTER>;fmt=JSON" auf ein bestimmtes Reading eines Gerätes oder Raumes setzen? aktuell Filter ich die Events Programmintern, wäre ja aber praktisch wenn ich gar nicht erst soviele Events bekomme. Mit event-on-change-reading hab ich das zwar schon reduziert, aber ein paar Dinge müssen da drin bleiben die ich an anderer Stelle brauche
Titel: Antw:Events von FHEM in C# oder JavaScript
Beitrag von: DeeSPe am 14 November 2019, 10:33:40
Zitat von: rudolfkoenig am 09 November 2019, 11:08:32
Benachrichtigt wird man, indem man den CGI Parameter inform=type=status;filter=<FILTER>;fmt=JSON schickt, wobei <FILTER> ein devspec ist (z.Bsp .*).

In devspec (https://fhem.de/commandref_DE.html#devspec) kannst Du doch angeben und filtern was Du möchtest.

Gruß
Dan
Titel: Antw:Events von FHEM in C# oder JavaScript
Beitrag von: rudolfkoenig am 14 November 2019, 11:16:47
ZitatIn devspec (https://fhem.de/commandref_DE.html#devspec) kannst Du doch angeben und filtern was Du möchtest.
Jein. devspec liefert eine Liste von Geraeten zurueck, und man kriegt dann von FHEMWEB per longpoll alle Events dieser Geraete.
Eine Beschraenkkung auf nur bestimmte Readings ist z.Zt. nicht moeglich.
Titel: Antw:Events von FHEM in C# oder JavaScript
Beitrag von: Bootscreen am 14 November 2019, 11:30:58
ok, damit hat sich meine grad formulierte Antwort erledigt ^^
Dann Filter ich das weiter intern.
Und noch eine Frage:macht es "Leistungstechnisch" einen Unterschied ob ich 10, 20 oder 30 einzelne longpolls ala "inform=type=status;filter=<device_name>;fmt=JSON" offen habe oder ob ich einen longpoll ala "inform=type=status;filter=StreamDeckValue=..*;fmt=JSON" offen habe?
Titel: Antw:Events von FHEM in C# oder JavaScript
Beitrag von: rudolfkoenig am 14 November 2019, 11:33:12
Interessante Frage, die Antwort wuerde mich auch interessieren :)