FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: Marko1976 am 03 September 2025, 18:55:44

Titel: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: Marko1976 am 03 September 2025, 18:55:44
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?
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: betateilchen am 03 September 2025, 19:21:54
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.
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: TomLee am 03 September 2025, 19:35:16
Hallo,

ergänzend...

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

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

Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: Marko1976 am 03 September 2025, 22:43:40
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?
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: betateilchen am 04 September 2025, 07:59:25
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.
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: Marko1976 am 04 September 2025, 11:06:03
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?
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: Marko1976 am 04 September 2025, 11:30:47
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.
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: TomLee am 04 September 2025, 12:02:28
Gibts denn derzeit überhaupt Devices deren Reading batteryState nicht ok ist? Nur dann wird der if-Zweig ja ausgeführt.
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: Marko1976 am 04 September 2025, 12:28:44
Ja, ein Device hat ein low.
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: TomLee am 04 September 2025, 12:45:59
Wenn Du mal ganz von vorne anfängst, erfolgt dann die Debugausgabe?
sub numberOfBattery() {
    foreach my $batteryName (devspec2array("group=Batteriebetrieb")) {
    Debug $batteryName;
    }
    }
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: Marko1976 am 04 September 2025, 16:15:42
funktioniert nicht, weil er eine globale declaration verlang.
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: Marko1976 am 04 September 2025, 16:24:12
Habs jetzt fehlerfrei hinbekommen, aber der debug gibt gar nichts zurück.
Wenn ich die Sub mit {numberOfBattery} aufrufe wird im Eventmonitor nichts zurückgegeben
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: Marko1976 am 04 September 2025, 16:33:26
So, es läuft!
Habe den Code noch mal komplett neu eingegeben und jetzt wird wie gewünscht die Summe hochgezählt und eine Liste des benannten Readings (nicht alias) in das benachrichtigungsdevice geschrieben und dort weiterverarbeitet.

Hier der Code aus der 99_myUtils:
sub numberOfBattery() {
my $batterys = 0;
my $deviceList = "";
foreach my $batteryName (devspec2array("group=Batteriebetrieb")) {
if (ReadingsVal($batteryName, "batteryState", "ok") ne "ok") {
$batterys++;
my $Name = ReadingsVal($batteryName, "batteryLabel", "");
my $deviceList = $deviceList." ".$Name;
fhem("setreading batterymonitoring DeviceList $deviceList");
}
}
return $batterys;
}

Eigentlich genauso wie schon mal gepostet, doch da hatte er nicht funktioniert. Man muss halt nicht alles verstehen.
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: betateilchen am 04 September 2025, 17:09:54
Zitat von: Marko1976 am 04 September 2025, 16:24:12aber der debug gibt gar nichts zurück.

Debug() gibt auch nix zurück, sondern schreibt einen Eintrag ins FHEM-Logfile.
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: Marko1976 am 04 September 2025, 19:00:44
Ins Fhem-Logfile wird bei mir schon seit ewigkeiten nichts mehr reingeschrieben - warum weiß ich nicht.
Kann daher nur den Eventmonitor nutzen, der ja das gleiche wie das Logfile aufzeigt mit dem Unterschied, dass es nur eine aktuelle Session gibt und man nichts speichern kann - soweit ich weiß.

Mit zurückgeben meine ich aber eben, dass nichts im EventMonitor aufgelistet wird.
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: betateilchen am 04 September 2025, 19:26:31
Event-Monitor und das Standard Logfile sind bei weitem nicht gleichzusetzen, weder vom Inhalt noch von der Funktion.

Debug() ist der Aufruf einer perl-Funktion in FHEM und hat nichts mit einem event zu tun. Deshalb taucht der Aufruf logischerweise nicht im Event-Monitor auf.

Warum legst Du das Logfile als device nicht einfach neu an, wenn es bei Dir nicht (mehr) funktioniert?

defmod Logfile FileLog ./log/fhem-%d.log Logfile
Titel: Aw: Abfrage des Devicenamens in einer ForEach-Schleife
Beitrag von: Prof. Dr. Peter Henning am 05 September 2025, 03:34:03
Zitat von: Marko1976 am 04 September 2025, 19:00:44Ins Fhem-Logfile wird bei mir schon seit ewigkeiten nichts mehr reingeschrieben - warum weiß ich nicht.
Ich schlage vor, zunächst einmal dieses Problem zu lösen. Das ist essenziell für alle weiteren Schritte in FHEM.

Und bitte endlich die Anfänger-Dokumentation lesen.

pah