Merkwürdige Seiteneffekte bei Nutzung des Variablennamens $source

Begonnen von olwaldi, 27 August 2026, 16:30:33

Vorheriges Thema - Nächstes Thema

olwaldi

Bastel gerade daran, Software-Abhängigkeiten in meinen Skripten von meiner alten Logitech Harmony zu entfernen, um irgendwann auf eine Sofabaton U3 umsteigen zu können. Dazu habe ich einige meiner Routinen in 99_myUtils.pm geändert, und dann nach einem Neuladen ganz merkwürdige mir unerklärliche Fehlermeldungen bekommen. Z.B. waren scheinbar noch alte Routinen aktiv, oder Variablen-Werte waren je nach Codestelle mal verfügbar, mal nicht.

Ich habe sehr lange experimentiert, woran es liegen könnte. Die Ursache war, daß ich in meinen Routinen die lokal Variable namens $source (oder auch $target) verwendet habe. Alle Merkwürdigkeiten sind verschwunden, nachdem ich $source in $avsource umbenannt habe. $source wird wohl intern von notify verwendet.

Sicherheitshalber habe ich fhem auch mal neu gestartet, um ganz sicherzugehen, daß "Reste" meiner alten Routinen jetzt weg sind.

Ich nutze aber auch noch andere Variablennamen, die "kritisch" sein könnten, z.B. $event (da ist wohl nur $EVENT benutzt).

Grüßle, Michael

Guybrush

wenn du innerhalb eines Blocks eigene Variablen nutzen willst, die auch global definiert sind, dann müsstest du den block mit {} klammern und dort die variable über my $variable definieren. dann gelten die Variablen nur innerhalb dieses Blocks und außerhalb wieder die global definierten. Meinst du das?

olwaldi

Ja, so habe ich's gemacht. Aber trotzdem scheint das "lokale" $source Seiteneffekte zu haben.
sub Test($) {
  my $source = "...";
  ...
};
Die sub Test wird von einem notify aufgerufen. Wenn ich das lokale $source in $avsource umbenenne, verschwinden die Merkwürdigkeiten (kann aber auch Zufall gewesen sein).

Vielleicht hängt das auch mit einem anderen Problem zusammen. In meiner sub soll eine Aktivität zeitverzögert ausgelöst werden. Das mache ich so
fhem("sleep 10; set something on");Ich hatte bislang geglaubt, daß obiger Code fhem NICHT blockiert und direkt weiterläuft. Scheint aber nicht so zu sein. Vermutlich muß ich das mit einem at lösen, richtig? Schließlich soll mein Code ohne zu Warten weiterlaufen.

Grüßle, Michael


Otto123

Zitat von: olwaldi am 30 August 2026, 17:57:19Ich hatte bislang geglaubt, daß obiger Code fhem NICHT blockiert und direkt weiterläuft. Scheint aber nicht so zu sein. Vermutlich muß ich das mit einem at lösen, richtig? Schließlich soll mein Code ohne zu Warten weiterlaufen.
Wenn das so wäre, würde etwas im Log stehen, siehe help sleep:
ZitatBemerkung: falls sleep von keinem Befehl gefolgt wird, dann wird FHEM blockiert. Das ist unerwünscht, und im FHEM-Log wird eine Warnung protokolliert.
Ein FHEM sleep gefolgt von einem Befehl erzeugt mW von der Sache her intern ein at ...

Es ist schwierig zu beurteilen, da nur ein Teil des Codes hier steht.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)