FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: AB1970 am 06 Januar 2017, 13:45:54

Titel: Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: AB1970 am 06 Januar 2017, 13:45:54
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.
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: Fixel2012 am 09 Januar 2017, 03:03:29
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
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: AB1970 am 09 Januar 2017, 13:29:03
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.
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: Fixel2012 am 09 Januar 2017, 20:33:36
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
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: JoeALLb am 18 Januar 2017, 10:15:12
Danke!

Funktioniert auch bestens direkt in einem DOIF ohne "99_MyUtils.pm", was ich persönlich eleganter finde!!
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: AB1970 am 18 Januar 2017, 18:19:50
Hi,
möchtest du deine DOIF-Variante posten?
Ich hoffe, da auch noch etwas lernen zu können. :-)

Grüsse :-)
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: Fixel2012 am 22 Januar 2017, 18:46:12
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
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag 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.
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: Fixel2012 am 22 Januar 2017, 22:07:12
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.
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag 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 (https://packages.debian.org/de/sid/libdatetime-format-strptime-perl)):


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


Vlt. geht's dann?

BR

Don
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: Fixel2012 am 23 Januar 2017, 18:28:20
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 (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.
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: Fixel2012 am 23 Januar 2017, 19:40:36
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!
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: betateilchen am 23 Januar 2017, 19:44:34
das macht doch hminfo alles automatisch?
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag 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.
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: automatisierer am 23 Januar 2017, 21:54:22
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 (https://wiki.fhem.de/wiki/HomeMatic#Action_Detector)
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: Don Pedro am 28 Januar 2017, 22:46:17
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?
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: Fixel2012 am 29 Januar 2017, 01:35:14
@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
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: AB1970 am 29 Januar 2017, 17:49:06
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
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: Fixel2012 am 29 Januar 2017, 18:49:00
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.  :)
Titel: Antw:Batterieabfrage für Homematic mit Ausfallsüberwachung
Beitrag von: AB1970 am 28 Februar 2017, 18:45:12
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.