Shelly Verbrauchswerte Speichern

Geflasht oder ungeflasht ...

Moderator: seppy

Antworten
Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Shelly Verbrauchswerte Speichern

Beitrag von udo1toni »

KellerK1nd hat geschrieben:Verstehe auch nicht warum die die Werte verlieren. Rein technisch ergibt das keinen Sinn.

Doch, das ergibt durchaus sehr viel Sinn (wenn es auch im Zusammenhang mit fw-Updates vermeidbar wäre).
Die „Zählerstände“ werden nur mi RAM gehalten. Würde jedes Mal ins EEPROM (aka Flash) geschrieben, wäre der entsprechende Flash Speicher nach wenigen Stunden Müll. Die Geräte sollen aber durchaus einige Jahre halten (eben lange genug, dass nur wenige Kunden unzufrieden sind, aber kurz genug, dass die Kunden immer wieder kaufen…)
Bei einem geplanten Neustart (wie bei einem fw-Update) könnte das Gerät natürlich einmalig den Zählerstand speichern. Aber bei einem Stromausfall funktioniert das nicht.

Toll wäre eine Option, den Zählerstand von außen zu setzen, dann könnte openHAB sich darum kümmern, dass nach einem Neustart - aus welchem Grund auch immer - der letzte Zählerstand geladen wird.


Gesendet von iPad mit Tapatalk
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
KellerK1nd
Beiträge: 432
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Re: Shelly Verbrauchswerte Speichern

Beitrag von KellerK1nd »

udo1toni hat geschrieben: 2. Nov 2021 17:00
KellerK1nd hat geschrieben:Verstehe auch nicht warum die die Werte verlieren. Rein technisch ergibt das keinen Sinn.

Doch, das ergibt durchaus sehr viel Sinn (wenn es auch im Zusammenhang mit fw-Updates vermeidbar wäre).
Die „Zählerstände“ werden nur mi RAM gehalten. Würde jedes Mal ins EEPROM (aka Flash) geschrieben, wäre der entsprechende Flash Speicher nach wenigen Stunden Müll. Die Geräte sollen aber durchaus einige Jahre halten (eben lange genug, dass nur wenige Kunden unzufrieden sind, aber kurz genug, dass die Kunden immer wieder kaufen…)
Bei einem geplanten Neustart (wie bei einem fw-Update) könnte das Gerät natürlich einmalig den Zählerstand speichern. Aber bei einem Stromausfall funktioniert das nicht.

Toll wäre eine Option, den Zählerstand von außen zu setzen, dann könnte openHAB sich darum kümmern, dass nach einem Neustart - aus welchem Grund auch immer - der letzte Zählerstand geladen wird.


Gesendet von iPad mit Tapatalk
Ist ein Aspekt. Bei Homematic und Fritz!Box übernimmt ja die "Bridge" die Speicherung der Werte. Cool wäre so etwas bei den Shelly Produkten, das man einen Server als Bridge einsetzt und da alle Werte gespeichert werden. openhab verbindet sich dann mit dieser Bridge und man hätte diese "Probleme" nicht.
Betriebssystem: Proxmox 7.3-4
openHAB Container: debian11 LXC
openHAB Version: 3.4
Hardware: HomeServer Eigenbau mit einem Intel i5 9600K
Smarthome-Equipment:
- Rasperrymatic
- deConz
- HUE
- Shellys
- Mosquitto
- AVM Fritz!Box

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

Re: Shelly Verbrauchswerte Speichern

Beitrag von udo1toni »

Wie gesagt... der Zähler ist der originale vom Shelly, und der wird halt bei Stromausfall zurückgesetzt. Gewöhnlich wird man in openHAB eine entsprechende Regel bauen, nach der Art: speichere immer die Differenz zwischen aktuellem und letztem Wert. Falls der aktuelle Wert kleiner als der letzte Wert ist, speichere stattdessen den aktuellen Wert.
Damit hat man dann jeweils den aufgelaufenen Verbrauch zwischen den beiden letzten Messungen, und die Einzelwerte kann man wiederum aufaddieren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Boby
Beiträge: 14
Registriert: 20. Okt 2021 22:22

