Seite 1 von 3

ShellyPlus2PM frage nach MQTT Thing

Verfasst: 3. Feb 2025 21:48
von PeterA
Hallo zusammen,

ja auch ich bin nun dabei die 1st.GEN Shelly 2.5 gegen 2nd.GEN ShellyPlus2PM zu tauschen.
Wer hat denn hier das schon erfolgreich hinter sich gebracht ?
Im speziellen frage ich nach dem Syntax im thing für den "command" an den Shelly um von 0% bis 100% zu fahren.
Ich lese viel mit "format before publish" aber damit hab ich bei den alten Shelly nichts zu tun gehabt.

LG Peter

Re: ShellyPlus2PM frage nach MQTT Thing

Verfasst: 3. Feb 2025 22:38
von udo1toni
Wenn Du den Dimmer mit mqtt steuern willst, musst Du dafür rpc Aufrufe verwenden (rpc -> RemoteProcedureCall). Dafür gibt es das rpc Topic.
Und der Aufruf erfolgt mit einem JSON Objekt. Du musst das JSON Objekt passend vorbereiten, das geschieht mit formatBeforePublish.

Der letzte Thread dazu (meines Wissens) wäre dieser hier viewtopic.php?t=9308 und ich habe mit @runa letztes Wochenende noch etwas weiter an dem Thema gearbeitet, ist halt immer etwas tricky, wenn man die Hardware nicht selbst hat. Die API Dokumentation von Shelly ist zwar an vielen Stellen sehr detailliert, an anderen dann aber auch in sich widersprüchlich und ganz allgemein verschweigen sie auch einige Dinge.
Das A und O: alles, was der Shelly an Informationen raus rückt, kommt über ein Topic. Die Payload ist immer JSON, aber das JSON ist hochgradig dynamisch, es enthält diverse Informationen, aber eben immer nur einen Teil, was es dann auch schwer machen kann, das "richtige" JSON mit der passenden Rückmeldung zu erwischen, um z.B. herauszufinden, ob der Shelly gerade ein- oder ausgeschaltet wurde.
Das bedeutet leider auch, dass man bei jeder stateTransformation ein passendes REGEX voranstellen muss, um zu verhindern, dass der jeweilige Channel auf NULL wechselt, sobald ein anderes JSON vorbei schneit.

Re: ShellyPlus2PM frage nach MQTT Thing

Verfasst: 4. Feb 2025 06:22
von Harka

Re: ShellyPlus2PM frage nach MQTT Thing

Verfasst: 4. Feb 2025 13:27
von udo1toni
Soweit ich durch die API durchgestiegen bin, kann man aber den Dimmer nicht über separate command/status Topics steuern, sondern ausschließlich über rpc.

Re: ShellyPlus2PM frage nach MQTT Thing

Verfasst: 4. Feb 2025 17:14
von Harka

Re: ShellyPlus2PM frage nach MQTT Thing

Verfasst: 4. Feb 2025 21:11
von PeterA
udo1toni hat geschrieben: 30. Dez 2024 18:15
Das heißt, das commandTopic wird so aussehen: <topic_prefix>/command/<component:id>, wobei <topic_prefix> gerätespezifisch ist und <component:id> mutmaßlich light:0 bzw. light:1 heißt. Und dann wird es vermutlich Set als Topic geben, wobei dort dann eine JSON Payload hingeschickt werden muss:

Code: Alles auswählen

{"id":0,"brightness":<value>}
Diese Payload musst über formatBeforePublish erzeugt werden, <value> wird dabei durch ein %f ersetzt, also so:

Code: Alles auswählen

formatBeforePublish: '{"id":0,"brightness":%f}'
Weil die Payload selbst doppelte Anführungszeichen enthält, muss der String mit einfachen Anführungszeichen markiert werden.

In der Gegenrichtung sollte das stateTopic dann so aussehen: <topic_prefix>/status/<component:id>, sinngemäß wie oben.
Das Topic liefert dann ebenfalls ein JSON zurück, also braucht es ein passendes transformationPattern, so:

Code: Alles auswählen

transformationPattern: JSONPATH:$["light:0"].brightness
Wobei die API Doku hier ein konkretes Beispiel schuldig bleibt, es wäre also nicht ganz unwichtig, die echte gelieferte Payload mittels MQTT Explorer (oder einem ähnlichen Werkzeug) anzuschauen und den JSONPath notfalls erst mal anzupassen.
Da ich selbst keinen solchen Dimmer habe, ist der Pfad halt nur geraten :)
Der Dimmer hat nur einen Thing Channel (bzw. zwei, weil es ja ein Doppel-Dimmer ist)! Es gibt keinen extra Channel zum Ein- oder Ausschalten, das geschieht durch Helligkeit 0 bzw. 100 (oder eben den gewünschten Helligkeitswert)
Um dem ShellyPlus2PM im "Rollershutter" Modus die entsprechende Position 0 - 100 zu senden möchte er laut der Doku vermutlich den Payload auf "pos" haben.

