In rule position erfassen und in variable schreiben

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Mattes
Beiträge: 25
Registriert: 23. Mär 2020 13:37
Answers: 0

In rule position erfassen und in variable schreiben

Beitrag von Mattes »

Hallo zusammen,

ich verzweifel gerade an einer doch einfachen Aufgabe..

Für eine Jalousie möchte ich die aktuelle Position (wird mit eine Shelly 2.5 angesteuert) auslesen, um einen festen Wert verändern (+/-) und wieder als neue Position ausgeben.

Manuell funktionier das auch, aber ich bekomme den aktuellen Wert des items Position nicht in die Regel eingebunden :(
Hier die Regel um den Shelly anzusteuern:

Code: Alles auswählen

var int pos3 = 11

// Test Shelly verstellen
rule "Rollo1 Position"
    when
        Item Test6 received command OFF
        then
        Shelly1poscmd.sendCommand(pos3+5)
end
Das funktioniert auch wenn ich Item Test6 anspreche - die gewünschte Position (hier 11+5=16) wird vom Shelly angefahren.
Die jeweilige aktuelle Position wird auf einem Item: Number Shelly1pos "Rollo1 Pos" auch korrekt angezeigt.
Ich bekomme das aber nicht in die Regel :( meine Idee war den Wert von "Shelly1pos " in die var pos3 zu übetragen und dann jeweils um einen festen Wert zu verändern.

Wie bekomme ich den Wert in die var pos3 ??
Habe schon mit Shelly1pos.state versucht klappt aber nicht... was ist der richtige Ansatz?

Danke schon mal !
von udo1toni » 16. Mai 2020 15:38
Vermutlich willst Du sowas:

Code: Alles auswählen

// Test Shelly verstellen

rule "Rollo1 Position"
when
    Item Test6 received command OFF
then
    var Number nPos = 45                   // Default Wert

    if(Shelly1pos.state instanceof Number) // Item enthält eine Zahl
        nPos = Shelly1pos.state as Number  // Also Zahl übernehmen
    // else return;                        // Falls keine Zahl vorliegt, fährt der Laden auf 50 %. 
                                           // Ist das nicht gewünscht, die Auskommentierung entfernen

    nPos = nPos + 5                        // Position erhöhen
    if(nPos > 100)                         // Falls Höchstwert überschritten
        nPos = 100                         // auf Höchstwert korrigieren
    Shelly1poscmd.sendCommand(nPos)        // Position anfahren
end
Zuerst wird die Variable mit einem Default Wert befüllt (hier 45)
Danach prüft die Rule, ob das Item eine gültige Zahl enthält. Ist das Der Fall, wird der Default Wert überschrieben. Ist das nicht der Fall, wird also mit 45 weitergemacht. Soll die Rule lieber nichts tun, kannst Du beim else-Part das Kommentarzeichen zu Beginn der Zeile entfernen.

Nun wird der Variablen der Schritt hinzugezählt
Anschließend wird die Variable auf Überschreitung des oberen Grenzwertes überprüft und der Wert gegebenenfalls korrigiert.
Zum Schluss geht das Kommando raus.

Es sollte eigentlich nicht nötig sein, Behanghöhe und Steuerung in verschiedenen Items zu halten. Für gewöhnlich reicht ein einfaches Rollershutter Item, um beides zu erledigen. Ein MyShutter.sendCommand((MyShutter.state as Number) + 5) wäre dann ausreichend (immer vorausgesetzt, das Item hält schon einen gültigen Zahlenwert). Genauso sollte dann ein MyShutter.sendCommand(DOWN) (UP oder STOP) funktionieren.
Gehe zur vollständigen Antwort

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

Re: In rule position erfassen und in variable schreiben

Beitrag von udo1toni »

Vermutlich willst Du sowas:

Code: Alles auswählen

// Test Shelly verstellen

rule "Rollo1 Position"
when
    Item Test6 received command OFF
then
    var Number nPos = 45                   // Default Wert

    if(Shelly1pos.state instanceof Number) // Item enthält eine Zahl
        nPos = Shelly1pos.state as Number  // Also Zahl übernehmen
    // else return;                        // Falls keine Zahl vorliegt, fährt der Laden auf 50 %. 
                                           // Ist das nicht gewünscht, die Auskommentierung entfernen

    nPos = nPos + 5                        // Position erhöhen
    if(nPos > 100)                         // Falls Höchstwert überschritten
        nPos = 100                         // auf Höchstwert korrigieren
    Shelly1poscmd.sendCommand(nPos)        // Position anfahren
end
Zuerst wird die Variable mit einem Default Wert befüllt (hier 45)
Danach prüft die Rule, ob das Item eine gültige Zahl enthält. Ist das Der Fall, wird der Default Wert überschrieben. Ist das nicht der Fall, wird also mit 45 weitergemacht. Soll die Rule lieber nichts tun, kannst Du beim else-Part das Kommentarzeichen zu Beginn der Zeile entfernen.

Nun wird der Variablen der Schritt hinzugezählt
Anschließend wird die Variable auf Überschreitung des oberen Grenzwertes überprüft und der Wert gegebenenfalls korrigiert.
Zum Schluss geht das Kommando raus.

Es sollte eigentlich nicht nötig sein, Behanghöhe und Steuerung in verschiedenen Items zu halten. Für gewöhnlich reicht ein einfaches Rollershutter Item, um beides zu erledigen. Ein MyShutter.sendCommand((MyShutter.state as Number) + 5) wäre dann ausreichend (immer vorausgesetzt, das Item hält schon einen gültigen Zahlenwert). Genauso sollte dann ein MyShutter.sendCommand(DOWN) (UP oder STOP) funktionieren.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Mattes
Beiträge: 25
Registriert: 23. Mär 2020 13:37
Answers: 0

Re: In rule position erfassen und in variable schreiben

Beitrag von Mattes »

Hallo Udo,

danke für deine Unterstützung :) genau das ist das, ws ich machen möchte...
Hatte auch schon mit Shelly1pos probiert, hab es aber nicht hinbekommen :( sah bei mir so aus:

var int pos3 = Shelly1pos.state as number

ist das so komplett verkehrt?
Hab deinen Teil eingefügt und angepasst, funktioniert... wieder was gelernt :)
Danke dir!

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

Re: In rule position erfassen und in variable schreiben

Beitrag von udo1toni »

Mattes hat geschrieben: 17. Mai 2020 09:45

Code: Alles auswählen

var int pos3 = Shelly1pos.state as number
ist das so komplett verkehrt?
Na ja. number gibt es nicht, wohl aber Number :)
und int ist ein Primitive. Kann man machen, muss sich aber über Konsequenzen im Klaren sein (ich muss auch immer probieren...)
openHAB sollte in der Lage sein, aus Number ein int zu machen, manchmal meckert es aber. Dann müsste man halt

Code: Alles auswählen

var int pos3 = (Shelly1pos.state as Number).intValue
schreiben.
Das bringt aber im vorliegenden Fall keine Vorteile.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten