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]):.*