Auszug aus der Doku:
https://shelly-api-docs.shelly.cloud/ge ... tt-control

Code: Alles auswählen

Accepted commands are:

status_update - causes the status of the corresponding component to be published on its <topic_prefix>/status/cover:<id> topic.
calibrate - starts calibration procedure.
open[,number] - opens the cover, optional duration parameter.
close[,number] - closes the cover, optional duration parameter.
stop - stops previously initiated movement.
pos,number - cover goes to position, required parameter.
rel,number - cover goes to relative position, required parameter.

Wie würde das denn im alten thing Code von OpenHab aussehen ?

So sieht das aktuell aus:

Code: Alles auswählen

Type rollershutter : Shellyswitch25_745118_roller   "Rolladen DG Flur"          [ stateTopic="shellies/shellyswitch25-745118/roller/0/pos", commandTopic="shellies/shellyswitch25-745118/roller/0/command/pos" ]
Uuund so ähnlich mit formatBeforePublish hab auch schon mal gearbeitet aber ich hab keine Ahnung wie ich das für den neuen Shelly abändern müsste.

Code: Alles auswählen

Type number : MaxDischargePower        "Maximale Inverter Leistung"        [ stateTopic="N/c0619ab2dc41/settings/0/Settings/CGwacs/CGwacs/MaxDischargePower", transformationPattern="JSONPATH:$.value", commandTopic="W/c0619ab2dc41/settings/0/Settings/CGwacs/MaxDischargePower", formatBeforePublish="{\"value\": %s}"]
LG Peter

Ps.: (Wir sollten dem Udo mal einen Shelly2PM spendieren) :)

Re: ShellyPlus2PM frage nach MQTT Thing

Verfasst: 4. Feb 2025 22:11
von udo1toni
PeterA hat geschrieben: 4. Feb 2025 21:11 Wir sollten dem Udo mal einen Shelly2PM spendieren
Bitte nicht! :) die Hardware ist bestimmt super, aber die Firmware ist Grütze.

Wenn ich richtig liege, sind sowohl der Shelly2PM als auch der Nachfolger Shelly 2.5 auf der Liste Tasmota-kompatibler Hardware.
Das größte "Problem" ist dabei der mit ~ 1,25 mm Rasterabstand eher ungewöhnliche Programmieranschluss - auf der anderen Seite muss man das Gerät nicht mal öffnen, wenn man den Adapter hat.

Re: ShellyPlus2PM frage nach MQTT Thing

Verfasst: 5. Feb 2025 21:34
von PeterA
Einen kleinen Schritt bin ich weiter: Den Status bzw. die Position vom Rollladen kommt in OpenHab an.
Aber das commandTopic bzw. die Position kommt nicht beim Shelly an:

Code: Alles auswählen

Type rollershutter : ShellyPlus2PM_c4d8d5517818_roller "Rollladen Test" [ stateTopic="shellyplus2pm-c4d8d5517818/status/cover:0", transformationPattern="JSONPATH:$.current_pos", commandTopic="shellyplus2pm-c4d8d5517818/rpc", formatBeforePublish="{ \"method\": \"Cover.GoToPosition\", \"params\": { \"id\": 0, \"position\": %s } }"]
Was übersehe ich ?

Re: ShellyPlus2PM frage nach MQTT Thing

Verfasst: 6. Feb 2025 17:57
von PeterA
FYI:

Ein User "schossel" aus der englischen Community hats zum laufen gebracht:

https://community.openhab.org/t/oh3-exa ... s/141143/5

Funktioniert hier auch!

EDIT: Funktioniert auf meinem Testsystem OpenHab 4.X

Auf meinem Produktivsystem (OH2.4) nicht.... war ja klar...

Gruß Peter

Re: ShellyPlus2PM frage nach MQTT Thing

Verfasst: 16. Feb 2025 21:01
von PeterA
Habe nun endlich durch viel Testen rausgefunden wie man dem Shelly die Rollladen Position via MQTT senden kann:
Screenshot 2025-02-16 205530.png
Der möchte einfach nur "pos,nummer" auf dem Topic "shellyid/command/cover:0 haben

Wie schreibe ich das in das formatBeforePublish= ?

Gruß Peter