Shelly plus 1

Geflasht oder ungeflasht ...

Moderator: seppy

ingo@hubaer.de
Beiträge: 7
Registriert: 5. Mär 2020 20:51
Answers: 0

Re: Shelly plus 1

Beitrag von ingo@hubaer.de »

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

Benutzeravatar
udo1toni
Beiträge: 14828
Registriert: 11. Apr 2018 18:05
Answers: 232
Wohnort: Darmstadt

Re: Shelly plus 1

Beitrag von udo1toni »

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.
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet

ingo@hubaer.de
Beiträge: 7
Registriert: 5. Mär 2020 20:51
Answers: 0

Re: Shelly plus 1

Beitrag von ingo@hubaer.de »

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

violine21
Beiträge: 596
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Shelly plus 1

Beitrag von violine21 »

Hallo,
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"
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

Code: Alles auswählen

shellyplus1pm-xxxxxxxxx/status/switch:0
Da kommt regelmäßig folgende Info:

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.

Benutzeravatar
udo1toni
Beiträge: 14828
Registriert: 11. Apr 2018 18:05
Answers: 232
Wohnort: Darmstadt

Re: Shelly plus 1

Beitrag von udo1toni »

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

dumbo
Beiträge: 2
Registriert: 19. Mär 2022 16:50
Answers: 0

Re: Shelly plus 1

Beitrag von dumbo »

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.

dumbo
Beiträge: 2
Registriert: 19. Mär 2022 16:50
Answers: 0

Re: Shelly plus 1 Gelöst

Beitrag von dumbo »

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 :D

Benutzeravatar
udo1toni
Beiträge: 14828
Registriert: 11. Apr 2018 18:05
Answers: 232
Wohnort: Darmstadt

Re: Shelly plus 1

Beitrag von udo1toni »

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

Ricotchet
Beiträge: 17
Registriert: 30. Okt 2019 18:54
Answers: 0

Re: Shelly plus 1

Beitrag von Ricotchet »

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]

Benutzeravatar
udo1toni
Beiträge: 14828
Registriert: 11. Apr 2018 18:05
Answers: 232
Wohnort: Darmstadt

Re: Shelly plus 1

Beitrag von udo1toni »

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.

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"
                                        ]

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):

Code: Alles auswählen

Type switch : ch1 "Schalter" [ stateTopic="stat/meinDevice/POWER",commandTopic="cmnd/meinDevice/POWER"] 
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...
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet

Antworten