[gelöst] For-Schleife - .forEach

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Benutzeravatar
Florian.Reinartz
Beiträge: 117
Registriert: 11. Apr 2022 08:47
Answers: 0
Wohnort: bei Schwerin

[gelöst] For-Schleife - .forEach

Beitrag von Florian.Reinartz »

Moin Zusammen,
ich habe einige Schleifen angelegt um z.B. den Batterie-Status meiner Homatic-Geräte zu überwachen.
Dazu habe ich das Batterie-Item aller Geräte in die Gruppe >gBatterien< gelegt.
Die Schleife prüft nun ob ein Itewm dieser Gruppe auf ON steht und benachrichtigt michb dann mittels sendNotification.
Alles funktioniert sowei ganz gut aber ich bekomme meine Schleife in Visual Studio immer als fehlerhaft angezeigt.

Code: Alles auswählen

//-------------------------- Batterien ------------------------
rule "Batteriebetriebene Geräte überwachen. Geräte müssen der Gruppe 'gBatterien' zugeordnet sein"
    when
        Member of gBatterien changed
    then
        var Integer z = 0
        var Integer i = 0
        var String s = ''
        gBatterien?.members.forEach
        [i |
            if (i.state == ON )
            {
                s = s + "\n" + i.name
                z ++
                sendNotification("meine_email@mailaccount.de",
                "Batterie leer!\n" + transform("MAP", "batterie.map", i.name.toString))
            }       
        ]
        if (z > 0)
        {
            sendCommand(Batterien_Sammelmeldung,ON)
        }
        if (z == 0)
        {
            sendCommand(Batterien_Sammelmeldung,OFF)
        }
end
Folgendes zeigt Visual Studio an:

var Integer i = 0 -> The value of the local variable i is not used
[i | -> Duplicate local variable i
s = s + "\n" + i.name -> Cannot refer to the non-final variable s inside a lambda expression
z ++ -> Cannot refer to the non-final variable z inside a lambda expression

Die erste Meldung bekomme ich weg wenn ich die Zeile weg lasse in der ich i definiere. Vermutlich wird i nach der eckigen Klammer noch mal definiert.
Aber bei den anderen, roten Meldungen bin ich mir unsicher ob da tatsächlich etwas falsch ist.

Danke und Gruß
Florian
Zuletzt geändert von Florian.Reinartz am 17. Mär 2025 20:15, insgesamt 1-mal geändert.
openHAB 4.3.4 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

nw378
Beiträge: 295
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: For-Schleife - .forEach

Beitrag von nw378 »

Du kannst die Zeile

Code: Alles auswählen

 var Integer i = 0
löschen. i ist ja das jeweilige Element (Item) der Gruppe. Als Integer wird es nicht benötigt. Das sagt VSC ja auch: "local variable i is not used".

s und z:

Du musst diese beiden Variablen als global deklarieren, also in der .rules Datei ganz oben vor der ersten Rule.

Code: Alles auswählen

var Integer z = 0
var String s = ''

rule "Batteriebetriebene Geräte überwachen. Geräte müssen der Gruppe 'gBatterien' zugeordnet sein"
    when
        Member of gBatterien changed
    then
        z = 0  // Zurücksetzen auf 0
 ...
Übrigens nutzt Du "s" auch nicht weiter...? Außer dem s = ... sehe ich es nicht in dem Code. Könntest Du dann auch ganz löschen.

PS 2: Hat sich da ein ? in gBatterien?.members.forEach eingeschlichen?
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Benutzeravatar
Florian.Reinartz
Beiträge: 117
Registriert: 11. Apr 2022 08:47
Answers: 0
Wohnort: bei Schwerin

Re: For-Schleife - .forEach

Beitrag von Florian.Reinartz »

ahhhhhhh...
Global :lol: Da hätte ich ja auch drauf kommen können.
Vielen Dank.
Das ist eine CopyPast-Waise aus einer anderen Schleife. Da nutze ich es noch.

Und wenn ich in einer *.rules drei dieser Schleifen laufen habe. Muss ich dann für jede der Schleifen eigene Variablen anlegen?

Vom logischen her muss ich für jede Schleife eine eigene Variable definieren...
Habe ich jetzt einfach gemacht ;-)
openHAB 4.3.4 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

nw378
Beiträge: 295
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: For-Schleife - .forEach

Beitrag von nw378 »

Ja, genau. Sinnvollerweise für jede rule eigene (globale) Variablen.

Da sie eben global sind, kann es sein, dass die eine Regel der Variablen einen Wert zuweist, und gleichzeitig eine andere Regel mit „falschen“ Werten weiterrechnet.

Und soviel kosten die ja auch nicht… :lol:
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Benutzeravatar
Florian.Reinartz
Beiträge: 117
Registriert: 11. Apr 2022 08:47
Answers: 0
Wohnort: bei Schwerin

Re: [gelöst] For-Schleife - .forEach

Beitrag von Florian.Reinartz »

Perfekt, Danke für die Unterstützung
openHAB 4.3.4 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Benutzeravatar
udo1toni
Beiträge: 15240
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: [gelöst] For-Schleife - .forEach

Beitrag von udo1toni »

Mit der aktuellen stable Version sollte der privateCache auch in der DSL zur Verfügung stehen. Damit müssten die Variablen nicht global definiert werden.
Ich hab's aber bisher nicht ausprobiert. In einer älteren Version (4.2?) funktionierte der privateCache nicht in der DSL.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten