FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Gear am 17 März 2018, 03:26:59

Titel: [Gelöst] Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 03:26:59
Guten Morgen Zusammen,

ich verzweifle gerade mit meinem ersten Notify.
Ich habe aktuell einen NodeMCU mit nem LiPo Akku um Temperaturen zu messen.

Nun möchte ich mir gerne per TeleBot eine MSG zukommenlassen, wenn der Akku z.B. 3,5V erreicht.
Der NodeMCU ist im DeepSleep und wacht alle 5 Minuten auf und überträgt die Daten.

Nun will ich das ganze gerne so einrichten, dass ich eine Nachricht bekomme, wenn der Akku die Spannung erreicht hat, aber nicht alle 5 Minuten.
Wünschenswert wäre ich das so einrichten könnte:

Ich würde gerne ein Flag haben, wenn der Akku 3,5V erreicht, dann soll das Flag gesetzt werden, erst wenn die Akkuspannung wieder über 4,1V steigt, dann soll das Flag wieder deaktiviert werden.
Bei Auslösung des Flag hätte ich gerne eine Nachricht auf dem Handy via Telebot und dann möchte ich alle x Stunden eine Erinnerung, bis der Akku 4,1V erreicht hat.

Ich hoffe Ihr könnt mir weiterhelfen.

Grüße
Gear
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: MadMax-FHEM am 17 März 2018, 10:32:46
Hallo,

vielleicht hilft das:

https://forum.fhem.de/index.php?topic=68765.0

Oder hier "spicken" https://forum.fhem.de/index.php/topic,82637.0.html

Kurz da nur Handy...

Gruß, Joachim
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 14:27:10
Hey, MadMax-FHEM

