Batteriestatus und Speicherung des letzten Wechsel

Begonnen von Amenophis86, 12 Januar 2018, 19:23:20

Vorheriges Thema - Nächstes Thema

Amenophis86

Quatsch, lag nicht an deiner Aussage, sondern daran, dass ich nicht mehr in der Lage war schnell zu denken. Und für zusätzliche Arbeit musste dich nicht entschuldigen, sonst dürfte ich ja nicht am Code weiter basteln wollen ;)
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...

Wzut

Zitat von: _fhemuser_ am 24 Januar 2018, 18:01:15
Da die Benachrichtigung nur einmal versandt wird, muss ich erst wieder volle Batterien einsetzen und dann wieder leere.
Wenn du so testest wird das ganze zu einer Strafarbeit für einen der Vater und Mutter erschlagen hat .....
Tipp : setze  das readings xxx_Bot im BatteryStatiusBot direkt wieder auf none :) 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Wzut

@Amenophis86, ich hätte da noch zwei Sachen für dich :
a. du besetzt die drei Dummys zwar mit BatteryStart vor, aber bitte bedenke es können danach immer noch neue Geräte  dazukommen die dann aber nicht erfasst sind. Es wird zwar durch den folgenden Block etwas gemildert 
# if it is the first time for that device set it to none (initialize)
  if(ReadingsVal($BatteryStatusBot, $SignalDevice, "undef") eq "undef")
  {
    fhem("setreading $BatteryStatusBot $SignalDevice none");
  }

aber konsequenter wäre es auch den  $BatteryStatus mit $Device dazu zu nehmen.

b. Stichwort  fhem("setreading xyz
mache ich z.B. in einem notify auch so , aber schaut man mal hinter die FHEM Kulissen, dann sieht man das dies zuerst zu CommandSetReading führt um dann bei readingsSingeleUpdate(a,b,c,1) zu enden.
Also warum dann nicht gleich statt z.B.
fhem("setreading $BatteryStatusBot $SignalDevice none");
den Code ändern in:
readingsSingeleUpdate($defs{$BatteryStatusBot}, $SignalDevice, "none",1);
denn nun kann man sich noch überlegen wie sinnvoll es ist mit jeder Änderung des Readings auch gleich wieder einen weiteren Event zu erzeugen -> die ,1 am Ende oder ob man nicht auf diesen zusätzlichen (IMHO überflüssigen) Event auch noch verzichtet und satt der ,1 ein ,0 am Ende einsetzt. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Amenophis86

Bin noch nie tiefer als myUtils eingestiegen, habe die von dir genannten Funktionen im DeveloperBoard mal gelesen, aber nicht näher mit beschäftigt. Kann es aber gerne ändern, da ich deine Argumentation nachvollziehen kann. Schreibe es mir auf die ToDo Liste. Danke für den Hinweis.
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...

_fhemuser_

Zitat von: Amenophis86 am 24 Januar 2018, 18:37:35
Dann musst du den Code nur wie folgt anpassen:
my $msg = "set TelegramBot message  ";
Soll heißen das Reading Battery bleibt auf low stehen, obwohl du neue volle Batterien einfügst?
Also ich beschreibe mal wie ich vorgehe.
1. Die Geräte werden normal mit Batterien betrieben
2. ich klemme parallel zur Batterie ein (Labor-)Netzteil an mit einer Spannung von 3 Volt
3. ich nehme die Batterien heraus. Damit ensteht keine Spannungsunterbrechung
4. in unregelmäßigen Abständen verringere ich die Spannung um 0,1 Volt und betätige die Boost-Taste um Strom zu verbrauchen.
5. Das Gerät meldet eine Batteriewarnung bei zB 2,4 Volt
6. Ich setze die Batterien wieder ein und entferne das Netzteil. Damit sollte die Batteriewarnung erlöschen weil die Spannung steigt. Auch hier ist keine Spannungsunterbrechung

Diesen Test werde ich mit anderen HTs wiederholen, da ich mindestens 4 verschiedene habe. Den Basic, 2 Versionen vom HT und den HT+.

Mögliche Fehlerquellen dabei:
Da der interne Programmcode der Geräte unbekannt ist, kann es sein, dass die Batteriespannung nicht kontinuierlich geprüft wird, sondern zB nur im Abstand von 2 Stunden. In der Zeit kann ich eventuell bereits die Versorgungsspannung soweit gesenkt haben, dass ich bereits unterhalb der Warnschwelle bin.
Der getestete HT geht bei einer weiteren Senkung der Betriebsspannung sogar in Fehler 9 und bleibt dann auf einem festen Wert stehen und sendet auch nicht mehr.

Zitat von: Wzut am 25 Januar 2018, 07:06:24
Wenn du so testest wird das ganze zu einer Strafarbeit für einen der Vater und Mutter erschlagen hat .....
Tipp : setze  das readings xxx_Bot im BatteryStatiusBot direkt wieder auf none :)
OK, Danke
fhem in der aktuellsten Version auf:
Raspberry 4 mit SSD | fhem2fhem | NanoCul433 Selbstbau | NanoCul868 Selbstbau | DbLog | MAX! | zigbee2MQTT | homebridge | alexa
inkl zigbee2MQTT Server, Unifi-Server

Raspberry 4 mit SD Karte | fhem2fhem | motioneye

Amenophis86

@_fhemuser_:
Und wenn du so testest, dann bleibt das Device auf low und es wird kein Batteriewechsel angezeigt, obwohl es auf ok wechseln sollte und ein Batterie Wechsel angezeigt werden sollte, verstehe ich das richtig?

Klappte denn jetzt bei dir die Meldung per Telegram?
_______________________________

Ich habe soeben den Code mal ziemlich stark verändert im test-Zweig. Ich habe die Abfrage wie folgt geändert:

- Kommt die Meldung als battery Meldung rein?
--> JA: Weiter im battery Zweig
----> Wie lautet der TYPE des Device und hat das Device kein batteryLevel Reading JA: Weiter im zuständigen TYPE Abschnitt
- Kommt die Meldung als batteryLevel Meldung rein?
--> JA: Weiter im batteryLevel Zweig
----> Wie lautet der TYPE des Device: Weiter im zuständigen TYPE Abschnitt

Jeweils am Ende werden dann alle anderen Geräte entsprechend abgearbeitet. Damit dürfte auch die doppelte Abarbeitung bei battery und batteryLevel Reading nicht mehr vorhanden sein.


Bei Xiaomi war ich mir nicht ganz sicher und habe mal auf =~ geprüft. CoolTux hat da die Tage was verändert und bin mir nicht sicher, ob alle Xiaomi Device den gleichen Typ haben und ob alle auch ein batterLevel Reading haben.


Wäre nett, wenn ihr mal über den neuen Code drüber schaut, ob ihr Fehler findet. Als nächstes würde ich dann gerne den temp-At Teil von Wzut einbauen. Muss ich mir nur nochmal näher ansehen, wo und wie genau der da rein kommt.
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...

Wzut

Zitat von: Amenophis86 am 26 Januar 2018, 18:59:31
Als nächstes würde ich dann gerne den temp-At Teil von Wzut einbauen.
Bitteschön , hier meine Beta Version mit (noch) viel Logging :

  ##############################################
  # MAX! Devices
  ##############################################
  elsif($TYPE eq "MAX")
  {
    my $level = ReadingsNum($BatteryStatus, $Device, 0);

    if($Event eq "battery: ok")
    {
     # Log3(undef, 3,"$Device, Batt ok");
      if (defined($defs{"at_BatLow_".$Device}))
     {
     CommandDelete(undef,"at_BatLow_".$Device)  if (defined($defs{"at_BatLow_".$Device}));
      Log3(undef, 3,"$Device, lösche at_BatLow_".$Device);
     }
     return undef;
    }
     elsif ($Event eq "battery: low")
    {
     Log3(undef, 3,"$Device, Batt low");
     # nicht zu schnell in zu kurzer Zeit !
    return undef  if (ReadingsAge($BatteryStatus, $Device,0) < 600);
     Log3(undef, 3,"$Device, Batt low2");
      if($level == 100)
      {
       readingsSingleUpdate($defs{$BatteryStatus},$Device, 75,0); # 1.Stufe
       return undef;
      }
      elsif ($level > 25)
      {
        $level -=5;
        readingsSingleUpdate($defs{$BatteryStatus}, $Device, $level,0);
        Log3(undef, 3,"$Device, Batt Level $level");
        return undef;
      }
       elsif ($level == 25)
      {
        readingsSingleUpdate($defs{$BatteryStatusBot}, $SignalDevice ,"low",0);
        fhem($msg.$text_soon);

        my $time_s = strftime("\%H:\%M:\%S", gmtime(43200));  # z.Z. 12 Stunden 
        my $error = CommandDefine(undef, "at_BatLow_".$Device." at +".$time_s." {BatteryStatusFunction('".$Device."','battery: dead')}");
        if (!$error) { $attr{"at_BatLow_".$Device}{room} = AttrVal($BatteryStatus,"room","Unsorted"); }
        else { Log3(undef, 3,"$Device, temp at error -> $error"); }
        return undef;
      }
       else { Log3(undef, 3,"$Device, unknown Level $level") if ($level);}
    }
     elsif ($Event eq "battery: dead")
    {
     Log3(undef, 3,"$Device, dead Event !");
     readingsSingleUpdate($defs{$BatteryStatus},$Device,0,1); # hier mal mit zusätzlichem Event , vllt will den jemand zum Mail/SMS Versand benutzen ?
     readingsSingleUpdate($defs{$BatteryStatusBot},$SignalDevice,"dead",0);
     fhem($msg.$text_now);
     return undef;
    }
     else
    {
     Log3(undef, 3,"$Device, unknown Event $Event");
    }
}



Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Amenophis86

Top, schaue es mir die Tage an. Und da fällt mir ein, dass ich noch auf readingsSingeleUpdate umstellen wollte. Schaue ich mir auch noch an. Danke
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...

_fhemuser_

Zitat von: Amenophis86 am 26 Januar 2018, 18:59:31
@_fhemuser_:
Und wenn du so testest, dann bleibt das Device auf low und es wird kein Batteriewechsel angezeigt, obwohl es auf ok wechseln sollte und ein Batterie Wechsel angezeigt werden sollte, verstehe ich das richtig?
Genau, ich erwartete dass nach steigen der Batteriespannung das Symbol erlischt und der Status an den Cube übermittelt wird. Da ich erst einen HT testen konnte, kann ich das noch nicht für alle MAX!Geräte bestätigen.
Zitat
Klappte denn jetzt bei dir die Meldung per Telegram?
Nein,leider immer noch nicht. Im Log steht:2018.01.27 10:32:45 3:  Die Batterien von Burofenster sollten bald gewechselt werden! : Unknown command Die, try help.
Die Definition des Telegram Bots habe ich geändert auf TelegramBotdefmod TelegramBot TelegramBot
attr TelegramBot allowUnknownContacts 0
attr TelegramBot cmdKeyword FHEM
attr TelegramBot cmdRestrictedPeer xxxxxxxxxx
attr TelegramBot defaultPeer xxxxxxxxxx
attr TelegramBot pollingTimeout 120
und in dem Code nur den Benutzernamen heraus gelöscht.################################
# Here you choos your message device and how to send
# comment the device you do not want to use
#
# TelegramBot
  my $msg = "set TelegramBot message ";
#
# msg-command
# my $msg = "msg \@User title='Battery Check' ";
#
# Pushover
# my $msg = "set Pushover msg device=User title='Battery Check' ";
Den Rest habe ich unverändert von github übernommen, Stand 26.01.17 testbranch checksum: 9af26fb
fhem in der aktuellsten Version auf:
Raspberry 4 mit SSD | fhem2fhem | NanoCul433 Selbstbau | NanoCul868 Selbstbau | DbLog | MAX! | zigbee2MQTT | homebridge | alexa
inkl zigbee2MQTT Server, Unifi-Server

Raspberry 4 mit SD Karte | fhem2fhem | motioneye

_fhemuser_

#84
Um einen Fehler durch eventuelle Änderungen auszuschließen habe ich den auf github veröffebtlichten Code aus der 99_myUtils.pm gelöscht. Alle Definitionen die urprüglich angelgt wurde gelöscht und fhem neu gestartet.

dann wie in Beitrag #1Edit: Code ist nun auf github verfügbar: https://github.com/Amenophis86/Batteryfunktion
Es kann entweder direkt die PM runtergeladen, im Order /FHEM/ eingefügt und ein
Code: [Auswählen]

reload 99_Batterycheck.pm

ausgeführt werden, oder der Code kopiert und in die eigene 99_myUtils.pm eingefügt werden.

