Modul HourCounter - Betriebsstundenzähler mit einem Fensterkontakt

Begonnen von John, 08 April 2013, 22:11:55

Vorheriges Thema - Nächstes Thema

pappn

Zitat von: John am 03 Januar 2015, 22:37:06
Ich kann mir vorstellen einen Sekunden-Offset einzuführen, der den Zeitraumwechsel, 1..n Sekunden vorwegnimmt, damit  der Zeitstempel
des gefeuerten Readings noch im eigentlich betroffenen Zeitraum landet.

Ich bin nicht sicher, dass es dass braucht. Kann das Verhalten bei mir nicht feststellen. Habe allerdings den Hourcounter zusammen mit 99_UtilsHourCounter am laufen. Die Sequenz sieht dann bei mir so aus (nur gefiltert auf countsPerDay): 2014-06-14_00:00:03 BrennerTest countsPerDay: 0
2014-06-14_05:59:56 BrennerTest countsPerDay: 1
2014-06-14_06:45:18 BrennerTest countsPerDay: 2
2014-06-14_11:54:52 BrennerTest countsPerDay: 3
2014-06-14_12:34:12 BrennerTest countsPerDay: 4
2014-06-14_17:07:28 BrennerTest countsPerDay: 5
2014-06-14_17:46:47 BrennerTest countsPerDay: 6
2014-06-15_00:00:03 BrennerTest appCountsPerDay: 6
2014-06-15_00:00:04 BrennerTest countsPerDay: 0
2014-06-15_05:59:52 BrennerTest countsPerDay: 1
2014-06-15_06:36:10 BrennerTest countsPerDay: 2
2014-06-15_11:19:31 BrennerTest countsPerDay: 3
2014-06-15_12:00:52 BrennerTest countsPerDay: 4
2014-06-15_18:22:01 BrennerTest countsPerDay: 5
2014-06-16_00:00:03 BrennerTest appCountsPerDay: 5
2014-06-16_00:00:04 BrennerTest countsPerDay: 0
2014-06-16_04:59:18 BrennerTest countsPerDay: 1
2014-06-16_05:43:40 BrennerTest countsPerDay: 2
2014-06-16_10:36:06 BrennerTest countsPerDay: 3
2014-06-16_16:33:03 BrennerTest countsPerDay: 4
2014-06-17_00:00:03 BrennerTest appCountsPerDay: 4
2014-06-17_00:00:04 BrennerTest countsPerDay: 0
2014-06-17_04:59:15 BrennerTest countsPerDay: 1
2014-06-17_05:40:35 BrennerTest countsPerDay: 2
2014-06-17_11:31:30 BrennerTest countsPerDay: 3
2014-06-17_17:52:39 BrennerTest countsPerDay: 4
2014-06-18_00:00:03 BrennerTest appCountsPerDay: 4


Die Definition ist wie folgt:define BrennerTest HourCounter Oelbrenner:Window:.Open Oelbrenner:Window:.Closed
attr BrennerTest event-min-interval tick.*:0,.*:3600
attr BrennerTest event-on-change-reading .*
bzw. define Brenner.Event notify BrennerTest:tick.* { appHCNotify("%NAME","%EVTPART0","%EVTPART1");;}


Vielleicht hat es ja doch eine andere Ursache. Wie sehen denn die Logs bei den anderen Nutzern aus?
"When all else fails, read the instructions."

CUL868, RFXTFX433 und CCU3
FS20, S300TH, UNIRoll, Homematic IP, OZW672, diverse HOMEEASY, IT kompatible und China Zeugs

John

Hallo pappn,

Zitat2014-06-16_00:00:04 BrennerTest countsPerDay: 0
2014-06-16_04:59:18 BrennerTest countsPerDay: 1
2014-06-16_05:43:40 BrennerTest countsPerDay: 2
2014-06-16_10:36:06 BrennerTest countsPerDay: 3
2014-06-16_16:33:03 BrennerTest countsPerDay: 4
2014-06-17_00:00:03 BrennerTest appCountsPerDay: 4

"appCountsPerDay: 4" bezieht sich auf die Counts des Tages 2014-06-16 trägt aber selbst den Zeitstempel 2014-06-17
und wird demnach in einem Chart auch über den Tag  " 2014-06-17" dargestellt.

Ich denke das ist der Kritikpunkt von cotecmania, wenn ich es richtig verstanden habe.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

pappn

Zitat von: John am 03 Januar 2015, 23:04:03
"appCountsPerDay: 4" bezieht sich auf die Counts des Tages 2014-06-16 trägt aber selbst den Zeitstempel 2014-06-17
und wird demnach in einem Chart auch über den Tag  " 2014-06-17" dargestellt.

Ich denke das ist der Kritikpunkt von cotecmania, wenn ich es richtig verstanden habe.

Puuuuhhh, dann ist es aber ein sehr grundsätzliches Problem. Ich habe das über die Diagrammdefinitionen gelöst. Mit fsteps in der gplot def plot "<IN>" using 1:2 axes x1y2 title 'Tages-Durchschnittstemperatur' ls l0 lw 1.5 with fsteps,\
     "<IN>" using 1:2 axes x1y1 title 'Betriebsstunden' ls l2 lw 1.5 with fsteps,\
     "<IN>" using 1:2 axes x1y1 title 'Verbrauch' ls l1fill_stripe lw 1.5 with fsteps
sieht das, mit diesen Daten 2015-01-01_00:00:01 BrennerTest appOpHoursPerDay: 1.50611111111111
2015-01-01_00:13:07 cp_S300TH T_avg_day: 0.2
2015-01-02_00:00:00 BrennerTest appOpHoursPerDay: 2.91666666666667
2015-01-02_00:03:29 cp_S300TH T_avg_day: -0.0
2015-01-03_00:00:00 BrennerTest appOpHoursPerDay: 5.29583333333333
2015-01-03_00:02:38 cp_S300TH T_avg_day: -0.6
dann wie im Bild aus. Damit stehen dann die Werte im Diagramm über dem richtigen Tag.
"When all else fails, read the instructions."

CUL868, RFXTFX433 und CCU3
FS20, S300TH, UNIRoll, Homematic IP, OZW672, diverse HOMEEASY, IT kompatible und China Zeugs

Billy

Zitat von: John am 03 Januar 2015, 23:04:03
Hallo pappn,

"appCountsPerDay: 4" bezieht sich auf die Counts des Tages 2014-06-16 trägt aber selbst den Zeitstempel 2014-06-17
und wird demnach in einem Chart auch über den Tag  " 2014-06-17" dargestellt.

Ich denke das ist der Kritikpunkt von cotecmania, wenn ich es richtig verstanden habe.

John
Stimmt, das ist unlogisch.
Habe zwar bei mir auch kein grundsätzliches Problem und nutze wie pappn im Diagramm with fsteps.
Beim Jahreswechsel hat das jedoch nicht mehr geholfen, da im CN.Oel-Day-2014.log der Wert ja gar nicht vorhanden war.
Habe dann manuell den Eintrag vom LOG 2015 ins Log für 2014 kopiert und wie folgt editiert.
2014-12-31_24:00:00 CN.Oel appOpHoursPerMonth: 101.050277777778 --> erzeugt! Hat auch mit 24:00 geklappt.

Insofern wäre das mit dem Offset eine gute Idee soweit es das System nicht zusätzlich belastet.

Gruß Billy
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

John

Mit dem Modul logProxy gibt es eine Lösung für das diskutierte Problem

http://www.fhemwiki.de/wiki/LogProxy

Neben den generellen Änderungen wie im Wiki beschrieben habe ich folgendes geändert:

Alt:
Zitat
#FileLog 4:CN.BRENNER.appCountsPerDay\x3a::
#FileLog 4:CN.BRENNER.appOpHoursPerDay\x3a::
#FileLog 4:CN.BRENNER.appUtilization\x3a::

Neu:
Zitat#logProxy  FileLog:CN.BRENNER.FileDay,offset=-60*60*24:4:CN.BRENNER.appCountsPerDay\x3a::
#logProxy  FileLog:CN.BRENNER.FileDay,offset=-60*60*24:4:CN.BRENNER.appOpHoursPerDay\x3a::
#logProxy  FileLog:CN.BRENNER.FileDay,offset=-60*60*24:4:CN.BRENNER.appUtilization\x3a::

Damit wird die Darstellung um einen Tag in die Vergangenheit verschoben.

Was mir noch aufgefallen ist:

Speichert man die gplot-Datei im SVG-Editor wird nichts mehr angezeigt, ein erneutes Speichern über den Menppunkt "Edit Files"
bewirkt, daß wieder alles funktioniert.


John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

cotecmania

Hallo John,

Zitat von: John am 03 Januar 2015, 23:04:03
Hallo pappn,

"appCountsPerDay: 4" bezieht sich auf die Counts des Tages 2014-06-16 trägt aber selbst den Zeitstempel 2014-06-17
und wird demnach in einem Chart auch über den Tag  " 2014-06-17" dargestellt.

Ich denke das ist der Kritikpunkt von cotecmania, wenn ich es richtig verstanden habe.
Genau !

Das mit dem LogProxy habe ich gerade mal überflogen, sieht aber nicht gerade einfach aus. Da brauche ich mal mehr Zeit.

Die Idee mit dem Offset finde ich eigentlich besser, denn der Wert ist ja wirklich "falsch" bedatet im Logfile, wenns auch nur eine Sekunde ist ;-))
Und das jetzt wieder mit einem "Workaround" im SVG zu fixen finde ich nicht ideal.
Der Offset könnte ja optional eingebaut werden und nur der, der ihn will kann ihn setzen.

Ich wäre definitiv FÜR den Offset.

Danke und Gruss
Joe
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

justme1968

wenn du im plot einen tageswert am richtigen tag anzeigen willst reicht es nicht ihn vom timestamp her eine sekunde oder minute früher erscheinen zu lassen (am ende des zugehörigen tages) sondern der wert muss an den anfang des tages. das geht aber nicht 'nachträglich' weil im gleichen log file schon andere werte des tages aufgelaufen sind. und die timestamps im logfile streng aufsteigend sein müssen. sonst geht nichts mehr. das 'korrekt' zu machen würde bedeuten das komplette log file zu lesen, zu sortieren und wieder zu schreiben. und dafür zu sorgen das in dieser zeit keine anderen werte ins log kommen,

logproxy löst das problem in dem es eine kurve relativ zu den anderen verschiebt. in diesem fall um 24 stunden. so das die kurven untereinander wieder korrekt sind. das gleiche würde für wochen oder monats werte gelten. natürlich um einen anderen betrag verschoben.

das verschieben der kurven relativ zu einander würde ich nicht als workaround sehen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

pappn

Zitat von: cotecmania am 04 Januar 2015, 22:15:05
Die Idee mit dem Offset finde ich eigentlich besser, denn der Wert ist ja wirklich "falsch" bedatet im Logfile, wenns auch nur eine Sekunde ist ;-))

Falsch kann man ja eigentlich nicht sagen; es liegt in der Natur der Sache, dass die Summe des Tages erst gebildet werden kann, wenn dieser auch gelaufen ist. Für die korrekte Darstellung würde nur 23:59:59 (oder 24:00:00) helfen. Alles was 00:00:00 oder später ist, gilt als neuer Tag und passt damit nicht in die Darstellung. Sekunde hin oder her.

Zitat von: justme1968 am 04 Januar 2015, 23:32:21
logproxy löst das problem in dem es eine kurve relativ zu den anderen verschiebt. in diesem fall um 24 stunden. so das die kurven untereinander wieder korrekt sind. das gleiche würde für wochen oder monats werte gelten. natürlich um einen anderen betrag verschoben.

das verschieben der kurven relativ zu einander würde ich nicht als workaround sehen.

Dem kann ich nur zustimmen.

Der Hourcounter sollte nicht mit Dingen überladen werden, für die es bereits fertige Lösungen gibt.

@John, danke für den Hinweis zum LogProxy.
"When all else fails, read the instructions."

CUL868, RFXTFX433 und CCU3
FS20, S300TH, UNIRoll, Homematic IP, OZW672, diverse HOMEEASY, IT kompatible und China Zeugs

cotecmania

Hallo,

ich habe das Ganze nun auch mit dem LogProxy gelöst.
Allerdings habe ich nur um -5 Sekunden verschoben.
Wenn ich die Lösung von John verwendet habe (-24h), war mein Plot leer. Ist eigentlich auch logisch.
Das ".FileDay" war mir auch nicht klar bzw. hat bei mir nicht funktioniert.
Zitat#logProxy  FileLog:CN.BRENNER.FileDay,offset=-60*60*24:4:CN.BRENNER.appUtilization\x3a:

So gings nun bei mir :

#logProxy FileLog:FileLog_BrennerCounter,offset=-5:4:BrennerCounter.countsPerDay\x3a::

Gruss
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

brmpfl

Moin,

hat schon jemand den HourCounter im Zusammenhang mit einem PRESENCE-Device laufen?
Bei mir arbeitet der HourCounter hier leider nicht korrekt.
Hier die Definition des PRESENCE-Devices:

define paul_Computer PRESENCE lan-ping ComputerPaul
attr paul_Computer alias Computer Paul
attr paul_Computer devStateIcon absent:FS20.off present:FS20.on

und hier die des dazugehörigen HourCounters

define CN.paul_Computer HourCounter paul_Computer:present paul_Computer:absent
attr CN.paul_Computer event-min-interval tick.*:0,.*:3600
attr CN.paul_Computer event-on-change-reading .*

Aus dem Wiki habe ich die 99_UtilsHourCounter übernommen und mit

define CN.EVENT notify CN\..*:tick.* { appHCNotify("%NAME","%EVTPART0","%EVTPART1");;}

aktiviert.

Das Ganze lasse ich über eine ReadingsGroup ausgeben:

define Laufzeit.paul_Computer readingsGroup <>,<%time_clock> \
CN.paul_Computer:<Laufzeiten> \
CN.paul_Computer:<Heute>,appOpHoursPerDayTemp,<&nbsp;;&nbsp;;&nbsp;;>,<Gestern>,appOpHoursPerDay \
CN.paul_Computer:<Aktuelle&nbsp;;Woche>,appOpHoursPerWeekTemp,<&nbsp;;&nbsp;;&nbsp;;>,<Letzte&nbsp;;Woche>,appOpHoursPerWeek \
CN.paul_Computer:<Aktueller&nbsp;;Monat>,appOpHoursPerMonthTemp,<&nbsp;;&nbsp;;&nbsp;;>,<Letzter&nbsp;;Monat>,appOpHoursPerMonth \
CN.paul_Computer:<Aktuelles&nbsp;;Jahr>,appOpHoursPerYearTemp,<&nbsp;;&nbsp;;&nbsp;;>,<Letztes&nbsp;;Jahr>,appOpHoursPerYear \
CN.paul_Computer:<Gesamtlaufzeit>,pulseTimeOverall,<&nbsp;;&nbsp;;&nbsp;;>,<&nbsp;;>,<&nbsp;;>
attr Laufzeit.paul_Computer alias Laufzeiten Paul Computer
attr Laufzeit.paul_Computer group Computer & Co
attr Laufzeit.paul_Computer mapping &nbsp;;
attr Laufzeit.paul_Computer room Paul
attr Laufzeit.paul_Computer valueFormat { if($READING eq "pulseTimeOverall"){sprintf("%.2f Stunden", $VALUE/3600);;}elsif($READING eq "pulseTimeIncrement"){sprintf("%.2f Minuten", $VALUE/60);;}else{if($READING =~ m/app/){sprintf("%.2f Stunden", $VALUE);;}}}
attr Laufzeit.paul_Computer valueStyle {'style="color:green;;;;text-align:right"'}


Ich vermute, das das Problem mit dem rel. kurfristig (30sec) zyklisch wiederkehrenden ON"-Events "present" zusammenhängt.
Die Events present und absent werden geworfen (->Event Monitor)

Ersetze ich das PRESENCE-Device durch ein entsprechendes Dummy-Device, funktioniert alles wie erwartet.

define paul_Computer dummy
attr paul_Computer alias Computer Paul
attr paul_Computer devStateIcon absent:FS20.off present:FS20.on
attr paul_Computer setList state:present,absent


Mache ich irgendwo was falsch, habe ich einen Denkfehler?
:)
Hajo

John

Hallo Hajo,

bitte stelle zu
Zitatdefine paul_Computer PRESENCE lan-ping ComputerPaul
das EventLog ein.

Weiterhin ein
Zitatlist CN.paul_Computer

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

brmpfl

Hai John,

anbei der Auszug aus dem Eventlog beim 1. "present"

2015-01-05 21:16:55 HourCounter CN.paul_Computer countsPerDay: 5
2015-01-05 21:16:55 HourCounter CN.paul_Computer countsOverall: 6
2015-01-05 21:16:55 HourCounter CN.paul_Computer pulseTimeIncrement: 0
2015-01-05 21:16:55 HourCounter CN.paul_Computer pauseTimeIncrement: 89
2015-01-05 21:16:55 HourCounter CN.paul_Computer pauseTimeEdge: 89
2015-01-05 21:16:55 HourCounter CN.paul_Computer pauseTimePerDay: 399
2015-01-05 21:16:55 HourCounter CN.paul_Computer pauseTimeOverall: 1175
2015-01-05 21:16:55 HourCounter CN.paul_Computer value: 1
2015-01-05 21:16:55 HourCounter CN.paul_Computer 5
2015-01-05 21:16:55 HourCounter CN.paul_Computer tickUpdated: 561
2015-01-05 21:16:55 HourCounter CN.paul_Computer tickChanged: 11
2015-01-05 21:16:55 HourCounter CN.paul_Computer appUtilizationTemp: 0.396789140507734
2015-01-05 21:16:55 HourCounter CN.paul_Computer appUtilizationTempOld: 0.396965304710046
2015-01-05 21:16:55 HourCounter CN.paul_Computer appCountsPerHourTemp: 1
2015-01-05 21:16:55 HourCounter CN.paul_Computer appCountsPerWeekTemp: 6
2015-01-05 21:16:55 HourCounter CN.paul_Computer appCountsPerMonthTemp: 6
2015-01-05 21:16:55 HourCounter CN.paul_Computer appCountsPerYearTemp: 6
2015-01-05 21:16:55 PRESENCE paul_Computer present

Die weitern sehen dann wie folgt aus:

2015-01-05 21:17:28 HourCounter CN.paul_Computer tickUpdated: 562
2015-01-05 21:17:28 HourCounter CN.paul_Computer appUtilizationTemp: 0.396618307066068
2015-01-05 21:17:28 HourCounter CN.paul_Computer appUtilizationTempOld: 0.396789140507734
2015-01-05 21:17:28 PRESENCE paul_Computer present


Hier noch das Ergebnis vom list CN.paul_Computer

Internals:
   CFGFN      /opt/fhem/FHEM/Paul.cfg
   DEF        paul_Computer:present paul_Computer:absent
   NAME       CN.paul_Computer
   NR         165
   NTFY_ORDER 50-CN.paul_Computer
   STATE      5
   TYPE       HourCounter
   Readings:
     2015-01-05 00:00:01   appCountsPerDay 1
     2015-01-05 21:00:00   appCountsPerHour 0
     2015-01-05 21:16:55   appCountsPerHourTemp 1
     2015-01-05 21:16:55   appCountsPerMonthTemp 6
     2015-01-05 21:16:55   appCountsPerWeekTemp 6
     2015-01-05 21:16:55   appCountsPerYearTemp 6
     2015-01-05 00:00:01   appOpHoursPerDay 0.307777777777778
     2015-01-05 21:20:14   appOpHoursPerDayTemp 0.0844444444444444
     2015-01-05 00:00:01   appOpHoursPerMonthTemp 0.307777777777778
     2015-01-05 00:00:01   appOpHoursPerWeekTemp 0.307777777777778
     2015-01-05 00:00:01   appOpHoursPerYearTemp 0.307777777777778
     2015-01-05 00:00:01   appUtilization  1.28280828499647
     2015-01-05 21:20:14   appUtilizationTemp 0.395761189366522
     2015-01-05 21:20:14   appUtilizationTempOld 0.395931285083549
     2015-01-05 21:20:14   countsOverall   6
     2015-01-05 21:20:14   countsPerDay    5
     2015-01-05 21:20:14   pauseTimeEdge   89
     2015-01-05 21:20:14   pauseTimeIncrement 89
     2015-01-05 21:20:14   pauseTimeOverall 1175
     2015-01-05 21:20:14   pauseTimePerDay 399
     2015-01-05 21:20:14   pulseTimeEdge   43
     2015-01-05 21:20:14   pulseTimeIncrement 0
     2015-01-05 21:20:14   pulseTimeOverall 1412
     2015-01-05 21:20:14   pulseTimePerDay 304
     2015-01-05 21:20:14   state           5
     2015-01-05 21:16:55   tickChanged     11
     2015-01-05 21:12:44   tickDay         0
     2015-01-05 21:12:44   tickHour        0
     2015-01-05 21:12:44   tickMonth       0
     2015-01-05 21:20:14   tickUpdated     567
     2015-01-05 21:12:44   tickWeek        0
     2015-01-05 21:12:44   tickYear        0
     2015-01-05 21:20:14   value           1
   Helper:
     OFF_Regexp paul_Computer:absent
     ON_Regexp  paul_Computer:present
     calledByEvent
     changedTimestamp 2015-01-05 21:20:14
     forceClear
     forceDayChange
     forceHourChange
     forceMonthChange
     forceWeekChange
     forceYearChange
     isFirstRun
     sdRoundHourLast 1420488000
     value      1
     cmdQueue:
Attributes:
   event-min-interval tick.*:0,.*:3600
   event-on-change-reading .*
   group      Computer & Co
   room       Paul


:)
Hajo

John

Hallo Hajo
das Eventlog zu  paul_Computer fehlt mir noch.
John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

brmpfl

Hai John,

reicht das o.g.

2015-01-05 21:16:55 PRESENCE paul_Computer present
2015-01-05 21:17:28 PRESENCE paul_Computer present

aus dem EventMonitor nicht aus?
:)
Hajo

John

ich hab das nachgestellt und via trigger simuliert.
Funktioniert alles soweit.
trigger paul_Computer present
trigger paul_Computer absent


John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP