Hallo,
ich hab ein an und für sich funktionierendes notify, dass auslöst, wenn ein "error(s)" auftritt.
defmod JK_BMS.notify notify JK_BMS:(errors.*|power_tube_temperature.*|temperature_sensor_1.*|temperature_sensor_2.*) \
{if ($EVENT =~ m/errors/) \
{my $alias = AttrVal($NAME,'alias','');; \
fhem "set Pushover.Nachricht msg '$alias Fehler' '$EVENT';; \
set NTFY message Title=\"$alias Fehler\" $EVENT"} \
elsif ($EVENT =~ m/temperature/ and $EVTPART1 >= 40) \
{my $alias = AttrVal($NAME,'alias','');; \
my $val = $EVENT;; $val =~ s/_/ /;; $val =~ s/_/ /;; \
fhem "set Pushover.Nachricht msg '$alias Temperatur' '$val°C';; \
set NTFY message Title=\"$alias Temperatur\" $val°C"}}
$EVENT war im Fehlerfall "errors: Charging overcurrent". Nachdem der Fehler sich erledigt hatte, wurde als Wert des Readings nichts - also gar nichts - ausgegeben.
Diese fehlende Information ist aber insofern etwas wert, da sie ja anzeigt, dass kein Fehler mehr vorliegt - nur das obige notify triggert darauf nicht.
Meine Frage lautet deshalb, wie man auf ein leeres Reading triggern kann?
Viele Grüße Gisbert
if !$EVENT
Sofern $EVENT wirklich leer ist.
Hab Deinen Code jetzt nicht vollständig analysiert, aber so sollte deine Aufgabe gelöst werden können:
defmod JK_BMS.notify notify JK_BMS:(errors|power_tube_temperature|temperature_sensor_1|temperature_sensor_2):.* {
my @evt = split(' ',$EVENT);
my $read = chop $evt[0];
my $val = $evt[1];
if ($read eq 'errors' && $val) {
# tue wenn Reading gleich errors und value vorhanden
} elsif ($read eq 'errors' && !$val) {
# tue wenn Reading gleich errors und value nicht vorhanden
}
}
Gruß
Dan
Bevor man den Inhalt zerlegt, ist es eventuell interessant, wie die Events überhaupt aussehen...
Falls eventTypes aktiv ist, könnte das hier weiterhelfen:
get eventTypes list JK_BMSDa dann raussuchen, was vermeintlich nicht triggert.
Hallo zusammen,
danke für die Lösungsvorschläge, die ich mir im Detail anschauen werde.
In der Zwischenzeit habe ich folgendes heraus gefunden. Das notify triggert auch bei einem leeren Reading:
2026-02-19 22:21:16.139 MQTT_DEVICE JK_BMS errors: aber die nachfolgende Bedingung wird nicht wahr:
if ($EVENT =~ m/errors/)
Am liebsten wäre mir, wenn ich die Bedingung zum Funktionieren bringen könnte.
Viele Grüße Gisbert
Hallo Dan,
ich bekomme folgenden Fehler in der log-Datei, wenn das notify triggert:
2026.02.20 00:33:28.432 1: ERROR evaluating my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my @MATCHED=@{$evalSpecials->{'%MATCHED'}};my $NAME= $evalSpecials->{'%NAME'};my $SELF= $evalSpecials->{'%SELF'};my $TYPE= $evalSpecials->{'%TYPE'};{
my $alias = AttrVal($NAME,'alias','');
my @evt = split(' ',$EVENT);
my $read = chop $evt[0];
my $val = $evt[1];
if ($read eq 'errors' && $val) {
fhem "set Pushover.Nachricht msg '$alias Fehler' '$EVENT';
set NTFY message Title=\"$alias Fehler\" $EVENT"
# true wenn Reading gleich errors und value vorhanden
}
elsif ($read eq 'errors' && !$val) {
fhem "set Pushover.Nachricht msg '$alias Fehler' 'erledigt';
set NTFY message Title=\"$alias Fehler\" erledigt"
# true wenn Reading gleich errors und value nicht vorhanden
}
elsif ($EVENT =~ m/temperature/ and $EVTPART1 >= 40)
{my $alias = AttrVal($NAME,'alias','');
my $val = $EVENT; $val =~ s/_/ /; $val =~ s/_/ /;
fhem "set Pushover.Nachricht msg '$alias Temperatur' '$val°C';
set NTFY message Title=\"$alias Temperatur\" $val°C"}}: Global symbol "$EVTPART1" requires explicit package name (did you forget to declare "my $EVTPART1"?) at (eval 68123109) line 16.
Die Definition lautet:
defmod JK_BMS.notify notify JK_BMS:(errors.*|power_tube_temperature.*|temperature_sensor_1.*|temperature_sensor_2.*) {\
my $alias = AttrVal($NAME,'alias','');;\
my @evt = split(' ',$EVENT);;\
my $read = chop $evt[0];;\
my $val = $evt[1];;\
if ($read eq 'errors' && $val) {\
fhem "set Pushover.Nachricht msg '$alias Fehler' '$EVENT';; \
set NTFY message Title=\"$alias Fehler\" $EVENT"\
# true wenn Reading gleich errors und value vorhanden\
} \
elsif ($read eq 'errors' && !$val) {\
fhem "set Pushover.Nachricht msg '$alias Fehler' 'erledigt';; \
set NTFY message Title=\"$alias Fehler\" erledigt"\
# true wenn Reading gleich errors und value nicht vorhanden\
}\
elsif ($EVENT =~ m/temperature/ and $EVTPART1 >= 40) \
{my $alias = AttrVal($NAME,'alias','');; \
my $val = $EVENT;; $val =~ s/_/ /;; $val =~ s/_/ /;; \
fhem "set Pushover.Nachricht msg '$alias Temperatur' '$val°C';; \
set NTFY message Title=\"$alias Temperatur\" $val°C"}}
Es scheint ein Problem mit $EVTPART1 zu existieren.
Viele Grüße Gisbert
Zitat von: Gisbert am 20 Februar 2026, 00:47:01Es scheint ein Problem mit $EVTPART1 zu existieren.
Ja, genau! Das ist immer der Fall wenn es leer ist! Deswegen habe ich das Aufteilen (splitten) selbst vorgenommen.
Ändere mal:
elsif ($EVENT =~ m/temperature/ and $EVTPART1 >= 40)in:
elsif ($read ne 'errors' && defined $val && $val >= 40)Gruß
Dan
Und diesen Teil:
{my $alias = AttrVal($NAME,'alias','');
my $val = $EVENT; $val =~ s/_/ /; $val =~ s/_/ /;
fhem "set Pushover.Nachricht msg '$alias Temperatur' '$val°C';
set NTFY message Title=\"$alias Temperatur\" $val°C"}}besser ändern zu:
{my $alias = AttrVal($NAME,'alias','');
$read =~ s/_/ /g;
fhem "set Pushover.Nachricht msg '$alias Temperatur' '$read $val°C';
set NTFY message Title=\"$alias Temperatur\" $val°C"}}
Gruß
Dan
Ach ja, sind das wirklich die Readingsnamen oder sind die noch länger?
defmod JK_BMS.notify notify JK_BMS:(errors.*|power_tube_temperature.*|temperature_sensor_1.*|temperature_sensor_2.*)Wenn das die vollständigen Namen der Readings sind dann würde ich das so schreiben wie schon in #2 (https://forum.fhem.de/index.php?msg=1358240) erwähnt:
defmod JK_BMS.notify notify JK_BMS:(errors|power_tube_temperature|temperature_sensor_1|temperature_sensor_2):.*
Gruß
Dan
EDIT:
Eigentlich sollte auch gehen:
defmod JK_BMS.notify notify JK_BMS:(errors|power_tube_temperature|temperature_sensor_[12]):.*
Hallo Dan,
ich hab versucht deine Vorschläge alle umzusetzen.
defmod JK_BMS.notify notify JK_BMS:(errors|power_tube_temperature|temperature_sensor_1|temperature_sensor_2):.* {\
my $alias = AttrVal($NAME,'alias','');;\
my @evt = split(' ',$EVENT);;\
my $read = chop $evt[0];;\
my $val = $evt[1];;\
if ($read eq 'errors' && $val) {\
fhem "set Pushover.Nachricht msg '$alias Fehler' '$EVENT';; \
set NTFY message Title=\"$alias Fehler\" $EVENT"\
# true wenn Reading gleich errors und value vorhanden\
} \
elsif ($read eq 'errors' && !$val) {\
fhem "set Pushover.Nachricht msg '$alias Fehler' 'erledigt';; \
set NTFY message Title=\"$alias Fehler\" erledigt"\
# true wenn Reading gleich errors und value nicht vorhanden\
}\
elsif ($read =~ m/temperature/ && $val && $val >= 40) {\
$read =~ s/_/ /;;\
$read =~ s/_/ /;;\
fhem "set Pushover.Nachricht msg '$alias Temperatur' '$read $val°C';;\
set NTFY message Title=\"$alias Temperatur\" $read $val°C"}}
Das positive ist, das notify triggert und erzeugt keine Fehlereinträge in der log-Datei.
Negativ ist, dass der Ausführungsanteil nicht ausgeführt wird. Ich hab's dadurch getestet, dass ich die Temperaturabfrage auf <= 40 statt >= 40 versuchsweise umgestellt hab. Aber auch ein leeres "errors" Reading führt nicht zur Ausführung des notify, obwohl ein Event vorliegt und das notify triggert.
Ich hab keine Idee, woran das liegen könnte. Hast du noch eine Idee?
Viele Grüße Gisbert
Eine Idee habe ich aktuell nicht.
Aber man kann ja Zwischenausgaben mit einbauen, meist liegt es an anderen ankommenden Daten als mit denen man rechnet.
Baue doch mal vor dem ersten "if" folgendes ein:
Debug "reading=$read value=$val";Dann lass mal auslösen und schaue was im Log ankommt.
Kommt das Reading in der gewünschten Form heraus? Und auch der Wert?
Gruß
Dan
Hallo Dan,
ich hab weiter experimentiert. Wenn ich die Funktion chop weglasse und mit
$read =~ m/errors/ bzw.
$read =~ m/temperature/abfrage, dann erhalte ich die Nachrichten wie erwartet - und auch mit der jeweiligen richtigen Formatierung.
Offensichtlich macht chop in diesem Zusammenhang etwas anderes als beabsichtigt.
Hier nochmals meine finale Definition, gerne kommentieren, falls dir noch was auffällt.
defmod JK_BMS.notify notify JK_BMS:(errors|power_tube_temperature|temperature_sensor_1|temperature_sensor_2):.* {\
my $alias = AttrVal($NAME,'alias','');;\
my @evt = split(' ',$EVENT);;\
my $read = $evt[0];;\
my $val = $evt[1];;\
if ($read =~ m/errors/ && $val) {\
fhem "set Pushover.Nachricht msg '$alias Fehler' '$EVENT';;\
set NTFY message Title=\"$alias Fehler\" $EVENT"\
} \
elsif ($read =~ m/errors/ && !$val) {\
fhem "set Pushover.Nachricht msg '$alias Fehler' '$read erledigt';; \
set NTFY message Title=\"$alias Fehler\" $read erledigt"\
}\
elsif ($read =~ m/temperature/ && $val && $val >= 40) {\
$read =~ s/_/ /;;\
$read =~ s/_/ /;;\
fhem "set Pushover.Nachricht msg '$alias Temperatur' '$read $val°C';;\
set NTFY message Title=\"$alias Temperatur\" $read $val°C"}}
Viele Grüße Gisbert
Hast du denn die Debug Ausgabe mal eingebaut? Dann wüßten wir doch was draus gemacht wird!
Eigentlich ist das chop nur da um das letzte Zeichen (Doppelpunkt erwartet) wegzukürzen.
Aber mir fällt gerade ein dass ich da glaube schon mal drauf reingefallen bin!
Teste mal so, das sollte klappen:
my $alias = AttrVal($NAME,'alias','');;\
my @evt = split(' ',$EVENT);;\
my $read = $evt[0];;\
chop $read;;\
my $val = defined $evt[1] ? $evt[1] : undef;;\
if ($read eq 'errors' && defined $val)
Hab hier noch Prüfung auf defined eingebaut weil Prüfung auf $val auch false ist wenn 0 ist.
Gruß
Dan
Hallo Dan,
vielen Dank für deine Unterstützung, ohne die ich mein Vorhaben nicht hätte umsetzen können.
Da der Inhalt des Readings zwar leer, aber nie 0 sein kann, benötige ich die Überprüfung mit defined nicht.
Viele Grüße Gisbert