Batteriewarnung aus der Commandref funktioniert nicht mehr

Begonnen von SouzA, 25 März 2017, 01:49:21

Vorheriges Thema - Nächstes Thema

SouzA

Hallo,

folgende Batteriewarnung habe ich bei mir:

(
[":battery: low"]
and
[?$SELF:B_$DEVICE] ne "low"
)
(setreading di_Alarme_battery B_$DEVICE low)
(set HomePortalBot message $DEVICE Batterie low)
DOELSEIF
(
[":battery: ok"]
and
[?$SELF:B_$DEVICE] ne "ok"
)
(setreading di_Alarme_battery B_$DEVICE ok)
(set HomePortalBot message $DEVICE Batterie ok)


Sieht ähnlich aus, wie die aus dem Commandref? Ja, ist es auch ;)
Nur scheint das Teil nicht mehr zu funktionieren. Das DOIF aktualisiert jetzt immer. Egal ob die Batterie beim letzten Trigger ok war oder nicht. Es scheint, die eigenen Readings überhaupt nicht zu lesen.

Das Ding hat bis vor zwei Stunden auch noch funktioniert. Dann hab ich das DOIF umbenannt und dann gings los... Als mein Handy nicht mehr still stand hab ich das "alte" DOIF gelöscht und einfach noch einmal ein neues angelegt. Selber Effekt.

Kann das jemand bestätigen?

Bis denn
SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

amenomade

Wäre besser mit coma-separated Befehle, oder?


(
[":battery: low"]
and
[?$SELF:B_$DEVICE] ne "low"
)
((setreading di_Alarme_battery B_$DEVICE low),
(set HomePortalBot message $DEVICE Batterie low))
DOELSEIF
(
[":battery: ok"]
and
[?$SELF:B_$DEVICE] ne "ok"
)
((setreading di_Alarme_battery B_$DEVICE ok),
(set HomePortalBot message $DEVICE Batterie ok))


Und was sind die attr deines DOIF? Ist do always eingestellt?

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

igami

Hast du beim Umbenennen auch "di_Alarme_battery" geändert? Das könnte man auch als $SELF schreiben.

Alternativ gibt es im monitoring Modul auch ein Beispiel für eine Batterieüberwachung.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

SouzA

Hi,

vielen Dank für die Antworten.
Ein Restart hat das DOIF wieder zum Arbeiten gebracht.
Keine Ahnung, wo der hängen geblieben ist...

@amenomade
so wie ich das sehe ist kein Komma notwendig.
Habe nen Dutzend DOIFs und eigentlich nirgendwo nen Komma zwischen.

Bis denn
SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

amenomade

Ok gut zu wissen, danke. Ich gebe mir immer Mühe... umsonst.  ;)

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

Per

Klammern statt Komma erzeugen eine höher Last, weil es getrennte CMD-Bereiche sind. Dafür lassen sie sich über wait, cmdState oder andere Befehle getrennt ansprechen.
Bevor die Geschichte mit den Kommas so funktionierte wie heute, waren Klammern bisweilen die einzige Möglichkeit, "widerspenstige" Befehle zu separieren.

FunkOdyssey

Hallo, vielleicht hat jemand einen Tipp für mich. Ich habe Homematic wie auch Z-Wave-Geräte. Bei den Z-Wave-Geräten wird als Reading (hole ich mir per get xyz battery) ein Prozentwert gespeichert: battery: 59 %

