Hauptmenü

DOIF Batterie Überwachung

Begonnen von wuast94, 27 Dezember 2019, 17:25:19

Vorheriges Thema - Nächstes Thema

wuast94

Ich versuche gerade ein DOIF zu erstellen was darauf reagiert wenn ein gert mit dem reading battery unter 40 fällt eine Push nachricht aufs handy bringt. allerdings scheine ich ieinen fehler zu haben weil das ganze nicht funktioniert.
Das DOIF:
([.*:[Bb]attery] < 40) ("set Push msg Gerät: $NAME Akkustand: $EVENT Bitte Akku wechseln") DOELSE ("set dummy off")

wenn ich das dann versuche mit nem trigger auszuprobieren tut sich genau nix :D

trigger Schalter_Wohnzimmer battery 20
Zigbee  Temp+Luftdruck+Humi Bewegungsmeldern Tür Kontakte, Klingel, TV, Denon, Schaltbare Steckdosen mit leistungsmessung, und weiteres

Homeassistant mit Nodered

mi.ke

Zitat von: wuast94 am 27 Dezember 2019, 17:25:19
([.*:[Bb]attery] < 40) ("set Push msg Gerät: $NAME Akkustand: $EVENT Bitte Akku wechseln") DOELSE ("set dummy off")

Ich schätze, weil der set-Teil in Anführungszeichen steht...
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

Gisbert

Hallo wuast94,

ich bin kein Experte, habe jedoch viele DOIFs und notifiys erfolgreich umgesetzt.
Was mir auffällt (edit: wie bei mi.ke - Antwort hat sich überschnitten), sind die Anführungszeichen in den beiden Ausführungteilen, die ich so noch nie benutzt habe.

Ich schlage vor, dass du deine Definitionen (in code tags) postest, und zwar sowohl das DOIF als auch Device, bei welchem die Batterie überwacht werden soll, sowie die Definition des Push-Devices, gerne auch noch das dummy-Device.

