[Gelöst] Leeres Reading in einem notify

Begonnen von Gisbert, 19 Februar 2026, 21:42:22

Vorheriges Thema - Nächstes Thema

Gisbert

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
Proxmox | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome | Panasonic Heishamon

frober

if !$EVENT
Sofern $EVENT wirklich leer ist.
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Beta-User

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.
Server: HP-elitedesk@Debian 13, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Gisbert

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
Proxmox | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome | Panasonic Heishamon

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
Proxmox | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome | Panasonic Heishamon

DeeSPe

#6
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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

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 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]):.*
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Gisbert

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
Proxmox | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome | Panasonic Heishamon

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Gisbert

#11
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
Proxmox | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome | Panasonic Heishamon

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe