Shelly plus 1
Moderator: seppy
-
- Beiträge: 7
- Registriert: 5. Mär 2020 20:51
Re: Shelly plus 1
Danke für den Beitrag.
Das schalten und die Rückmeldung meines Shelly PLus 1 PM funktioniert jetzt perfekt mittels MQTT und openhab 3.3 M1
Was ich noch nicht verstehe wie ich die Energiewerte aus dem Shelly auslesen kann.
Hat das schon jemand gelöst.
Danke und Grüße
Ingo
Das schalten und die Rückmeldung meines Shelly PLus 1 PM funktioniert jetzt perfekt mittels MQTT und openhab 3.3 M1
Was ich noch nicht verstehe wie ich die Energiewerte aus dem Shelly auslesen kann.
Hat das schon jemand gelöst.
Danke und Grüße
Ingo
- udo1toni
- Beiträge: 14829
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Shelly plus 1
Ja, das ist einfach. Es gibt ein Status Topic, in dem ein JSON Objekt ausgeliefert wird. Dieses JSON Objekt kannst Du mittels JSONPATH abfragen. Wahlweise kannst Du nur ein einzelnes Datum aus dem Objekt verwenden, dann packst Du das JSONPATH Statement einfach in die stateTransformation und definierst den Channel mutmaßlich als Number.
Oder Dich interessieren mehrere Werte aus dem JSON Objekt, dann nimmst Du einen String Channel und verlinkst diesen auf mehrere Number Items (eines pro Datum) und nutzt als Profile JSONPATH mit individuell unterschiedlichen Pfaden zu den einzelnen Daten.
In beiden Fällen muss natürlich JSONPATH als Addon installiert sein.
Oder Dich interessieren mehrere Werte aus dem JSON Objekt, dann nimmst Du einen String Channel und verlinkst diesen auf mehrere Number Items (eines pro Datum) und nutzt als Profile JSONPATH mit individuell unterschiedlichen Pfaden zu den einzelnen Daten.
In beiden Fällen muss natürlich JSONPATH als Addon installiert sein.
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet
-
- Beiträge: 7
- Registriert: 5. Mär 2020 20:51
Re: Shelly plus 1
Hallo, ich habe mich vielleicht nicht ganz klar ausgedrückt.
Das parsen der JSON Objekte ist klar. Problematisch ist dass nicht alle notwendigen Objekte mittel MQTT immer übertragen werden.
z.B. nach dem Einschalten kommt nachfolgende Nachricht über MQTT an
{"src":"shellyplus1pm-3c610579c2e0","dst":"shelly/shellyplus1pm-3c610579c2e0/events","method":"NotifyStatus","params":{"ts":1645184842.15,"switch:0":{"id":0,"output":true,"source":"WS_in"}}}
der Wert für output verschwindet aber nach einiger Zeit und das JSON parsing in openhab wirft permanent Fehler das output nicht gefunden wird.
Jetzt möchte ich aber auch gerne Spannung, Energieverbrauch usw auslesen, das kommt aber auch nicht immer alles
Mit "http://192.168.yyy.xxx/rpc/Switch.GetStatus?id=0" bekomme ich die Werte geliefert, aber nur über die http Anfrage und nicht via MQTT. Das müsste dann ggf über eine rule gemacht werden, finde ich aber nicht so chic
{"id":0, "source":"WS_in", "output":true, "apower":0.0, "voltage":223.0, "current":0.000, "aenergy":{"total":0.000,"by_minute":[0.000,0.000,0.000],"minute_ts":1645184253},"temperature":{"tC":39.7, "tF":103.5}}
Und das shelly Binding in openHab unterstützt aktuell die plus Modelle nicht. Also in Summe funktioniert nur Ein/Aus
Das parsen der JSON Objekte ist klar. Problematisch ist dass nicht alle notwendigen Objekte mittel MQTT immer übertragen werden.
z.B. nach dem Einschalten kommt nachfolgende Nachricht über MQTT an
{"src":"shellyplus1pm-3c610579c2e0","dst":"shelly/shellyplus1pm-3c610579c2e0/events","method":"NotifyStatus","params":{"ts":1645184842.15,"switch:0":{"id":0,"output":true,"source":"WS_in"}}}
der Wert für output verschwindet aber nach einiger Zeit und das JSON parsing in openhab wirft permanent Fehler das output nicht gefunden wird.
Jetzt möchte ich aber auch gerne Spannung, Energieverbrauch usw auslesen, das kommt aber auch nicht immer alles
Mit "http://192.168.yyy.xxx/rpc/Switch.GetStatus?id=0" bekomme ich die Werte geliefert, aber nur über die http Anfrage und nicht via MQTT. Das müsste dann ggf über eine rule gemacht werden, finde ich aber nicht so chic
{"id":0, "source":"WS_in", "output":true, "apower":0.0, "voltage":223.0, "current":0.000, "aenergy":{"total":0.000,"by_minute":[0.000,0.000,0.000],"minute_ts":1645184253},"temperature":{"tC":39.7, "tF":103.5}}
Und das shelly Binding in openHab unterstützt aktuell die plus Modelle nicht. Also in Summe funktioniert nur Ein/Aus
-
- Beiträge: 596
- Registriert: 20. Sep 2019 05:49
Re: Shelly plus 1
Hallo,
hiermit bekomme ich alle Channels, die mir wichtig sind:
Leider liefert der Shelly einige Werte nur sehr sporadisch.
Spannung z.B. nur beim Aktivieren (kann damit zusammenhängen, das wir hier eine sehr stabile Spannung haben?)
Die Temperatur kommt auch nur sehr sporadisch und wenn, macht sie gleich einen gehörigen Sprung.
Ich dachte, das die Werte bei Änderungen immer per MQTT übertragen werden, dem scheint nicht so zu sein.
Nachtrag: Du kannst auch am Shelly in den Einstellungen das "Generic MQTT" aktivieren und nutzt dann das
State-Topic
Da kommt regelmäßig folgende Info:
hiermit bekomme ich alle Channels, die mir wichtig sind:
Code: Alles auswählen
UID: mqtt:topic:01144906ea:shellyplus1pm-7c87ce637f30
label: Shelly Plus 1PM
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:01144906ea
location: Test
channels:
- id: test_temperatur
channelTypeUID: mqtt:number
label: Temperatur
description: null
configuration:
stateTopic: shellyplus1pm-7c87ce637f30/events/rpc
transformationPattern: JSONPATH:$.params.switch:0.temperature.tC
- id: test_leistung
channelTypeUID: mqtt:number
label: Leistung
description: null
configuration:
stateTopic: shellyplus1pm-7c87ce637f30/events/rpc
transformationPattern: JSONPATH:$.params.switch:0.apower
- id: test_spannung
channelTypeUID: mqtt:number
label: Spannung
description: null
configuration:
stateTopic: shellyplus1pm-7c87ce637f30/events/rpc
transformationPattern: JSONPATH:$.params.switch:0.voltage
- id: test_ip
channelTypeUID: mqtt:string
label: IP
description: null
configuration:
stateTopic: shellyplus1pm-7c87ce637f30/events/rpc
transformationPattern: JSONPATH:$.params.wifi.sta_ip
- id: test_switch
channelTypeUID: mqtt:switch
label: Relais
description: null
configuration:
commandTopic: shellyplus1pm-7c87ce637f30/rpc
formatBeforePublish: '{"id": 0, "src": "shellyplus1pm-7c87ce637f30",
"method":"Switch.Set", "params":{"id":0,"on":%s}}'
stateTopic: shellyplus1pm-7c87ce637f30/events/rpc
transformationPattern: JSONPATH:$.params.switch:0.output
off: "false"
on: "true"
- id: test_rueck
channelTypeUID: mqtt:string
label: Status
description: null
configuration:
stateTopic: shellyplus1pm-7c87ce637f30/events/rpc
transformationPattern: JSONPATH:$.params.switch:0.aenergy.by_minute[0]
- id: test_strom
channelTypeUID: mqtt:number
label: Strom
description: null
configuration:
stateTopic: shellyplus1pm-7c87ce637f30/events/rpc
transformationPattern: JSONPATH:$.params.switch:0.current
- id: test_verbrauch
channelTypeUID: mqtt:number
label: Gesamtverbrauch
description: null
configuration:
stateTopic: shellyplus1pm-7c87ce637f30/events/rpc
transformationPattern: JSONPATH:$.params.switch:0.aenergy.total
- id: test_input
channelTypeUID: mqtt:switch
label: Eingang
description: null
configuration:
stateTopic: shellyplus1pm-7c87ce637f30/events/rpc
transformationPattern: JSONPATH:$.params.input:0.state
off: "false"
on: "true"
Spannung z.B. nur beim Aktivieren (kann damit zusammenhängen, das wir hier eine sehr stabile Spannung haben?)
Die Temperatur kommt auch nur sehr sporadisch und wenn, macht sie gleich einen gehörigen Sprung.
Ich dachte, das die Werte bei Änderungen immer per MQTT übertragen werden, dem scheint nicht so zu sein.
Nachtrag: Du kannst auch am Shelly in den Einstellungen das "Generic MQTT" aktivieren und nutzt dann das
State-Topic
Code: Alles auswählen
shellyplus1pm-xxxxxxxxx/status/switch:0
Code: Alles auswählen
{
"id" : 0,
"source" : "WS_in",
"output" : true,
"apower" : 0.0,
"voltage" : 225.2,
"current" : 0.0,
"aenergy" : {
"total" : 0.0,
"by_minute" : [ 0.0, 0.0, 0.0 ],
"minute_ts" : 1643400340
},
"temperature" : {
"tC" : 49.2,
"tF" : 120.6
}
}
Zuletzt geändert von violine21 am 19. Feb 2022 12:36, insgesamt 1-mal geändert.
- udo1toni
- Beiträge: 14829
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Shelly plus 1
Ja, das mit dem dynamischen Inhalt ist etwas tricky. In diesem Fall musst Du leider zwei Transformation Services miteinander verbinden, und zwar REGEX und JSONPATH. Dazu musst Du beide Transformations hintereinander schreiben und mit dem Zeichen ∩ verbinden. Das Zeichen steht im Hilfstext zur incoming Value Transformation, es steht nicht auf der gewöhnlichen Tastatur zur Verfügung, und in der Windows Zeichentabelle gibt es mindestens zwei Symbole, die fast exakt gleich aussehen (es aber natürlich nicht sind).
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet
-
- Beiträge: 2
- Registriert: 19. Mär 2022 16:50
Re: Shelly plus 1
Danke für Eure umfangreiche Darstellung der neuen Shelly Gen2 MQTT Lösung. Bei meinem Shelly Plus1PM funktiniert das Schalten perfekt. Leider schaffe ich es die Werte aus dem JSONPATH nicht auszulesen. Bei der http Abfrage (http://192.xxx.xxx.xx/rpc/Switch.GetStatus?id=0) bekomme ich alles angezeigt.
Ich habe für die Incoming Value Transformations unterschiedliche Einstellungen versucht:
1. JSONPATH:$.apower
2. JSONPATH:$.params.switch:0.apower
Leider ist das Ergebnis immer nur NULL.
Ich habe für die Incoming Value Transformations unterschiedliche Einstellungen versucht:
1. JSONPATH:$.apower
2. JSONPATH:$.params.switch:0.apower
Leider ist das Ergebnis immer nur NULL.
-
- Beiträge: 2
- Registriert: 19. Mär 2022 16:50
Re: Shelly plus 1 Gelöst
Habe nach 3 Tagen jetzt meinen Fehler gefunden.
formatBeforePublish: '{"id": 0, "src": "shellyplus1pm-xxxxxxxxx",
"method":"Switch.Set", "params":{"id":0,"on":%s}}'
Hatte hier einen Tippfehler. Das wirkt sich nicht zwingend auf das Schalten des Shelly aus, aber sehr wohl auf die JSONPATH Werte.
Warte auf das neue Binding
formatBeforePublish: '{"id": 0, "src": "shellyplus1pm-xxxxxxxxx",
"method":"Switch.Set", "params":{"id":0,"on":%s}}'
Hatte hier einen Tippfehler. Das wirkt sich nicht zwingend auf das Schalten des Shelly aus, aber sehr wohl auf die JSONPATH Werte.
Warte auf das neue Binding
- udo1toni
- Beiträge: 14829
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Shelly plus 1
Hmm... formatBeforePublish ist aber die Senderichtung. Auf den Empfang hat das definitiv keinerlei Einfluss.
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet
-
- Beiträge: 17
- Registriert: 30. Okt 2019 18:54
Re: Shelly plus 1
Hallo zusammen irgend wie stehe ich auf dem Schlauch ich würde gerne mein Shelly 1pm per Mqtt steuern an aus mit Feedback und die Leistung auslesen. Nun versuche ich das Thing mit folgenden channel anzulegen aber die Syntax ist falsch kann mir einer helfen?
Code: Alles auswählen
Type switch : sPM1_Terasse "Decke" [stateTopic="shellyplus1pm-d4d4da082310/status/switch:0", formatBeforePublish=""src":"chan_1","method":"Switch.Set", "params":{"id":0,"on":%s}", commandTopic="shellyplus1pm-d4d4da082310/rpc", transformationPattern="JSONPATH:$.params.switch:0.output off: "false" on: "true"", postCommand= true]
- udo1toni
- Beiträge: 14829
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Shelly plus 1
Hättste mal den Thread gelesen...
Die Zeile ist so verkehrt, dass ich mich frage, wie weit vorne ich anfangen muss...
Vermutlich sollte der Channel so aussehen (kannst Du auch in einer Zeile schreiben, so kann man aber einigermaßen gut erkennen, was Schlüsselworte und Parameternamen, und was die eigentlichen Parameterwerte sind.
Ganz wichtig: Jeder Parameterwert, der nicht rein numerisch ist, muss in Anführungszeichen stehen. das gilt hier also für alle Parameterwerte.
In welcher Reihenfolge die Paramter angegeben werden (alles zwischen den eckigen Klammern) ist egal, ich versuche aber immer, die Parameter passend zu gruppieren, hier also zuerst die Empfangsseite (stateTopic + transformationPattern), dann die Sendeseite (commandTopic + formatBeforePublish), zum Schluss die richtungsunabhängigen Parameter off und on)
Beim Parameter formatBeforePublish ist ganz wichtig, dass der angegebene String selbst ebenfalls Anführungszeichen enthält. Damit diese nicht als Ende des Parameterwertes erkannt werden, müssen sie escaped werden, das passiert mit dem Backslash. Jedes Anführungszeichen im angegebenen JSON Objekt muss also so geschrieben werden \" , nicht einfach so ". Jedes einzelne, ohne Ausnahme.
Alle Parameter werden durch ein Komma vom Vorgänger getrennt. Leerzeichen und Zeilenumbrüche sind hingegen optional.
Zwischen Parametername und Parameterwert steht ein Gleichheitszeichen.
Im transformationPattern kommt der Teilstring "switch:0" vor. Ich bin mir nicht sicher, ob das so in der Syntax erlaubt ist. Falls Du keinen gültigen Status empfangen kannst, kannst Du stattdessen auch transformationPattern="JSONPATH:$.params["switch:0"]output" versuchen.
Ob die Konfiguration so tatsächlich korrekt ist, kann ich nicht sagen, da ich keine Shelly im Einsatz habe - hätte ich welche, wäre meine erste Amtshandlung, sie auf Tasmota umzuflashen, die MQTT Schnittstelle ist seit der Version 2 (?) eine Zumutung.
Ursprünglich war das mal einigermaßen menschenfreundlich gestaltet und dann wurde es kaputt optimiert.
Tasmota Thing (einfache Schaltsteckdose):
Und das war's. Es kann so einfach sein... Und selbstverständlich steht auf Wunsch auch ein JSON mit dem vollständigen Status zur Verfügung...
Die Zeile ist so verkehrt, dass ich mich frage, wie weit vorne ich anfangen muss...
Vermutlich sollte der Channel so aussehen (kannst Du auch in einer Zeile schreiben, so kann man aber einigermaßen gut erkennen, was Schlüsselworte und Parameternamen, und was die eigentlichen Parameterwerte sind.
Code: Alles auswählen
Type switch : sPM1_Terasse "Decke" [
stateTopic="shellyplus1pm-d4d4da082310/status/switch:0",
transformationPattern="JSONPATH:$.params.switch:0.output"
commandTopic="shellyplus1pm-d4d4da082310/rpc",
formatBeforePublish="{\"src\": \"chan_1\", \"method\": \"Switch.Set\", \"params\": {\"id\": 0,\"on\":\"%s\"}}",
off="false",
on="true"
]
In welcher Reihenfolge die Paramter angegeben werden (alles zwischen den eckigen Klammern) ist egal, ich versuche aber immer, die Parameter passend zu gruppieren, hier also zuerst die Empfangsseite (stateTopic + transformationPattern), dann die Sendeseite (commandTopic + formatBeforePublish), zum Schluss die richtungsunabhängigen Parameter off und on)
Beim Parameter formatBeforePublish ist ganz wichtig, dass der angegebene String selbst ebenfalls Anführungszeichen enthält. Damit diese nicht als Ende des Parameterwertes erkannt werden, müssen sie escaped werden, das passiert mit dem Backslash. Jedes Anführungszeichen im angegebenen JSON Objekt muss also so geschrieben werden \" , nicht einfach so ". Jedes einzelne, ohne Ausnahme.
Alle Parameter werden durch ein Komma vom Vorgänger getrennt. Leerzeichen und Zeilenumbrüche sind hingegen optional.
Zwischen Parametername und Parameterwert steht ein Gleichheitszeichen.
Im transformationPattern kommt der Teilstring "switch:0" vor. Ich bin mir nicht sicher, ob das so in der Syntax erlaubt ist. Falls Du keinen gültigen Status empfangen kannst, kannst Du stattdessen auch transformationPattern="JSONPATH:$.params["switch:0"]output" versuchen.
Ob die Konfiguration so tatsächlich korrekt ist, kann ich nicht sagen, da ich keine Shelly im Einsatz habe - hätte ich welche, wäre meine erste Amtshandlung, sie auf Tasmota umzuflashen, die MQTT Schnittstelle ist seit der Version 2 (?) eine Zumutung.
Ursprünglich war das mal einigermaßen menschenfreundlich gestaltet und dann wurde es kaputt optimiert.
Tasmota Thing (einfache Schaltsteckdose):
Code: Alles auswählen
Type switch : ch1 "Schalter" [ stateTopic="stat/meinDevice/POWER",commandTopic="cmnd/meinDevice/POWER"]
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet