vorschlag: erweiterung EvalSpecials/ReplaceSetMagic um devspec device namen

Begonnen von justme1968, 30 August 2016, 00:24:54

Vorheriges Thema - Nächstes Thema

justme1968

durch den thread hier: https://forum.fhem.de/index.php/topic,57174.msg485762.html#msg485762 ist aufgefallen das es aktuell keine möglichkeit gibt in im auführungsteil eines set den namen des device herauszufinden für den das set gerade ausgeführt wird. das wäre besonders im falle einer devspec angabe nützlich die mehr als ein device betrifft.

mit folgendem kleinen patch wird diese möglichkeit eingebaut:--- fhem.pl (revision 12086)
+++ fhem.pl (working copy)
@@ -1625,6 +1625,8 @@
   my @rets;
   foreach my $sdev (devspec2array($a[0], $cl)) {

+    $evalSpecials->{'%DEV'} = $sdev;
+
     $a[0] = $sdev;
     $defs{$sdev}->{CL} = $cl if($defs{$sdev});
     my $ret = DoSet(@a);


getestet mir direktem aufruf des set und auch aus einem notify. wo könnte es nebenwirkungen geben?

das ganze funktioniert nur für die {(...)} variante nicht für die [device:reading] variante. für letzteres ist mir noch keine elegante lösung eingefallen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Habs eingebaut, und dabei noch auf $evalSpecials geprueft, da es nicht immer gesetzt ist.

Bemerkungen:
- das Feature macht nur in einem notify oder cmdalias Sinn, sonst ist evalSpecials nicht gesetzt, und man kriegt haessliche Fehlermeldungen ala "Global symbol "$DEV" requires explicit package name". Leider sieht man nicht mal die ganze Fehlermeldung, das muessten wir noch fixen.
- ich wollte eigentlich NAME verwenden, das ist aber mit dem Namen des triggers belegt.

justme1968

ja NAME geht nicht will es vom notify selber schon verwendet wird.

es geht auch ausserhalb vom notify mit einem reinen set wie z.b. set A|B {($DEV)}.

wenn $evalSpecials nicht gesetzt ist wird es ja durch die zuweisung gesetzt. d.h. innerhalb des notify gibt es $DEV zusätzlich zu den specials des notify und ausserhalb gibt es nur $DEV. das ist zumindest bei meiner perl version hier der fall.

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

sehe gerade du hast eine zusätzliche prüfung für $evalSpecials eingebaut. die war absichtlich nicht drin. siehe oben...
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Ok, wieder was gelernt. Perl 5.16, 5.20 und 5.24 hat damit kein Problem, hoffentlich machen das aeltere perl Versionen auch mit.
Habe die Pruefung entfernt und eingecheckt.

justme1968

für ältere perl versionen könnte man bei nicht gesetztem $evalSpecials die zuweisung über $evalSpecials = { '%DEV' => ...} machen. ich habe nur kein alter perl zum testen da.

die beschreibung von $DEV in der commandref müsste noch angepasst werden oder?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

hab gerade noch ein perl 5.8.3 gefunden. damit geht es auch.

dann bleibt nur die doku oder ?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig