Batterieabfrage für Homematic mit Ausfallsüberwachung

Begonnen von AB1970, 06 Januar 2017, 13:45:54

Vorheriges Thema - Nächstes Thema

AB1970

der Code läuft bei mir in der 99_MyUtils.pm:

Er meldet entweder einen niedrigen Batteriestand aller Homematic Geräte oder wenn sich ein Gerät länger als 2 Tage nicht gemeldet hat.
In meinem Fall wird eine Pushnachricht via Pushover verschickt, aber das kann jeder nach seinen eigenen Vorlieben ändern.


sub check_battery()
{
my $text = "Ich brauche Hilfe:\n\n";
my $send = 0;

    foreach my $dev (devspec2array("battery=\\w+"))
    {
my $state = ReadingsVal($dev, "battery", "unbekannt");
if ($state eq "low")
{
my $Room = AttrVal($dev, "room", "...");
my $pos= index($Room,",");
if ($pos != -1) {$Room = substr($Room,0,$pos);}
my $Alias = AttrVal($dev, "alias", "...");
my $time = ReadingsTimestamp($dev, "battery", 0);
$text = $text."Im Raum \"".$Room."\" hat das Gerät \"" .$Alias."\" (Gerätname: \"".$dev."\") den Batteriestand: ".$state." (Zeitstempel: ".$time.")\n";
Log(3,$text);
$send=1;
}
  }
 
  foreach my $dev (devspec2array("Activity=dead"))
    {
my $state = ReadingsVal($dev, "Activity", "nicht auslesbar");
my $time = ReadingsTimestamp($dev, "Activity", 0);
my ($TSss,$TSmm,$TShh,$TSday,$TSmonth,$TSyear,$TSzone) = strptime($time);
my ($LTss,$LTmm,$LThh,$LTday,$LTmonth,$LTyear,$LTwday,$LTyday,$LTisdst) = localtime();

$LTyear+=1900;
$TSyear+=1900;
$TSmonth+=1;
$LTmonth+=1;

my $Dd = Date::Pcalc::Delta_Days($TSyear,$TSmonth,$TSday,$LTyear,$LTmonth,$LTday);

if ($state eq "dead" && $Dd >= 2)
{
$send=1;
my $Room = AttrVal($dev, "room", "...");
my $pos= index($Room,",");
if ($pos != -1) {$Room = substr($Room,0,$pos);}
my $Alias = AttrVal($dev, "alias", "...");
$text = $text."Im Raum \"".$Room."\" hat das Gerät \"" .$Alias."\" (Gerätname: \"".$dev."\") sich das letze Mal gemeldet am ".$time."\n";
Log(3,$text);
}
  }
 
 
  if ($send == 1 )
  {
system ("curl -s -F 'token=<Token>' -F 'user=<Benutzername' -F 'device=IPhone6' -F 'message=$text' https://api.pushover.net/1/messages.json");
}
}


Bitte beachtet, dass die Bibliothek libdate-pcalc-perl installiert sein muss.

Das erreicht ihr mit:
sudo apt-get install libdate-pcalc-perl libdatetime-format-strptime-perl
FHEM muss nach der Installation evtl. neu gestartet werden.

Oben in der 99_MyUtils.pm müsst ihr dann die Bibliothek hinzufügen.
Das geschieht mit:
use Date::Pcalc;

Damit das Ganze auch aufgerufen wird, kommt in die fhem.cfg:
define Battery_low at *20:15:00 {check_battery()}

das heisst, die Batterieauswertung erfolgt einmal am Tag um 20:15.

Fixel2012

Hallo, danke für das veröffentlichen deines Codes, finde ihn sehr Interessant!

Habe Momentan nicht als zu viele Homematic Geräte, aber es werden doch rasch schnell mehr. Ich habe für diese jeweils ein einzeln notify geschrieben, damit ich über leere Batterienstände benachrichtigt werde. Deine Methode ist da wohl deutlich eleganter!

Könntest du mir sagen ob mein unten abgeänderter Code für die Nutzung eines Telegrambots anstatt Pushover richtig ist?

system ("curl -s -F 'token=<Token>' -F 'user=<Benutzername' -F 'device=IPhone6' -F 'message=$text' https://api.pushover.net/1/messages.json");

Diese Zeile würde ich bei mir durch

fhem ("set telebot message $text")

abändern.

sehe ich das richitg?

Hast du außerdem noch einen kleinen Tipp wie ich am einfachsten testen kann ob die nachricht auch ohne leere Batterien (richtig) gesendet wird?

Ich habe in der 99_MyUtils.pm bisher nur einen Code, kann ich den neuen Code mit ein paar Absätzen dazwischen einfach ran hängen

Danke und Viele Grüße

Fixel
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

AB1970

#2
Hi,
ich nutze "telegram bot" nicht, daher kenne ich die Syntax nicht. Aber die Stelle, die du abändern möchtest, ist richtig.
Zum Testen habe ich einfach eine alte Batterie genommen. Ob die Funktion generell aufgerufen wird, kannst du zum Beispiel testen, wenn du ein
Log(3,"Hallo ich bin da!");
in die erste Zeile setzt. Das siehst du dann im Log.
Ob deine Nachricht gesendet wird kannst du testen in dem du:
my $state = ReadingsVal($dev, "battery", "unbekannt"); durch my $state = "low"; ersetzt.

Bitte beachte, wenn du die 99_MyUtils.pm änderst musst du ein reload 99_MyUtils.pm in die Befehlszeile eingeben.
Beim ändern der fhem.cfg ein rereadcfg

Du kannst meinen Code in der Tat einfach bei dir in die 99_MyUtils.pm einfügen.
aber bitte vor dem abschließenden
1;

Ich werde gleich noch ein paar Erläuterungen oben einfügen, ich hoffe der Gesamtablauf wird dann klarer.

Fixel2012

Hey AB1970,

ich danke dir viel Mals, auch für die Hilfestellung!

Habe es mit zwei fast leeren Batterie getestet und es läuft einwandfrei! Super Skript.

Danke für das veröffentlichen!

Dankende Grüße

Fixel
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

JoeALLb

Danke!

Funktioniert auch bestens direkt in einem DOIF ohne "99_MyUtils.pm", was ich persönlich eleganter finde!!
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

AB1970

Hi,
möchtest du deine DOIF-Variante posten?
Ich hoffe, da auch noch etwas lernen zu können. :-)

Grüsse :-)

Fixel2012

Hallo,

ich nochmal...

Ich habe sobald das script ausgeführt wird folgenden Error im Log.

2017.01.22 18:30:00 1: ERROR evaluating {check_battery()}: Undefined subroutine &main::strptime called at ./FHEM/99_myUtils.pm line 98.

2017.01.22 18:30:00 3: Battery_low: Undefined subroutine &main::strptime called at ./FHEM/99_myUtils.pm line 98.


Zeile 98 ist diese hier:
my ($TSss,$TSmm,$TShh,$TSday,$TSmonth,$TSyear,$TSzone) = strptime($time);

Hier das script, wie es bei mir in der myutils.pm steht:

use Date::Pcalc;

sub check_battery()
{
my $text = "Ich brauche Hilfe:\n\n";
my $send = 0;

    foreach my $dev (devspec2array("battery=\\w+"))
    {
my $state = ReadingsVal($dev, "battery", "unbekannt");
if ($state eq "low")
{
my $Room = AttrVal($dev, "room", "...");
my $pos= index($Room,",");
if ($pos != -1) {$Room = substr($Room,0,$pos);}
my $Alias = AttrVal($dev, "alias", "...");
my $time = ReadingsTimestamp($dev, "battery", 0);
$text = $text."Im Raum \"".$Room."\" hat das Gerät \"" .$Alias."\" (Gerätname: \"".$dev."\") den Batteriestand: ".$state." (Zeitstempel: ".$time.")\n";
Log(3,$text);
$send=1;
}
  }
 
  foreach my $dev (devspec2array("Activity=dead"))
    {
my $state = ReadingsVal($dev, "Activity", "nicht auslesbar");
my $time = ReadingsTimestamp($dev, "Activity", 0);
my ($TSss,$TSmm,$TShh,$TSday,$TSmonth,$TSyear,$TSzone) = strptime($time);
my ($LTss,$LTmm,$LThh,$LTday,$LTmonth,$LTyear,$LTwday,$LTyday,$LTisdst) = localtime();

$LTyear+=1900;
$TSyear+=1900;
$TSmonth+=1;
$LTmonth+=1;

my $Dd = Date::Pcalc::Delta_Days($TSyear,$TSmonth,$TSday,$LTyear,$LTmonth,$LTday);

if ($state eq "dead" && $Dd >= 2)
{
$send=1;
my $Room = AttrVal($dev, "room", "...");
my $pos= index($Room,",");
if ($pos != -1) {$Room = substr($Room,0,$pos);}
my $Alias = AttrVal($dev, "alias", "...");
$text = $text."Im Raum \"".$Room."\" hat das Gerät \"" .$Alias."\" (Gerätname: \"".$dev."\") sich das letze Mal gemeldet am ".$time."\n";
Log(3,$text);
}
  }
 
 
  if ($send == 1 )
  {
fhem ("set teleBot message $text");
}
}


###### ENDE #######
1;


leider kenne ich mich mit Perl nicht aus und blicke auch nicht richtig durch, was diese Zeile macht und wo der Error liegen könnte.  :-\

Wäre Super nett, wenn jemand Hilfe leisten könnte!

Schonmal danke!
Grüße Fixel
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

AB1970

ist die lib libdate-pcalc-perl  installiert?

Wenn nicht kannst du sie mit sudo apt-get install libdate-pcalc-perl installieren.
Nach der Installation muss FHEM neu gestartet werden.

Fixel2012

#8
Zitat von: AB1970 am 22 Januar 2017, 20:06:33
ist die lib libdate-pcalc-perl  installiert?

Wenn nicht kannst du sie mit sudo apt-get install libdate-pcalc-perl installieren.
Nach der Installation muss FHEM neu gestartet werden.

ja, wie oben von dir beschrieben.

