[gelöst] DOIF und calendar: Bedingung mit defined() wird immer true

Begonnen von rob, 30 Juni 2022, 20:06:30

Vorheriges Thema - Nächstes Thema

rob

Hallo.

Mein Problemchen lässt sich schon ganz gut einkreisen. Wenn ich jedoch nur das reinschreibe, wo es bei mir hakt, kann das keiner richtig nachvollziehen. Zum Nachvollziehen muss ich also etwas ausholen. Seht mir das bitte nach :)

Kurz:
- hab seit > 2 Jahren einen Abfallkalender und ein DOIF im Einsatz, das mir per Telegram sagt, welche Tonne dran ist
- nie Probleme gehabt
- auf einmal* (s. Lang) wird die enthaltene Bedingung defined() immer true, sodass der True-Teil ausgeführt wird und ich eine rudimentäre Nachricht in Telegram bekomme, obwohl kein Abfuhrtermin ansteht
list vom DOIF:

define doif_MuellKalender DOIF (([10:00] or [17:40]) and defined(my $CalMessage=fhem('get myCalender events format:custom="$T1 - $T2" limit:when=tomorrow')) )\
(\
{\
my $CalMessage=fhem('get myCalender events format:custom="$S \($T1\)" limit:when=tomorrow');;\
fhem("set HomeBot msg 📢 Morgen $CalMessage 🚛")\
}\
)
attr doif_MuellKalender do always
attr doif_MuellKalender group AbfallKalender
attr doif_MuellKalender loglevel 0
attr doif_MuellKalender room 24_Hof_Garten
attr doif_MuellKalender verbose 0

setstate doif_MuellKalender cmd_1
setstate doif_MuellKalender 2022-06-30 17:40:00 cmd 1
setstate doif_MuellKalender 2022-06-30 17:40:00 cmd_event timer_2
setstate doif_MuellKalender 2022-06-30 17:40:00 cmd_nr 1
setstate doif_MuellKalender 2022-06-30 17:39:34 mode enabled
setstate doif_MuellKalender 2022-06-30 17:40:00 state cmd_1
setstate doif_MuellKalender 2022-06-30 17:39:34 timer_01_c01 01.07.2022 10:00:00
setstate doif_MuellKalender 2022-06-30 17:40:00 timer_02_c01 01.07.2022 17:40:00


lt. Log:

2022.06.30 17:40:00 3: get myCalender events format:custom="$T1 - $T2" limit:when=tomorrow : 02.07.2022 - 03.07.2022
2022.06.30 17:40:00 1: PERL WARNING: Use of uninitialized value $CalMessage in concatenation (.) or string at (eval 2101) line 1.
2022.06.30 17:40:00 3: eval: { my $CalMessage=fhem('get myCalender events format:custom="$S \($T1\)" limit:when=tomorrow'); fhem("set HomeBot msg 📢 Morgen $CalMessage 🚛")


- die Abfrage "defined(my $CalMessage=fhem('get myCalender events format:custom="$T1 - $T2" limit:when=tomorrow'))" gibt also true zurück, weil 'get myCalender events format:custom="$T1 - $T2" limit:when=tomorrow = 02.07.2022 - 03.07.2022' ergibt
- im ausgeführten True-Teil erfolgt ja fast die selbe Abfrage nocheinmal und gibt dort korrekterweise keinen Wert zurück --> deshalb steht auch im Log "PERL WARNING: Use of uninitialized value..."
- das Phänomen scheint nur unter Bullseye bei mir aufzutreten - kann es mir aber nicht erklären

Hat jemand eine Idee?

Vielen Dank und beste Grüße
rob



Lang:
Möchte mein System nach Bullseye bringen und perspektivisch dauerhaft in Docker laufen haben.

* auf einmal heißt in diesem Fall folgendes:
- mein produktives System auf SSD läuft unter Stretch
- habe ein Backup gemacht, meine SSD abgestöpselt, das Backup v. produktiven Sys auf eine Test-HDD geklont und die HDD angestöpselt --> FHEM startet ohne muh und mäh
- dann upgrade nach Buster --> problemlos
- dann upgrade nach Bullseye --> problemlos
- dann FHEM gestoppt, mitmigrierte Test-Config von /opt/fhem in einen anderen Pfad kopiert, Docker gestartet und kopierte Config hineingereicht --> läuft problemlos

Weil Docker direkt problemlos lief, habe ich dann testweise alles mehrere Tage laufen lassen. Nur mein oben beschriebenes DOIF will meine Geduld prüfen :)
Hab das DOIF kurzerhand zum Perl-Mode umgeschrieben zum Testen:

block_one {
if ([10:00] or [18:27]) {
  my $CalMessage='';
  $CalMessage=fhem('get myCalender events format:custom="$S \($T1\)" limit:when=tomorrow');
  if (defined($CalMessage)) {
    fhem("set HomeBot msg 📢 Morgen $CalMessage 🚛");
Log 1, "calevt muellcal was '$CalMessage'";

  }
}
}

Log sagt:

2022.06.30 18:27:00 3: get myCalender events format:custom="$S \($T1\)" limit:when=tomorrow : Abfuhr: Altpapier Vereine (02.07.2022)
2022.06.30 18:27:00 1: calevt muellcal was 'Abfuhr: Altpapier Vereine (02.07.2022


- wird also auch so herum wieder true und in Telegram kommt die volle Nachricht
- ich dachte, na gut spinnt also mein calendar --> also Perl in ein Userreadings direkt im Calendar-Device gepackt, um zu sehen was es dort tut:
attr myCalender userReadings mytestreading {my $hupe='_'.fhem('get myCalender events format:custom="$T1 - $T2" limit:when=tomorrow');; $hupe}

- dort kommt "_" als Reading und das ist auch korrekt; häh?
- also dachte ich mir OK, dann lass ich mal testweise das DOIF das Userreading abfragen:

block_one {
if ([10:00] or [18:56]) {
  my $CalMessage='';
  $CalMessage=fhem('get myCalender events format:custom="$S \($T1\)" limit:when=tomorrow');
  if (ReadingsVal('myCalender','mytestreading','') ne '_') {
    fhem("set HomeBot msg 📢 Morgen $CalMessage 🚛");
Log 1, "calevt muellcal was '$CalMessage'";

  }
}
}

laut LOG
2022.06.30 18:56:00 3: get myCalender events format:custom="$S \($T1\)" limit:when=tomorrow : Abfuhr: Altpapier Vereine (02.07.2022)
- nun wird der True-Teil nicht ausgeführt und es kommt auch nix in Telegram (lediglich das LOG 3 ist immer kurios, da alle beteiligten Devices verbose=0 haben - soll hier aber nicht ablenken) --> passt

- dachte mir, OK liegts ggf. am Docker
- Docker gestoppt, lokales FHEM gestartet und Versuche wiederholt --> alles gleich wie im Docker
- OS ist gleichermaßen Bullseye und FHEM jeweils aktuell
- also Test-Sys gestoppt, HDD weg, produktive SSD wieder dran --> keinerlei Problem, alles wie früher; häh?
- dann aufm Laptop vorhandenes unkonfiguriertes Test-FHEM in Docker gestartet (Buster), beteiligte Devices angelegt --> keinerlei Probleme
- gestoppt, Image entfernt und latest neu geholt (Bullseye), Devices wieder angelegt --> Problem reproduzierbar

Es scheint also weder an den Docker Images zu liegen, noch an meiner migrierten produktiven Config und auch nicht unter Stretch oder Buster aufzutauchen.
Einzig unter Bullseye tritt das anscheinend bei mir auf --> egal ob lokal installiertes FHEM oder in Docker

Kurios, oder?


Damian

Die Konstruktion ist für mich ungewöhnlich.

Warum wird hier überhaupt eine Variable definiert?

fhem('get myCalender events format:custom="$T1 - $T2" limit:when=tomorrow')

wird wohl etwas zurückliefern und das muss man abfragen.

also einfach angeben:

defined (fhem('get myCalender events format:custom="$T1 - $T2" limit:when=tomorrow'))

Und wenn es immer defined ist, dann muss man schauen, was da kommt und eben dieses abfragen.



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

rob

Hallo Damian.

Vielen Dank für Deine flinke Rückmeldung und Hilfe  :)

Zitat von: Damian am 30 Juni 2022, 23:10:43
Die Konstruktion ist für mich ungewöhnlich.
...
Warum wird hier überhaupt eine Variable definiert?
Naja, was soll ich dazu schon groß antworten? Weil ich es nicht besser wusste, auf Beschreibungen zu defined() geschaute hatte (z.B. https://de.perlmaven.com/undef-und-defined-in-perl) und ich nicht weiter drüber nachdachte, weil es lief.

Die Bedingung habe ich jetzt natürlich gem. Deiner Info angepasst und getestet. Läuft.
Da habe mich ja schön selber ausgetrickst. Komisch, dass sich mein Fehler bislang nicht offenbaren wollte, aber egal - jetzt passt es.

Vielen Dank und beste Grüße
rob

PS: Soll ich mein überflüssiges Geschreibsel besser entfernen? Dann tun sich künftige Leser ggf. leichter.

Damian

Zitat von: rob am 01 Juli 2022, 08:25:55
Hallo Damian.

Vielen Dank für Deine flinke Rückmeldung und Hilfe  :)
Naja, was soll ich dazu schon groß antworten? Weil ich es nicht besser wusste, auf Beschreibungen zu defined() geschaute hatte (z.B. https://de.perlmaven.com/undef-und-defined-in-perl) und ich nicht weiter drüber nachdachte, weil es lief.

Die Bedingung habe ich jetzt natürlich gem. Deiner Info angepasst und getestet. Läuft.
Da habe mich ja schön selber ausgetrickst. Komisch, dass sich mein Fehler bislang nicht offenbaren wollte, aber egal - jetzt passt es.

Vielen Dank und beste Grüße
rob

PS: Soll ich mein überflüssiges Geschreibsel besser entfernen? Dann tun sich künftige Leser ggf. leichter.

Möglicherweise hat sich in den Perlversionen etwas geändert. Denn eine Variablenzuweisung ist an sich immer wahr, es sei denn der Rückgabewert ist nicht die Zuweisung als solche, sondern der zugewiesene Wert. Ich würde solche Konstruktionen auf jeden Fall meiden.

Ich würde alles so stehen lassen, damit es für andere nachvollziehbar bleibt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF