Seite 2 von 3

Re: Laufzeiten Kompressor und Heizkartusche einer Wärmepumpe erfassen

Verfasst: 20. Okt 2024 15:58
von udo1toni
Stunden/Minuten ist tatsächlich nur mit Aufwand möglich, Du könntest aber einfach als state Description pattern "%.2f h" angeben, die Ausgabe erfolgt dann in Stunden mit zwei Nachkommastellen, also z.B. 12,25 für 12 Stunden/15 Minuten. Gerade für Betriebsstunden ist die Angabe der Stundenbruchteile als Dezimalbruch sehr üblich.
Alternativ kannst Du auch Im Label das Pattern "[%1$tT]" setzen, dann bekommst Du die Ausgabe in HHHHHH:MM:SS, allerdings funktioniert diese Formatierung nur in der Sitemap, nicht in der Main UI. Es liefe also auf eine Rule heraus, welche sich um die Formatierung kümmert und den Wert dafür in ein anderes Item übernimmt, wahlweise auch die direkte Übernahme in ein anderes Item und Umwandlung per Transformation Service, potentiell unter Verlust der Möglichkeit, auf den Zahlenwert zuzugreifen...

Re: Laufzeiten Kompressor und Heizkartusche einer Wärmepumpe erfassen

Verfasst: 20. Okt 2024 20:21
von mike69
Hab mir was zusammen gedragedanddroped, könntne von Dir sein. :)
sec2min2hour.js

Code: Alles auswählen

(function(seconds){
    var retval = "";
    var minutes = Math.floor(seconds / 60)
    var hours = Math.floor(minutes / 60)
    seconds = seconds % 60
    minutes = minutes % 60
    if (hours < 10)
        retval = retval + "0";
    retval = retval + hours + "'";
    if (minutes < 10)
        retval = retval + "0";
    retval = retval + minutes + "'";
    if (seconds < 10)
        retval = retval + "0";
    retval = retval + seconds + "\"";
    return retval;
})(input)
hier Teil der .items:

Code: Alles auswählen

Number         NibeCounter_1 "Kompressor [JS(sec2min2hour.js):%s]"   <time>   (gNibeCount)
Sieht so aus:

Code: Alles auswählen

 00'16'31" 
Nutze nur sitemaps, deswegen für mich optimal.
Leider funktioniert das mit dem UoM nicht, deswegen kein Number:Time

Wenn das mit einem "[%1$tT]" hin haut, würde mir reichen :)

edit:
Der Tip mit dem "[%1$tT]" ist sogar noch besser. :lol:
In welcher Doku steht sowas?

Der Betriebszähler läuft geschmeidig und ist Neustartfest. Am 01.01.2025 wird zurückgesetzt und dann sehen wir was das Jahr so bringt.

Danke Dir, Udo.

Re: (solved) Laufzeiten Kompressor und Heizkartusche einer Wärmepumpe erfassen

Verfasst: 20. Okt 2024 23:37
von udo1toni
Ja, gut möglich, dass das irgendwann mal auf meinem Mist gewachsen ist. Die Schreibweise mit ' und " ist nicht so weit verbreitet...

Die Formatierung im Label ist "uralt", noch aus OH1-Zeiten.
Die meisten Sachen in openHAB sind aus Java übernommen (oftmals indirekt, funktioniert aber trotzdem...), entsprechend kann man vieles in der offiziellen Doku von Java nachschlagen, z.B. String-Formatter: https://docs.oracle.com/en/java/javase/ ... atter.html
Leider funktioniert dieses Format nicht im Pattern, oder zumindest nicht bei Number:Time, da hier die Unit zum Einsatz kommt.

Re: (solved) Laufzeiten Kompressor und Heizkartusche einer Wärmepumpe erfassen

Verfasst: 30. Okt 2024 09:15
von mike69
Moin.

Die rule läuft echt geschmeidig. Nur eins macht mir Kopfzerbrechen. Die Heizpatrone ist gesperrt, dennoch sammeln sich irgendwelche Laufzeiten an. Werden die Einträge von der Stufe1 (NibeCounter_2) aus der influxdb gelöscht, sind sie ein Tag später wieder welche da. :)

Code: Alles auswählen

doof@openhab:/home/master# cat  /var/log/ope*/*.log | grep Heizstufe
2024-10-25 04:44:06.317 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 3434 Sekunden
2024-10-25 16:12:18.904 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 44727 Sekunden
2024-10-26 00:41:40.677 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 75290 Sekunden
2024-10-26 02:20:18.998 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 81209 Sekunden
2024-10-27 02:43:02.926 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 7605 Sekunden
2024-10-27 02:02:15.397 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 8759 Sekunden
2024-10-27 05:02:33.668 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 19578 Sekunden
2024-10-28 03:19:40.869 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 99806 Sekunden
2024-10-28 07:09:33.135 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 99807 Sekunden
2024-10-29 18:09:36.444 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 13297 Sekunden
Anlaufstrom könnte sein, wäre aber nach einem Bruchteil einer Sekunde wieder auf normalem Wert. Zumal der Zähler sekündlich Daten versendet, wären das bei 20 Kompressorstarts max 20 Sekunden.

Jemand eine Idee?


Edit:
Jetzt wo ich es gerade geschrieben habe, es gab mehrere reboots vom DB Server und openhab. :(
Werde es weiter beobachten...

Re: (solved) Laufzeiten Kompressor und Heizkartusche einer Wärmepumpe erfassen

Verfasst: 30. Okt 2024 10:33
von udo1toni
Schau mal ins Log, was NibePower für einen Verlauf hat:

Code: Alles auswählen

touch ~/NibePower.log
gunzip -c -k /var/log/openhab/events.log.*.gz | grep NibePower >> ~/NibePower.log
cat /var/log/openhab/events.log | grep NibePower >> ~/NibePower.log
touch erzeugt eine leere Datei, falls die Datei bereits vorhanden ist, aktualisiert sie jedoch nur den Zeitstempel der Datei. In diesem Fall wird die Datei NibePower.log im home-Verzeichnis (~/) des aktuell angemeldeten Users angelegt.
gunzip entpackt Archive, die mit gzip gepackt wurden. -k verhindert dabei, dass das Archiv nach dem Entpacken gelöscht wird.
-cwiederum sorgt dafür, dass gunzip nicht in eine Datei, sondern nach STDOUT schreibt, so dass der Output mittel Pipe (|) direkt an grep weitergereicht wird.
grepfiltert und gibt nur die Zeilen aus, in denen der angegebene Begriff auftaucht - hier also NibePower.
Die Ausgabe wird mittels >> an die Datei ~/NibePower.log angehängt.

Nachdem die Befehle durchgelaufen sind, hast Du also eine Datei NibePower.log, die nur die events für dieses eine Item enthält - zeitlich aufsteigend sortiert. Die Datei kann man z.B. prima mit Excel weiterverarbeiten, um nur den Zeitstempel und den aktuellen Status zu erhalten.
Vielleicht gibt es Anlaufströme, so dass man die Grenzwerte anpassen muss?

Re: (solved) Laufzeiten Kompressor und Heizkartusche einer Wärmepumpe erfassen

Verfasst: 30. Okt 2024 11:12
von mike69
Hmmm. events.log wurde am 27.07. generiert und ist leer.
Seltsam.

Wie oben editiert, paar reboots waren dazwischen. Beobachte es weiter.

Re: (solved) Laufzeiten Kompressor und Heizkartusche einer Wärmepumpe erfassen

Verfasst: 31. Okt 2024 11:51
von mike69
Moin.

So, logs laufen wieder.

Code: Alles auswählen

2024-10-30 17:10:49.143 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 230 Sekunden
2024-10-30 17:10:49.168 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 2 total 133 Sekunden
2024-10-30 17:12:45.484 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 302 Sekunden
2024-10-30 17:12:45.505 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 2 total 204 Sekunden
2024-10-30 23:19:13.996 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 22060 Sekunden
2024-10-31 09:54:41.916 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 38129 Sekunden
Habe gestern Nachmittag die NibeStates und NibeCounter in der influxdb zurückgesetzt, openHab restarted und an der WP händisch alle Modies durchgeschaltet, um Startpunkte zu generieren. Ab 17:13 Uhr war sie sich selbst überlassen.

Code: Alles auswählen

2024-10-30	23:19:10.795	100	W	to	101	W
2024-10-30	23:19:11.851	101	W	to	101	W
2024-10-30	23:19:12.906	101	W	to	4870	W
2024-10-30	23:19:13.969	4870	W	to	609	W
2024-10-30	23:19:15.023	609	W	to	644	W
2024-10-30	23:19:16.087	644	W	to	671	W
2024-10-30	23:19:17.138	671	W	to	685	W
2024-10-30	23:19:18.192	685	W	to	695	W
Um 23:19 der erste Schwinger, wird als Stufe 1 erkannt und errechnet eine Lauzeit von 22060s oder 7h,6m,40s.

Code: Alles auswählen

2024-10-31	09:54:37.664	101	W	to	101	W
2024-10-31	09:54:38.730	101	W	to	102	W
2024-10-31	09:54:39.780	102	W	to	102	W
2024-10-31	09:54:40.835	102	W	to	4956	W
2024-10-31	09:54:41.897	4956	W	to	624	W
2024-10-31	09:54:42.950	624	W	to	655	W
2024-10-31	09:54:44.011	655	W	to	675	W
Der nächste Schwinger um 09:54 Uhr. Laufzeit von 38129 Sekunden oder 10h,35m, 29s.

Normalerweise wäre die Summe der beiden Peaks 2s Laufzeit für Stufe 1, damit kann man leben.
So wie das aussieht, nimmt er grundsätzlich die Startzeit 17:12 Uhr an.

Hier die Datenpunkte der Datenbank, die Zeiten sind in UTC :

Code: Alles auswählen

NibeState_2	1	2024-10-30T16:07:00.000Z
NibeState_2	0	2024-10-30T16:10:50.000Z
NibeState_2	1	2024-10-30T16:11:35.000Z
NibeState_2	0	2024-10-30T16:12:50.000Z
NibeState_2	0	2024-10-30T22:19:15.000Z
NibeState_2	0	2024-10-31T08:54:45.000Z
Es fehlen die Startpunkte für 23:19 und 09:54 Uhr.

Re: (solved) Laufzeiten Kompressor und Heizkartusche einer Wärmepumpe erfassen

Verfasst: 31. Okt 2024 13:32
von udo1toni
Ja, das ist problematisch, die Zeit wird nur auf eine Sekunde genau aufgelöst (.toEpochSecond). Weil die Messwerte aber im Sekundentakt reinkommen, kann es dabei zu Fehlberechnungen kommen.

Es gibt allerdings eine Möglichkeit, das auf Millisekunden umzustellen :)

Code: Alles auswählen

rule "Laufzeit bestimmen"
when
    Member of gNibeState changed to OFF
then
    val strItem = triggeringItem.name.split("_").get(1)
    val nCount = gNibeCount.members.filter[i|i.name.endsWith(strItem)].head
    val nStart = triggeringItem.previousState(true,"influxdb").timestamp.toInstant.toEpochMilli
    var strDev = ""
    switch(strItem) {
        case "1" : strDev = "Kompressor"
        case "2" : strDev = "Heizstufe 1"
        case "3" : strDev = "Heizstufe 2"
    }
    var Number nCounter = 0
    if(nCount.state instanceof Number)
        nCounter = nCount.state as Number
    nCounter = nCounter + (now.toInstant.toEpochMilli - nStart)
        logInfo("nibeWp", "Laufzeit {} total {} Sekunden", strDev, (nCounter/1000).intValue)
      nCount.postUpdate(nCounter)
end
Achtung: weil EpochMilli zu groß für eine normale Integer Variable ist, muss iCounter nun als Number definiert werden, statt als Integer - und da ich Variablen gerne nach Datentyp benenne, habe ich dann auch den Variablennamen geändert.
Das hat auch Auswirkungen auf zur Verfügung stehende Funktionen, += gibt es nicht für Number...

Außerdem sind die Counter nun in Millisekunden, was bei der Anzeige berücksichtigt werden muss.
Alternativ kann man natürlich auch den Counter beim Einlesen mit 1000 Multiplizieren und beim Schreiben durch 1000 teilen, das müsste man im Zweifel mal ausprobieren, ob das negative Auswirkungen hat:

Code: Alles auswählen

    var Number nCounter = 0
    if(nCount.state instanceof Number)
        nCounter = (nCount.state as Number) * 1000  // <--- hier
    nCounter = nCounter + (now.toInstant.toEpochMilli - nStart)
        logInfo("nibeWp", "Laufzeit {} total {} Sekunden", strDev, (nCounter/1000).intValue)
      nCount.postUpdate((nCounter/1000).intValue)  // <--- und hier
Ich bin mir nicht ganz sicher, ob das Problem damit beseitigt ist, kann durchaus sein, dass die Persistence insgesamt zu träge ist, aber einen Versuch ist es wert. Ansonsten müsste man schauen, wie man die Persistence dazu bringt, millisekundengenau zu persistieren. Ich bin mir allerdings nicht bewusst, dass man auf openHAB-Seite da was konfigurieren kann, das wäre ein Fall für die Spezialisten im englischen Forum.
InfluxDB selbst verarbeitet die Daten meines Wissens in Mikrosekunden und kann potentiell tausende Messwerte pro Sekunde verarbeiten, auch auf "schwacher" Hardware.

Re: (solved) Laufzeiten Kompressor und Heizkartusche einer Wärmepumpe erfassen

