FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: Gisbert am 08 Oktober 2025, 19:13:13

Titel: [gelöst] Verwendung von $yday in userReadings
Beitrag von: Gisbert am 08 Oktober 2025, 19:13:13
Hallo zusammen,

ich bin gerade bei der Definition eines UserReadings über einen Fehler gestolpert, den ich so nicht erwartet hätte.

summer {if (80 <= $yday <= 264) {"yes"} else {"no"}}
Fehlermeldung im Logfile:
Error evaluating <Device> userReading summer: Global symbol "$yday" requires explicit package name (did you forget to declare "my $yday"?) at (eval 54967821) line 1.
Gebe ich jedoch
{if (80 <= $yday <= 264) {"yes"} else {"no"}}in der Fhem-Kommandozeile ein, bekomme ich die erwartete Antwort no.

Warum kommt es zu diesem Verhalten?

Viele Grüße Gisbert
Titel: Aw: UserReadings
Beitrag von: betateilchen am 08 Oktober 2025, 19:44:38
Weil es in FHEM "spezielle" Variablen gibt, die nur in der Befehlszeile zur Verfügung stehen, aber nicht FHEM-systemweit. Dazu gehört z.B. auch $hms oder $today.
Du kannst diese Variablen in "onelinern" verwenden, die direkt über die Befehlszeile eingegeben werden, z.B. um notify mit perl Code anzulegen.

Wenn Du diese Variablen in eigenem Code verwenden möchtest, musst Du sie Dir selbst erzeugen oder beispielsweise beim Aufruf von Funktionen der 99_myUtils.pm als Parameter übergeben.
Titel: Aw: UserReadings
Beitrag von: Gisbert am 09 Oktober 2025, 08:00:03
Hallo betateilchen,

ich konnte deinen Vorschlag umsetzen.

In 99_myUtils.pm habe ich folgendes definiert:
## summer = 20. März bis 21. September
## siehe zur Methodik: http://forum.fhem.de/index.php/topic,34363.msg266811.html#msg266811
sub summer {
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  if (79 <= $yday <= 264) {1} else {0};
  }

Damit kann ich in einem DOIF die sub summer oder !summer (für Winter) als Bedingung verwenden. Das Hilfskonstrukt über ein userReading ist damit überflüssig.

Viele Grüße Gisbert