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 .*
Du kannst mit Rest rechnen, wenn der Null ist hast du die 50h erreicht. Rest ist anstelle von ÷ mit % rechnen.
Wird nicht funtionieren, der Zähler zählt doch immer weiter hoch.
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
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.
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
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)
Gut möglich, dass es so klappt. Einfach probieren und zB mit setreading oder trigger testen.
Im Log habe ich eine Fehlermeldung.
eval: Automower_Messerwechsel: warning in condition c01
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 :)
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
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.....
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.
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 ;)
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.
Zitat von: Pfriemler am 08 April 2018, 13:53:37
Mit cmdPause 3600 könnte man das mehrfache Auslösen des Ausführungsteils in solchem Fall prima verhindern.
Hmm, das is dann aber doch eher SymptomBekämpfung oder?
Wenn Robi dann durch Zufall zur 50igsten Betriebsstunde ins Häuschen fährt und nach 2-3h Laden weiter macht befindet er sich ja trotzdem noch 60 min in der 50igsten Betriebsstunde und hat abhängig vom Interval noch x Gelegenheiten eine Nachricht zu senden
Ok eben getestet, ich bekomme auch alle 4 Minuten eine Meldung, wenn der pulseTimeOverall Wert jetzt immer weiter läuft sollte es so gehen ;D
Stimmt - so betrachtet ist das nicht ganz pfiffig, wenngleich die Meldung dann trotzdem max 1x pro Stunde kommt.