NEWS
Shelly-Geräte mit MQTT-Adapter steuern
-
@mickym
danke für die InfoIch habe nur noch eine Frage zur
command
-Syntax. Wenn ich beispielsweise dentarget_C
auf 22 Grad stellen will, was schreibe ich dann in dencommand
-Datenpunkt:target_C: 22 target_C = 22 target_C?value=22
-
@klausstoertebeker Nein es heißt
target_t
und nicht target_c und- zweitens ist das ein eigenter topic unter command - in dem Du nur die Zahl publishst.
Also unter
shellies/shellytrv-<id>/thermostat/0/command/target_t, also unter thermostat/0 machst Du ein Folder command und darunter ein Datenpunkt target_t und in den schreibst Du eine Zahl als Zieltemperatur.
In diesem Thread siehst Du dass target_t ein eigenes topic unter command ist:
Das gilt aber wie gesagt nur für Gen1 Geräte, nicht für Gen3 Geräte
-
@mickym
Moin moin mickym,
ich brauche nochmal Deine Hilfe. Ich möchte aus folgender JSON-formatierter Zeichenkette folgende Information extrahieren{ "src": "shellyplusi4-c4d8d554856c", "dst": "shellyplusi4-c4d8d554856c/events", "method": "NotifyEvent", "params": { "ts": 1742530641.42, "events": [ { "component": "input:2", "id": 2, "event": "single_push", "ts": 1742530641.42 } ] } }
folgende Information extrahieren:
wenn "events" vorhanden dann wenn "component" = "input:2" enthalten gib den Wert von "event" zurück.
Wie kann ich das mit dem JSON.parse() und/oder anderen JSON.xxxx machen? Ich möchte das in einen Datenpunkt von einem Alias packen, um den RPC-Event-Datenpunkt eines Shelly auszuwerten.Hintergrund ist, dass ich nicht nur feststellen will, ob eine Taste gedrückt wurde (hier Taste an "input:2"), sondern auch, um was für einen Tastendruck es sich gehandelt hat (zum Beispiel "einfach", "zweifach", "dreifach", "lang"...)
Wäre das dann vielleicht sowas wie
if(JSON.parse(JSON.parse(val).params.events).component == "input:2") JSON.parse(JSON.parse(val).params.events).event; "";
-
Ob das mit den events so gut ist, bezweifle ich mal - da das ein Array ist und wenn das event an anderer Stelle steht, dann schaust Du in die Röhre. Ich würde lieber bei Status schauen. "If" funktioniert in meinen Augen auch nicht.
So wie es momentan funktioniert wäre so:
JSON.parse(val).params.events[0].component === "input:2" ? JSON.parse(val).params.events[0].event : ""
Aber wie gesagt, dass geht nur wenn das event an 1. Stelle steht. Wenn das komplexer wird, würde ich doch lieber eine Logikamschine nehmen. So funktioniert es halt wenn das an erster Stelle im Array steht.
Die Frage ist halt - gibt es dennn unter status kein "input:2"
Wie gesagt, so funktioniert es zwar - aber ich würde immer den status erst abfragen, bevor ich auf events reagiere. Dann kannst Dir auch die Bedingung sparen, da unter status "input:2" auch nur dann aktualisiert wird, wenn getriggert.
-
Hallo mickym,
ich kann den Status eines "input:x" offenbar nur auswerten, wenn dieser als "Switch" konfiguriert ist. Dann bekomme ich über "JSON.parse(val).state" den aktuellen Schalterstatus ("true" oder "false").
Ich habe aber meine "input:x" als "Button" konfiguriert und wollte auch hier über die "JSON.parse(val).state" Funktion die Art des Tastendrucks auswerten. Aber offenbar ändert sich der "state" nicht, wenn der "input:x" als Button konfiguriert ist - der ist immer "null". Zumindest habe ich mir mal ein Skript geschieben, dass auf eine Statusänderung getriggert war. Aber das hat nie ausgelöst"...JSON.parse(val).params.events[0].component === "input:0" ? JSON.parse(val).params.events[0].event : ""
funktioniert prima, allerdings bekomme ich nun vom Javascript-Adapter ständig folgende Fehlermeldungen:
javascript.0 2025-03-23 18:32:00.161 error Invalid read function for "alias.0.Kueche_Deckenbeleuchtung_Hw-Schalter.Schalter": "JSON.parse(val).params.events[0].component === "input:1" ? JSON.parse(val).params.events[0].event : (null)" => Cannot read properties of undefined (reading '0')
Ich schätze aber mal, dass das damit zusammenhängt, dass nicht bei jedem Event auch die Attribute "component" und "event" enthalten sind, oder? Kann man diese Fehler irgendwie abfangen, indem man die read-Funktion anpasst?
-
@klausstoertebeker sagte in Shelly-Geräte mit MQTT-Adapter steuern:
Ich schätze aber mal, dass das damit zusammenhängt, dass nicht bei jedem Event auch die Attribute "component" und "event" enthalten sind, oder?
Ja - deswegen ist events auch ungeeignet. Du sollst unter status den Datenpunkt auswerten. Ein Button hat KEINEN Zustand - deswegen ist er in der Regel true. Das heißt hier prüft man nur auf Aktualisierung.
-
-
@klausstoertebeker und bei denn switches?
-
Ob die Switches an oder aus sind, siehst Du am Attribut "output": "true" = an...
Und ich muss Dir recht geben: Der Status der "input:x" wechselt von "null" auf "true", wenn er gedrückt wird - mea culpa! Vermutlich hat mein damaliges Skript nicht reagirt, weil ich nicht auf einen String sondern auf einen Boolean verglichen habe.Kann man diese Abfrage auch irgendwie in die Alias-read-Funktion packen? Vielleicht in der folgenden Art:
JSON.parse(mqtt.0.shellyplus2pm-d48afc7dbd1c.status.input:0).state === "true" ? JSON.parse(val).params.events[0].event : "null"
-
=== "true"
läßt Du einnfach weg.
Also so:
JSON.parse(mqtt.0.shellyplus2pm-d48afc7dbd1c.status.input:0).state ? JSON.parse(val).params.events[0].event : "null"
-
Habe ich gemacht, und ich erhalte jetzt folgenden Fehler:
javascript.0 2025-03-23 19:17:00.212 error Invalid read function for "alias.0.Wohnzimmer_Esstischlampe_Hw-Schalter.Taster": "JSON.parse(mqtt.0.shellyplus2pm-d48afc7dbd1c.status.input:0).state ? JSON.parse(val).params.events[0].event : "null"" => missing ) after argument list
-
@mickym sagte in Shelly-Geräte mit MQTT-Adapter steuern:
mqtt.0.shellyplus2pm-d48afc7dbd1c.status.input:0
Na ist ja auch ein Fehler. In dem parse muss ja auch val. Solange da bei state null ist, dann hilft Dir das nichts. Also ist der Datenpunkt so ungeeignet - dann musst halt doch mit dem Blockly arbeiten.