shelly Plug per MQTT

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

shelly Plug per MQTT

Beitrag von Snatsch »

Habe mir einen Shelly Plug S Gen3 angeschafft um wenigstens den Stromverbrauch von meiner Infrarotheizung messen zu können. Da er mit dem Shelly Binding sich nicht in openhab einbinden lassen hat habe ich es mit MQTT probiert. Ich kann ihn in openhab schalten und sehe auch den aktuellen Verbrauch nur den Gesamt Verbrauch bekomme ich irgend wie nicht hin.

Code: Alles auswählen

UID: mqtt:topic:MQTTBroker:InfHBad
label: Infrarotheizung Badezimmer
thingTypeUID: mqtt:topic
configuration:
  transformationPattern:
    - JSONPATH:$.status
bridgeUID: mqtt:broker:MQTTBroker
location: Badezimmer
channels:
  - id: Betrieb
    channelTypeUID: mqtt:switch
    label: Betrieb
    description: Betrieb (on/off)
    configuration:
      commandTopic: shellyplugsg3-b08184a5b870/command/switch:0
      transformationPatternOut:
        - MAP:config:map:shellystate
      transformationPattern:
        - JSONPATH:$.output
      stateTopic: shellyplugsg3-b08184a5b870/status/switch:0
      off: "false"
      on: "true"
  - id: GesamtPower
    channelTypeUID: mqtt:number
    label: Gesamt Power
    description: Power in kWh
    configuration:
      unit: kWh
      formatBeforePublish: "%.4f kWh"
      stateTopic: shellyplugsg3-b08184a5b870/status/switch:0
      transformationPattern:
        - JSONPATH:$.aenergy
  - id: Power
    channelTypeUID: mqtt:number
    label: Power
    description: Power in Watt
    configuration:
      unit: W
      formatBeforePublish: "%.4f W"
      transformationPattern:
        - JSONPATH:$.apower
      stateTopic: shellyplugsg3-b08184a5b870/status/switch:0
vielleicht jemand einen Tipp was ich falsch mache.
Screenshot (74).png
im Log kommen auch wenn sich der Wert ändert diese Warnmeldungen

Code: Alles auswählen

2025-01-23 19:11:32.920 [WARN ] [ab.binding.mqtt.generic.ChannelState] - Command '{total=1986.911, by_minute=[8508.81,8301.278,8301.278], minute_ts=1737655860}' from channel 'mqtt:topic:MQTTBroker:InfHBad:GesamtPower' not supported by type 'NumberValue': Character array is missing "e" notation exponential mark.
2025-01-23 19:11:32.920 [WARN ] [ofiles.JSonPathTransformationProfile] - Could not transform state '0 W' with function 'JSONPATH:$.apower' and format '%s'
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: shelly Plug per MQTT

Beitrag von Snatsch »

Jetzt habe ich es zwar hinbekommen das ich die Werte Gesamt Verbrauch und aktueller Verbrauch in openhab angezeigt bekomme doch bekomme ich im Log immer diese Warnmeldungen mit den ich nichts anfangen kann

Code: Alles auswählen

2025-01-24 16:35:00.056 [WARN ] [ofiles.JSonPathTransformationProfile] - Could not transform state '0 W' with function 'JSONPATH:$.apower' and format '%s'
2025-01-24 16:35:00.056 [WARN ] [ofiles.JSonPathTransformationProfile] - Could not transform state '3549.834 Wh' with function 'JSONPATH:$.aenergy.total' and format '%s'
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: shelly Plug per MQTT

Beitrag von Harka »

Moin,
prüfe mal bitte, ob das Profil auf Standart eingestellt ist. Den Fehler kann ich reproduzieren, wenn ich dort auch noch mal jsonpath genutzt wird.

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: shelly Plug per MQTT

Beitrag von Snatsch »

genau so war es :) vielen Dank
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: shelly Plug per MQTT

Beitrag von Snatsch »

Könnte Hilfe bei einer Rule gebrauchen ;) Da es jetzt klappt mit den Auslesen der Werte über MQTT wollte ich mit einer Rule mir die Werte für Tag, Monat u.s.w anzeigen lassen. Mit udo1toni seiner Hilfe hab ich das auch schon für meine Waschmaschine gemacht. Habe die Rule auf die Items umgeschrieben aber irgendwie kommen keine Werte an.

Code: Alles auswählen

rule "Infrarotheizung Tag Woche Monat Jahr"
when
    Item Infrarotheizung_Badezimmer_Gesamt_Power changed
then
    logInfo("Infrarotheizung", "Regel ausgelöst: Infrarotheizung_Badezimmer_Gesamt_Power hat sich geändert")
    val Preis = 0.481 
    val ZonedDateTime zdt = ZonedDateTime.now() // jetzt
    val ZonedDateTime start_of_day = zdt.with(LocalTime.MIDNIGHT) // heute, Mitternacht
    val ZonedDateTime start_of_week = start_of_day.minusDays(start_of_day.getDayOfWeek.getValue - 1) // Montag
    val ZonedDateTime start_of_month = start_of_day.withDayOfMonth(1) // Erster Tag des Monats (1)
    val ZonedDateTime start_of_year = start_of_day.withDayOfYear(24) // Erster Tag des Jahres läuft seit 24.01.2025
    
    val Heizung_Heute_Wh = if(Infrarotheizung_Badezimmer_Gesamt_Power.deltaSince(start_of_day) as Number != null) (Infrarotheizung_Badezimmer_Gesamt_Power.deltaSince(start_of_day) as Number).doubleValue() else 0.0 // Wh Delta holen
    val Heizung_Woche_Wh = if(Infrarotheizung_Badezimmer_Gesamt_Power.deltaSince(start_of_week) as Number != null) (Infrarotheizung_Badezimmer_Gesamt_Power.deltaSince(start_of_week) as Number).doubleValue() else 0.0
    val Heizung_Monat_Wh = if(Infrarotheizung_Badezimmer_Gesamt_Power.deltaSince(start_of_month) as Number != null) (Infrarotheizung_Badezimmer_Gesamt_Power.deltaSince(start_of_month) as Number).doubleValue() else 0.0
    val Heizung_Jahr_Wh = if(Infrarotheizung_Badezimmer_Gesamt_Power.deltaSince(start_of_year) as Number != null) (Infrarotheizung_Badezimmer_Gesamt_Power.deltaSince(start_of_year) as Number).doubleValue() else 0.0
    
    logInfo("Infrarotheizung", "Heizung_Heute_Wh: " + Heizung_Heute_Wh)
    logInfo("Infrarotheizung", "Heizung_Woche_Wh: " + Heizung_Woche_Wh)
    logInfo("Infrarotheizung", "Heizung_Monat_Wh: " + Heizung_Monat_Wh)
    logInfo("Infrarotheizung", "Heizung_Jahr_Wh: " + Heizung_Jahr_Wh)
    
    val Heizung_Heute_kWh = Heizung_Heute_Wh / 1000 // Umrechnung in kWh
    val Heizung_Woche_kWh = Heizung_Woche_Wh / 1000
    val Heizung_Monat_kWh = Heizung_Monat_Wh / 1000
    val Heizung_Jahr_kWh = Heizung_Jahr_Wh / 1000
    
    logInfo("Infrarotheizung", "Heizung_Heute_kWh: " + Heizung_Heute_kWh)
    logInfo("Infrarotheizung", "Heizung_Woche_kWh: " + Heizung_Woche_kWh)
    logInfo("Infrarotheizung", "Heizung_Monat_kWh: " + Heizung_Monat_kWh)
    logInfo("Infrarotheizung", "Heizung_Jahr_kWh: " + Heizung_Jahr_kWh)
    
    val Euro_Heute = String::format("%.2f €", (Heizung_Heute_kWh * Preis)) // Summe in Euro berechnen
    val Euro_Woche = String::format("%.2f €", (Heizung_Woche_kWh * Preis))
    val Euro_Monat = String::format("%.2f €", (Heizung_Monat_kWh * Preis))
    val Euro_Jahr = String::format("%.2f €", (Heizung_Jahr_kWh * Preis))
    
    InfHBad_Heute.postUpdate(Heizung_Heute_kWh.toString + " kWh/" +  Euro_Heute)
    InfHBad_Woche.postUpdate(Heizung_Woche_kWh.toString + " kWh/" +  Euro_Woche)
    InfHBad_Monat.postUpdate(Heizung_Monat_kWh.toString + " kWh/" +  Euro_Monat)
    InfHBad_Jahr.postUpdate(Heizung_Jahr_kWh.toString + " kWh/" +  Euro_Jahr)
end

und die Items die ich angelegt habe

Code: Alles auswählen

Group InfHeizung 
String InfHBad_Heute "infHBad Heute" <energy> (InfHeizung)
String InfHBad_Woche "infHBad Woche" <energy> (InfHeizung)
String InfHBad_Monat "infHBad Monat" <energy> (InfHeizung)
String InfHBad_Jahr "infHBad Jahr" <energy> (InfHeizung)
Die Ausgabe vom Item " Infrarotheizung_Badezimmer_Gesamt_Power" sind in Wh
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

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

Re: shelly Plug per MQTT

Beitrag von udo1toni »

So macht man das aber nicht mehr...

1. Wenn Du ein generic mqtt Thing anlegst, kannst Du dort bei number Channels den PArameter unit setzen. Dieser muss zu dem gelieferten Messwert passen, also z.B. Wh
2. das zugehörige Item definierst Du dann passend (für Wh wäre es Number:Energy). Außerdem kannst Du im Item in den Metadaten ebenfalls die unit setzen. Sie bestimmt, in welcher Einheit der Wert im Status gehalten wird. Das hat auch Einfluss auf die Persistence, denn die Persistence kennt keine Units, entsprechend werden Zahlen als Zahlen gespeichert und beim Wiedereinlesen werden sie mit der unit des Items beaufschlagt.
3. Weiterhin gibt es das stateDescription pattern, welches die Anzeige des Items innerhalb eines Widgets beeinflusst. dort kannst Du z.B. "%.1f kWh" rein schreiben, um den Wert in kWh angezeigt zu bekommen. Diese Konfiguration kannst Du jederzeit nach Herzenslust ändern, meinetwegen in Mcal (Megakalorien) oder Ws oder was auch immer, openHAB wird den Wert immer vollautomatisch korrekt umrechnen.
4. Das gleiche kannst Du für die vier Summierer konfigurieren, also nicht String, sondern Number:Energy, und dafür schreibst Du nur den ermittelten Wert ins Item -gemeinsam mit der Unit, oder aber ohne Unit, dann aber mit der für das Item festgelegten Unit (siehe 2.)

Da Du lauter Werte aus der Persistence beziehst, wirst Du warten müssen, bis der abgefragte Zeitraum auch Daten liefert.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: shelly Plug per MQTT

Beitrag von Snatsch »

Herzlichen Glückwunsch zum 15000 Beitrag :)
Meine Thing Datei sieht so aus

Code: Alles auswählen

UID: mqtt:topic:MQTTBroker:InfHBad
label: Infrarotheizung Badezimmer
thingTypeUID: mqtt:topic
configuration:
  transformationPattern:
    - JSONPATH:$.status
bridgeUID: mqtt:broker:MQTTBroker
location: Badezimmer
channels:
  - id: Betrieb
    channelTypeUID: mqtt:switch
    label: Betrieb
    description: Betrieb (on/off)
    configuration:
      commandTopic: shellyplugsg3-b08184a5b870/command/switch:0
      transformationPatternOut:
        - MAP:config:map:shellystate
      stateTopic: shellyplugsg3-b08184a5b870/status/switch:0
      transformationPattern:
        - JSONPATH:$.output
      off: "false"
      on: "true"
  - id: GesamtPower
    channelTypeUID: mqtt:number
    label: Gesamt Power
    description: Power in kWh
    configuration:
      unit: Wh
      formatBeforePublish: "%.4f Wh"
      stateTopic: shellyplugsg3-b08184a5b870/status/switch:0
      transformationPattern:
        - JSONPATH:$.aenergy.total
  - id: Power
    channelTypeUID: mqtt:number
    label: Power
    description: Power in Watt
    configuration:
      unit: W
      formatBeforePublish: "%.4f W"
      stateTopic: shellyplugsg3-b08184a5b870/status/switch:0
      transformationPattern:
        - JSONPATH:$.apower

das Item habe ich mit Plattern geändert das mir kWh angezeigt werden
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

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

Re: shelly Plug per MQTT

Beitrag von udo1toni »

formatBeforePublish ist ausschließlich für die Senderichtung in mqtt da, sprich, da gehört bei Sensoren (read only...) gar nichts rein. :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten