Modul HourCounter - Betriebsstundenzähler mit einem Fensterkontakt

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

Vorheriges Thema - Nächstes Thema

Nestor

Here is a small patch to generate $hash->{NOTIFYDEV} and optimize event processing.
Inspired by this thread https://forum.fhem.de/index.php/topic,111938.15.html

--- - 2020-07-25 00:17:28.358989882 +0200
+++ /srv/fhem/FHEM/98_HourCounter.pm 2020-07-25 00:09:25.947705598 +0200
@@ -261,6 +261,8 @@
   $modules{HourCounter}{defptr}{$name} = $hash;
   RemoveInternalTimer($name);

+  notifyRegexpChanged($hash, "$onRegexp|$offRegexp");
+
   # wait until alle readings have been restored
   InternalTimer( int( gettimeofday() + 15 ), "HourCounter_Run", $name, 0 );
   return undef;

shamal2008

#601
Hallo Doc,

du hast mit ziemlicher Sicherheit recht. Ich habe das Modul gestern in Betrieb genommen und die "app"-Readings trotz 5x lesen des Wiki nicht reinbekommen... nun auf der x-sten Seite des Threads... finde ich die Lösung und siehe da - die Readings sind vorhanden - zumindest mal 3 davon.

appOpHoursPerDayTemp
appUtilizationTemp
appUtilizationTempOld
   

Wie ich zu den restlichen im Wiki beschriebenen komme, ist mir leider bislang noch ein Rätsel...

lg
Shamal

Zitat von: docb am 13 Mai 2020, 21:56:12
Grüße Euch, kann es sein, dass der Wikieintrag nicht passt beim Einbinden der 99_UtilsHourCounter.pm?
Aktuell steht da:
define CN.EVENT notify CN\..*:tick.* { appHCNotify("$NAME","$EVTPART0","$EVTPART1");;}
Da triggert bei mir nichts und ich glaube auch die zwei ;; sind am Ende nicht mehr nötig. Und eben der eine Backslash samt Punkt dahinter muss / kann raus, kann das sein? So funktioniert es jedenfalls bei mir:
define CN.EVENT notify CN.*:tick.* { appHCNotify("$NAME","$EVTPART0","$EVTPART1");}

Viele Grüße
doc
FHEM auf RasPiI 3+, MapleCUL 868+433MhZ, MAX! via CUL, LD686 LED-Controller, GHoma Plugins,, Shelly, ConbeeII + IKEA + Xiaomi, div. Infodienste & Google Assistant via FHEM;

KlaGho

Bei mir kamen die restlichen Readings nach einem "set forceDayChange"

Stefki

Hallo,

Ich habe mir einen HourCounter für meine Heizung (Brenner) eingerichtet. Funktioniert auch alles ganz gut.
Sobald ich aber die Datei 99_UtilsHourCounter_CE im Verzeichnis installiere (wegen Berechnung Tankinhalt) funktioniert nichts mehr.
Jemand eine Idee was ich falsch mache?
Bin leider nicht gut im interpretieren der Meldungen im logfile.

2020.12.11 14:14:04 1: PERL WARNING: Subroutine UtilsHourCounter_Initialize redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 45.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnYear redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 55.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnMonth redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 80.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnWeek redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 104.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnDay redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 128.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnHour redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 167.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnCount redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 184.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHCNotify redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 249.
2020.12.11 14:14:04 1: Including fhem.cfg
2020.12.11 14:14:04 1: PERL WARNING: Subroutine UtilsHourCounter_Initialize redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 45, <$fh> line 6.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnYear redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 55, <$fh> line 6.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnMonth redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 80, <$fh> line 6.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnWeek redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 104, <$fh> line 6.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnDay redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 128, <$fh> line 6.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnHour redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 167, <$fh> line 6.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnCount redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 184, <$fh> line 6.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHC_OnValueChanged redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 219, <$fh> line 6.
2020.12.11 14:14:04 1: PERL WARNING: Subroutine appHCNotify redefined at ./FHEM/99_UtilsHourCounter_CE.pm line 249, <$fh> line 6.

Charles

Hallo Stefki,
diese Meldung kenne ich gut. Die kommt jedes Mal, wenn ich fhem neustarte. Der HourCounter läuft aber trotzdem.
Alles funktioniert bei mir bis auf die Berechnung des Tankinhalts. Das ging irgendwann nicht mehr und wurde auch nie gefixt.
VG
Raspberry · FB 7590 · CUL · FS20 · MAX · ESP

Stefki

Hallo Charles,

Danke für die Antwort. Komisch ist nur, wenn ich nur die 99_UtilsHourCounter_CE  im Verzeichnis habe funktioniert die Berechnung des Tankinhaltes, aber der Rest nicht.

pappn

Du kannst natürlich die originale 99_UtilsHourCounter.pm nehmen. Ich habe an dieser damals 4 Dinge geändert bzw. eingefügt.

1. Kleine Korrektur hinsichtlich einer Abweichung zwischen appCounts*Temp und countsOverall. Das wurde von mir korrigiert. (Reiner Schönheitsfehler.) siehe hier: https://forum.fhem.de/index.php/topic,12216.msg174888.html#msg174888
2. Ich benötigte keine stündliche Berechnung der Werte, daher wurde "tickHour" mit dem Aufruf von "appHC_OnHour" auskommentiert. (Wäre, wie ich heute weiß, gar nicht notwendig gewesen. Anpassung "define CN.EVENT notify" reicht.)
3. Einfügung der Berechnung des Tanklevels
4. Aufruf von "WriteStatefile();" zum Abschluss der Berechnungen um sicherzustellen, dass alle aktuellen Werte in fhem.save gespeichert werden. Damit ist einem Datenverlust durch Absturz von FHEM weitgehend vorgebeugt.

Diese kleinen Änderungen haben die 99_UtilsHourCounter_CE.pm ergeben.

1. und 2. sollte für dich nicht relevant sein.
3. habe ich mittlerweile verlagert in die 99_myUtils. Die Berechnung des Tanklevels wird über ein at aufgerufen. Siehe hier:
https://forum.fhem.de/index.php/topic,12216.msg591488.html#msg591488

Die Tankberechnung in der 99_UtilsHourCounter_CE.pm besteht allerdings auch nur aus 2 Zeilen. Eingefügt habe ich:
Zeile 146 my $appTanklevel = ReadingsVal ($name,'appTanklevel',0 )-$pulseTimePerDay*0.000630901964;
Zeile 160 readingsBulkUpdate ($hash, 'appTanklevel' , $appTanklevel);

Dabei war der Wert "0.000630901964" der Ölverbrauch in Liter/Sekunde meiner damaligen Heizung. Den Wert musst du für deine Anlage eh selbst ermitteln und ändern, damit es passt. Darüber hinaus basiert die (sehr) alte 99_UtilsHourCounter_CE.pm auf der "99_UtilsHourCounter.pm 2014-02-01 20:15:33" aktuell ist aber "99_UtilsHourCounter.pm 2014-12-16 20:15:33". D.h dein "define CN.EVENT notify" aus dem WIKI passt nicht zu meiner 99_UtilsHourCounter_CE.pm.

Du solltest versuchen, wie im Beitrag aus 2017 beschrieben, die Tanklevelberechnung auch in die 99_myUtils zu verlegen und per at aufzurufen. Um dann mit der original 99_UtilsHourCounter.pm zu arbeiten.
"When all else fails, read the instructions."

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

Loctite

#607
Zitat von: docb am 13 Mai 2020, 21:56:12
Grüße Euch, kann es sein, dass der Wikieintrag nicht passt beim Einbinden der 99_UtilsHourCounter.pm?
Aktuell steht da:
define CN.EVENT notify CN\..*:tick.* { appHCNotify("$NAME","$EVTPART0","$EVTPART1");;}
Da triggert bei mir nichts und ich glaube auch die zwei ;; sind am Ende nicht mehr nötig. Und eben der eine Backslash samt Punkt dahinter muss / kann raus, kann das sein? So funktioniert es jedenfalls bei mir:
define CN.EVENT notify CN.*:tick.* { appHCNotify("$NAME","$EVTPART0","$EVTPART1");}

Viele Grüße
doc

Schon etwas älter ich weiß.
Wenn ich was falsches sage, bitte korrigieren.
Ein Punkt . bedeutet ja, dieses Zeichen ist in der Erkennung egal. Ein Punkt mit Stern .* bedeutet, das ab hier alle Zeichen keine Rolle spielen und damit erkannt werden.

device1test

Wird das DEF mit device.test angelegt, werden alle deviceXtest Geräte erkannt und es wird ein Event ausgelöst.
Wird das DEF mit device.* angelegt, werden auch Geräte wie device12345 berücksichtigt...oder ?

Nun heißt das Gerät aber CN.test , hat also einen echten Punkt. Um diesen Punkt abzubilden und nicht mit dem "egal was da kommt" Punkt zu verwechseln, wird ein \. verwendet.
Zwei Punkte sagen, zwei Zeichen, egal welche. Dieses  \..*  sagt, da kommt ein Punkt und danach irgend welche Zeichen.
Wenn nun CN.* verwendet wird, werden alle Geräte mit CN erkannt.

Es würde erst ein Unterschied machen, wenn es CNtest und CN.test als Geräte gibt und ich NUR CN.test erkennen möchte.
"CN\..*" erkennt alle Geräte mit CN.xxxx  und "CN.*" erkennt Geräte wie CNxxxx und CN.xxxx


Nun habe ich aber noch eine kleine Frage die ich mal so hier rein haue:
Gibt es die Möglichkeit, den Wochenwechsel (der ja Sonntag 00:00 Uhr stattfindet) auf Montag zu verschieben ?
Das stört mich schon seit dem ich den HourCounter habe.

EDIT:
Ach so, dieses ;; am Ende vor der Klammer, worüber du geschrieben hast, habe ich nicht, ich habe nur ein ; und bei mir läuft alles sein 1,5 Jahren
Es gibt ja Unterschiede, ob ich das in der Kommandozeile in FHEM eingebe, oder direkt in der DEF bearbeite.
Ich habe wie gesagt mit Sicherheit den danzen Befehl kopiert und ausgeführt und ich habe auch nur ein ; am Ende stehen.
Das doppelte ; wird dann vermutlich nur beim anlegen gebraucht und ausgefilter und in der DEF Zeile nicht mehr benötigt oder angezeigt.



Wzut

Zitat von: Loctite am 10 Januar 2021, 09:44:06
Gibt es die Möglichkeit, den Wochenwechsel (der ja Sonntag 00:00 Uhr stattfindet) auf Montag zu verschieben ?

IMHO ist für dieses Verhalten das hier :
# wday 0 Sonntag 1 Montag ...
  $time -= $wday * 86400;


Vermutlich bekommst du deine gewünschte Verschiebung um 24 Stunden mit
$wday-- ; # Sonntag wird zu -1 , Montag = 0
$wday = 6 if ($wday < 0); # Sonntag wird nun zum letzten Tag der Woche
$time -= $wday * 86400;
   


Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

pappn

Offensichtlich nutzen ja doch einige die 99_UtilsHourCounter_CE.pm mit der Tanklevelberechnung.
Da ich auch mein eigenes System etwas umstellen musste (Heizung mit 2 Brennerstufen, die einzeln gezählt werden und neuerdings auch zwischen Heizbetrieb und Warmwasserbetrieb unterscheiden), habe ich die Gelegenheit genutzt die aktuelle 99_UtilsHourCounter.pm "2014-12-16 20:15:33" als Basis zu nehmen und basierend darauf eine aktuelle 99_UtilsHourCounter_CE.pm erstellt.

Geändert bzw. ergänzt sind:

  • Korrektur hinsichtlich einer Abweichung zwischen appCounts*Temp und countsOverall.
    (Reiner Schönheitsfehler.) siehe hier: https://forum.fhem.de/index.php/topic,12216.msg174888.html#msg174888
  • Einfügung der Berechnung des Tanklevels, mit angepasstem Code.
  • Aufruf von "WriteStatefile();" regelmäßig zum Abschluss der Berechnungen um sicherzustellen, dass alle aktuellen Werte in fhem.save gespeichert werden. Damit ist einem Datenverlust durch Absturz von FHEM weitgehend vorgebeugt.
Handhabung:

1. Einbingung wie im Wiki für 99_UtilsHourCounter.pm beschrieben mit: define CN.EVENT notify CN\..*:tick.* { appHCNotify("$NAME","$EVTPART0","$EVTPART1");} bzw. define CN.EVENT notify CN.*:tick.* { appHCNotify("$NAME","$EVTPART0","$EVTPART1");} je nachdem ob euer DeviceName einen "." enthält oder nicht, wie hier erklärt: https://forum.fhem.de/index.php/topic,12216.msg1120122.html#msg1120122

2. Die Angabe des Verbrauchs zur Tanklevelberechnung habe ich in ein Reading des HourcounterDevices verlegt.
Damit muss dann im Code des Moduls nichts mehr angepasst werden.
Dieses Reading "consuptionrate" muss im HourcounterDevice einmal mit dem entsprechenden Verbrauchswert in l/h angelegt werden. z.B. mit: setreading CN.Test consumptionrate 1.6818 Sobald dieses Reading existiert und !=0 ist, erfolgt die Berechnung. Das Ergebnis (aktueller Tanklevel - Tagesverbrauch) landet dann wie gewohnt im Reading "appTanklevel".

Mit einem negativen Verbrauchwert setreading CN.Test consumptionrate -1.6818 lassen sich die Dinge natürlich auch aufsummieren, wenn man das möchte....
"When all else fails, read the instructions."

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

Lucky2k12

#610
Danke @pappn hab ich so bei mir eingebaut.

Jetzt bekomme ich allerdings keine logs mehr von appTanklevel. Künnte da ein event fehlen?

List vom hourcounter device:
Internals:
   DEF        sonoffpow1:onoff:.1  sonoffpow1:onoff:.0
   FUUID      5c435b3f-f33f-b21a-f2c7-9a18503034d59148
   NAME       HZ_HourCounter
   NR         226
   NTFY_ORDER 50-HZ_HourCounter
   STATE      Starts 0 /d, Vorrat: 5019.6 Liter, 2.9 h/d
   TYPE       HourCounter
   VERSION    1.0.1.2 - 24.12.2014
   Helper:
     DBLOG:
       appCountsPerDay:
         DBLogging:
           TIME       1611856741.38567
           VALUE      36
       appCountsPerHour:
         DBLogging:
           TIME       1611856800.60699
           VALUE      1
       appOpHoursPerDay:
         DBLogging:
           TIME       1611856741.38567
           VALUE      2.8825
       appUtilization:
         DBLogging:
           TIME       1611856741.38567
           VALUE      15.3617266953857
   READINGS:
     2021-01-28 18:41:40   appCountsOverallTemp 7475
     2021-01-28 18:59:01   appCountsPerDay 36
     2021-01-28 19:00:00   appCountsPerHour 1
     2021-01-28 19:00:00   appCountsPerHourTemp 0
     2021-01-01 00:00:01   appCountsPerMonth 937
     2021-01-28 18:41:40   appCountsPerMonthTemp 1126
     2021-01-24 00:00:01   appCountsPerWeek 260
     2021-01-28 18:41:40   appCountsPerWeekTemp 211
     2021-01-01 00:00:02   appCountsPerYear 4637
     2021-01-28 18:41:40   appCountsPerYearTemp 1126
     2021-01-28 18:59:01   appOpHoursPerDay 2.8825
     2021-01-28 19:00:00   appOpHoursPerDayTemp 0
     2021-01-01 00:00:01   appOpHoursPerMonth 91.1625
     2021-01-28 18:59:01   appOpHoursPerMonthTemp 100.079444444444
     2021-01-24 00:00:01   appOpHoursPerWeek 23.0236111111111
     2021-01-28 18:59:01   appOpHoursPerWeekTemp 16.8522222222222
     2021-01-01 00:00:02   appOpHoursPerYear 514.389999999999
     2021-01-28 18:59:01   appOpHoursPerYearTemp 100.079444444444
     2021-01-28 18:59:01   appTanklevel    5019.55466666667
     2021-01-28 18:59:01   appUtilization  15.3617266953857
     2021-01-28 19:00:00   appUtilizationTemp 0
     2021-01-28 19:00:00   appUtilizationTempOld 15.1841500709676
     2021-01-23 13:49:16   consumptionrate 2.4
     2021-01-28 19:00:00   countsOverall   7475
     2021-01-28 19:00:00   countsPerDay    0
     2021-01-28 19:00:00   pauseTimeEdge   2253
     2021-01-28 19:00:00   pauseTimeIncrement 849
     2021-01-28 19:00:00   pauseTimeOverall 44441548
     2021-01-28 19:00:00   pauseTimePerDay 59
     2021-01-28 19:00:00   pulseTimeEdge   251
     2021-01-28 19:00:00   pulseTimeIncrement 251
     2021-01-28 19:00:00   pulseTimeOverall 2883653
     2021-01-28 19:00:00   pulseTimePerDay 0
     2021-01-28 19:00:00   state           0
     2021-01-28 18:45:51   tickChanged     964
     2021-01-28 18:59:01   tickDay         1
     2021-01-28 19:00:00   tickHour        6
     2021-01-28 13:57:16   tickMonth       0
     2021-01-28 19:00:00   tickUpdated     719
     2021-01-28 13:57:16   tickWeek        0
     2021-01-28 13:57:16   tickYear        0
     2021-01-28 19:00:00   value           0
   helper:
     OFF_Regexp sonoffpow1:onoff:.0
     ON_Regexp  sonoffpow1:onoff:.1
     calledByEvent
     changedTimestamp 2021-01-28 19:00:00
     forceClear
     forceDayChange
     forceHourChange
     forceMonthChange
     forceWeekChange
     forceYearChange
     isFirstRun
     sdRoundHourLast 1611856800
     value      -1
     cmdQueue:
Attributes:
   DbLogInclude app\w*(Tanklevel|Utilization|PerHour|PerDay|PerWeek|PerMonth|PerYear)(?!Temp).*
   event-min-interval tick.*:0,.*:3600
   event-on-change-reading .*
   room       Energy,Heizung
   stateFormat Starts [HZ_HourCounter:countsPerDay:i] /d, Vorrat: [HZ_HourCounter:appTanklevel:r1] Liter, [HZ_HourCounter:appOpHoursPerDay:r1] h/d
   verbose    3


notify
Internals:
   DEF        HZ_HourCounter:tick.* { appHCNotify("$NAME","$EVTPART0","$EVTPART1");}
   FUUID      5c435b3f-f33f-b21a-8899-d2ba5f32821f7f2e
   NAME       n.HC
   NOTIFYDEV  HZ_HourCounter
   NR         227
   NTFY_ORDER 50-n.HC
   REGEXP     HZ_HourCounter:tick.*
   STATE      2021-01-28 19:00:00
   TRIGGERTIME 1611856800.52002
   TYPE       notify
   READINGS:
     2021-01-28 13:56:43   state           active
Attributes:
   room       Heizung


Das Reading appTanklevel zählt brav runter, wird aber nicht geloggt.
HP T610, HM, Jeelink, LGW, mapleCUL868+434

pappn

ZitatDas Reading appTanklevel zählt brav runter, wird aber nicht geloggt.

Da hat sich ein kleiner Fehler in den Code eingeschlichen. readingsSingleUpdate für appTanklevel muss von:
readingsSingleUpdate($hash, 'appTanklevel', $appTanklevel,0); auf
readingsSingleUpdate($hash, 'appTanklevel', $appTanklevel,1); geändert werden.
Dann läuft es. Ist mir nie aufgefallen, da ich den Wert nicht logge.

Version mit Korrektur ist angehängt.
"When all else fails, read the instructions."

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

Smarthome_BABO

Hallo zusammen,

es tut mir leid, dass ich direkt mit so einer Anfängerfrage hier in den Beitrag schreibe (Sorry vorab)..


Leider kriege ich den HourCounter beim einem Bewegunsmelder Device absolut nicht zum laufen...trotz diverser Versuche.

Anbei ein Auszug aus den LOG Einträgen:
2021-08-05_20:41:47 HM_motion battery: ok
2021-08-05_20:41:47 HM_motion brightness: 144
2021-08-05_20:41:47 HM_motion motion: on (to broadcast)
2021-08-05_20:41:47 HM_motion motionCount: 187_next:240s
2021-08-05_20:41:47 HM_motion motion
2021-08-05_20:41:47 HM_motion trigger_cnt: 187
2021-08-05_20:41:47 HM_motion Uhrzeit: 2021-08-05 20:41:47
2021-08-05_20:45:49 HM_motion motion: off
2021-08-05_20:45:49 HM_motion motionDuration: 242
2021-08-05_20:45:49 HM_motion noMotion
2021-08-05_20:45:49 HM_motion Uhrzeit: 2021-08-05 20:45:49
2021-08-05_20:49:10 HM_motion Activity: alive
2021-08-05_20:49:10 HM_motion Uhrzeit: 2021-08-05 20:45:49



Bereits ohne Erfolg versucht wurde:

HM_motion:.noMotion HM_motion:.motion
HM_motion:.Motion HM_motion:.noMotion
HM_motion:motion:.on HM_motion:motion:.off
HM_motion:state:.motion HM_motion:state:.noMotion

aber leider wird kein einziges Event erkannt....bin inzwischen ein wenig ratlos und hoffe auf eure Hilfe!

Gruß und Danke

Sebastian

Wzut

Zitat2021-08-05_20:41:47 HM_motion motion: on (to broadcast)
2021-08-05_20:45:49 HM_motion motion: off
wäre dann vermutlich
HM_motion:motion:.on.* HM_motion:motion:.off
das simple on greift nicht wegen  (to broadcast)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Smarthome_BABO

Danke für den Tipp... hab es probiert...leider auch ohne Erfolg!

Bei den verschiedenen  DOIF und notify Anwendungen überall kein Thema, aber beim HourCounter funktioniert es einfach nicht!

Gruß

Sebastian