2. Werte entsprechend anpassen (Siehe weiter unten)
3. Einmalig die Funktion BatteryStart mittels
Code: [Auswählen]

{BatteryStart()}

ausführen. Sobald diese durchgelaufen ist, könnt ihr sie wieder löschen.
beschrieben den Code in die 99_myUtils.pm eingefügt, wie oben eine Zeile bei TelegramBot angepasst und fhem erneut gestartet anschließend mit {BatteryStart()} alle benötigten Definitionen erstellen lassen.

Die Batterieerkennung funktioniert aber ich erhalte keine Nachricht über TelegramBot. In der Logdatei steht wieder der og Eintrag nur mit einem neuen Zeitstempel
[edit]
Ich habe aus der Definition des TelegramBot die Einstellung für den defaultUser gelöscht und in der Kommandozeile eingegebenTelegramBot message hallound erhalte wie erwartet den Fehler018.01.27 11:28:27 3: FHEMWEB WEB CSRF error: csrf_194100744996488 ne csrf_643818872398676 for client WEB_192.168.0.17_49908 / command set TelegramBot message Hallo. For details see the csrfToken FHEMWEB attribute.Dann habe ich in der n der Kommandozeile eingegebenTelegramBot message @1234567 hallound erhalte die Nachricht. Die Übermittlung funktioniert.
Dann die Einstellung im Code geändert auf:# TelegramBot
my $msg = "set TelegramBot message \@\@1234576 ";
und erhalte den Fehler:FHEMWEB WEB CSRF error: csrf_194100744996488 ne csrf_643818872398676 for client WEB_192.168.0.17_49914 / command style edit 99_myUtils.pm . For details see the csrfToken FHEMWEB attribute.sowie erneut den Hinweis, dass Die kein Befehl ist
[/edit]
fhem in der aktuellsten Version auf:
Raspberry 4 mit SSD | fhem2fhem | NanoCul433 Selbstbau | NanoCul868 Selbstbau | DbLog | MAX! | zigbee2MQTT | homebridge | alexa
inkl zigbee2MQTT Server, Unifi-Server

Raspberry 4 mit SD Karte | fhem2fhem | motioneye

Amenophis86

@Wzut:
Habe deinen Code gerade mal ein bisschen angepasst und kommentiert. Schau mal bitte drüber, ob ich es richtig verstanden habe:

   ##############################################
   # MAX! Devices with battery
   ##############################################
   elsif($TYPE eq "MAX" and ReadingsVal($Device, "batteryLevel", "undef") eq "undef")
   {
my $level = ReadingsNum($BatteryStatus, $Device, 0);

    if($Event eq "battery: ok")
{
# Log3(undef, 3,"$Device, Batt ok");
  if (defined($defs{"at_BatLow_".$Device})) # temporary at allready defined?
{
CommandDelete(undef,"at_BatLow_".$Device)  if (defined($defs{"at_BatLow_".$Device})); #if defined delete it, battery not dead yet or allready changed?
  Log3(undef, 3,"$Device, deleted at_BatLow_".$Device);
}
return undef;
}
     elsif ($Event eq "battery: low")
{
Log3(undef, 3,"$Device, Batt low");

return undef  if (ReadingsAge($BatteryStatus, $Device,0) < 600); #take some time since the last event
Log3(undef, 3,"$Device, Batt low2");
  if($level == 100)
  {
   readingsSingleUpdate($defs{$BatteryStatus},$Device, 75,0); # set battery level 75%
   return undef;
  }
  elsif ($level > 25)
  {
$level -=5;
readingsSingleUpdate($defs{$BatteryStatus}, $Device, $level,0); # reduce battery level by 5 with every event
Log3(undef, 3,"$Device, Batt Level $level");
return undef;
  }
   elsif ($level == 25)
  {
readingsSingleUpdate($defs{$BatteryStatusBot}, $SignalDevice ,"low",0);# set battery level to low and send message
fhem($msg." ".$text_soon);

my $time_s = strftime("\%H:\%M:\%S", gmtime(43200));  # 12 hours waittime for the temp at 
my $error = CommandDefine(undef, "at_BatLow_".$Device." at +".$time_s." {BatteryStatusFunction('".$Device."','battery: dead')}");
if (!$error) { $attr{"at_BatLow_".$Device}{room} = AttrVal($BatteryStatus,"room","Unsorted"); }
else { Log3(undef, 3,"$Device, temp at error -> $error"); }
return undef;
  }
   else { Log3(undef, 3,"$Device, unknown Level $level") if ($level);}
}
     elsif ($Event eq "battery: dead")
{
Log3(undef, 3,"$Device, dead Event !");
readingsSingleUpdate($defs{$BatteryStatus},$Device,0,1); # set device 0 with an event
readingsSingleUpdate($defs{$BatteryStatusBot},$SignalDevice,"dead",0); # set device dead without event
fhem($msg." ".$text_now);
return undef;
}
     else
{
Log3(undef, 3,"$Device, unknown Event $Event");
}
   }



@_fhemuser_
Wundert mich auch, dass es nicht von low auf ok wechselt.

Telegram:
lösche den defaultUser, gib den User im Skript ein und füge mal folgenden Code nach
# Pushover
# my $msg = "set Pushover msg device=User title='Battery Check' ";

ein:


Log 3, "tele: ".$msg."\nNach.: ".$text_soon;
fhem($msg." ".$text_soon);


Und führe das Skript mit {BatteryStatusFunction(1,"1:1")} in der CommandoZeile aus. Was steht im Log?
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...

_fhemuser_

Zitat von: Amenophis86 am 27 Januar 2018, 12:57:36
@_fhemuser_
Wundert mich auch, dass es nicht von low auf ok wechselt.

Telegram:
lösche den defaultUser, gib den User im Skript ein und füge mal folgenden Code nach
# Pushover
# my $msg = "set Pushover msg device=User title='Battery Check' ";

ein:


Log 3, "tele: ".$msg."\nNach.: ".$text_soon;
fhem($msg." ".$text_soon);


Und führe das Skript mit {BatteryStatusFunction(1,"1:1")} in der CommandoZeile aus. Was steht im Log?
Alles so eingestellt, wie du empfohlen hast und es ergibt NICHTS. Dh es ist kein Eintrag im Log. Wobei ich auch "Log 3" in  "Log3" geändert habe.
Nach den Änderungen natürlich immer "shutdown restart" durchgeführt.

Dass das System auf einem Raspberry3 unter Raspbian GNU/Linux 8 (jessie) läuft kann es nicht liegen?
Können andere Programmteile zu dem Fehler führen?
Fehlen vielleicht noch Module?

Ich habe jetzt fast alle unterschiedlichen MAX!Geräte getestet und bei allen ändert sich die Batteriewarnung ohne Batteriewechsel. Daher gehe ich davon aus, dass nur das eine Gerät sich geringfügig anders verhält.
fhem in der aktuellsten Version auf:
Raspberry 4 mit SSD | fhem2fhem | NanoCul433 Selbstbau | NanoCul868 Selbstbau | DbLog | MAX! | zigbee2MQTT | homebridge | alexa
inkl zigbee2MQTT Server, Unifi-Server

Raspberry 4 mit SD Karte | fhem2fhem | motioneye

Amenophis86

Zitat von: _fhemuser_ am 27 Januar 2018, 15:42:06
Wobei ich auch "Log 3" in  "Log3" geändert habe.

Und das hast du gemacht weil?
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...

_fhemuser_

Weil alle andern ähnlichen Einträge Log3 am Anfang hatten und es keinen Eintrag gab.

Sowohl mit Log 3, "tele: ".$msg."\nNach.: ".$text_soon;
als auch
Log3, "tele: ".$msg."\nNach.: ".$text_soon;
gibt es keine Einträge im Log.
fhem in der aktuellsten Version auf:
Raspberry 4 mit SSD | fhem2fhem | NanoCul433 Selbstbau | NanoCul868 Selbstbau | DbLog | MAX! | zigbee2MQTT | homebridge | alexa
inkl zigbee2MQTT Server, Unifi-Server

Raspberry 4 mit SD Karte | fhem2fhem | motioneye

Amenophis86

Ja, gibt auch einen Unterschied zwischen Log3 und Log 3, hatte bewusst Log 3 gewählt. Ein Shutdownrestart musst du nicht ausführen, wenn du es direkt im Editor von FHEM editierst und speicherst, werden sofort die Änderungen übernommen.

Es wundert mich, dass NICHTS ausgegeben wird, wenn du {BatteryStatusFunction(1,"1:1")} in die CommandZeile eingibst. Da stimmt was nicht.
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...