Re: Shelly Verbrauchswerte Speichern

Beitrag von Boby »

Hi,
habe jetzt endlich Zeit gefunden - und das hier zusammengebastelt. Muss noch beobachten, ob es auch funktioniert wie es soll.
Hier ein Beispiel für einen Wert inkl. der Rule, die ich laufen habe:

Shelly Item für aktuelle Watt:
Itemname = ShellyTVWohnzimmer_Watt
Label = "Verbrauch Watt TV (Shelly)"

Shelly Item für kWh (wie von Shelly angeliefert):
Itemname = ShellyTVWohnzimmer_kWh
Label = "Verbrauch kWh TV (Shelly)"
--> gehört in Gruppe gShellyConsumption

Shelly Item kWh kummuliert (wird in OH mit der Rule aggregiert):
Itemname = ShellyTVWohnzimmer_kWh_kummuliert
Label = "Verbrauch kWh TV (kummuliert)"
--> gehört in Gruppe gShellykWh

Code: Alles auswählen

// Berechne den Shelly-kWh-Verbrauch (alle 60 Minuten) basierend auf den kWh-Werten der Shelly
// Gruppe mit Consumption Member
val ConsumptionMembers = gShellyConsumption.members
logInfo("ShellykWh", "Es gibt " + ConsumptionMembers.size + " Member in der Consumption Gruppe.")
gShellykWh.members.forEach[i|
  val iSource = gShellyConsumption.members.filter[j|j.name.split("_").get(0) == i.name.split("_").get(0)].head
  val Number nDelta = (iSource.deltaSince(now.minusMinutes(60)).floatValue) / 60000
  logInfo("ShellykWh", "Quell member: " + iSource.name + ", Ziel member: " + i.name + ", Delta: " + nDelta + ", before update: " + i.state)
  // Wenn Delta größer Null ist, dann dazuzählen - sonst nicht; damit wird das Reset der kWh-Werte beim FW-Upgrade abgefangen
  if (nDelta > 0)
  {
    // Sonderfall: Wenn das Ziel-Member = NULL, dann auf 0 setzen, sonst kann das Delta nicht addiert werden
    if (i.state == NULL)
    { 
      i.postUpdate(0 as Number)
    }
    // Delta dazurechnen
    i.postUpdate((i.state as Number) + nDelta)
  }
]  

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Shelly Verbrauchswerte Speichern

Beitrag von PeterA »

Hi Boby,

ist diese Rule für OpebHab 3.X oder 2.X geschrieben ?
(Hier läuft noch 2.4)

Hier Exemplarisch die Items von einem Shelly 2.5:

Code: Alles auswählen

Number           Shellyswitch25_745118_energy        "Shelly2501energy [%.0f W*min]"                                                                    
Number           Shellyswitch25_745118_kWh           "Shelly2501energy [%.2f kWh]"
Dann müsste das Item "_energy" in die "gShellyConsumption" Gruppe ?
Und das Item "_kWh" in die "gShellykWh" Gruppe ?

Bisher hab ich das einfach "So" Berechnen lassen:

Code: Alles auswählen

rule "Shelly25_01 kWh"

when
Item Shellyswitch25_745118_energy received update 
then
Shellyswitch25_745118_kWh.postUpdate(Shellyswitch25_745118_energy.state as DecimalType / 60000)
end
Und da ist natürlich bei einem FW Update oder Reboot alles weg.

Gruß Peter
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Shelly Verbrauchswerte Speichern

Beitrag von PeterA »

So,

habe das mal so gebaut:

Code: Alles auswählen

rule "Shellies25 kWh aggregation"

when 
Item Shellyswitch25_745118_energy received update or 
Item Shellyswitch25_E66E4E_energy received update or 
Item Shellyswitch25_740A26_energy received update or 
Item Shellyswitch25_00B713_energy received update or 
Item Shellyswitch25_E58F7A_energy received update or
Item Shellyswitch25_00B12B_energy received update    
then
// Berechne den Shelly-kWh-Verbrauch basierend auf den kWh-Werten der Shelly
// Gruppe mit Consumption Member
val ConsumptionMembers = gShellyConsumption.members // Gruppe mit Consumption Member
logInfo("ShellykWh", "Es gibt " + ConsumptionMembers.size + " Member in der Consumption Gruppe.")
  gShellykWh.members.forEach[i|
  val iSource = gShellyConsumption.members.filter[j|j.name.split("_").get(0) == i.name.split("_").get(0)].head
  val Number nDelta = (iSource.deltaSince(now.minusMinutes(60)).floatValue) / 60000
  logInfo("ShellykWh", "Quell member: " + iSource.name + ", Ziel member: " + i.name + ", Delta: " + nDelta + ", before update: " + i.state)
  // Wenn Delta größer Null ist, dann dazuzählen - sonst nicht; damit wird das Reset der kWh-Werte beim FW-Upgrade abgefangen
  if (nDelta > 0)
  {
    // Sonderfall: Wenn das Ziel-Member = NULL, dann auf 0 setzen, sonst kann das Delta nicht addiert werden
    if (i.state == NULL)
    { 
      i.postUpdate(0 as Number)
    }
    // Delta dazurechnen
    i.postUpdate((i.state as Number) + nDelta)
  }
]  
end
Im Log kommt nun diese Meldung:

Code: Alles auswählen

2021-12-03 14:21:53.178 [INFO ] [pse.smarthome.model.script.ShellykWh] - Es gibt 6 Member in der Consumption Gruppe.

2021-12-03 14:21:53.201 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Shellies25 kWh aggregation': cannot invoke method public float org.eclipse.smarthome.core.library.types.DecimalType.floatValue() on null
Was hab ich übersehen ?
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Shelly Verbrauchswerte Speichern

Beitrag von PeterA »

hier noch mal:

Code: Alles auswählen

2021-12-03 15:09:07.502 [vent.ItemStateChangedEvent] - Shellyswitch25_E66E4E_energy changed from 39308 to 39313


==> /var/log/openhab2/openhab.log <==

2021-12-03 15:09:07.533 [INFO ] [pse.smarthome.model.script.ShellykWh] - Es gibt 6 Member in der Consumption Gruppe.

2021-12-03 15:09:07.583 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Shellies25 kWh aggregation': cannot invoke method public float org.eclipse.smarthome.core.library.types.DecimalType.floatValue() on null
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Shelly Verbrauchswerte Speichern

Beitrag von PeterA »

Update:

Scheint doch zu funktionieren:

Code: Alles auswählen

2021-12-03 17:22:34.923 [INFO ] [pse.smarthome.model.script.ShellykWh] - Es gibt 6 Member in der Consumption Gruppe.

2021-12-03 17:22:34.954 [INFO ] [pse.smarthome.model.script.ShellykWh] - Quell member: Shellyswitch25_745118_energy, Ziel member: Shellyswitch25_745118_kWh, Delta: 0.0, before update: 0.01966667

2021-12-03 17:22:34.984 [INFO ] [pse.smarthome.model.script.ShellykWh] - Quell member: Shellyswitch25_745118_energy, Ziel member: Shellyswitch25_E66E4E_kWh, Delta: 0.0, before update: 0.65495000

2021-12-03 17:22:35.013 [INFO ] [pse.smarthome.model.script.ShellykWh] - Quell member: Shellyswitch25_745118_energy, Ziel member: Shellyswitch25_740A26_kWh, Delta: 0.0, before update: 1.62088333

2021-12-03 17:22:35.032 [INFO ] [pse.smarthome.model.script.ShellykWh] - Quell member: Shellyswitch25_745118_energy, Ziel member: Shellyswitch25_00B713_kWh, Delta: 0.0, before update: 1.62606667

2021-12-03 17:22:35.048 [INFO ] [pse.smarthome.model.script.ShellykWh] - Quell member: Shellyswitch25_745118_energy, Ziel member: Shellyswitch25_E58F7A_kWh, Delta: 0.0, before update: 1.83806667

2021-12-03 17:22:35.063 [INFO ] [pse.smarthome.model.script.ShellykWh] - Quell member: Shellyswitch25_745118_energy, Ziel member: Shellyswitch25_00B12B_kWh, Delta: 0.0, before update: 0.92098333
Ich hatte für die "_energy" zunächst keine Persistence... somit konnten auch erst mal eine Daten geholt werden.
- OpenHab 2.4
#PWRUP

Boby
Beiträge: 14
Registriert: 20. Okt 2021 22:22

Re: Shelly Verbrauchswerte Speichern

Beitrag von Boby »

Hallo Peter,
ich habe OH3.2 laufen - die Rules sollten aber auch so funktionieren.

- Die Quell-Werte der kWh (kommend von der Shelly) gehören in die Gruppe gShellyConsumption
- Die Zielwerte (ich hab' sie kWh_kummuliert genannt) gehören in die Gruppe gShellykWh

Dann einfach diese Rule verwenden:

Code: Alles auswählen

// Berechne den Shelly-kWh-Verbrauch (alle 15 Minuten) basierend auf den kWh-Werten der Shelly
// Gruppe mit Consumption Member
val ConsumptionMembers = gShellyConsumption.members
logInfo("ShellykWh", "Es gibt " + ConsumptionMembers.size + " Member in der Consumption Gruppe.")
gShellykWh.members.forEach[i|
  val iSource = gShellyConsumption.members.filter[j|j.name.split("_").get(0) == i.name.split("_").get(0)].head
  val Number nDelta = (iSource.deltaSince(now.minusMinutes(15)).floatValue)
  logInfo("ShellykWh", "Quell member: " + iSource.name + ", Ziel member: " + i.name + ", Delta: " + nDelta + ", before update: " + i.state)
  // Wenn Delta größer Null ist, dann dazuzählen - sonst nicht; damit wird das Reset der kWh-Werte beim FW-Upgrade abgefangen
  if (nDelta > 0)
  {
    // Delta dazurechnen
    i.postUpdate((i.state as Number) + nDelta)
  }
]
Wichtig ist das IF - denn damit wird abgefangen, dass im Falle eines FW-Updates nicht wieder die Werte herunterrasseln.
Auch noch wichtig: Wenn man - so wie hier - die kWh-Werte abgreift, ist das /60000 nicht notwendig bzw. verfälscht die Ergebnisse.
Meine Rule funktioniert unter OH3.2 wie oben abgebildet & endlich habe ich fortlaufende kWh-Werte auch wenn die Shelly mal wieder alles vergisst...
2021-12-03 19_25_16-Verbrauch kummuliert 24.0 kWh und 2 weitere Seiten - Persönlich – Microsoft​ Edg.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Shelly Verbrauchswerte Speichern

Beitrag von PeterA »

Hallo Boby,

vielen Dank für Deine Antwort.
Wie gesagt die Fehlermeldung kam an der fehlenden Persistence für das "_energy" Item.

So läufts jetzt bei mir:

Code: Alles auswählen

rule "Shellies25 kWh aggregation"

when
    Member of gShellyConsumption changed
then
// Berechne den Shelly-kWh-Verbrauch basierend auf den kWh-Werten der Shelly
// Gruppe mit Consumption Member
val ConsumptionMembers = gShellyConsumption.members // Gruppe mit Consumption Member
logInfo("ShellykWh", "Es gibt " + ConsumptionMembers.size + " Member in der Consumption Gruppe.")
  gShellykWh.members.forEach[i|
  val iSource = gShellyConsumption.members.filter[j|j.name.split("_").get(0) == i.name.split("_").get(0)].head
  val Number nDelta = (iSource.deltaSince(now.minusMinutes(15)).floatValue) / 60000
  logInfo("ShellykWh", "Quell member: " + iSource.name + ", Ziel member: " + i.name + ", Delta: " + nDelta + ", before update: " + i.state)
  // Wenn Delta größer Null ist, dann dazuzählen - sonst nicht; damit wird das Reset der kWh-Werte beim FW-Upgrade abgefangen
  if (nDelta > 0)
  {
    // Sonderfall: Wenn das Ziel-Member = NULL, dann auf 0 setzen, sonst kann das Delta nicht addiert werden
    if (i.state == NULL)
    { 
      i.postUpdate(0 as Number)
    }
    // Delta dazurechnen
    i.postUpdate((i.state as Number) + nDelta)
  }
]  
end
- OpenHab 2.4
#PWRUP

Antworten