[Gelöst] Batterieüberwachung nur einmal täglich

Begonnen von Joesky, 01 April 2019, 15:15:55

Vorheriges Thema - Nächstes Thema

Joesky

Hat vielleicht jemand eine Idee wie man die Batterieüberwachung aus dem Wiki so abändern könnte, dass

1. Alle Meldungen nur einmal am Tag gesammelt verschickt werden (bei mit über Telegram)
2. Die Meldungen sich nicht wiederholen, also pro Gerät nur eine Zeile gespeichert und verschickt wird.

Hintergrund bei mir ist dieser, dass ich eine Batteriewarnung bekomme, die über die CUL433 reinkommt aber nicht von einem meiner Geräte ist. Ich habe das Gerät in der fhem.cfg auf die Geräte-Ignoreliste gesetzt. Es wird auch nicht mehr in der fhem.cfg neu angelegt und trotzdem bekomme ich täglich zwischen 100 und 150 Meldungen, 24h. Das nervt. Ich habe gesehen, dass Einträge mit dem Gerät in der fhem.save gibt.
Des weiteren nerven mich Batteriewarnungen, die Nachts kommen. Auch wenn der Ton aus ist, die Vibration kriege ich mit. Und der dritte Grund ist, dass die Geräte, wenn sie eine Batteriewarnung ausgeben mind. einen ganzen Tag noch halten werden, vor daher ist eine sofortige Meldung für mich persönlich nicht nötig. Ich hab nur keine Idee, wie man das machen könnte.
_______________
FREI STATT BAYERN

igami

Das monitoring Modul deckt das ab. Ein Beispiel für die Batterie Überwachung findet sich in der commandref.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Joesky

Danke für den Tipp! Würde ich nun mit DOIF oder einem Notify zu einer bestimmten Uhrzeit einen Reading auslesen und verschicken?
_______________
FREI STATT BAYERN

Damian

Zitat von: Joesky am 01 April 2019, 17:41:10
Danke für den Tipp! Würde ich nun mit DOIF oder einem Notify zu einer bestimmten Uhrzeit einen Reading auslesen und verschicken?

notify kann keine Zeitsteuerung, wenn schon, dann at-Befehl oder eben DOIF.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Byte09

Du könntest das auch komplett über MSWITCH realisieren . Das könnte alle Meldungen 'sammeln' und zu einer bestimmten Zeit verschicken.  Da wäre alles komplett in einem Device.  Bin heute leider unterwegs , könnte aber morgen mal was bauen.

Gruss Byte09

Gesendet von meinem SM-G900F mit Tapatalk


igami

Zitat von: Joesky am 01 April 2019, 17:41:10
Danke für den Tipp! Würde ich nun mit DOIF oder einem Notify zu einer bestimmten Uhrzeit einen Reading auslesen und verschicken?
Hier ist eine Möglichkeit wie man das machen kann:
Zitat von: igami am 11 Juli 2017, 08:05:47
Schon etwas ausführlicher:

defmod ServiceNotifications_DI DOIF ((\
   [":^error add:"]\
   || [$SELF:cmd] == 2\
) \
&& (\
   (\
     [ServiceNotifications_cu:state] eq "ein"\
     && [NRW:state] eq "none"\
   ) \
   || AttrVal("$DEVICE", "priority", 0) == 1\
) \
)(\
  {my $msg = fhem("get TYPE=monitoring default");;\
   my $oldMsg = $defs{$SELF}{helper}{oldMsg};;\
\
   if($msg && (!$oldMsg || $msg ne $oldMsg)){\
    sendEmail("XXX", $msg);;\
\
$defs{$SELF}{helper}{oldMsg} = $msg;;\
   }\
   \
   return;;\
  }\
)\
DOELSEIF\
([":^error add:"])

attr ServiceNotifications_DI cmdState send notifications|notifications pending
attr ServiceNotifications_DI cmdpause 60*15
attr ServiceNotifications_DI do always
attr ServiceNotifications_DI wait 60*15

Ich überprüfe immer auf error add:

Umschriben bedeutet der code:
Falls ein Gerät ein "error add:" Event auslöst, oder ich mich im Status zwei Befinde
Und, mein Weekdaytimer eingeschaltet ist und kein Feiertag ist, oder die Benachrichtigung Priorität hat,
warte 15 Minuten ob noch weitere Fehlermeldungen kommen und schicke mir dann eine Nachricht, sofern die Nachricht sich von der vorherigen unterscheidet und nicht leer ist.
Andernfalls falls ein Gerät ein "error add:" Event auslöst, speichere das als Status zwei.

Dieses DOIF nutze ich auf der Arbeit um mich nur während der Arbeitszeit informieren zu lassen. Ich möchte ja nicht zu Hause wissen, dass ich Batterien tauschen muss. Falls aber etwas wichtiges ist, z.B. Klimaanlage im Serverraum ausgefallen werde ich trotzdem benachrichtigt. Dafür habe ich meinen monitoring einer userattr priority spendiert.

Zu Hause mache ich das ganz anders, da lasse ich mir einfach alle Nachrichten schicken, wenn ich 15 Minuten zu hause bin. Und nicht dann, wenn sie auftreten.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Joesky

Das sieht irgendwie kompliziert aus. Ich will doch nur Meldungen gesammelt 1x am Tag zur festen Uhrzeit ausgeben...  ;)

Das mit dem MSWITCH find ich interessant.
_______________
FREI STATT BAYERN

Eistee

Schreib doch in deine DOIF Bedingung einfach die Uhrzeit mit rein: and [18:00]

DeeSPe

#8
Hier ein beispielhaftes at:

defmod at_Batteriewarnung at *20:00 {\
  my @devs;;\
  foreach (devspec2array("battery!=,batteryPercent!="))\
  {\
    push @devs,$_ if (ReadingsVal($_,"battery","") eq "low" || ReadingsNum($_,"batteryPercent",100) < 20);;\
  }\
  fhem "msg push Die Batterien von folgenden Geräten sollten ausgetauscht werden: ".join(", ",@devs) if (@devs);;\
}


Jeden Tag um 20 Uhr werden alle Devices die ein battery oder batteryPercent Reading haben und deren Werte entweder low oder kleiner als 20 sind in ein Array geschrieben und am Ende das Array als kommaseparierter String per Push Nachricht versendet.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

#9
Zitat von: DeeSPe am 03 April 2019, 15:01:31
Hier ein beispielhaftes at:

defmod at_Batteriewarnung at *20:00 {\
  my @devs;;\
  foreach (devspec2array("battery!=,batteryPercent!="))\
  {\
    push @devs,$_ if (ReadingsVal($_,"battery","") eq "low" || ReadingsNum($_,"batteryPercent",100) < 20);;\
  }\
  fhem "msg push Die Batterien von folgenden Geräten sollten ausgetauscht werden: ".join(", ",@devs) if (@devs);;\
}


Jeden Tag um 20 Uhr werden alle Devices die ein battery oder batteryPercent Reading haben und deren Werte entweder low oder kleiner als 20 sind in ein Array geschrieben und am Ende das Array als kommaseparierter String per Push Nachricht versendet.

Gruß
Dan

Oder noch kürzer:
defmod at_Batteriewarnung at *20:00 {\
  my @devs = devspec2array("battery=low,batteryPercent<20");;\
  fhem "msg push Die Batterien von folgenden Geräten sollten ausgetauscht werden: ".join(", ",@devs) if (@devs);;\
}


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Byte09

#10
Zitat von: Joesky am 03 April 2019, 14:11:32
Das sieht irgendwie kompliziert aus. Ich will doch nur Meldungen gesammelt 1x am Tag zur festen Uhrzeit ausgeben...  ;)

Das mit dem MSWITCH find ich interessant.

hier die MSwitch Version:

aktuelles Fhem ist Voraussetzung. sendet dir die Infos immer um 18.00 Uhr . Wenn du reinschaust wirst du sehen , wo du die Zeit ändern kannst.

ansonsten kannst du manuell das Senden auslösen und die readings zurücksetzen. Bei Fragen gerne melden.

gruss Byte09

PS:

falls du im device folgende meldung bekommst :

Zitattelebot   
Achtung: Dieses Device ist nicht vorhanden , bitte mit "set changed_renamed" korrigieren !

musst du den Namen deines telegrammdevices anpassen. dazu bitte 'set changed_renamed telebot DEINDEVICENAME' eingeben' ( direkt im Device über die 'set' auswahl.


defmod Batteri_Info MSwitch
attr Batteri_Info MSwitch_Debug 0
attr Batteri_Info MSwitch_Delete_Delays 1
attr Batteri_Info MSwitch_Expert 1
attr Batteri_Info MSwitch_Extensions 0
attr Batteri_Info MSwitch_Help 0
attr Batteri_Info MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul
attr Batteri_Info MSwitch_Include_Devicecmds 1
attr Batteri_Info MSwitch_Include_MSwitchcmds 0
attr Batteri_Info MSwitch_Include_Webcmds 0
attr Batteri_Info MSwitch_Inforoom MSwitch
attr Batteri_Info MSwitch_Lock_Quickedit 1
attr Batteri_Info MSwitch_Mode Full
attr Batteri_Info eventMap /exec_cmd_1:send_info/exec_cmd_1 ID 1:clear_readings/
attr Batteri_Info room 1_test
attr Batteri_Info stateFormat {my $out = ReadingsVal($name,'Devices_all','no_info');;$out=~ s/\n/<br>/ig;;return $out;;}
attr Batteri_Info webCmd send_info:clear_readings

