Hey zusammen,
ich bin inzwischen etwas raus was Perl und Regex betrifft da ich schon lange nichts mehr in FHEM umstellen musste, daher hoffe ich auf eure Hilfe.
Seit Jahren funktioniert bei mir das Notify für die Batterieüberwachung problemlos, abgeschaut hier: https://wiki.fhem.de/wiki/Batterieüberwachung
Mein Notify sieht so aus (bewusst inaktiv weil ich die Meldung erst einmal unterdrücke wegen dem Problem):
Internals:
DEF .*:[Bb]attery:|.*:[Bb]atteryS { if($EVENT !~ m/ok/) {
{ fhem ("msg push FHEM Batteriewarnung, $NAME: $EVENT:\nBatterien sollten demnächst gewechselt werden!");
Log 3, "$NAME: Batteriewarnung $EVENT";
}
}
}
FUUID 5f807c20-f33f-38f1-b3e4-5189c05504ad9ad9
FVERSION 91_notify.pm:0.255310/2022-01-21
NAME n_batt_chk
NR 224
NTFY_ORDER 50-n_batt_chk
REGEXP .*:[Bb]attery:|.*:[Bb]atteryS
STATE inactive
TRIGGERTIME 1642948194.07513
TYPE notify
READINGS:
2022-01-23 15:30:27 state inactive
2022-01-23 15:29:54 triggeredByDev HM_BWM_Buero
2022-01-23 15:29:54 triggeredByEvent battery: ok
Attributes:
room System->Logik
Seit dem letzten Update liefern jedoch Geräte von HUE wie Bewegungsmelder oder Dimmschalter den Wert des Reading "battery" mit einer Zahl für den Prozentwert aus, als Beispiel mein Bewegungsmelder:
Internals:
CFGFN
DEF sensor 29 IODev=HUEBridge
FUUID 61ed5a1a-f33f-38f1-6b6e-51a3dde219a3bc69
FVERSION 31_HUEDevice.pm:0.255380/2022-01-21
ID S29
INTERVAL
IODev HUEBridge
NAME HUESensor29
NR 334
STATE nomotion
TYPE HUEDevice
manufacturername Signify Netherlands B.V.
modelid SML002
name Bewegungsmelder Terrasse
on 1
productname Hue outdoor motion sensor
reachable 1
sensitivity 0
sensitivitymax 4
swversion 6.1.1.27575
type ZLLPresence
uniqueid 00:17:88:01:06:49:3a:aa-02-0406
READINGS:
2022-01-23 14:37:30 IODev HUEBridge
2022-01-23 12:10:31 battery 100
2022-01-23 12:10:31 batteryPercent 100
2022-01-23 12:10:31 reachable 1
2022-01-23 12:10:31 state nomotion
helper:
devtype S
fromAutocreate 1
reachable 0
update_timeout 1
capabilities:
configList:
json:
manufacturername Signify Netherlands B.V.
modelid SML002
name Bewegungsmelder Terrasse
productname Hue outdoor motion sensor
swversion 6.1.1.27575
type ZLLPresence
uniqueid 00:17:88:01:06:49:3a:aa-02-0406
capabilities:
config:
alert none
battery 100
sensitivity 0
sensitivitymax 4
pending:
state:
lastupdated 2022-01-23T11:10:31
swupdate:
lastinstall 2021-05-28T19:25:17
state noupdates
setList:
hmccu:
Attributes:
IODev HUEBridge
alias Bewegungsmelder Terrasse
group HUESensor
model SML002
room HUEDevice
Wie kann ich jetzt diesen Wert entweder ausschließen aus dem Notify für die Batterieüberwachung (brauch ich nicht unbedingt) oder aber angeben dass er erst ab 15% eine Meldung auswirft?
Gruß Cobra
Ich nutze ja das hier: https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514
Inkl. "Batterieverbrauchsberechnung" und "Batteriehaltbarkeitsübersicht" ("private Erweiterungen", die ich aber liefern könnte)...
Bei deinem Problem:
entweder das notify nur auf ok|low triggern lassen bzw. ja nur auf low?
Oder eben das if um ein elsif erweitern, dass auf < 15 prüft...
Gruß, Joachim
Zitat von: MadMax-FHEM am 23 Januar 2022, 16:51:41
Oder eben das if um ein elsif erweitern, dass auf < 15 prüft...
So kompliziert muss man es nicht machen.
Einfach nix machen, wenn der numerische Wert größer als 15 ist:
.*:[Bb]attery:|.*:[Bb]atteryS { return if ReadingsNum($NAME,$EVTPART0,0) > 15; fhem ("msg push FHEM Batteriewarnung, $NAME: $EVENT:\nBatterien sollten demnächst gewechselt werden!"); Log 3, "$NAME: Batteriewarnung $EVENT"; }
(Prinzipdarstellung, eventuell muss $EVTPART0 noch passend gemacht werden)
Aber das geht ja dann jetzt nur für die Prozentwerte?
Zitat von: Cobra am 23 Januar 2022, 15:56:52
Wie kann ich jetzt diesen Wert entweder ausschließen aus dem Notify für die Batterieüberwachung (brauch ich nicht unbedingt) oder aber angeben dass er erst ab 15% eine Meldung auswirft?
So wie ich verstanden braucht er die (Prozentwerte) nicht wirklich, oder?
Also so wie ich es verstanden hatte:
entweder nur (wie vorher) auf low (oder nicht ok) und wenn es einfach geht, dann zusätzlich auch low (nicht ok) und unter 15%...
Das "Problem" jetzt ist ja (wohl), dass eben irgendeine Prozentangabe auch "nicht ok" ist und somit eben eine Batteriewarung für ALLE "Prozent-Devices" kommt, obwohl eben nicht leer...
Gruß, Joachim
Zitat von: MadMax-FHEM am 23 Januar 2022, 17:57:12
Also so wie ich es verstanden hatte:
So wie ich es verstanden habe und wie es in den gezeigten readings zu sehen ist, gibt es die Werte "low" und "ok" jetzt nicht mehr, sondern nur noch numerische Werte in beiden readings:
2022-01-23 12:10:31 battery 100
2022-01-23 12:10:31 batteryPercent 100
Deshalb bringt Dein nun schon zweimal gemachter Vorschlag bezüglich low und ok für mich wenig Nutzen.
Hey zusammen,
mir geht es in erste Linie um die Batteriüberwachung von den Homematic-Geräten, die liefen Werte wie zB. ok oder low.
Nur die HUE-Geräte haben jetzt die Prozentanzeige und das bringt mir jetzt eben mein Notify durcheinander.
Da die HUE-Geräte auch über die HUE-App melden wenn die Batterie leer ist brauch ich das nicht unbedingt noch über FHEM, daher könnte ich es auch ausklammern.
Wie müsste denn der Code aussehen wenn ich zB, im if-Teil hier noch sagen würde alles was keine Zahl ist oder eben die Zahl kleiner als 15 ist?
if($EVENT !~ m/ok/)
Wenn ich richtig weiß gibt es manche Geräte die statt low auch andere Werte für eine leere Batterie abliefern die ich da auch gerne noch abfangen würde daher will ich ungern nur auf "low" prüfen.
Beim Elsif steh ich auf dem Schlauch wie das gemeint ist.
Gruß Cobra
Letztendlich kannst Du auch eine Prüfung auf den TYPE des device einbauen, damit das notify nur auf Homematic Geräte reagiert. Alternativ kannst Du das auch umkehren und festlegen, dass bei HUE eben nicht reagiert werden soll.
Zitat von: Cobra am 23 Januar 2022, 18:14:35
Wie müsste denn der Code aussehen wenn ich zB, im if-Teil hier noch sagen würde alles was keine Zahl ist oder eben die Zahl kleiner als 15 ist?
if($EVENT !~ m/ok/ || ReadingsNum(device,reading,default) < 15)
Zitatif($EVENT !~ m/ok/ || ReadingsNum(device,reading,default) < 15)
Hier bekomme ich dann als Fehlermeldung:
Bareword "device" not allowed while "strict subs" in use at (eval 264569) line 1.
Bareword "reading" not allowed while "strict subs" in use at (eval 264569) line 1.
Bareword "default" not allowed while "strict subs" in use at (eval 264569) line 1.
Zitat von: betateilchen am 23 Januar 2022, 18:18:45
Letztendlich kannst Du auch eine Prüfung auf den TYPE des device einbauen, damit das notify nur auf Homematic Geräte reagiert. Alternativ kannst Du das auch umkehren und festlegen, dass bei HUE eben nicht reagiert werden soll.
Dann wären wir ja langsam fast bei dem zuerst von mir verlinkten "Beispiel"... ;)
Wenn du die HUE nicht willst, sollte doch ein notify das auf low reagiert zumindest für die Homematic-Dinger passen 8)
Statt auf "nicht ok" zu prüfen, was halt auf viele Dinge zutrifft...
Ich habe alles gesagt was mir dazu einfällt...
EDIT: device, reading, default -> das ist nur die "Aufrufbeschreibung" von ReadingsNum. Also ReadingsNum(device, reading, default). Da musst du (verm.) noch einsetzen, was eben bei dir zutrifft...
Gruß, Joachim
natürlich bekommst Du da eine Fehlermeldung...
Du musst die Funktion ReadingsNum() mit den entsprechenden Werten für device, reading und default aufrufen, nicht mit den Platzhaltern, die ich verwendet habe.
Zitat von: Cobra am 23 Januar 2022, 18:14:35
mir geht es in erste Linie um die Batteriüberwachung von den Homematic-Geräten, die liefen Werte wie zB. ok oder low.
Wenn es tatsächlich um Homematic geht, kann man die Information über den Batteriezustand auch viel einfacher aus HMinfo bekommen.
Zitat von: betateilchen am 23 Januar 2022, 18:35:52
Wenn es tatsächlich um Homematic geht, kann man die Information über den Batteriezustand auch viel einfacher aus HMinfo bekommen.
Es geht nicht nur um Homematic. Zwar hauptsächlich darum aber eben auch um andere Geräte die ich grad nicht auf dem Schirm hab oder die ich ggfs in Zukunft integrieren will.
Ich hab es jetzt pragmatisch gelöst und PhilipsHue einfach davon rausgenommen wie folgt:
Internals:
DEF .*:[Bb]attery:|.*:[Bb]atteryS { if($EVENT !~ m/ok/ && ReadingsVal($NAME,"IODev","OK") ne "HUEBridge") {
{ fhem ("msg push FHEM Batteriewarnung, $NAME: $EVENT:\nBatterien sollten demnächst gewechselt werden!");
Log 3, "$NAME: Batteriewarnung $EVENT";
}
}
}
FUUID 5f807c20-f33f-38f1-b3e4-5189c05504ad9ad9
FVERSION 91_notify.pm:0.255310/2022-01-21
NAME n_batt_chk
NR 224
NTFY_ORDER 50-n_batt_chk
REGEXP .*:[Bb]attery:|.*:[Bb]atteryS
STATE 2022-01-23 19:21:21
TRIGGERTIME 1642962081.80905
TYPE notify
READINGS:
2022-01-23 19:17:23 state active
2022-01-23 19:21:21 triggeredByDev HM_BWM_Wohnzimmer
2022-01-23 19:21:21 triggeredByEvent battery: ok
Attributes:
room System->Logik
Danke für den Schubs in die richtige Richtung.
Gruß Cobra
Ich habe das gleiche Problem, würde aber ungern die HUE Devices einfach ausschließen. Hat jemand vielleicht doch eine Idee wie man den Code anpassen muss um die HUE Devices korrekt mit verarbeiten zu können, meine Regex Kenntnisse sind leider sehr beschränkt.
Zitat von: Fredi69 am 25 Januar 2022, 08:35:14
Ich habe das gleiche Problem, würde aber ungern die HUE Devices einfach ausschließen. Hat jemand vielleicht doch eine Idee wie man den Code anpassen muss um die HUE Devices korrekt mit verarbeiten zu können, meine Regex Kenntnisse sind leider sehr beschränkt.
Aber du hast doch eine ganz andere Lösung im Einsatz oder planst diese in Betrieb zu nehmen?
An 2 Stellen mit 2 unterschiedlichen "Mechanismen" nachfragen ist auch nicht zielführend!
Wo willst du nun geholfen haben?
Dieses "simple" notify erweitert auf HUE-Devices oder in dem anderen Thread zusätzlich HUE-Devices (Vorschlag habe ich ja gepostet, geht der nicht?)...
Doppelt mache ich mir die Arbeit nicht 8)
Gruß, Joachim
Zitat von: MadMax-FHEM am 25 Januar 2022, 09:46:21
Aber du hast doch eine ganz andere Lösung im Einsatz oder planst diese in Betrieb zu nehmen?
An 2 Stellen mit 2 unterschiedlichen "Mechanismen" nachfragen ist auch nicht zielführend!
Wo willst du nun geholfen haben?
Dieses "simple" notify erweitert auf HUE-Devices oder in dem anderen Thread zusätzlich HUE-Devices (Vorschlag habe ich ja gepostet, geht der nicht?)...
Doppelt mache ich mir die Arbeit nicht 8)
Gruß, Joachim
Vielen herzlichen Dank für Deine Unterstützung.
Ich habe seit vielen Jahren die hier beschriebene Lösung erfolgreich im Einsatz.
Da leider die HUE Devices, die seit dieser Woche ein Battery Reading haben, mit dieser Lösung auch nicht funktionieren, habe ich gestern mal nach einer Lösung gesucht und bin dann auf Deine Lösung unter den Codeschnipseln gestossen.
Diese Lösung ist zwar auch ein toller Ansatz, hat aber wieder andere Probleme mit sich gebracht.
Daher habe ich nun versucht die ursprüngliche Lösung, basierend auf einem einzigen Notify, an die HUE Devices anzupassen.
Vielen Dank und Grüße
Fredi69
Und was soll nun gelöst werden bzw. wo willst du geholfen haben?
Hier oder dort? ;)
Gruß, Joachim
Zitat von: MadMax-FHEM am 25 Januar 2022, 10:58:59
Und was soll nun gelöst werden bzw. wo willst du geholfen haben?
Hier oder dort? ;)
Gruß, Joachim
Gerne hier.
Dann würde ich halt mal z.B. so umbauen:
{ if($EVENT =~ m/low/)
{
fhem ("msg push FHEM Batteriewarnung, $NAME: $EVENT:\nBatterien sollten demnächst gewechselt werden!");
Log 3, "$NAME: Batteriewarnung $EVENT";
}
if(InternalVal($DEVICE, "TYPE", "n.a.") eq "HUEDevice" && $EVENT < 15)
{
fhem ("msg push FHEM Batteriewarnung, $NAME: $EVENT:\nBatterien sollten demnächst gewechselt werden!");
Log 3, "$NAME: Batteriewarnung $EVENT";
}
}
EDIT: ich bin jetzt nicht sicher ob/wie man das in den DEF-Editor eingeben kann, also mit Zeilenumbrüchen etc. Weil ich sowas eben immer in Subs auslagere, da ist das kein Problem... Bei Eingabe in RawDef musst du die Zeilenumbrüche noch jeweils mit \ abschließen (denke ich) und evtl./verm. auch die Strichpunkte "doppeln"...
EDIT: u.U. gibt das auch (ab und an) eine Warning im Log wegen "isn't numeric". Dann könnte man auf "Stringvergleich" ausweichen oder eben die Abfrage <15 in eine weitere "Verschachtelung", also ein if innerhalb des if(HUE). Hatte ich schon aber so ist es eben "kürzer"...
Bzgl. $EVENT < 15 bin ich halt nicht sicher, weil es könnte auch $EVTPART1 etc. sein...
Du kannst ja auch das $EVENT < 15 erst mal weglassen und schauen was die Logausgabe bzgl. $EVENT ins Log schreibt und dann anpassen (lassen).
Setzt halt jetzt voraus, dass die Homematic (oder alle anderen Geräte/Devices) eben low liefern und die HUE immer Prozentzahlen...
Wenn das nicht so ist bzw. weitere Typen kommen, dann bist du über kurz oder lang eben bei der anderen Lösung (so habe ich ja auch angefangen ;) ).
Ebenso: manchmal schwanken die Sensoren zwischen ok/low bevor sie dann endgültig leer sind. Das würde die andere Lösung ebenfalls abfangen...
Gruß, Joachim
.*:[Bb]attery:|.*:[Bb]atteryS { if($EVENT !~ m/ok/ && ReadingsVal($NAME,"IODev","OK") ne "HUEBridge") ...
Solche Definitionen sind reine Performancefresser und das für eine relativ zeitunkritische Abfrage.
Hier wird jedes Event im System ausgewertet, nur um festzustellen, dass einmal pro Jahr eine Batterie alle ist.
Wenn man alle seine Probleme so löst, dann wird sich das System irgendwann mit sich selbst beschäftigen.
Zitat von: Damian am 25 Januar 2022, 12:02:11
.*:[Bb]attery:|.*:[Bb]atteryS { if($EVENT !~ m/ok/ && ReadingsVal($NAME,"IODev","OK") ne "HUEBridge") ...
Solche Definitionen sind reine Performancefresser und das für eine relativ zeitunkritische Abfrage.
Hier wird jedes Event im System ausgewertet, nur um festzustellen, dass einmal pro Jahr eine Batterie alle ist.
Wenn man alle seine Probleme so löst, dann wird sich das System irgendwann mit sich selbst beschäftigen.
Danke für die Info, das war mir so nicht bewußt.
Hast Du einen anderen Vorschlag?
Es gibt da schon gefühlt tausend verschiedene Lösungsansätze zu dem Thema, hier zwei davon - beide resourcenschonend:
hier, wie man einen Ausfall eines beliebigen Readings anhand des Zeitstempels feststellen kann: https://forum.fhem.de/index.php/topic,104569.msg985397.html#msg985397
hier, mit Typ und Readingauswertung: https://forum.fhem.de/index.php/topic,103977.msg1201984.html#msg1201984