Hallo in die Runde,
da mein Stromzähler "Itron ACE3000 Typ 260" leider nur den aktuellen Zählerstand in 0,1kWh Schritten an den IEC Sensor sendet, würde ich gerne die ungefähre aktuelle Leistung anhand der Statusänderungen vom Zählerstand berechnen.
Meine geplante Rechung wäre 360000 durch die Zeit zwischen der Statusänderung (in Sekunden) zu rechnen.
Hier mal ein paar Beispiele, anhand von meinen Daten:
10684,6 kWh 06:45:36 -> 10684,7 kWh 07:20:07 = 34:31 = 2071s -> 360000 / 2071 = 173,3 W/h
10684,7 kWh 07:20:07 -> 10684,8 kWh 08:03:17 = 43:10 = 2590s -> 360000 / 2590 = 139 W/h
10684,8 kWh 08:03:17 -> 10684,9 kWh 09:00:49 = 56:43 = 3452s -> 360000 / 3452 = 104,3 W/h
Hier ein Log von den Daten:
Soweit nun zu Theorie.
Hat einer von Euch eine Idee wie man sowas per Script programmieren könnte?
Die Werte von Timestamp und LastDPActionTime stimmen leider nicht mit den Statusänderungszeiten überein, diese zeigen nur die letzte Aktualisierung an.
Richtig schön wäre es, wenn auch nur die Zähleränderung um 0,1 ausgewertet würde, da der Stromzähler gelegenlich auch mal 0 bzw. Blödsinn sendet.
Zeit zwischen Statusänderung berechnen
Moderator: Co-Administratoren
-
- Beiträge: 544
- Registriert: 17.04.2021, 17:12
- System: CCU
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 123 Mal
Re: Zeit zwischen Statusänderung berechnen
Ich hab mal Deinen so beschriebenen Gedankenweg in HM-Script übertragen:
(je nach dem wie die Daten tatsächlich vorliegen muss noch etwas fine tuning gemacht werden )
Code: Alles auswählen
!angenommen, Daten liegen so vor
string zeit_alt = "08:03:17";
string zeit_akt = "09:00:49";
string S_kWh_alt = "10684,8";
string S_kWh_akt = "10684,9";
!umwandeln in Zahl
real kWh_alt = S_kWh_alt.Replace(",", ".").ToFloat();
real kWh_akt = S_kWh_akt.Replace(",", ".").ToFloat();
!Zeitdifferenz in Sekunden
integer sek_dif = (zeit_akt.ToTime() - zeit_alt.ToTime()).ToInteger();
!berechnen wenn Zähleränderung um 0,1
! dazu alles um Faktor 10 erhöhen
if (((kWh_akt * 10) - (kWh_alt * 10)) == 1.0)
{
WriteLine(sek_dif);
var Wh = (360000.000 / sek_dif).ToString(1);
WriteLine(Wh);
WriteLine(Wh.Type());
!oder zum weiterrechnen
real Wh = (360000.000 / sek_dif).ToString(1).ToFloat();
WriteLine(Wh);
WriteLine(Wh.Type());
}
Gruß
Harry
Harry
- Baxxy
- Beiträge: 10779
- Registriert: 18.12.2018, 15:45
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 604 Mal
- Danksagung erhalten: 2205 Mal
Re: Zeit zwischen Statusänderung berechnen
Hmm, normalerweise sendet der HM-ES-TX-WM (ist es doch, oder?) seine Werte immer im ~3 Minuten Raster.
Zumindest mach das meiner (FW: 1.2) mit ES-LED so.
Kann natürlich sein das der mit FW: 2.5 und ES-IEC nichts sendet wenn keine Änderung stattfand. Oder aber influx speichert nur geänderte Werte.
Ich würde das erstmal mittels Protokollierung über die WebUI prüfen.
Dein Vorhaben ist zwar nicht unmöglich, aber schwierig umzusetzen.
Normalerweise rechnet man ja von einer Sendung zur nächsten.
Die geringe Auflösung (0,1kWh) gepaart mit der geringen Leistung aus dem Beispiel (104.3 - 173.3 W/h) führt aber dazu das sich der Verbrauch (von einer Sendung zur nächsten) manchmal nicht ändert. Das Ergebnis wäre 0.0 W/h, braucht also erst gar nicht berechnet werden.
Die WebUI (oder besser die ReGa) hat aber maximal 2 Werte eines Datenpunktes parat. Den aktuellen Wert ( .Value() ) und den vorherigen Wert ( .LastValue() ). Will man mit "älteren Werten" rechnen muss man diese in SysVars zwischenspeichern.
Um auch für Reboots gewappnet zu sein müsste man also Wert und Zeitstempel in eine SysVar schreiben.
Bei Aktualisierung dann zuerst prüfen ob sich der Wert verändert hat.
Wenn nein --> nichts tun
Wenn ja --> Berechnungen wie von @Tyfys gezeigt durchführen, dann neuen Wert und neuen Zeitstempel wieder in die SysVar schreiben.
Mir wäre das viel zu ungenau um den Aufwand zu betreiben.
Zumindest mach das meiner (FW: 1.2) mit ES-LED so.
Kann natürlich sein das der mit FW: 2.5 und ES-IEC nichts sendet wenn keine Änderung stattfand. Oder aber influx speichert nur geänderte Werte.
Ich würde das erstmal mittels Protokollierung über die WebUI prüfen.
Dein Vorhaben ist zwar nicht unmöglich, aber schwierig umzusetzen.
Normalerweise rechnet man ja von einer Sendung zur nächsten.
Die geringe Auflösung (0,1kWh) gepaart mit der geringen Leistung aus dem Beispiel (104.3 - 173.3 W/h) führt aber dazu das sich der Verbrauch (von einer Sendung zur nächsten) manchmal nicht ändert. Das Ergebnis wäre 0.0 W/h, braucht also erst gar nicht berechnet werden.
Die WebUI (oder besser die ReGa) hat aber maximal 2 Werte eines Datenpunktes parat. Den aktuellen Wert ( .Value() ) und den vorherigen Wert ( .LastValue() ). Will man mit "älteren Werten" rechnen muss man diese in SysVars zwischenspeichern.
Um auch für Reboots gewappnet zu sein müsste man also Wert und Zeitstempel in eine SysVar schreiben.
Bei Aktualisierung dann zuerst prüfen ob sich der Wert verändert hat.
Wenn nein --> nichts tun
Wenn ja --> Berechnungen wie von @Tyfys gezeigt durchführen, dann neuen Wert und neuen Zeitstempel wieder in die SysVar schreiben.
Mir wäre das viel zu ungenau um den Aufwand zu betreiben.
Grüße... Baxxy
- Raspberry Pi 4 als Homematic-Zentrale - Tipps und Informationen
- Analysescript für genutzte Funk-Adressen, Funkmodul-Hardware und Zentralen Hardware
- NANO CUL 868MHz - Stick zum AskSin Analyzer XS umflashen (Anleitung für ArduinoIDE unter Windows)
- Firmware Updates für IP-Aktoren / Sensoren... Info's, Tipps und Sonstiges
- CCU funkt nicht - CarrierSense (CS) Probleme erkennen und lösen