Benachrichtigung nach x Stunden

Begonnen von elmer, 07 April 2018, 12:05:55

Vorheriges Thema - Nächstes Thema

elmer

Ich lasse von Hourcounter und einem Homematic Fensterkontakt die Stunden zählen die mein Möhroboter fährt. Ist es möglich mit einem notify oder doif immer nach x Stunden eine Benachrichtigung zu erhalten?

Also so das ich immer wenn der Mäher 50 Stunden unterwegs war eine Benachrichtigung erhalte.

Internals:
   .lastTimecountsOverall 1523095202.47141
   .lastTimecountsPerDay 1523095202.47141
   .lastTimepauseTimeEdge 1523095202.47141
   .lastTimepauseTimeIncrement 1523095202.47141
   .lastTimepauseTimeOverall 1523095202.47141
   .lastTimepauseTimePerDay 1523095202.47141
   .lastTimepulseTimeEdge 1523095202.47141
   .lastTimepulseTimeIncrement 1523095202.47141
   .lastTimepulseTimeOverall 1523095202.47141
   .lastTimepulseTimePerDay 1523095202.47141
   .lastTimestate 1523095202.47141
   .lastTimetickDay 1523068235.45031
   .lastTimetickHour 1523095202.51415
   .lastTimetickMonth 1523068235.45031
   .lastTimetickUpdated 1523095202.47141
   .lastTimetickWeek 1523068235.45031
   .lastTimetickYear 1523068235.45031
   .lastTimevalue 1523095202.47141
   DEF        HM_4AE8E3:open HM_4AE8E3:closed
   NAME       CN.Automower_Stundenzaehler
   NR         352
   NTFY_ORDER 50-CN.Automower_Stundenzaehler
   STATE      0
   TYPE       HourCounter
   VERSION    1.0.1.2 - 24.12.2014
   .attraggr:
   .attreocr:
     .*
   .attrminint:
     tick.*:0
     .*:3600
   READINGS:
     2018-04-07 12:00:02   countsOverall   2
     2018-04-07 12:00:02   countsPerDay    0
     2018-04-04 18:00:00   openclosed      0
     2018-04-07 12:00:02   pauseTimeEdge   154864
     2018-04-07 12:00:02   pauseTimeIncrement 64462
     2018-04-07 12:00:02   pauseTimeOverall 260208
     2018-04-07 12:00:02   pauseTimePerDay 41365
     2018-04-07 12:00:02   pulseTimeEdge   11819
     2018-04-07 12:00:02   pulseTimeIncrement 11819
     2018-04-07 12:00:02   pulseTimeOverall 24211
     2018-04-07 12:00:02   pulseTimePerDay 0
     2018-04-07 12:00:02   state           0
     2018-04-06 17:35:05   tickChanged     4
     2018-04-07 04:30:35   tickDay         0
     2018-04-07 12:00:02   tickHour        8
     2018-04-07 04:30:35   tickMonth       0
     2018-04-07 12:00:02   tickUpdated     113
     2018-04-07 04:30:35   tickWeek        0
     2018-04-07 04:30:35   tickYear        0
     2018-04-07 12:00:02   value           0
   helper:
     OFF_Regexp HM_4AE8E3:closed
     ON_Regexp  HM_4AE8E3:open
     calledByEvent
     changedTimestamp 2018-04-07 12:00:02
     forceClear
     forceDayChange
     forceHourChange
     forceMonthChange
     forceWeekChange
     forceYearChange
     isFirstRun
     sdRoundHourLast 1523095200
     value      -1
     cmdQueue:
Attributes:
   event-min-interval tick.*:0,.*:3600
   event-on-change-reading .*

Amenophis86

Du kannst mit Rest rechnen, wenn der Null ist hast du die 50h erreicht. Rest ist anstelle von ÷ mit % rechnen.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

elmer

#2
Wird nicht funtionieren, der Zähler zählt doch immer weiter hoch.

stefanpf

Das funktioniert schon.
Modulo ist das Stichwort.

1 % 50=1
2 % 50=2
...
50% 50=0
100% 50=0
Kannst du unter
http://www.mathe24.net/modulo.html?action=do
simulieren

elmer

Und wie soll das mit Doif gehen, so wie ich das verstehe ist der Wert pulseTimeIncrement in Hourcounter immer fortlaufend. Also genau von diesem Wert muss ich ausgehen für die Gesamt Fahrzeit.

Für jede Stunde die der Mäher in Bewegung ist erhöht sich dieser Wert um eine Stunde. Ich brauche also ein Doif oder notify das mir meldet wenn der Wert 50 Stunden höher ist, wenn wieder 50 Stunden mehr drauf sind soll es die nächste Meldung geben, und immer so weiter.

stefanpf

#5
Habe noch nie mit einem hourcounter gearbeitet, aber hier mal mit einem dummy simuliert:


Internals:
   CFGFN     
   NAME       maeh
   TYPE       dummy
   
   READINGS:
     2018-04-07 21:21:04   hourcounter     150
Attributes:
   room       000



Internals:
   CFGFN     
   DEF        (  [maeh:hourcounter] % 50  == 0 ) ( set s_ku_Licht on)
   MODEL      FHEM
   NAME       di_maeh
   TYPE       DOIF

Attributes:
   do         always
   room       000




Mittels SetReading kann man die Funktion überprüfen

SetReading maeh  hourcounter 50


elmer

Würde das so passen

( [CN.Automower_Stundenzaehler:pulseTimeIncrement] % 50 == 0 ) ( set Pushover msg title=Automower priority=2 retry=180 expire=900 sound=siren 🔪 Messer wechseln)

Amenophis86

Gut möglich, dass es so klappt. Einfach probieren und zB mit setreading oder trigger testen.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

elmer

Im Log habe ich eine Fehlermeldung.

eval: Automower_Messerwechsel: warning in condition c01

Amenophis86

Wie so oft hilft ein List des Device bzw der Beteiligten Device. Bis dahin kann ich dir sagen, dass ich Bedingung 1 ein Fehler ist :)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

elmer

Internals:
   .lastTimeappCountsPerHour 1523174400.65939
   .lastTimeappCountsPerHourTemp 1523174400.65939
   .lastTimeappOpHoursPerDayTemp 1523174400.646
   .lastTimeappUtilizationTemp 1523174400.646
   .lastTimeappUtilizationTempOld 1523174400.646
   .lastTimecountsOverall 1523174400.57122
   .lastTimecountsPerDay 1523174400.57122
   .lastTimepauseTimeEdge 1523174400.57122
   .lastTimepauseTimeIncrement 1523174400.57122
   .lastTimepauseTimeOverall 1523174400.57122
   .lastTimepauseTimePerDay 1523174400.57122
   .lastTimepulseTimeEdge 1523174400.57122
   .lastTimepulseTimeIncrement 1523174400.57122
   .lastTimepulseTimeOverall 1523174400.57122
   .lastTimepulseTimePerDay 1523174400.57122
   .lastTimestate 1523174400.57122
   .lastTimetickDay 1523154634.00563
   .lastTimetickHour 1523174400.62227
   .lastTimetickMonth 1523154634.00563
   .lastTimetickUpdated 1523174400.57122
   .lastTimetickWeek 1523154634.00563
   .lastTimetickYear 1523154634.00563
   .lastTimevalue 1523174400.57122
   DEF        HM_4AE8E3:open HM_4AE8E3:closed
   NAME       CN.Automower_Stundenzaehler
   NR         352
   NTFY_ORDER 50-CN.Automower_Stundenzaehler
   STATE      0
   TYPE       HourCounter
   VERSION    1.0.1.2 - 24.12.2014
   .attraggr:
   .attreocr:
     .*
   .attrminint:
     tick.*:0
     .*:3600
   READINGS:
     2018-04-08 00:00:01   appCountsPerDay 0
     2018-04-08 10:00:00   appCountsPerHour 0
     2018-04-08 10:00:00   appCountsPerHourTemp 0
     2018-04-08 00:00:01   appCountsPerWeek 0
     2018-04-08 00:00:01   appCountsPerWeekTemp 0
     2018-04-08 00:00:01   appOpHoursPerDay 0
     2018-04-08 10:00:00   appOpHoursPerDayTemp 0
     2018-04-08 00:00:01   appOpHoursPerMonthTemp 0
     2018-04-08 00:00:01   appOpHoursPerWeek 0
     2018-04-08 00:00:01   appOpHoursPerWeekTemp 0
     2018-04-08 00:00:01   appOpHoursPerYearTemp 0
     2018-04-08 00:00:01   appUtilization  0
     2018-04-08 10:00:00   appUtilizationTemp 0
     2018-04-08 10:00:00   appUtilizationTempOld 0
     2018-04-08 10:00:00   countsOverall   2
     2018-04-08 10:00:00   countsPerDay    0
     2018-04-04 18:00:00   openclosed      0
     2018-04-08 10:00:00   pauseTimeEdge   154864
     2018-04-08 10:00:00   pauseTimeIncrement 141828
     2018-04-08 10:00:00   pauseTimeOverall 337574
     2018-04-08 10:00:00   pauseTimePerDay 34168
     2018-04-08 10:00:00   pulseTimeEdge   11819
     2018-04-08 10:00:00   pulseTimeIncrement 50
     2018-04-08 10:00:00   pulseTimeOverall 24211
     2018-04-08 10:00:00   pulseTimePerDay 0
     2018-04-08 10:00:00   state           0
     2018-04-06 17:35:05   tickChanged     4
     2018-04-08 04:30:34   tickDay         0
     2018-04-08 10:00:00   tickHour        6
     2018-04-08 04:30:34   tickMonth       0
     2018-04-08 10:00:00   tickUpdated     137
     2018-04-08 04:30:34   tickWeek        0
     2018-04-08 04:30:34   tickYear        0
     2018-04-08 10:00:00   value           0
   helper:
     OFF_Regexp HM_4AE8E3:closed
     ON_Regexp  HM_4AE8E3:open
     calledByEvent
     changedTimestamp 2018-04-08 10:00:00
     forceClear
     forceDayChange
     forceHourChange
     forceMonthChange
     forceWeekChange
     forceYearChange
     isFirstRun
     sdRoundHourLast 1523174400
     value      -1
     cmdQueue:
Attributes:
   event-min-interval tick.*:0,.*:3600
   event-on-change-reading .*


Internals:
   DEF        (  [CN.Automower_Stundenzaehler:pulseTimeIncrement] % 1  == 0 ) ( set Pushover msg title=Automower device=Samsung-S7 priority=2 retry=180 expire=900 sound=siren 🔪 Messer wechseln)
   NAME       Automower_Messerwechsel
   NR         358
   NTFY_ORDER 50-Automower_Messerwechsel
   STATE      disabled
   TYPE       DOIF
   READINGS:
     2018-04-08 00:00:01   Device          CN.Automower_Stundenzaehler
     2018-04-08 00:00:01   cmd             1
     2018-04-08 00:00:01   cmd_event       CN.Automower_Stundenzaehler
     2018-04-08 00:00:01   cmd_nr          1
     2018-04-08 00:00:01   e_CN.Automower_Stundenzaehler_pulseTimeIncrement 50
     2018-04-08 00:01:20   last_cmd        cmd_1
     2018-04-08 00:01:20   mode            disabled
     2018-04-08 00:01:20   state           disabled
   condition:
     0            ReadingValDoIf($hash,'CN.Automower_Stundenzaehler','pulseTimeIncrement') % 1  == 0
   devices:
     0           CN.Automower_Stundenzaehler
     all         CN.Automower_Stundenzaehler
   do:
     0:
       0           set Pushover msg title=Automower device=Samsung-S7 priority=2 retry=180 expire=900 sound=siren 🔪 Messer wechseln
     1:
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   itimer:
   readings:
     0           CN.Automower_Stundenzaehler:pulseTimeIncrement
     all         CN.Automower_Stundenzaehler:pulseTimeIncrement
   uiState:
   uiTable:
Attributes:
   do         always

stefanpf

#11
Ich erkenne auf den ersten Blick keinen Fehler :(
Aber:
pulseTimeIncrement scheint dasfalsche Reading für dein Vorhaben zu sein.
Der Counter wird jedes mal auf 0 gesetzt wenn Robi aus dem Häuschen fährt.

PulseTimeOverall scheint fortlaufend die Betriebssekunden zu zählen.
Da das Reading nicht jede Sekunde aktualisiert wird, kannst du hier nicht mit Div MOD arbeiten, da die Chance, dass das Reading genau in der passenden Sekunde eintrifft gegen 0 gehen dürfte.

Grübel.....

elmer

#12
Sagte ich doch das alles fortlaufend ist, Pause Time zählt immer hoch wenn der Möher steht und Pulse Time wenn er fährt.

Kann ich das Value Reading dafür missbrauchen, der Wert steht immer auf 0, wenn er fährt auf 1.

Ist es möglich sobald der Wert auf 1 geht das von den 50 Stunden rückwärts gezählt wird, wenn er wieder auf 0 geht sollte das ganze pausieren und bei der nächsten 1 wieder wieder abziehen bis ich eine Meldung erhalte. Danach sollte er einfach wieder bei 50 anfangen und wieder bis 0 runterzählen.

stefanpf

#13
Das alles fortlaufend ist, steht nicht zur Debatte....
Sicher gibt es verschiedene Ansätze zur Lösung, aber nur weil jemand einen Stein in den Weg legt, muss man nicht jedesmal die Richtung wechseln.
Überleg doch lieber mit, wie du den Stein wegbekommst.

Bauen wir uns doch erst mal ein Helferchen.....

attr CN.Automower_Stundenzaehler userReadings Betriebsstunden:pulseTimeOverall.* {int (ReadingsVal("CN.Automower_Stundenzaehler","pulseTimeOverall",0)/3600)}
attr CN.Automower_Stundenzaehler Interval 1


Nun haben wir ein Reading mit ganzzahligem Inhalt, dass auch nur jede Stunde den Inhalt wechselt - sprich das vermeintlich unregelmässige Aktualisieren des pulseTimeOverall Readings ist kompensiert.


define di_Tester ([CN.Automower_Stundenzaehler:Betriebsstunden]>0 and [CN.Automower_Stundenzaehler:Betriebsstunden] % 50== 0 ) ( set pushmsg message Messer wechseln)


Das kann man sicher auch im doif zusammenfassen, aber ich finde das so etwas augenfreundlicher :)

Zum Testen kann man
die /3600 ja erst einmal durch /120 (jede Real-Minute entspricht einer halben fiktiven Stunde)
und % 50 durch % 2 (jede zweite fiktive Stunde wird eine Nachricht geschickt)
ersetzen, damit die Zeit etwas schneller umgeht.

Das do always am doif muss wieder weg, da sonst das doif vermutlich innerhalb der 50igsten Betriebsstunde bei jedem Update des Readings anschlägt.

Bitte nicht mit Modulo 1 testen, dass doif ruft dann nicht das cmd_2 auf und die  Nachricht für den nächsten Wechsel wird nicht mehr geschickt).
Mit meiner Terrassentür funktioniert das hier wie Bolle (da soll ich jetzt alle 4 Minuten das Messer wechseln)


Nun weiß ich nicht, wann daß Reading pulseTimeOverall überläuft und wie es sich dann verhält (könnte auf 0 springen oder aber auch irgend einen Minuswert annehmen,...).
Wenn dich die Gesamtbetriebsstunden nicht interessieren, dann kannst du den Counter auch bei Nachrichtensendung auf 0 setzen:
([CN.Automower_Stundenzaehler:Betriebsstunden]>0  and [CN.Automower_Stundenzaehler:Betriebsstunden] % 50== 0 )
( set pushmsg message Messer wechseln, set CN.Automower_Stundenzaehler pulseTimeOverall 0)


Und weitergespielt: sind die Gesamtbetriebsstunden egal, geht es auch noch einfacher
define Tester2 doif ([CN.Automower_Stundenzaehler:pulseTimeOverall]>=(50*3600) ) ( set pushmsg message Messer wechseln, set CN.Automower_Stundenzaehler pulseTimeOverall 0)

Btw: das Reading value spiegelt doch den Status deines FensterKontaktes. Da kannst du zwar einen zweiten Hourcounter mit ansteuern, bringt dann aber nix ;)

Pfriemler

Zitat von: stefanpf am 08 April 2018, 12:43:23
Das do always am doif muss wieder weg, da sonst das doif vermutlich innerhalb der 50igsten Betriebsstunde bei jedem Update des Readings anschlägt.
Mit cmdPause 3600 könnte man das mehrfache Auslösen des Ausführungsteils in solchem Fall prima verhindern.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."