leider nicht wirklich. =(
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: MadMax-FHEM am 17 März 2018, 14:32:35
Warum?

Beides schafft was du willst...
...so wie ich deinen "Wunsch" gelesen hab...

Gruß, Joachim
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 14:37:13
Weil ich das irgendwie nicht verstehe. =(

edit:
Aus einem anderen Beitrag:
Ich muss mich an dieser Stelle entschuldigen, ich habe eine Lese- Rechtschreibschwäche, die leider nicht behandelbar ist, da sie von einer Behinderung kommt.
Mir fällt es leider schwer mich in neue Themen einzuarbeiten, da es am Anfang wenn man neue ist, einfach zu viel ist für mich.
Ich kann solange ich etwas nicht richtig verstehe, dies auch nicht auf andere Anwendungsbereiche anwenden, da ich erstmal verstehen muss, wie das im Beispiel funktioniert und dann muss ich das irgendwie auf mein vorhaben anwenden. Leider verstehe ich manchmal die Beispiele nicht, dann fällt es mir schwer das in abgewandelter Form anzuwenden.
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: MadMax-FHEM am 17 März 2018, 15:35:33
Aha.

Dafür, dass du dich schwer tust Dinge zu übertragen hast du einen ganz schön "komplexen" Wunsch...

Da würde ich halt erst mal "klein" anfangen...

Also EventMonitor und warten bis der Spannungs-Event kommt.

Dann die Zeile markieren und "modify/create", dann hast du schon mal den Notify den du brauchst...

Wenn du das hast, kannst du den Notify erweitern und erst mal nur eine Logausgabe machen:

define nNotify notify RegEx {Log3(undef, 3, "Das ist der Event $EVENT")}

Also nur ein "pseudo-Beispiel" hier geht es nur um die Logausgabe.

Dann sollte ja alle 5min die Ausgabe im Log erscheinen.

Wenn du das hast, dann kann man ja schrittweise weiter machen...

Gruß, Joachim
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: CoolTux am 17 März 2018, 15:46:24
Bitte mach mal ein list vom Device

Also oben in der FHEMWEB Eingabezeile list DEVICENAME eingeben.
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 16:13:01
@MadMax-FHEM
Werde ich gleich mal testen, Danke.  :)

@CoolThx
Hier ist das Akku Device:
Internals:
   IODev      mqtt
   NAME       WZ.MCU
   NR         43
   STATE      3.628 V
   TYPE       MQTT_DEVICE
   Helper:
     DBLOG:
       Akku:
         DBLogging:
           TIME       1521299081.85071
           VALUE      3.628
   READINGS:
     2018-03-17 16:04:41   Akku            3.628
     2018-03-17 16:04:41   transmission-state incoming publish received
   message_ids:
   sets:
   subscribe:
     /SH/W/WZ/MCU/Volt
   subscribeExpr:
     ^\/SH\/W\/WZ\/MCU\/Volt$
   subscribeReadings:
     /SH/W/WZ/MCU/Volt:
       cmd       
       name       Akku
Attributes:
   DbLogExclude .*
   DbLogInclude Akku
   IODev      mqtt
   room       50 Wohnzimmer
   stateFormat Akku V
   subscribeReading_Akku /SH/W/WZ/MCU/Volt
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: CoolTux am 17 März 2018, 16:22:31
Nimm ein userReading dafür


userReadings batteryWarn:Akku:.* { if(ReadingsVal($name,'Akku',0) < 3.6) { 'low' } elsif(ReadingsVal($name,'Akku',0) > 4.1) { 'high' } }


Und dann halt ein Notify auf das Reading batteryWarn triggern lassen.
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 18:46:58
Okey, das habe ich soweit verstanden und auch umgesetzt.
Nun habe ich im Notify unter Def folgendes:
WZ.MCU:batteryWarn:.low {}

Nun muss ich warscheinlich in die {} meinen Code reinschreiben, oder?
Ich gehe mal davon aus, es muss Perl sein?

Wenn ich darüber nachdenke, nun steht ja im userReading der Code der low oderr high in die Readings schreibt.
Wäre doch einfacher, wenn das Notify auch meine anderen geplanten Geräte auch gleich mitmacht.

Also würde ich das am besten so anlegen:
defmod AkkuCheck notify .*.MCU:Akku:.* {}

Dann würde ich hier in die {} folgenden machen:
- if else um die Akku Spannung festzustellen
- AkkuStatus (very low, low, ok, high) vergleichen ob der aktuelle AkkuStatus ungleich des gerade ermittelten AkkuStatus ist
-> Wenn ja, dann Nachricht per TeleBot, wenn eine hinterlegt ist
- ermittelten AkkuStatus dem Device hinterlegen

Somit wäre eine erneute Erinnerung bei very low ja auch mit drin.
Nun habe ich wenn das so funktioniert noch eine Frage oder zwei.  ;D
Wie genau sieht der Befehl aus um den AkkuStatus vom Device zu holen und wie der um ihn zu schreiben?
Wenn ich das richtig verstanden habe, dann ist die Akkuspannung im Notify folgende: ReadingsVal($name,'Akku',0)

Vielen Dank für die hilfe, ich glaube ich verstehe das langsam. *freu*  ;D ;D
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: CoolTux am 17 März 2018, 19:01:55
Dann lege in alle anderen geplanten Geräte ein userReading an.
Auf Perlebene solltest Du nicht müssen. Du bekommst mit dem Event welches das Notify triggert das Device mit $NAME mit sowie das Event mit $EVENT und Teile vom Event.

defmod AkkuCheck notify .*.MCU:batteryWarn:.low set telebot msg Achtung Batteriemeldung, $NAME meldet nur [$NAME:Akku] V


Bitte den Code natürlich korrekt anpassen für Dein Telepot

Du musst nicht noch mal irgendwas ermitteln, das Notify triggert ja sofort.
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 19:07:56
Ich muss aber etwas machen, sonst bekomme ich doch dann alle 5min eine Nachricht aufs Handy oder?
Zudem muss ich ja das userReading in jedes Device mit Akku reinschreiben oder?
Wenn das alles das Notify macht, dann müsste ich im endeffekt ja nur noch das Device anlegen, bzw. es legt sich ja selber an.
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: CoolTux am 17 März 2018, 19:18:00
Nein bekommst Du eben nicht.
Ok Du musst natürlich am Device selber am besten event-on-change-reading setzen. Aber ansonsten reicht das userReading.
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 19:47:02
Ok, das funktioniert soweit.
Vielen Dank!! =D

Nun noch eine Frage zu Notify, die die Tage auch noch aufkommen wird.
Wenn ich mal anhand das Beispiel hier, das so machen möchte, dass wenn die Akkuspannung aktualisiert wird, ein Notify ausgelöst wird.
Wie bekomme ich im Notify die Readings und wie kann ich Readings ändern, bzw. anlegen und überprüfen ob ein Reading angelegt ist und wenn nicht, dieses dann anlegen um einen Fehler vorzubeugen?
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: CoolTux am 17 März 2018, 20:11:59
Wenn du das Reading abfragen möchtest auf das Du eh beim Notify triggert so ist der Wert vom Reading Teil des Events.
Schau dir den Eventmonitor an.

Wenn du ein Reading abfragen willst nimmst du innerhalb eines Set Befehles [DEVICE:READING] oder wenn es kein set Befehl ist nimmst du die Funktion ReadingsVal() dazu musst Du natürlich in Perl gehen.
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 20:25:37
Ok, ich versuche das gerade mit einem Notify an der Akkuspannung.
Ich will im DEF folgendes ablegen:
.*.MCU:.* {
if([$NAME:Akku] < 3.3)
{}
}


Bekomme aber folgende Fehlermeldung:
syntax error at (eval 2136) line 2, near "$NAME:"
syntax error at (eval 2136) line 4, near "}}"


Kannst du mir evtl sagen was ich falsch mache?
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: CoolTux am 17 März 2018, 20:30:04
Das ist ja auch Unsinn. Ich sagte das [NAME:READING] nur innerhalb eines set Befehles geht. Nennt sich auch setmagic.

Du bist ja sogar auf Perlebene und musst dann mit den FHEM Perlfunktionen arbeiten

.*.MCU:.* {
if( ReadingsVal ($NAME,'Akku',0) < 3.3 )
{}
}
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 21:05:49
Okey, das geht nun hab ich nochmal Google genutzt um zu schauen, wie ich ein Reading setze.

Irgendwie hilft mir da aber nichts weiter.
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: CoolTux am 17 März 2018, 21:37:29
setreading ist der FHEM Befehl dazu.

Also wenn Du in Perl bist
fhem("setreading DEVICE READING VALUE");
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 22:26:02
Ok, ich habe das in meinem Notify nun so gemacht:
.*.MCU:.* {
if(ReadingsVal($NAME,'Akku',0) > 3.3)
{
fhem("setreading ", $NAME ," Status Very low");
}
}


Das Notify bekommt bei seinen Reading STATE immer das aktuelle Datum und Uhrzeit, welches identisch mit der Akkuspannung ist.
Es schreibt aber den Wert nicht.
Muss das Reading Status erst gesetzt werden?
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: CoolTux am 17 März 2018, 22:49:36
Zitat von: Gear am 17 März 2018, 22:26:02
Ok, ich habe das in meinem Notify nun so gemacht:
.*.MCU:.* {
if(ReadingsVal($NAME,'Akku',0) > 3.3)
{
fhem("setreading ", $NAME ," Status Very low");
}
}


Das Notify bekommt bei seinen Reading STATE immer das aktuelle Datum und Uhrzeit, welches identisch mit der Akkuspannung ist.
Es schreibt aber den Wert nicht.
Muss das Reading Status erst gesetzt werden?

STATE ist kein Reading sondern ein Internal. Was Du meinst ist state.

.*.MCU:.* {
if(ReadingsVal($NAME,'Akku',0) > 3.3)
{
fhem("setreading $NAME Status Very low");
}
}
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 22:59:42
Jetzt wo du es sagt mit dem STATE und dem state, da hab ich mich vertan, du hast recht.

Achso, ich dachte das ist ein String und eine Variable die ich zusammenführen muss, nun funktioniert es! =D
Vielen Dank!!!!!!!
Was genau passiert, wenn ich ein Reading abfrage, welches nicht existiert?
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: CoolTux am 17 März 2018, 23:07:07
Bei ReadingsVal hast du ja drei Parameter.
Erste ist Device Name zweite ist Reading Name dritte ist Default Wert. Ist kein Reading da wird der Default Wert als Value angegeben.
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: Gear am 17 März 2018, 23:14:03
Okey, super!
Vielen Dank für die Hilfe und für die Geduld und die Zeit! =)
Titel: Antw:Wenn die Akkuspannung zu niedrig ist Notify per TeleBot
Beitrag von: KernSani am 18 März 2018, 10:05:11
Schreibst du dann noch [Gelöst] vor das Subject des ersten Posts?
Danke :-)


Kurz, weil mobil...