Hi,
ich habe mich durch das Forum gelesen und würde gerne devspec2array nutzen. Die Überlegung ist, bei einer gewissen Statusänderung (z.B.: Licht) mittels Notify und der devspec2array in einem structure ein Reading einzufügen, dass die Anzahl der eingeschalteten Lichter enthält.
Konkret
define nt_Licht .*Licht.* {
my $AnzahlLichtAn = devspec2array("NAME=.*Licht.*:FILTER=state=on")}
$AnzahlLichtAn würde ich dann als Reading in das Structure schreiben. Meine Frage ist nun, wie kann ich den Status 0 Lampen (Licht) an von 1 Lampe (Licht) an unterscheiden. Das Array devspec2array wird, wie üblich bei 0 beginnend gefüllt => gibt also 0 zurück, was in "normaler" Zählart 1 entspricht. Wenn das Array nicht gefüllt wird, gibt es ebenfalls eine 0 zurück, was in "normaler" Zählart 0 entspricht. Ist auch so im Wiki beschrieben https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array)
Muss ich also, um 0 und 1 zu unterscheiden, ein Script nutzen? (z.B.: https://forum.fhem.de/index.php?topic=72547.0 (https://forum.fhem.de/index.php?topic=72547.0))
Gruß Mundus
Ich kann das nicht ganz nicht ganz nachvollziehen.
bei mir gibt:
{my $test=devspec2array("unbekanntes device")}
"unbekanntes device" zurück, dagegen gibt:
{my $test=devspec2array("TYPE=logProxy")}
den Wert "1" zurück.
also, wie in der Doku beschrieben: Nicht gefunden gibt den Übergabewert zurück, ansonsten kommt ein Array (bzw. die Anzahl der Elemente wg. scalar)
Du kannst folgende benutzen:
{my @a=devspec2array("xxx");; my $count=($defs{$a[0]} && $#a+1 || 0)}
Dann hast du in $count die Anzahl der gefundenen Devices. 0 wenn keins gefunden wurde.
Ich musste mir jetzt nochmal die Funktion im Code anschauen weil ich es auch nicht ganz verstanden habe muss ich sagen. Ich glaube der CODE oben ist nicht notwendig, denn wie KernSani schon gesagt hat, steht eigentlich die Anzahl der gefundenen schon in der Variable (scalar).
Das liegt daran weil ein Array im Scalaren Kontext die Anzahl der Elemente ausgibt. Also auch 0 wenn keine gefunden werden. Und nicht die Position des Elements im Array.
Eine Besonderheit gibt es aber noch. Wenn man ein Device direkt eingibt wird der Text ausgegeben wie wenn man ein unbekanntes Device eingegeben hätte. Das mit der Anzahl geht nur wenn du das Device nicht direkt ansprichst.
Gruß
Ich habe jetzt nochmal mit exakt deiner devspec getestet (meine Lichter heissen auch alle .*Licht ;-)) Und ich bekomme 0, wenn alles aus ist, 1 wenn eines an ist etc...