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.
