Seite 1 von 1

shelly Plug per MQTT

Verfasst: 23. Jan 2025 19:01
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'

Re: shelly Plug per MQTT

Verfasst: 24. Jan 2025 16:39
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'

Re: shelly Plug per MQTT

Verfasst: 24. Jan 2025 17:21
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.

Re: shelly Plug per MQTT

Verfasst: 24. Jan 2025 17:46
von Snatsch
genau so war es :) vielen Dank

Re: shelly Plug per MQTT

Verfasst: 24. Jan 2025 21:54
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

Re: shelly Plug per MQTT

Verfasst: 24. Jan 2025 22:22
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.

Re: shelly Plug per MQTT

Verfasst: 24. Jan 2025 22:29
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

Re: shelly Plug per MQTT

Verfasst: 25. Jan 2025 12:46
von udo1toni
formatBeforePublish ist ausschließlich für die Senderichtung in mqtt da, sprich, da gehört bei Sensoren (read only...) gar nichts rein. :)