Der Error kommt nur, sobald devices dem status dead angenommen haben. Es scheint so als würde dieser Teil von dem Skript bei mir nicht funktionieren. Dementsprechend kriege ich auch keine Nachricht, falls diese Geräte "dead" sind. :o :(

edit: Dadurch,dass das Script nicht durch laufen kann, funktioniert die Batterie abfrage auch nicht.
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

Don Pedro

Versuch mal zusätzlich das Modul libdatetime-format-strptime-perl zu installieren, dort steckt nämlich das bei dir fehlende strpdate drin (https://packages.debian.org/de/sid/libdatetime-format-strptime-perl):


sudo apt-get install libdatetime-format-strptime-perl


Vlt. geht's dann?

BR

Don

Fixel2012

#10
Zitat von: Don Pedro am 23 Januar 2017, 00:57:37
Versuch mal zusätzlich das Modul libdatetime-format-strptime-perl zu installieren, dort steckt nämlich das bei dir fehlende strpdate drin (https://packages.debian.org/de/sid/libdatetime-format-strptime-perl):


sudo apt-get install libdatetime-format-strptime-perl


Vlt. geht's dann?

BR

Don

Hallo,
danke für deine Hilfe! Aber habe das Paket schon installiert.

Liegt also nicht daran.

Gruß Fixel

edit: Wenn ich das richtig interpretiere, dann ist die Zeile "nur" dafür da, dass ein Zeitstempel mit geliefert wird. Darauf kann ich zur Not auch verzichten. Werde also nun versuchen alle Zeilen die mit dem Zeitstempel etwas zu tun haben raus zu löschen.

Mal schauen ob das hilft.
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

Fixel2012

Habe es nun geschafft. Es geht und ich kriege eine Nachricht, sobald die Batterie leer oder die Activity dead ist.


Hier mein Code, wie ich ihn abgeändert habe:

use Date::Pcalc;

sub check_battery()
{
my $text = "Das Gerät braucht Hilfe:\n\n";
my $send = 0;

    foreach my $dev (devspec2array("battery=\\w+"))
    {
my $state = ReadingsVal($dev, "battery", "unbekannt");
if ($state eq "low")
{
my $Room = AttrVal($dev, "room", "...");
my $pos= index($Room,",");
if ($pos != -1) {$Room = substr($Room,0,$pos);}
my $Alias = AttrVal($dev, "alias", "...");
my $time = ReadingsTimestamp($dev, "battery", 0);
$text = $text."Im Raum \"".$Room."\" hat das Gerät \"" .$Alias."\" (Gerätname: \"".$dev."\") den Batteriestand: ".$state." (Zeitstempel: ".$time.")\n";
Log(3,$text);
$send=1;
}
  }
 
  foreach my $dev (devspec2array("Activity=dead"))
    {
my $state = ReadingsVal($dev, "Activity", "nicht auslesbar");
my $time = ReadingsTimestamp($dev, "Activity", 0);



if ($state eq "dead")
{
$send=1;
my $Room = AttrVal($dev, "room", "...");
my $pos= index($Room,",");
if ($pos != -1) {$Room = substr($Room,0,$pos);}
my $Alias = AttrVal($dev, "alias", "...");
$text = $text."Im Raum \"".$Room."\" hat das Gerät \"" .$Alias."\" (Gerätname: \"".$dev."\") sich das letze Mal gemeldet am ".$time."\n";
Log(3,$text);
}
  }
 
 
  if ($send == 1 )
  {
fhem ("set teleBot message $text");
}
}


Die Nachricht sieht dann wie folgt aus:
ZitatIm Raum "hidden" hat das Gerät "TEST" (Gerätname: "Wohnzi_Taster") den Batteriestand: low (Zeitstempel: 2017-01-23 19:25:28)
Im Raum "hidden" hat das Gerät "TEST" (Gerätname: "Wohnzi_Taster") sich das letze Mal gemeldet am 2017-01-23 08:35:11

Danke trotzdem an alle,  besonders AB1970 für das zu Verfügung stellen des Codes!
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

AB1970

@Betateilchen: An deiner Lösung mit HMINFO wäre ich dann auch interessiert. Poste mal was.
@Fixel: Ich hatte das Problem, das Geräte auch kurzfristig mal auf DEAD gingen, daher war die Lösung mit den zwei Tage Wartezeit nötig um Fehlalarme zu unterbinden.

automatisierer

Zitat von: AB1970 am 23 Januar 2017, 21:22:03
@Betateilchen: An deiner Lösung mit HMINFO wäre ich dann auch interessiert. Poste mal was.
@Fixel: Ich hatte das Problem, das Geräte auch kurzfristig mal auf DEAD gingen, daher war die Lösung mit den zwei Tage Wartezeit nötig um Fehlalarme zu unterbinden.

Infos zu hmInfo gibts in der Comandreff.

Und zum ActionDetector (der legt fest, ob ein Device Dead or Alive ist) im Wiki...
https://wiki.fhem.de/wiki/HomeMatic#Action_Detector

Don Pedro

Zitat von: Fixel2012 am 23 Januar 2017, 18:28:20
danke für deine Hilfe! Aber habe das Paket schon installiert.
Liegt also nicht daran.

Interessant! Dann sollte das Komando eigentlich vorhanden sein. Grübel... ???

Zitat von: Fixel2012 am 23 Januar 2017, 18:28:20
edit: Wenn ich das richtig interpretiere, dann ist die Zeile "nur" dafür da, dass ein Zeitstempel mit geliefert wird. Darauf kann ich zur Not auch verzichten. Werde also nun versuchen alle Zeilen die mit dem Zeitstempel etwas zu tun haben raus zu löschen.

So ist es "strptime" steht für "string parse time" und parst einen String mit einem Zeitstempel in numerische Einzelwerte mit denen man dann irgendetwas weiteres tun kann. Hat bei dir die darauffolgende Zeile mit dem Aufruf von localtime() auch einen Fehler produziert oder warum hast du die entfernt?

Fixel2012

#16
@Don Pedro

Ich habe keine Ahnung warum diese Zeile einen Error hervorruft...


ZitatSo ist es "strptime" steht für "string parse time" und parst einen String mit einem Zeitstempel in numerische Einzelwerte mit denen man dann irgendetwas weiteres tun kann. Hat bei dir die darauffolgende Zeile mit dem Aufruf von localtime() auch einen Fehler produziert oder warum hast du die entfernt?

Ursprünglich habe ich nur die eine Zeile entfernt. Danach hatte ich aber mehrere Fehlermeldungen und habe alles in meinen Augen nicht nötige gelöscht. ::) :o


Im Moment bin ich auch so zufrieden, in meinen Tests hat alles geklappt. Der zusätzliche Code war laut AB1970 ja nur dafür da, dass das gerät mindestens 2 tage nicht erreichbar ist, bevor eine Nachricht gesendet wird. Meine Geräte gingen bisher noch nie einfach so auf dead.

Falls das in Zukunft doch so sein sollte, muss ich mich mit dem Stück Code nochmal befassen ::) :P

Grüße Fixel
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

AB1970

Zitat von: Fixel2012 am 29 Januar 2017, 01:35:14
@Don Pedro

Ich habe keine Ahnung warum diese Zeile einen Error hervorruft...


Ursprünglich habe ich nur die eine Zeile entfernt. Danach hatte ich aber mehrere Fehlermeldungen und habe alles in meinen Augen nicht nötige gelöscht. ::) :o


Im Moment bin ich auch so zufrieden, in meinen Tests hat alles geklappt. Der zusätzliche Code war laut AB1970 ja nur dafür da, dass das gerät mindestens 2 tage nicht erreichbar ist, bevor eine Nachricht gesendet wird. Meine Geräte gingen bisher noch nie einfach so auf dead.

Falls das in Zukunft doch so sein sollte, muss ich mich mit dem Stück Code nochmal befassen ::) :P

Grüße Fixel
Ich bekomme  am Dienstag einen Rasp 3 und werde darauf Jessie Lite installieren,  ich hoffe dadurch rauszubekommen, welche fehlende Library nun wirklich den Fehler verursacht.
Im Moment habe ich leider keine Ahnung wie ich euch weiterhelfen kann. :(

Grüße
Andreas


Gesendet von iPhone mit Tapatalk Pro

Fixel2012

Zitat von: AB1970 am 29 Januar 2017, 17:49:06
Ich bekomme  am Dienstag einen Rasp 3 und werde darauf Jessie Lite installieren,  ich hoffe dadurch rauszubekommen, welche fehlende Library nun wirklich den Fehler verursacht.
Im Moment habe ich leider keine Ahnung wie ich euch weiterhelfen kann. :(

Grüße
Andreas


Gesendet von iPhone mit Tapatalk Pro

Kein Problem! Bei mir funktioniert es ja nun erstmal.  :)
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

AB1970

Hallo ,
ich habe mein FHEM nun auf dem Rasp3 unter Jessie Lite am laufen.

In der Tat, ich musste
sudo apt-get install libdate-pcalc-perl libdatetime-format-strptime-perl

installieren um das Script zum Laufen zu bringen.
Danach tat es aber ohne Änderungen seinen Dienst.