Shelly Pro 3EM => Einbindung via MQTT ???

Geflasht oder ungeflasht ...

Moderator: seppy

Tourentiger
Beiträge: 7
Registriert: 5. Mär 2023 17:46
Answers: 0

Shelly Pro 3EM => Einbindung via MQTT ???

Beitrag von Tourentiger »

Hallo miteinander,
ich habe seit kurzem einen Shelly Pro 3EM im Einsatz. nun möchte ich diesen in openhab integrieren. Da das Shelly-Binding den Pro 3EM zwar erkennt, jedoch nicht unterstütz, bleibt nur der Weg über MQTT. Hierbei benötige ich Hilfe:

Auf einem Raspi ist openhab 3.4.2 sowie der Mosqitto-MQTT-Server istalliert.
Der Shelly Pro 3EM ist in der Verteilung installiert, ans LAN angeschlossen, MQTT aktiviert und verbunden. Über die IP-Adresse kann ich drauf zugreifen und mir die Website mit den aktuellen Werten anzeigen lassen.

nun das ganze in Openhab versucht zu integrieren:

1. MQTT-Broker (Mosquitto) hinzugefügt
Erscheint grün und online bei den Things

2. Generic-MQTT-Thing hinzugefügt
Als Quelle den MQTT-Broker angegen, erscheint grün und online bei den Things

3. Channels im Generic-MQTT-Thing definieren
An dieser Stelle benötige ich Hilfe :roll:
Hier möchte ich mir die aktuelle Leistung in Watt anzeigen lassen, für L1, L2, L3. Soweit ich das verstanden habe benötige ich dafür jeweils einen Channel. So das insgesamt 3 Channels zu definieren sind. Nur wie?

Wenn ich mit MQTTfx mich verbinde und spionieren gehe, sehe ich verschiedne Topics und dahinter wiederum Werte.
Beim ersten sichten der Werte würde L1 dem Wert "a_act_power", L2 dem Wert "b_act_power" und L3 dem Wert "c_act_power" entsprechen.

Wie komme ich an dieser Stelle zu den korrekten Einträgen für die Channels?

Vielen Dank schon einmal für eure Bemühungen

LG Sebastian
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Shelly Pro 3EM => Einbindung via MQTT ???

Beitrag von udo1toni »

Da es hier nur ums Lesen von Werten geht und diese alle in einem JSON Objekt geliefert werden, reicht Dir tatsächlich ein Channel vom Typ string.

Aber zunächst: Der Screenshot ist als Überblick zwar nett, besser wäre es aber gewesen, das konkrete Topic und die Payload als Text einzufügen:

Code: Alles auswählen

shellypro3em-c8f09e8972c4/status/em:0

Code: Alles auswählen

{
    "id": 0,
    "a_current": 0.828,
    "a_voltage": 236.6,
    "a_act_power": 146.5,
    "a_aprt_power": 195.8,
    "a_pf": -6.81,
    "b_current": 6.266,
    "b_voltage": 235.6,
    "b_act_power":26.1,
    "b_aprt_power": 62.4,
    "b_pf":-0.63,
    "c_current": 6.576,
    "c_voltage": 237.3,
    "c_act_power": 2.0,
    "c_aprt_power": 136.6,
    "c_pf": -0.50,
    "n_current": null,
    "total_current": 1.670,
    "total_act_power": 174.501,
    "total_aprt_power": 394.860,
    "user_calibrated_phase": []
}
Ein Glück gibt es Texterkennung :)
Die Formatierung kommt dann als Zuckerguss obendrauf, wenn man passende Werkzeuge nutzt ;)

Wie oben erwähnt, brauchst Du nur einen string Channel (Hier als Kind der nicht mit gelisteten Bridge definiert):

Code: Alles auswählen

     Thing topic shellypro3em "Shelly Pro 3 EM" @ "mqtt" [
         availabilityTopic="shellypro3em-c8f09e8972c4/online",
         payloadNotAvailable="offline",
         payloadAvailable= "online"
     ]{
        Channels:
            Type string : json "JSON Data" [ stateTopic= "shellypro3em-c8f09e8972c4/status/em:0" ]
      }
Die Payload für available und not available ist geraten, da musst Du schauen, was das Topic tatsächlich liefert :) Das Topic hingegen ließ sich aus dem Screenshot ersehen :) also in diesem Fall doch ganz praktisch.

Als Ergebnis hast Du nun jedenfalls einen string Channel mit dem Namen json, nehmen wir an, die Bridge hört auf den Namen mosquitto, kannst Du nun verschiedene Items mit diesem Channel koppeln:

Code: Alles auswählen

Number SP3emL1curr    "L1 Strom"        {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.a_current"]}
Number SP3emL1volt    "L1 Spannung"     {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.a_voltage"]}
Number SP3emL1actp    "L1 Leistung"     {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.a_act_power"]}
Number SP3emL1prtr    "L1 Leistung2"    {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.a_aprt_power"]}
Number SP3emL1pf      "L1 Power Factor" {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.a_pf"]}
Number SP3emL2curr    "L2 Strom"        {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.b_current"]}
Number SP3emL2volt    "L2 Spannung"     {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.b_voltage"]}
Number SP3emL2actp    "L2 Leistung"     {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.b_act_power"]}
Number SP3emL2prtr    "L2 Leistung2"    {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.b_aprt_power"]}
Number SP3emL2pf      "L2 Power Factor" {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.b_pf"]}
Number SP3emL3curr    "L3 Strom"        {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.c_current"]}
Number SP3emL3volt    "L3 Spannung"     {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.c_voltage"]}
Number SP3emL3actp    "L3 Leistung"     {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.c_act_power"]}
Number SP3emL3prtr    "L3 Leistung2"    {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.c_aprt_power"]}
Number SP3emL3pf      "L3 Power Factor" {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.c_pf"]}
Number SP3emCurrTotal "Strom gesamt"    {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.total_current"]}
Number SP3emActPTotal "Leistung gesamt" {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.total_act_power"]}
Number SP3emAptPTotal "Leistung2 geamt" {channel="mqtt:topic:mosquitto:shellypro3em:json"[profile="transform:JSONPATH",function="$.total_aprt_power"]}
Die Notation ist für *.items Dateien, daraus kannst Du aber sehr gut erkennen, wie das Ganze nun abläuft, Du kannst die Konfiguration auch direkt über die Main UI vornehmen.
Voraussetzung ist natürlich, dass die JSONPATH Transformation installiert ist.
Die Items sind alle mit dem selben Channel verknüpft, der einzige Unterschied besteht im jsonpath, der im Link gesetzt ist.

Zu bemerken ist noch, dass Du so nackte Zahlen bekommst, es fehlt also die konkrete Einheit. Die Alternative wäre, jeweils das identische Topic als stateTopic in achtzehn number Channels zu setzen, jsonpath als incoming transformation zu nutzen und über den zusätzlichen Parameter unit die jeweils korrekte Einheit zu setzen. Dann kannst Du UoM Items verknüpfen, ohne weitere Angaben im Link. Für die reine Anzeige spielt UoM erst mal keine große Rolle, man kann die Einheit auch manuell ergänzen, interessnt wird UoM, wenn man Einheiten ineinander umrechnen will...
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet

Tourentiger
Beiträge: 7
Registriert: 5. Mär 2023 17:46
Answers: 0

Re: Shelly Pro 3EM => Einbindung via MQTT ???

Beitrag von Tourentiger »

Lieber Udo1Toni,

Danke für die ausführliche Antwort. Ich werde versuchen es nachzuvollziehen. Da ich mich jedoch erst seit ca. 3 Wochen mit openHab
auseinandersetze werde ich sicherlich öfter nachfragen müssen. :oops:

Eine erste Frage habe ich schon nach dem lesen Deiner Antwort. Wo wird der von dir erwähnte
brauchst Du nur einen string Channel (Hier als Kind der nicht mit gelisteten Bridge definiert)
eingefügt ? Auf der Bridge oder im Generic Thing?

So sieht aktuell der Code der Bridge aus:

Code: Alles auswählen

UID: mqtt:broker:5f5af93f20
label: MQTT_Mosquitto
thingTypeUID: mqtt:broker
configuration:
  lwtQos: 0
  publickeypin: true
  clientid: 1e04eb93-a756-4ccf-b72f-9964afb310c9
  keepAlive: 60
  hostnameValidated: true
  birthRetain: true
  secure: false
  certificatepin: true
  shutdownRetain: false
  password: XXXX
  protocol: TCP
  qos: 0
  reconnectTime: 60000
  port: 1883
  mqttVersion: V3
  host: 192.168.178.5
  lwtRetain: true
  enableDiscovery: true
  username: mqttuser
So sieht aktuell der Code des Generic-Thing aus:

Code: Alles auswählen

UID: mqtt:topic:5f5af93f20:2786feca29
label: Shelly_Pro_3EM
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:5f5af93f20
Insofern der String-Channel dann richtig gesetzt bzw. eingebunden ist, kann ich dann daraus/darauf Items verlinken, wenn ich es richtig
verstanden habe . :roll: Die JSONPATH Transformation habe ich installiert.

LG

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

Re: Shelly Pro 3EM => Einbindung via MQTT ???

Beitrag von udo1toni »

Du kannst einfach ein generic mqtt Thing erzeugen, mit der Bridge verbinden und im dem Thing den string Channel anlegen.
Ich nutze gerne die Schreibweise, wie sie in den *.things Dateien verwendet wird. Dort wäre die Bridge gewöhnlich ein Element oberhalb des Things, deshalb die verwirrende Randbemerkung :)
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet

Tourentiger
Beiträge: 7
Registriert: 5. Mär 2023 17:46
Answers: 0

Re: Shelly Pro 3EM => Einbindung via MQTT ???

Beitrag von Tourentiger »

Guten Abend Udo1Toni,

grundsätzlich kann ich Dir folgen, jedoch im Detail hapert es dann.

Ich habe wie von dir angeregt ein Generic-MQTT-Thing angelegt. Anschließend versucht im Generic-MQTT-Thing einen Channel zu definieren. und auf ein Item zu verlinken. Das ganze habe ich mehrmals versucht ohne Erfolgt ... :oops:

Daher an dieser Stelle meine Bitte / Frage, ob Du den 2 Post vorher von mir geposteten Code der Bridge bzw. des Generic-MQTT-Thing einmal kontrollieren, ggf. korrigiren und musterhaft einen Channel mit Item ergänzen kannst, z.B. Aktuelle Power L1 [a_act_power] . So das ich eine Vorlage zum erarbeiten des Restes habe ?

LG

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

Re: Shelly Pro 3EM => Einbindung via MQTT ???

Beitrag von udo1toni »

Code: Alles auswählen

UID: mqtt:topic:5f5af93f20:2786feca29
label: Shelly_Pro_3EM
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:5f5af93f20
channels:
  - id: json
    channelTypeUID: mqtt:string
    label: JSON Data
    description: ""
    configuration:
      stateTopic: shellypro3em-c8f09e8972c4/status/em:0
So sollte das aussehen. Du kannst auch einfach den Part ab dem Schlüsselwort channels: kopieren und in der Code-Ansicht einfügen, das sollte funktionieren.

Für die Items gibt es leider keine Textansicht, allerdings sollte es möglich sein, die Liste als Text zu importieren (natürlich musst Du dann die ChannelUID anpassen - oder Du legst gleich eine neue Bridge an, die eine sinnvollere ID hat, und ein Thing, welches ebenfalls eine sinnvolle ID hat. Die von openHAB generierten alphanumerischen Zeichenketten sind ausgewürfelt, damit es keine Doppelungen gibt. Man kann aber jederzeit beim Anlegen eine andere ID setzen (bitte immer mit einem Buchstaben beginnen und ausschließlich die Zeichen des englischen Alphabets sowie die arabischen Ziffern verwenden)
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet

Tourentiger
Beiträge: 7
Registriert: 5. Mär 2023 17:46
Answers: 0

Re: Shelly Pro 3EM => Einbindung via MQTT ???

Beitrag von Tourentiger »

Vielen Dank, das hat soweit geklappt. Hab mir einfach meherere Generische MQTT-Things angelegt und den entsprechenden Datenstrom via Jasonpath eingebunden. Zum Visualisieren völlig ausreichend. Der jeweilige Datenstrom übertrögt ja die Werte ohne Einheit. Nun Wollte ich das ganze etwas händisch aufhübschen. Dazu wollte ich die Metadaten ergänzen => Add Metadate => State Description. Hier bei Pattern den Wert " %2f W" eingegeben. Es erfolgt keine Veränderung bzw. Anzeige des "W" . Ist das normal bzw. woran kann das liegen? Oder gibt es einen andere Lösung?

LG

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

Re: Shelly Pro 3EM => Einbindung via MQTT ???

Beitrag von violine21 »

Tourentiger hat geschrieben: 27. Mär 2023 17:06 " %2f W" eingegeben. Es erfolgt keine Veränderung bzw. Anzeige des "W"
Da fehlt ein Punkt.

Code: Alles auswählen

%.2f W

Tourentiger
Beiträge: 7
Registriert: 5. Mär 2023 17:46
Answers: 0

Re: Shelly Pro 3EM => Einbindung via MQTT ???

Beitrag von Tourentiger »

violine21 hat geschrieben: 27. Mär 2023 18:06
Tourentiger hat geschrieben: 27. Mär 2023 17:06 " %2f W" eingegeben. Es erfolgt keine Veränderung bzw. Anzeige des "W"
Da fehlt ein Punkt.

Code: Alles auswählen

%.2f W
Das habe ich bereits mehrfach kontrolliert. Auch mit " . " . Ändert nix. Werte werden nach wie vor ohne " W " angezeigt . :shock:

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

Re: Shelly Pro 3EM => Einbindung via MQTT ???

Beitrag von udo1toni »

Ich denke, Du erwartest, dass die Anzeige in der Liste der Items geändert ist.
Das Pattern für die State Description wirkt nur in den Pages der Main UI oder in den Sitemaps der Basic UI.

Wenn Du in der Administrationsansicht überall die Einheit mit angegeben haben willst, musst Du leider für jeden Wert einen eigenen number Channel anlegen und die Transformation direkt im Channel mit angeben.
Bei einem number Channel gibt es unter den Advanced Options auch ein Feld Unit, über das Du dann die Einheit angibst (also hier "W").
Anschließend musst Du ein Number:Energy Item mit dem Channel verknüpfen, welches dann automatisch die Einheit mitführt.
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet

Antworten