Abfrage des Devicenamens in einer ForEach-Schleife

Begonnen von Marko1976, 03 September 2025, 18:55:44

Vorheriges Thema - Nächstes Thema

Marko1976

Hallo, ich frage mit "foreach my $batteryName (devspec2array("group=Batteriebetrieb"))" alle Geräte mit Batterien ab und würde innerhalb der Schleife gerne für jedes Gerät einige Readings wie zb den alias abfragen und in eine Variable schreiben.

Leider kenne ich mich mit Perl nicht wirklich aus. Theoretischh würde das ja mit ReadingsVal funktionieren, aber mir fehlt der Trigger um das Device anzusprechen.

Kann mir da jamand bitte helfen?

betateilchen

Der Name des device steht doch in $batteryName?

ReadingsVal($batterName,"battery","?")
sollte Dir innerhalb der Schleife den Wert des readings "battery" aus dem jeweiligen device liefern.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Hallo,

ergänzend...

ZitatTheoretischh würde das ja mit ReadingsVal funktionieren,...

Nee, um Attribute abzufragen gibts die Funktion AttrVal('devicename','attributname','ersatzwert')


Marko1976

Zitat von: betateilchen am 03 September 2025, 19:21:54Der Name des device steht doch in $batteryName?
Offenbar nicht, denn in meinem Code habe ich es schon mit
if (ReadingsVal($batteryName, "batteryState", "ok") ne "ok") {$batterys++;} {my $devicename = $devicename.", ".$batteryName;} {fhem("setreading batterymonitoring devicename $devicename");}probiert, den Inhalt von batteryName in der Variable deviceName aneinander zu reihen und dann in ein Reading zu schreiben. Doch leider kommt immer nur 0 raus.

Zitat von: TomLee am 03 September 2025, 19:35:16Nee, um Attribute abzufragen gibts die Funktion AttrVal('devicename','attributname','ersatzwert')
Wieso Attribut, es geht hier doch nur um Readings?

betateilchen

Zitat von: Marko1976 am 03 September 2025, 22:43:40Wieso Attribut, es geht hier doch nur um Readings?

Nein.

Zitat von: Marko1976 am 03 September 2025, 18:55:44würde innerhalb der Schleife gerne für jedes Gerät einige Readings wie zb den alias abfragen

Der alias ist normalerweise ein Attribut und eben kein reading.

Schreib doch in die Schleife einfach mal nur "Debug $batteryName;" und schau danach ins Logfile, ob Dein array überhaupt funktioniert.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Marko1976

Zitat von: betateilchen am 04 September 2025, 07:59:25Wieso Attribut, es geht hier doch nur um Readings
Ok, ja, ich meinte, dass ich es in ein Reading schreiben will nicht in ein Attribut.

Die Rückgave des Debug sieht so aus:
2025-09-04 10:51:28.321 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.324 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.327 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.330 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.333 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.336 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.339 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.342 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.344 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.346 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.349 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.352 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.354 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.357 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.361 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.364 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.367 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.370 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.374 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.377 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.380 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.384 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.387 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.390 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.393 DOIF batterymonitoring devicename: 0
2025-09-04 10:51:28.396 DOIF batterymonitoring devicename: 0
Es wird für jedes Gerät offenbar nichts, also Null, zurückgegeben. Warum im Eventlog jetzt meine Variable (deviceNAme) stehtstatt des batteryName ist mir allerdings schleierhaft.

Die ganze Funktion lautet:
sub numberOfBattery() {
my $batterys = 0;
my $devicename = 0;
foreach my $batteryName (devspec2array("group=Batteriebetrieb")) {
if (ReadingsVal($batteryName, "batteryState", "ok") ne "ok") {$batterys++;} {Debug $batteryName;} {my $devicename = $devicename.", ".$batteryName;} {fhem("setreading batterymonitoring devicename $devicename");}
}
return $batterys;
}
Also zuerst werden die beiden Variablen inizialisiert und auf 0 gesetzt,
dann wird die Schleife gestartet und für jeden Gerät in der Gruppe "Batteriebetrieb" durchlaufen,
im Durchlauf wird für jeden Device abgefragt ob das Reading batteryState nicht "ok" ist und falls dies zutrifft wird die Variable $batterys hochgezählt und die Variable $batteryName an die Variable $deviceName angehangen und zu guter letzt die Variable dann in das Reading devicename des Benachrichtigungs-Device geschrieben.
Oder habe ich da einen Interpretationsfehler im Code? Macht es einen Unterschied ob ich  die Variable $deviceName am Anfang auf 0 setze? Wäre es besser sie auf "" zu setzen?

Marko1976

#6
Ich ahbe die Sub jetzt folgendermaßen abgeändert, da die geschwungenen Klammern ja nicht richtig sind:
sub numberOfBattery() {
    my $batterys = 0;
    my $deviceList = 0;
    my $Name = 0;
    foreach my $batteryName (devspec2array("group=Batteriebetrieb")) {
        if (ReadingsVal($batteryName, "batteryState", "ok") ne "ok") {
            $batterys++;
            Debug $batteryName;
            my $Name = ReadingsVal($batteryName, "batteryLabel", "");
            Debug $Name;
            my $deviceList = $Name.", ".$Name;
            fhem("setreading batterymonitoring DeviceList $deviceList");
        }
    }
    return $batterys;
    }
Die beiden Dubugs geben im Eventmonitor nichts zurück und der fhem-Befehl erzeugt auch nicht das Reading im Benachrichtigungsdevice. Die Variable $batteries wird aber richtig gezählt.

Ich komme mit Perl zwar nicht sonderlich klar, aber so sollte es doch funktionieren. Ich verstehe es nicht.

TomLee

Gibts denn derzeit überhaupt Devices deren Reading batteryState nicht ok ist? Nur dann wird der if-Zweig ja ausgeführt.

Marko1976


TomLee

Wenn Du mal ganz von vorne anfängst, erfolgt dann die Debugausgabe?
sub numberOfBattery() {
    foreach my $batteryName (devspec2array("group=Batteriebetrieb")) {
    Debug $batteryName;
    }
    }