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
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
Hey, MadMax-FHEM
leider nicht wirklich. =(
Warum?
Beides schafft was du willst...
...so wie ich deinen "Wunsch" gelesen hab...
Gruß, Joachim
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.
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
Bitte mach mal ein list vom Device
Also oben in der FHEMWEB Eingabezeile list DEVICENAME eingeben.
@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
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.
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
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.
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.
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.
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?
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.
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?
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 )
{}
}
Okey, das geht nun hab ich nochmal Google genutzt um zu schauen, wie ich ein Reading setze.
Irgendwie hilft mir da aber nichts weiter.
setreading ist der FHEM Befehl dazu.
Also wenn Du in Perl bist
fhem("setreading DEVICE READING VALUE");
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?
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");
}
}
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?
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.
Okey, super!
Vielen Dank für die Hilfe und für die Geduld und die Zeit! =)
Schreibst du dann noch [Gelöst] vor das Subject des ersten Posts?
Danke :-)
Kurz, weil mobil...