Nun dachte ich, dass ich einfach der Wert mit < 60 vergleiche. Aber dann werden auch alle Geräte zurückgeliefert, die keine Zahl enthalten. Somit lösen alle "ok"-Geräte auch aus.


   DEF        (
(
[":^[Bb]attery.*[Ll]ow"] or
[":^[Bb]attery"] < 60
) and
[?$SELF:BATT$DEVICE,"init"] ne "low" and
[?$SELF:P_mode,"inaktiv"] eq "aktiv"
)
(
setreading $SELF msg {((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Batterie leer")},
{Log 1,((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Batterie leer")},
(msg mail xxx -2 {((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Batterie leer")})
setreading $SELF BATT$DEVICE low
)
DOELSEIF
(
[":^battery: ok"] and
[?$SELF:BATT$DEVICE,"init"] ne "ok" and
[?$SELF:P_mode,"inaktiv"] eq "aktiv"
)
(
setreading $SELF BATT$DEVICE ok,
setreading $SELF msg -
)


Frage 1:

Wie kann man bei einem DOIF Ereignistrigger auch auf eine Zahl filtern?

Aus der CommandRef:
Filtern nach Ausdrücken mit Ausgabeformatierung:
Syntax: [<device>:<reading>|<internal>:d<number>|"<regex>":<output>]

Ich würde gerne so etwas ähnliches wie folgender Vergleich umsetzen:
[":^[Bb]attery":d] < 60

Ich kenne Ereignistrigger und auch die Filtern nach dem :d-Ausdruck. Aber wie kann man beides kombinieren?

Frage 2:

Hat jemand einen Tipp, wie ich den Vergleich auf "low" und auf "< 60 %" bewerkstelligen kann?

Danke.

amenomade

Ich würde es abhängig vom TYPE machen (nicht getestet): statt [":^[Bb]attery.*[Ll]ow"] or
[":^[Bb]attery"] < 60

etwas in der Art (sorry, kann im Moment nicht testen)
[":^[Bb]attery.*[Ll]ow"] or
([":^[Bb]attery"] < 60 and [?$DEVICE:TYPE] eq "ZWave)


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

FunkOdyssey

Ach, was hat man manchmal ein Brett vor dem Kopf. :-) Vielen Dank.

Der Code würde dann wie folgt aussehen:
(
(
[":^[Bb]atte.*[Ll]ow"] or
([":^[Bb]attery"] < 60 and [?$DEVICE:&TYPE] eq "ZWave")
) and
[?$SELF:BATT$DEVICE,"init"] ne "low" and
[?$SELF:P_mode,"inaktiv"] eq "aktiv"
)


Wenn ich jetzt noch wüsste, wie ich das Prozentzeichen eleganter loswerde. Wie gesagt: Ich kenne das normalerweise mit dem [name:reading:d], aber ich weiß nicht, wie ich das hiermit kombinieren soll.

Folgendes klappt aber auch:
([":^[Bb]attery:\s?(-?\d+(\.\d+)?)"] < 60 and [?$DEVICE:&TYPE] eq "ZWave")


Damian

Zitat von: FunkOdyssey am 11 September 2017, 10:49:02
Hallo, vielleicht hat jemand einen Tipp für mich. Ich habe Homematic wie auch Z-Wave-Geräte. Bei den Z-Wave-Geräten wird als Reading (hole ich mir per get xyz battery) ein Prozentwert gespeichert: battery: 59 %

Nun dachte ich, dass ich einfach der Wert mit < 60 vergleiche. Aber dann werden auch alle Geräte zurückgeliefert, die keine Zahl enthalten. Somit lösen alle "ok"-Geräte auch aus.


   DEF        (
(
[":^[Bb]attery.*[Ll]ow"] or
[":^[Bb]attery"] < 60
) and
[?$SELF:BATT$DEVICE,"init"] ne "low" and
[?$SELF:P_mode,"inaktiv"] eq "aktiv"
)
(
setreading $SELF msg {((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Batterie leer")},
{Log 1,((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Batterie leer")},
(msg mail xxx -2 {((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Batterie leer")})
setreading $SELF BATT$DEVICE low
)
DOELSEIF
(
[":^battery: ok"] and
[?$SELF:BATT$DEVICE,"init"] ne "ok" and
[?$SELF:P_mode,"inaktiv"] eq "aktiv"
)
(
setreading $SELF BATT$DEVICE ok,
setreading $SELF msg -
)


Frage 1:

Wie kann man bei einem DOIF Ereignistrigger auch auf eine Zahl filtern?

Aus der CommandRef:
Filtern nach Ausdrücken mit Ausgabeformatierung:
Syntax: [<device>:<reading>|<internal>:d<number>|"<regex>":<output>]

Ich würde gerne so etwas ähnliches wie folgender Vergleich umsetzen:
[":^[Bb]attery":d] < 60

Ich kenne Ereignistrigger und auch die Filtern nach dem :d-Ausdruck. Aber wie kann man beides kombinieren?

Frage 2:

Hat jemand einen Tipp, wie ich den Vergleich auf "low" und auf "< 60 %" bewerkstelligen kann?

Danke.

:d ist hier noch nicht realisiert, aber du kannst folgenden Filter definieren:

([":^[Bb]attery.*[Ll]ow"] or
  [":^[Bb]attery":"[^\:]*: (-?\d+(\.\d+)?)",999]<60)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Vielen Dank. Ich übernehme dann mal deine Variante, da du der Profi bist.
Wie ich weiter geschrieben hatte, funktioniert folgendes auch:
[":^[Bb]attery:\s?(-?\d+(\.\d+)?)"] < 60

Aber ich bin nun wirklich kein RegExp-Profi. :-)

Damian

Zitat von: FunkOdyssey am 11 September 2017, 17:51:50
Vielen Dank. Ich übernehme dann mal deine Variante, da du der Profi bist.
Wie ich weiter geschrieben hatte, funktioniert folgendes auch:
[":^[Bb]attery:\s?(-?\d+(\.\d+)?)"] < 60

Aber ich bin nun wirklich kein RegExp-Profi. :-)

Das wird nicht gut funktionieren. Zitat aus der Commandref:

ZitatAllgemeine 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.

Du hast keinen Default-Wert (getrennt durch ein Komma) angegeben, deswegen kann dein Ausdruck nur wahr (1) oder unwahr (0) werden.


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

heikoh81

Ich möchte diese Batterieüberwachung nun auch einsetzen, ausschließlich für Homematic-Devices.
In der commandref von fhem.de finde ich das Beispiel nicht - ist die Funktion noch aktuell?

Problem:
Bei mir überwacht das DOIF nur genau 1 Device (Bewegungsmelder HMBW05SchuppenGarage), warum weiß ich nicht.
Ich habe 30 Batteriebetriebene Homematic-Devices!


([":battery: low"] and [?$SELF:B_$DEVICE] ne "low")
(setreading di_Batterieueberwachung B_$DEVICE low)
({DebianMail('mail@xyz.de','Batteriewarnung $DEVICE','siehe Betreff')})
DOELSEIF ([":battery: ok"] and [?$SELF:B_$DEVICE] ne "ok")
(setreading di_Batterieueberwachung B_$DEVICE ok)
##({DebianMail('mail@xyz.de','Batterie OK $DEVICE','siehe Betreff')})


Reading:
B_HMBW05SchuppenGarage = ok

Damian

Zitat von: heikoh81 am 09 Oktober 2018, 22:07:42
Ich möchte diese Batterieüberwachung nun auch einsetzen, ausschließlich für Homematic-Devices.
In der commandref von fhem.de finde ich das Beispiel nicht - ist die Funktion noch aktuell?

Problem:
Bei mir überwacht das DOIF nur genau 1 Device (Bewegungsmelder HMBW05SchuppenGarage), warum weiß ich nicht.
Ich habe 30 Batteriebetriebene Homematic-Devices!


([":battery: low"] and [?$SELF:B_$DEVICE] ne "low")
(setreading di_Batterieueberwachung B_$DEVICE low)
({DebianMail('mail@xyz.de','Batteriewarnung $DEVICE','siehe Betreff')})
DOELSEIF ([":battery: ok"] and [?$SELF:B_$DEVICE] ne "ok")
(setreading di_Batterieueberwachung B_$DEVICE ok)
##({DebianMail('mail@xyz.de','Batterie OK $DEVICE','siehe Betreff')})


Reading:
B_HMBW05SchuppenGarage = ok
probiere mal

DOIF
{if ([":battery: low"] and [?$SELF:B_$DEVICE] ne "low") {
set_Reading("B_$DEVICE","low");
::DebianMail('mail@xyz.de','Batteriewarnung $DEVICE','siehe Betreff');
}
}
{if ([":battery: ok"] and [?$SELF:B_$DEVICE] ne "ok") {
set_Reading("B_$DEVICE","ok");
  }
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

heikoh81

Danke für deine schnelle Antwort.
Irgendetwas passt da nicht beim Einfügen in das DOIF über das WEBIF.


di_Batterieueberwachung DOIF: no left bracket of condition: DOIF {if ([":battery: low"] and [?di_Batterieueberwachung:B_$DEVICE] ne "low") { set_Reading("B_$DEVICE","low"); ::DebianMail('mail@xyz.de','Batteriewarnung $DEVICE','siehe Betreff');  } } {if ([":battery: ok"] and [?di_Batterieueberwachung:B_$DEVICE] ne "ok") { set_Reading("B_$DEVICE","ok");   } }


Diese Variante funktioniert leider auch nicht:

([":^[Bb]attery.*[Ll]ow"] and [?$SELF:B_$DEVICE] ne "low")
(setreading di_Batterieueberwachung B_$DEVICE low)
({DebianMail('mail@xyz.de','Batteriewarnung $DEVICE','siehe Betreff')})
DOELSEIF ([":^[Bb]attery.*[Oo]k"] and [?$SELF:B_$DEVICE] ne "ok")
(setreading di_Batterieueberwachung B_$DEVICE ok)