Verfasst: 31. Okt 2024 16:57
von mike69
udo1toni hat geschrieben: 31. Okt 2024 13:32 Ja, das ist problematisch, die Zeit wird nur auf eine Sekunde genau aufgelöst (.toEpochSecond). Weil die Messwerte aber im Sekundentakt reinkommen, kann es dabei zu Fehlberechnungen kommen.

....

Ich bin mir nicht ganz sicher, ob das Problem damit beseitigt ist, kann durchaus sein, dass die Persistence insgesamt zu träge ist, aber einen Versuch ist es wert. Ansonsten müsste man schauen, wie man die Persistence dazu bringt, millisekundengenau zu persistieren. Ich bin mir allerdings nicht bewusst, dass man auf openHAB-Seite da was konfigurieren kann, das wäre ein Fall für die Spezialisten im englischen Forum.
InfluxDB selbst verarbeitet die Daten meines Wissens in Mikrosekunden und kann potentiell tausende Messwerte pro Sekunde verarbeiten, auch auf "schwacher" Hardware.
Oha, mit Millisekunden arbeiten, ist das nicht wie mit Kanonen auf Spatzen schießen? :)
Werde es heute Abend testen.

Anderer Gedankengang, Rule erst nach der 2ten Änderung regeln lassen? Ein Aussetzer wird ignoriert, bleibt der Wert wird die Zeit erfasst. Auf die Sekunde kommt es nicht an.

Re: (solved) Laufzeiten Kompressor und Heizkartusche einer Wärmepumpe erfassen

Verfasst: 1. Nov 2024 10:45
von mike69
Moin.

Hier die letzte Nacht mit der Umstellung auf Millisekunden:

Code: Alles auswählen

NibeState_2	value	0	2024-10-31T17:28:45.000Z	NibeState_2
NibeState_2	value	0	2024-11-01T00:26:50.000Z	NibeState_2
NibeState_2	value	0	2024-11-01T04:19:25.000Z	NibeState_2

Code: Alles auswählen

2024-11-01 01:26:48.226 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 1 Sekunden
2024-11-01 05:19:22.391 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 13956 Sekunden

Code: Alles auswählen

2024-11-01 01:26:45.046 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 100.993 W to 101.368 W
2024-11-01 01:26:46.100 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 101.368 W to 101.32 W
2024-11-01 01:26:47.164 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 101.32 W to 4873.369 W
2024-11-01 01:26:48.211 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 4873.369 W to 621.602 W
2024-11-01 01:26:49.303 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 621.602 W to 651.819 W
2024-11-01 01:26:50.351 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 651.819 W to 672.173 W
....

2024-11-01 05:19:19.204 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 101.258 W to 101.969 W
2024-11-01 05:19:20.268 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 101.969 W to 102.491 W
2024-11-01 05:19:21.320 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 102.491 W to 4911.398 W
2024-11-01 05:19:22.373 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 4911.398 W to 574.474 W
2024-11-01 05:19:23.434 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 574.474 W to 669.054 W
2024-11-01 05:19:24.486 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 669.054 W to 682.367 W
Jetzt gibt es keine Startpunkte. :)

Nochmal, openHab stop, alle Counter und States löschen, openhab start und die Heizstufen durchfahren.
Bis jetzt passt es, mal auf ein Peak warten....



edit:

Hier isser...

Code: Alles auswählen

2024-11-01 13:49:55.591 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 103.295 W to 103.079 W
2024-11-01 13:49:56.652 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 103.079 W to 4908.277 W
2024-11-01 13:49:57.718 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 4908.277 W to 615.2 W
2024-11-01 13:49:58.769 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 615.2 W to 658.205 W
2024-11-01 13:49:59.820 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'NibePower' changed from 658.205 W to 675.694 W

Kein Startpunkt

Code: Alles auswählen

2024-11-01 09:24:13.234 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 2 total 261 Sekunden
2024-11-01 09:28:57.693 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 546 Sekunden
2024-11-01 13:49:57.738 [INFO ] [org.openhab.core.model.script.nibeWp] - Laufzeit Heizstufe 1 total 16753 Sekunden
hier ein Auszug der DB:

Code: Alles auswählen

0	NibeState_2	value	0	2024-11-01T08:07:35.000Z	NibeState_2
0	NibeState_2	value	1	2024-11-01T08:19:55.000Z	NibeState_2
0	NibeState_2	value	0	2024-11-01T08:29:00.000Z	NibeState_2
0	NibeState_2	value	0	2024-11-01T12:50:00.000Z	NibeState_2
Beim starten von opebHAB wird ein "0" gesetzt, danach händisch an und aus. Ab 9:30 laufen lassen.

Werde das erstmal mit cron triggern, alle 2 oder 5 Sekunden. Falls das keine gute Idee ist, gibt Info.