setstate Batteri_Info no_info
setstate Batteri_Info 2019-04-03 17:21:51 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,teleBot-AbsCmd1
setstate Batteri_Info 2019-04-03 17:54:13 .Device_Affected_Details FreeCmd-AbsCmd1#[NF]cmd#[NF]cmd#[NF]{#[nl]my#[sp]@devs#[se]#[nl]@devs=(devspec2array('battery!='))#[se]#[nl]my#[sp]$alldevices#[se]#[nl]foreach#[sp](@devs)#[nl]{#[nl]my#[sp]$devicename#[sp]=#[sp]"Device_".$_#[se]#[nl]my#[sp]$inhalt#[sp]=#[sp]ReadingsVal($_#[sp]#[ko]'battery'#[ko]'')#[se]#[nl]$alldevices#[sp].=#[sp]$_."#[sp]Status#[dp]#[sp]".$inhalt."#[bs]n"#[se]#[nl]fhem("setreading#[sp]$SELF#[sp]$devicename#[sp]$inhalt")#[se]#[nl]}#[nl]fhem("setreading#[sp]$SELF#[sp]Devices_all#[sp]$alldevices")#[se]#[nl]}#[NF]#[NF]delay1#[NF]delay1#[NF]00#[dp]00#[dp]00#[NF]00#[dp]00#[dp]00#[NF]#[NF]#[NF]0#[NF]0#[NF]1#[NF]0#[NF]#[NF]0#[NF]0#[NF]1#[ND]FreeCmd-AbsCmd2#[NF]cmd#[NF]cmd#[NF]{#[nl]fhem("deletereading#[sp]$SELF#[sp]Device_.*")#[se]#[nl]fhem("deletereading#[sp]$SELF#[sp]Devices_.*")#[se]#[nl]}#[NF]#[NF]delay1#[NF]delay1#[NF]00#[dp]00#[dp]00#[NF]00#[dp]00#[dp]00#[NF]#[NF]#[NF]0#[NF]0#[NF]1#[NF]1#[NF]#[NF]0#[NF]0#[NF]1#[ND]teleBot-AbsCmd1#[NF]_msg#[NF]no_action#[NF][$SELF#[dp]Devices_all]#[NF]#[NF]delay1#[NF]delay1#[NF]00#[dp]00#[dp]00#[NF]00#[dp]00#[dp]00#[NF]#[NF]#[NF]0#[NF]0#[NF]2#[NF]0#[NF]#[NF]0#[NF]0#[NF]1
setstate Batteri_Info 2019-04-03 17:20:54 .Device_Events no_trigger
setstate Batteri_Info 2019-04-03 16:31:32 .First_init done
setstate Batteri_Info 2019-04-03 16:31:32 .Trigger_cmd_off no_trigger
setstate Batteri_Info 2019-04-03 16:31:32 .Trigger_cmd_on no_trigger
setstate Batteri_Info 2019-04-03 17:20:54 .Trigger_condition
setstate Batteri_Info 2019-04-03 16:31:32 .Trigger_off no_trigger
setstate Batteri_Info 2019-04-03 16:31:32 .Trigger_on no_trigger
setstate Batteri_Info 2019-04-03 17:20:54 .Trigger_time on~off~ononly[18#[dp]00]~offonly~onoffonly
setstate Batteri_Info 2019-04-03 16:31:32 .V_Check V2.00
setstate Batteri_Info 2019-04-03 17:56:25 Trigger_device no_trigger
setstate Batteri_Info 2019-04-03 16:31:32 Trigger_log off
setstate Batteri_Info 2019-04-03 17:29:19 last_activation_by manual
setstate Batteri_Info 2019-04-03 17:50:09 last_cmd 2
setstate Batteri_Info 2019-04-03 17:50:09 last_exec_cmd set teleBot _msg 0
setstate Batteri_Info 2019-04-03 17:29:19 state on


Eistee

Dann mach ich noch mal das DOIF:
defmod xx.Battery.di DOIF ([":^[Bb]attery"] eq "low" and [18:00])\
(msg push Die Batterie von $DEVICE ist bald leer.)

Byte09

Zitat von: Eistee am 03 April 2019, 18:05:26
Dann mach ich noch mal das DOIF:
defmod xx.Battery.di DOIF ([":^[Bb]attery"] eq "low" and [18:00])\
(msg push Die Batterie von $DEVICE ist bald leer.)


nun ist ja reichlich Auswahl vorhanden  ;D

gruss Byte09

Damian

#13
Zitat von: Eistee am 03 April 2019, 18:05:26
Dann mach ich noch mal das DOIF:
defmod xx.Battery.di DOIF ([":^[Bb]attery"] eq "low" and [18:00])\
(msg push Die Batterie von $DEVICE ist bald leer.)


Das wird nicht gut gehen, ein Event ist nur wahr oder falsch, es kann aber nicht low sein und schon gar nicht gleichzeitig mit einem Zeittrigger.

Es gibt dennoch eine kurze Alternative mit Hilfe der Aggregation mit DOIF:

define msgBattery DOIF ([18:00]) (msg push Batteriewechsel für folgende Devices: [@"":battery:$_ ne "ok","keine"])
attr msgBattery  do always


PS.: Im DOIF-Perlmodus geht es noch kürzer ohne Attribute
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Joesky

#14
Uj, danke erstmal für die ganzen Vorschläge. Es gibt viele Wege, die nach Rom führen. Oder so ähnlich...  :)

Zitatsendet dir die Infos immer um 18.00 Uhr . Wenn du reinschaust wirst du sehen , wo du die Zeit ändern kannst.
Nein, leider sehe ich es nicht. Ehrlich gesagt verstehe ich das Modul noch nicht. Ich hab noch nicht rausbekommen, wie ich es dem Modul beibringe, dass er auf .*:[Bb]attery:.* (hier dann natürlich auf !ok, wie derzeit beim Notify) reagiert. Und auch, dass es die Benachrichtigung auf Telegram verschickt.

EDIT:
Jetzt sehe ich was... Wo trage ich das ganze Geraffel ab "setstate" ein?
_______________
FREI STATT BAYERN