SEPIA-Framework / sepia-docs

Documentation and Wiki for SEPIA. Please post your questions and bug-reports here in the issues section! Thank you :-)
https://sepia-framework.github.io/
237 stars 16 forks source link

Anleitung/Vorschlag: MQTT-Service an Node Red anbinden #37

Closed hartm11 closed 4 years ago

hartm11 commented 4 years ago

Hallo zusammen, ich habe mal eine Anleitung geschrieben, wie ich über den MQTT-Service eine Anbindung an Node Red hinbekomme. Ich finde die Lösung eigentlich ganz gut weil:

  1. Ich definiere meine Geräte in Node Red (Lavalampe, Vitrine, ...)
  2. Kurze Befehle möglich ("mqtt schalte die Lavalampe ein.", also kein "mqtt schalte das Licht der Lavalampe im Wohnzimmer ein" :-)
  3. Ich kann mit einem Satz mehrere Geräte ein-/ausschalten ("mqtt schalte die Lavalampe, die Vitrine und die Leselampe ein"). Alle 3 Geräte werden dann eingeschaltet. Steht alles im Word-Dokument mit vielen Bildchen ;-)

Hier das Word-Dokument: Anleitung für die Anbindung über MQTT an Node Red.docx

fquirin commented 4 years ago

Hey, sehr cool 😎 :+1: Ich überlege gerade wo man das am Besten hinpacken könnte, so dass User direkt drauf zugreifen können ohne Word. Das SEPIA Wiki hier in GitHub hat leider keinen Image Upload und vom Format wäre das eher ein kleiner Blog Artikel :thinking:

hartm11 commented 4 years ago

Wie wäre es denn mit einer pdf-Datei?

fquirin commented 4 years ago

PDF klingt gut, ich würde es aber am liebsten komplett ins Wiki übertragen, vielleicht dann mit der PDF als Anhang. Es gibt scheinbar einen kleinen Trick um Bilder hochzuladen ohne sie direkt ins Repository zu übertragen, ... ich teste Morgen mal ;-)

capitaenz commented 4 years ago

Hallo zusammen, würde mir sehr gerne das Dokument mal ansehen, aber docx..!? VG Leif

hartm11 commented 4 years ago

Hallo, ja, wenn ich für mich was schreibe, kann ich es am schnellsten mit Word. Hab den Vorschlag mal als pdf-Datei gedruckt. Ich denke das kann jeder lesen/öffnen. Hier der Link zur pdf: Anleitung für die Anbindung über MQTT an Node Red.pdf

Falls man nicht damit zurecht kommt, einfach alles bis zum ersten Node "empfSepiaTopics" (...abonniere alles von Sepia...) nachbauen und einen "debug"-Node hinten dranhängen. Dann kann man sehr schön in den debug-Nachrichten sehen, was und in welchem Format empfangen wird.

Viele Spaß

sepia-assistant commented 4 years ago

@hartm11 Danke für den PDF Upload :-) Ich habe quasi last-minute entschieden die neuen MQTT Funktionen, die eigentlich für SEPIA v2.5.1 geplant waren doch noch ins v2.5.0 Update einzubauen. Dadurch verzögert sich gerade alles etwas aber ich denke es lohnt sich ^^.

Eine Frage hätte ich dazu, vielleicht weißt du Rat :-)

Bisher ist es so, dass der User (Smart Home Admin) in v2.5.0 neue Geräte erstellen kann im SEPIA Control HUB, die dann einem MQTT Kanal (Topic) lauschen (Präfix sepia/smart-devices/[selbst definiert]) und bei State Änderungen ("Licht im Wohnzimmer auf 70%") dann diesen State im selben Kanal publizieren als { "state": 70 } zum Beispiel. Die Frage die ich mir hier stelle ist, ob zusätzlich noch weitere Infos in das Objekt sollten (type, room, etc.) oder ob die dem Node-Red (o.ä.) User eh durch den Kanal bekannt sind. Ich tendiere dazu das Objekt so klein wie möglich zu halten ;-)

hartm11 commented 4 years ago

Hi, ich habe mal versucht das zu erläutern wie es bei mir aufgebaut ist. Dazu habe ich eine pdf mit Bildchen erstellt, sonst hätte ich mir einen Wolf geschrieben. Die ersten beiden Seiten zeigen es so, wie ich es bei mir eingestellt habe mit einer kurzen Beschreibung der Prefixe (ist vielleicht wichtig für eine Statusabfrage in Sepia. Alle Sonoffs sind bei mir mit Tasmota geflasht. Ich denke das nutzen auch die meisten, da Tasmota sehr viele Geräte abdeckt. Seite 3 zeigt den Group Topic. Den hast Du ev. noch nicht beachtet, ist aber eine nette Funktion. Seite 4, endlich die Antwort auf Deine Frage :-D, und was mir sonst noch so dazu eingefallen ist. MQTT Modul Einbindung in Sepia.pdf

sepia-assistant commented 4 years ago

Cool, danke für die Erklärungen! :-)

Ein Zitat aus der PDF:

Ja, es sollte mindestens der Raum mit drin sein, sonst weiß NodeRed nicht welches Gerät angesprochen werden soll. NodeRed weiß ja im Prinzip nichts

Ich glaube hier gibt es 2 Ansätze. Die Informationen im Topic Namen zu haben oder im Payload. Der Topic Name könnte z.B. sein sepia/smart-devices/light/livingroom/brightness, damit wären dann alle relevanten Informationen schon definiert und der Kanal weiß auch, dass "70" -> 70% meint. Aus deiner PDF und der Frage nehme ich an, dass du eher den Fall bevorzugst bei dem der Topic einen ganzen Raum oder eine Gruppe definiert? Da würden diese Infos dann natürlich fehlen.

Im moment ist SEPIA's MQTT Connector so konzipiert, dass jedes Gerät, dass man im SEPIA Control HUB erstellt einen eigenen Kanal zugewiesen bekommt. Das macht die Konfiguration etwas einfacher, wobei es glaube ich im Endeffekt aufs gleiche hinausläuft. Hier wird dann aber auch der Unterschied zum MQTT Demo Service klar, da ging es ja eher darum die SEPIA Befehle weiterzuleiten, bevor sie ausgewertet werden. Bei der direkten MQTT Integration in den Smart Home Service passiert nun die Zuordnung zu einem Konkreten "item" schon vorher.

Soweit ich das gesehen habe kann NodeRed sowohl Topic als auch Payload beliebig parsen und ggf. auch umleiten in andere Kanäle falls erforderlich?

hartm11 commented 4 years ago

Das mit den Gruppierungen ist nur eine Idee von mir. Ich selbst nutze "nur" einzelne Geräte steuern und den Group Topic. Finde ich irgendwie cool wenn ich rausgehe und nur einen Befehl habe "Alle Lichter aus".

Ja, NodeRed hat einige Parser in der Grundausstattung. Hier z.B. der, den ich für den MQTT-Service genutzt habe und der wichtigste Teil der NodeRed Beschreibung dazu: json parser

Konvertiert zwischen einem JSON-String und seiner JavaScript-Objektdarstellung in beide Richtungen. Eingaben: payloadObjekt | String Ein JavaScript Objekt oder ein String. schema: Objekt Ein optionales JSON Schema Objekt gegen das das JSON Objekt validiert wird. Ausgaben: payloadObjekt | String Wenn die Eingabe ein JSON-String ist, wird versucht ihn in ein JavaScript-Objekt zu parsen.. Wenn die Eingabe ein JavaScript-Objekt ist, wird ein JSON-String erstellt. Der String kann optional gut formatiert werden.

Was man damit dann in NodeRed macht, bleibt jedem selbst überlassen. Sollte der Aufbau des SepiaMQTT's der Gleiche sein, den das Gerät auch abonniert hat, braucht man gar nichts mehr in NodeRed machen (ev. noch die Rückmeldung/Status auswerten). Das ist dann der Idealfall. Ansonsten ist es relativ einfach den SepiaMQTT in den entsprechenden Kanal umzuleiten. Das habe ich ja quasi beim SepiaMQTT-Service auch schon so gemacht.

Der GroupTopic wird, denke ich, dann auch nutzbar sein. Man muss eben nur ein Pseudo-Gerät definieren wie device: "alle Lampen" und dann aus NodeRed den entsprechenden GroupTopic versenden. Das sollte eigentlich funktionieren.

sepia-assistant commented 4 years ago

Ok super, danke :+1: . Ich werde für v2.5.0 dann jetzt nichts mehr ändern daran und mal gucken wie gut es in der Praxis funktioniert :-)

fquirin commented 4 years ago

v2.5.0 ist online. Eine Anleitung folgt noch, Feedback erwünscht :-D

fquirin commented 4 years ago

Anleitung für die neue MQTT Integration ist nun auch online :-)

https://github.com/SEPIA-Framework/sepia-docs/wiki/Smart-Home-Controls#tutorial-sepia-internal-multi-hub

Ich überlege gerade die PDF von Oben (Anbindung über MQTT an Node.Red) irgendwo dort auch zu verlinken oder ob das eigentlich in eine eigene Sektion gehört, die sich eher mit SEPIA Services beschäftigt :thinking:

hartm11 commented 4 years ago

Meiner Meinung nach sollte es in den Bereich Services. Es bezieht sich zwar beides auf MQTT, sind aber zwei verschiedene Ansätze/Wege für die MQTT Integration.

Smarthome-Creator commented 4 years ago

Hallo,

da ihr zwei ja hier eine Menge Fachchinesisch sprecht, könnt ihr mir vielleicht weiterhelfen. Ich bin nun seit release 2.5.0 fleißig dabei mein Smarthome einzurichten, da jetzt auch die Wake Word Erkennung um Welten besser läuft. Jetzt bin ich auf ein Problem gestoßen, bei dem ich mir nicht ganz zu helfen weiß.

In openHAB werden manche Things als String definiert. So zum Beispiel die ganzen Aktionen die man für den Harmony HUB anlegt. Diese Strings simulieren am Ende eine Fernbedienung, das Problem ist jetzt das Sepia diese Strings nicht als "Aktion" interpretieren kann.

Als Beispiel: Ich habe eine Aktion die sich "Fernsehen gucken" nennt und eine andere die sich "Film über Fernseher gucken" nennt. Bei der zweiten Aktion wird zusätzlich die Soundbar eingeschaltet.

Dasselbe habe ich bei meinem über den Harmony HUB gesteuertem TV. Die Fernbedienung sollte lauter, leiser und sowas können. Aber auch das geht nicht, da Sepia hier Probleme hat den Status zu ändern.

Ich kann also Sepia nicht beibringen zwischen verschiedenen Aktionen hin und her zu wechseln, bzw. ergibt sich hieraus meine eigentliche Frage, hat einer von euch beiden eine Idee wie ich das Sepia beibringen kann?

hartm11 commented 4 years ago

Hallo, ich bin auch "nur ein Anwender" und kenne mich mit openHAB nicht so aus. So wie ich Dein Problem verstehe, hast Du ein Gerät definiert, das "Fernseh gucken" heißt. Wenn es so ist, reicht der Befehl dann nicht aus, da daraus nicht hervor geht (aus SEPIA-Sicht): Soll ich das Gerät "Fernseh gucken" ein- oder ausschalten. Vom (einfachen) Prinzip versucht eine Sprachsteuerung den gesprochenen Satz audzudröseln in Ort, Gerät und Aktion. Der Rest wird dann weggelassen. Dann kommt folgendes ungefähr raus: Selbsdefiniertes Gerät: Glotze = TV "Schalte die Glotze im Wohnzimmer ein" -> Ort: Wohnzimmer, Gerät: TV, Aktion: ON Bei einem Gerät, das "Fernsehen gucken" heißt, (also dem TV zugeordnet) käme dann folgendes raus: "Ich möchte Fernsehen gucken im Wohnzimmer" -> Ort: Wohnzimmer, Gerät: TV, Aktion: ????

Versuch es mal testweise mit "Fernsehen gucken einschalten". Wenn das funktioniert, hast Du zwar den Grund aber noch nicht die Lösung gefunden ;-)

Aktionen sind (sprachlich) überwiegend: "... einschalten", "... auf 22 Grad Celsius" oder "... auf 70%"

fquirin commented 4 years ago

In openHAB werden manche Things als String definiert. So zum Beispiel die ganzen Aktionen die man für den Harmony HUB anlegt. Diese Strings simulieren am Ende eine Fernbedienung, das Problem ist jetzt das Sepia diese Strings nicht als "Aktion" interpretieren kann. [...] Als Beispiel: Ich habe eine Aktion die sich "Fernsehen gucken" nennt und eine andere die sich "Film über Fernseher gucken" nennt. Bei der zweiten Aktion wird zusätzlich die Soundbar eingeschaltet.

Hi, also ich bin nicht sicher ob ich das Setup ganz richtig verstanden habe, aber generell ist SEPIA erstmal egal wie deine openHAB Geräte/Things/Items/etc. heißen, das kannst du in SEPIA (oder über die openHAB "sepia-..." tags) frei neu definieren. Wichtig ist nur, dass das openHAB "Thing" was du steuern willst einen Kanal hat der als "Item" (channels -> linkedItems) Befehle empfangen kann. Ist "Fernsehen gucken" ein "Item"?

Smarthome-Creator commented 4 years ago

@fquirin , das ist leider genau die Krux an der ganzen Sache. Der Harmony HUB simuliert einfach gesagt eine universal Fernbedienung. Diese wird in openHAB als "String" angelegt.

Als Beispiel: Die Aktion "TV gucken" beinhaltet das einschalten des Fernsehers und das auswählen der input source "TV".

Die Aktion "PS4 spielen" würde die Abfolge TV einschalten - Soundbar einschalten - HDMI Source der PS4 auswählen beinhalten.

Den Harmony HUB braucht man quasi um nicht Smarthome fähige Geräte "smart" zu machen.

Und ich glaube genau diese "Strings" kann Sepia eben nicht auflösen. Wenn ich versuche im Smarthome Hub eben so eine Aktion zu erstellen und diese testen zu wollen bekomme ich dann eine Fehlermeldung ( cannot switch device state due to unknown old state... ). Um es also kurz zu beschreiben kann Sepia die emulierte Fernbedienung nicht ansteuern da Sepia den "State Type" nicht erkennen kann.

Jetzt ist halt einfach nur die Frage ob man diesen State Type noch mit einbauen kann oder ob wir hier an eine technische Grenze gelangt sind?

fquirin commented 4 years ago

Ist der Harmony HUB als "Item" in openHAB eingerichtet? Kannst du über das REST Interface von openHAB besagte Befehle auslösen?

Jetzt ist halt einfach nur die Frage ob man diesen State Type noch mit einbauen kann oder ob wir hier an eine technische Grenze gelangt sind?

Wenn openHAB es steuern kann, dann kann es auch SEPIA (via openHAB) ... behaupte ich jetzt einfach mal ;-) Falls besagte Strings die "state" Befehle sind für das Harmony "Item" dann kriegen wir das über das Feld "Custom Config" hin im SEPIA HUB.

Smarthome-Creator commented 4 years ago

Na du fragst mich ja Sachen... ich habe keine Ahnung wie man das macht. Google hilft mir da leider auch nicht weiter. Irgendwas mit curl... riesen Befehl hinten dran und trortdem keine ordentliche Erläuterung wie man das macht und wo man das überhaupt reintippen soll. Das ist chinesisch für mich.

Aber erstmal kann ich sagen ja der Harmony Hub ist als Item eingerichtet.

Update: Ich habe jetzt zumindest rausgefunden wie das mit dem steuern über die REST API funktionieren würde und konnte das zumindest mit meinem Homeserver testen aber wie ich den Befehl bearbeiten muss damit das mit dem String der Fernbedienung klappt liegt mir fern. Ich habe dir jetzt einfach mal den REST API Auszug angehangen, vielleicht kannst du da ja schon mehr rauslesen als ich.

{"link":"http://192.168.0.25:8080/rest/items/HarmonyHub_","state":"NULL","stateDescription":{"pattern":"%s","readOnly":false,"options":[{"value":"PowerOff","label":"PowerOff"},{"value":"Fernsehen gucken","label":"Fernsehen gucken"},{"value":"Film über Fernseher gucken","label":"Film über Fernseher gucken"},{"value":"PS3 spielen","label":"PS3 spielen"},{"value":"PS4 spielen","label":"PS4 spielen"},{"value":"SHIELD TV spielen","label":"SHIELD TV spielen"},{"value":"Film auf PS3 gucken","label":"Film auf PS3 gucken"},{"value":"Film auf SHIELD TV gucken","label":"Film auf SHIELD TV gucken"},{"value":"Film auf PS4 gucken","label":"Film auf PS4 gucken"}]},"commandDescription":{"commandOptions":[{"command":"PowerOff","label":"PowerOff"},{"command":"Fernsehen gucken","label":"Fernsehen gucken"},{"command":"Film über Fernseher gucken","label":"Film über Fernseher gucken"},{"command":"PS3 spielen","label":"PS3 spielen"},{"command":"PS4 spielen","label":"PS4 spielen"},{"command":"SHIELD TV spielen","label":"SHIELD TV spielen"},{"command":"Film auf PS3 gucken","label":"Film auf PS3 gucken"},{"command":"Film auf SHIELD TV gucken","label":"Film auf SHIELD TV gucken"},{"command":"Film auf PS4 gucken","label":"Film auf PS4 gucken"}]},"editable":true,"type":"String","name":"HarmonyHub_","label":"Fernbedienung","tags":["sepia-room\u003dlivingroom","sepia-state-type\u003d","sepia-type\u003dtv","sepia-name\u003dHarmonyFB"],"groupNames":[]}

fquirin commented 4 years ago

Genau was ich brauchte :-) Ich habe eine Idee, die vielleicht klappen könnte. Versuch mal folgenden Befehl über die Teach-UI zu speichern:

Smart device: <tv>;;HarmonyFB Action: <set> Room: <livingroom> (optional) Value: {"type":"text_raw","value":"Fernsehen gucken"}

image

P.S.: wir sollten ein neues Issue dafür erstellen ^^

hartm11 commented 4 years ago

Meinst Du das geht? Was für ein Wert wird dann unter Action übertragen? --Diese Nachricht wurde von meinem Android Mobiltelefon mit WEB.DE Mail gesendet.Am 22.06.20, 21:55 schrieb Florian Quirin notifications@github.com:

Genau was ich brauchte :-) Ich habe eine Idee, die vielleicht klappen könnte. Versuch mal folgenden Befehl über die Teach-UI zu speichern: Smart device: ;;HarmonyFB Action: Value: {"type":"text_raw","value":"Fernsehen gucken"}

—You are receiving this because you modified the open/close state.Reply to this email directly, view it on GitHub, or unsubscribe.

fquirin commented 4 years ago

Meinst Du das geht? Was für ein Wert wird dann unter Action übertragen?

Der Wert für "Action" is fast egal in diesem Fall ("on" und "set" sollten auf jeden Fall gehen, eventuell sogar "off"), da er von Value überschrieben wird. Wenn ich die Daten des REST Endpoints richtig interpretiere empfängt das Harmony "Item" die Strings als value und der SEPIA Befehl sendet dann value="Fernsehen gucken".

fquirin commented 4 years ago

Fortsetzung des Harmony Themas: https://github.com/SEPIA-Framework/sepia-docs/issues/53