Was passiert, wenn du in der Fhem-Kommandozeile "set Push msg Gerät: $NAME Akkustand: $EVENT Bitte Akku wechseln" (inkl. deiner Anführungszeichen eingibst, wobei du $NAME und $EVENT durch etwas spezifisches (d.h. für das zu überwachende Device) ersetzt?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

amenomade

Dazu (die beiden hieroben haben Recht) kommt noch:
([.*:[Bb]attery] < 40) Das ist syntaxisch falsch.  Du bekommst bestimmt eine Fehlermeldung
timer_01_c01 error: Wrong timespec .*:attery: either HH:MM:SS or {perlcode}

Die Triggerung mit Regex ist für Eventtriggerung. Dies muss dann in Einführungszeichen geschrieben werden.
ABER : ein Event kann nicht kleiner oder grösser als 40 sein.
([".*:[Bb]attery"] < 40) würde deswegen auch nicht funktionieren.

Schau mal in CommandRef bei https://fhem.de/commandref_DE.html#DOIF_aggregation
Es gibt viele Beispiele, wie man das implementieren kann.


Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

andies

zB

([18:00] and [?@"":battery:$_ ne "ok",""]) (set TelegramBot _msg Batteriewarnung am Gerät [@"":battery:$_ ne "ok",""])

Ist dann um 18:00, klappt auch.


Gesendet von iPad mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

wuast94

Zitat von: Gisbert am 27 Dezember 2019, 17:46:48
Hallo wuast94,

ich bin kein Experte, habe jedoch viele DOIFs und notifiys erfolgreich umgesetzt.
Was mir auffällt (edit: wie bei mi.ke - Antwort hat sich überschnitten), sind die Anführungszeichen in den beiden Ausführungteilen, die ich so noch nie benutzt habe.

Ich schlage vor, dass du deine Definitionen (in code tags) postest, und zwar sowohl das DOIF als auch Device, bei welchem die Batterie überwacht werden soll, sowie die Definition des Push-Devices, gerne auch noch das dummy-Device.

Was passiert, wenn du in der Fhem-Kommandozeile "set Push msg Gerät: $NAME Akkustand: $EVENT Bitte Akku wechseln" (inkl. deiner Anführungszeichen eingibst, wobei du $NAME und $EVENT durch etwas spezifisches (d.h. für das zu überwachende Device) ersetzt?

Viele Grüße Gisbert

Hier einmal das komplette DOIF:
defmod sys_bat_check DOIF ([.*:[Bb]attery] < 40) ("set Push msg Gerät: $NAME Akkustand: $EVENT Bitte Akku wechseln") DOELSE ("set dummy off")

Was die definition eines zu überwachendes Gerätes angeht ist auch nur ein DOIF das sich aus 3 verschiedenen devices die readings holt und auf sich selbst setzt (zigbee Multisensor werden leider temp humidity und baro nicht in einem sensor sondern in 3 verschiedene übergeben). Und eines der Readings ist battery mit einem Zahlenwert von 0-100. deswegen kann ich auch nicht die Beispiele aus dem wiki nehmen da die alle von einem "ok" ausgehen.

das push device ist ein ganz normales pushover device und sollte hier auch nichts zur sache tun da das einwandfrei funktioniert. und wenn ich "set Push msg Gerät: bla Akkustand: 29 Bitte Akku wechseln" eingebe bekomme ich auch direkt die push nachricht. allerdings gebe ich das in fhem im commando Feld oben ohne Anführungszeichen ein.
Zigbee  Temp+Luftdruck+Humi Bewegungsmeldern Tür Kontakte, Klingel, TV, Denon, Schaltbare Steckdosen mit leistungsmessung, und weiteres

Homeassistant mit Nodered

wuast94

Zitat von: amenomade am 27 Dezember 2019, 22:10:39
Dazu (die beiden hieroben haben Recht) kommt noch:
([.*:[Bb]attery] < 40) Das ist syntaxisch falsch.  Du bekommst bestimmt eine Fehlermeldung
timer_01_c01 error: Wrong timespec .*:attery: either HH:MM:SS or {perlcode}

Die Triggerung mit Regex ist für Eventtriggerung. Dies muss dann in Einführungszeichen geschrieben werden.
ABER : ein Event kann nicht kleiner oder grösser als 40 sein.
([".*:[Bb]attery"] < 40) würde deswegen auch nicht funktionieren.

Schau mal in CommandRef bei https://fhem.de/commandref_DE.html#DOIF_aggregation
Es gibt viele Beispiele, wie man das implementieren kann.

und ja diese Fehlermeldung bekomme ich tatsächlich. timer_01_c01 error: Wrong timespec .*:attery: either HH:MM:SS or {perlcode}

aber es muss doch möglich sein in einem DOIF zahlen miteinander vergleichen zu können und auch ein wenn reading kleiner als dann das machen gehen
Zigbee  Temp+Luftdruck+Humi Bewegungsmeldern Tür Kontakte, Klingel, TV, Denon, Schaltbare Steckdosen mit leistungsmessung, und weiteres

Homeassistant mit Nodered

Gisbert

Hallo wuast94,

versuch mal das (ungetestet):
defmod sys_bat_check DOIF ([.*:[Bb]attery] < 40) (set Push msg Gerät: $NAME Akkustand: [$NAME:[Bb]attery] Bitte Akku wechseln) DOELSE (set dummy off)
Ggf. den 1. Ausführungsteil in doppelte Klammern:
defmod sys_bat_check DOIF ([.*:[Bb]attery] < 40) ((set Push msg Gerät: $NAME Akkustand: [$NAME:[Bb]attery] Bitte Akku wechseln)) DOELSE (set dummy off)
Falls beides nicht rennt, dann lass mal "[$NAME:[Bb]attery]" weg, und versuch es zuerst mal ohne den Readingswert.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

amenomade

Zitat von: Gisbert am 29 Dezember 2019, 17:51:52
Hallo wuast94,

versuch mal das (ungetestet):
defmod sys_bat_check DOIF ([.*:[Bb]attery] < 40) (set Push msg Gerät: $NAME Akkustand: [$NAME:[Bb]attery] Bitte Akku wechseln) DOELSE (set dummy off)
Ggf. den 1. Ausführungsteil in doppelte Klammern:
defmod sys_bat_check DOIF ([.*:[Bb]attery] < 40) ((set Push msg Gerät: $NAME Akkustand: [$NAME:[Bb]attery] Bitte Akku wechseln)) DOELSE (set dummy off)
Falls beides nicht rennt, dann lass mal "[$NAME:[Bb]attery]" weg, und versuch es zuerst mal ohne den Readingswert.

Viele Grüße Gisbert

So werden die Befehle funktionieren, aber die Bedingung ist immer noch falsch.

Ja, man kann Zahlen vergleichen, aber nicht ein Event mit einem Zahl.
Lies bitte nochmal CommandRef / Aggregation DOIF,wie schon erwähnt. Es sind viele Beispiele, sogar auch mit Zahlen
Etwas in der Art:
([#"":[Bb]attery:$_ < 40]  >  0) Wenn Anzahl Devices mit Reading B/battery kleiner als 40 grösser als 0 ist

(set TelegramBot _msg Batteriewarnung am Gerät [@"":battery:$_ ne "ok",""]) ..., sende Liste von diesen Devices
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

MadMax-FHEM

Wenn es kein DOIF sein muss, ist vielleicht auch das eine Alternative: https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514

Kann auch mehr als "nur" OK etc. ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

wuast94

also habe dein zweites Bespiel mal ausprobiert .. auf ein setreading oder ein trigger reagiert es nicht.. allerdings wenn ich auf dem Dorf ein checkall mache bekomme ich einen push mit folgendem Inhalt:
Gerät: $NAME Akkustand: Bitte Akku wechseln
Also schonmal mehr als vorher. habe mittlerweile die 40 auch auf 100 umgestellt um eher was zu triggern wenn ein echtes event rein kommt aber auch da bis jetzt nichts.

was die Geschichte mit dem geht so nicht angeht bin ich verwirrt .. die commandref in der deutschen version hat zb ganz am anfang folgendes stehen:
define di_lamp DOIF ([06:00-09:00] and [sensor:brightness] < 40) (set lamp on) DOELSE (set lamp off)
wenn ich das richtig sehe und man sich die erste Kondition weg denkt wird da genau das gemacht was ich auch mache .. nur im Beispiel mit nem größer als und ich habe ein kleiner als.
Vlt hat es bei mir einfach noch nicht klick gemacht aber ich verstehe einfach nicht warum es nicht gehen sollte .. wenn ich das so vergleiche ist die syntax korrekt und alles passt und dennoch geht es nicht und gibt mir zusätzlich n timespec Fehler aus obwohl ich nicht mal ne zeit vergleiche oder verwende was mich noch mehr verwirrt.
Zigbee  Temp+Luftdruck+Humi Bewegungsmeldern Tür Kontakte, Klingel, TV, Denon, Schaltbare Steckdosen mit leistungsmessung, und weiteres

Homeassistant mit Nodered

Damian

Vergleiche sind normalerweise nur mit konkreten Readings möglich, z. B. wie:

[sensor:brightness] < 40

Diese Angabe :

[".*:[Bb]attery"] < 40

ist aber keine konkrete Angabe eines Readings, sondern eine Eventabfrage, die normalerweise nur wahr oder falsch ist, aber keinen Inhalt eines Readings liefert.

Es gibt die Möglichkeit, statt des Readings auch das Event auszuwerten, dazu muss man deinen Default-Wert angeben, z. B.

[".*:[Bb]attery",0] < 40



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

amenomade

Das ist aber interessant.
[".*:[Bb]attery",0] < 40
Damit wird auf Regex-Event getriggert, aber dann das Reading bewertet? Cool!
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

#13
nein, es wird das Event ausgewertet.
Zitat aus der Commandref:
Zitat

Allgemeine Ereignistrigger können ebenfalls so definiert werden, dass sie nicht nur wahr zum Triggerzeitpunkt und sonst nicht wahr sind, sondern Inhalte des Ereignisses zurückliefern. Initiiert wird dieses Verhalten durch die Angabe eines Default-Wertes.

Syntax:

["regex for trigger",<default value>]

Anwendungsbeispiel:

define di_warning DOIF ([":^temperature",0]< 0) (set pushmsg danger of frost $DEVICE)
attr di_warning do always

Perl-Modus:
define di_warning DOIF {if ([":^temperature",0]< 0) {fhem_set"pushmsg danger of frost $DEVICE}}

Damit wird auf alle Devices getriggert, die mit "temperature" im Event beginnen. Zurückgeliefert wird der Wert, der im Event hinter "temperature: " steht. Wenn kein Event stattfindet, wird der Defaultwert, hier 0, zurückgeliefert.
Ebenfalls kann ein Ereignisfilter mit Ausgabeformatierung angegeben werden.

Syntax:

["regex for trigger":"<regex filter>":<output>,<default value>]

Regex-Filter- und Output-Parameter sind optional. Der Default-Wert ist verpflichtend.

Die Angaben zum Filter und Output funktionieren, wie die beim Reading-Filter. Siehe: Filtern nach Ausdrücken mit Ausgabeformatierung

Wenn kein Filter, wie obigen Beispiel, angegeben wird, so wird intern folgende Regex vorbelegt: "[^\:]*: (.*)" Damit wird der Wert hinter der Readingangabe genommen. Durch eigene Regex-Filter-Angaben kann man beliebige Teile des Events herausfiltern, ggf. über Output formatieren und in der Bedingung entsprechend auswerten, ohne auf Readings zurückgreifen zu müssen.

Ich würde allerdings für diese Aufgabe die Lösung aus dem Post #5 nehmen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

wuast94

Zitat von: Damian am 29 Dezember 2019, 21:34:35
nein, es wird das Event ausgewertet.
Zitat aus der Commandref:
Ich würde allerdings für diese Aufgabe die Lösung aus dem Post #5 nehmen.

also hab es jetzt mal so defmod sys_bat_check DOIF ([".*:[Bb]attery",0] < 80)\
("set Push msg Gerät: $NAME Akkustand: $EVENT Bitte Akku wechseln") DOELSE ("set dummy off")

scheint aber immer noch nicht zu gehen
Zigbee  Temp+Luftdruck+Humi Bewegungsmeldern Tür Kontakte, Klingel, TV, Denon, Schaltbare Steckdosen mit leistungsmessung, und weiteres

Homeassistant mit Nodered