Setpoint Wert als sendCommand übergeben

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Wohnort: bei Mannheim

Setpoint Wert als sendCommand übergeben

Beitrag von Joe »

Hallo zusammen,

ich bin sicher einer von Euch hat im Handumdrehen eine Lösung für mein Problem.
Ich habe eine Regel geschrieben, in der ich jetzt einen Wert aus einem Setpoint von der Sitmap benötige.
Mein Problem ist, dass ich nicht weiß der Richtige Befehl ist um den Wert ab zugreifen.

Beispiel:
SITEMAP

Code: Alles auswählen

Setpoint item=Rollo_aus_1 minValue=0 maxValue=100 step=1 //Wert wird manuell eingegeben
ITEM

Code: Alles auswählen

Number Rollo_aus_1 "Rollladen auf [%d Prozent]"
RULE

Code: Alles auswählen

?????
Angesteuert soll der Rollo mit dem ITEM "Studio_1_Pro" werden, sprich ich muss den Wert aus dem "Rollo_aus_1" (0-100%) in den Bereich
des "Studio_1_Pro.sendCommand(20)" bekommen in dem jetzt die 20 steht
Mit der Regel geht es nicht!!!

Code: Alles auswählen

Studio_1_Pro.sendCommand(Integer::parseInt(Rollo_aus_1.state.toString())
Hat jemand ein Idee das ganze hört sich so einfach an, will aber nicht funktionieren :-(

Benutzeravatar
peter-pan
Beiträge: 2568
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Setpoint Wert als sendCommand übergeben

Beitrag von peter-pan »

Ich bin zwar "Laie", aber hast du das Item "Studio_1_Pro" mit dem Typ "Rollershutter" angelegt ?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

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

Re: Setpoint Wert als sendCommand übergeben

Beitrag von udo1toni »

Fangen wir mal ein paar Schritte vorher an... Du möchtest den Rollladen ansteuern. Warum tust Du das nicht direkt?
Wenn Du einen Rollladen hast,
item:

Code: Alles auswählen

Rollershutter Studio_1_Pro "Rollladen [%d %%]" { ... }
Kannst Du in der Sitemap diese Widgets anlegen:

Code: Alles auswählen

Default   item=Studio_1_Pro                                             //ergibt ein Rollershutter Widget
Switch    item=Studio_1_Pro                                             //ergibt ein Rollershutter Widget
Switch    item=Studio_1_Pro mappings=[0="hoch",60="mitte",100="runter"] //ergibt drei Schaltflächen für Positionsfahrten
Selection item=Studio_1_Pro mappings=[0="hoch",60="mitte",100="runter"] //ergibt eine Dropdownliste für Positionsfahrten
Setpoint  item=Studio_1_Pro minValue=0 maxValue=100 step=10             //ergibt ein Setpoint Widget mit 11 Schritten
Text      item=Studio_1_Pro                                             //ergibt eine reine Anzeige der Position
Alle Widgets können gleichzeitig verwendet werden, auch mehrfach, mit unterschiedlichen Parametern, es ist also z.B. möglich, zwei Setpoints zu verwenden, den einen mit step=10, den anderen mit step=1, wirksam auf dasselbe Item.
Eine Rule sollte dafür nicht notwendig sein.
Ansonsten wäre aber der einfachste Weg der korrekte:

Code: Alles auswählen

rule "control roller shutter"
when
    Item Rollo_aus_1 changed
then
    if(Rollo_aus_1.state instanceof Number)
        Studio_1_Pro.sendCommand(Rollo_aus_1.state as Number)
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Wohnort: bei Mannheim

Re: Setpoint Wert als sendCommand übergeben

Beitrag von Joe »

Hallo Udo,
wie immer hast Du mir wieder super weitergeholfen.
Mir hat nur der Befehl instanceof gefehlt um den Wert zurückzugeben.

Ich bin gerade dabei einen Bereich des Hauses so zu steuern, dass ich 5 unterschiedliche Rollopositionen in verschiedenen Abhängigkeiten über die Oberfläche steuern kann.
Im Nachfolgenden String, versuche ich (leider noch vergeblich) um das Flattern des Rollos zu vermeiden (da ich die Position zwar exakt angeben kann der Rollo jedoch nicht die exakte Position anfahren kann) durch eine Range von +/- 5 zu komprimieren.
Kannst Du mir bitte helfen wo mein Fehler liegt?

IST_3_Switch ist der Trigger
Rollo_auf_3 ist die Angabe aus der Oberfäche auf die der Rollo fahren soll
Studio_1_Pro ist der Wert/Position auf die der Rollo fährt
Studio_1_Pos ist die Information des Shellys auf dem der Rollo aktuell ist

Code: Alles auswählen

        if (azim > ss3){
            IST_3_Switch.sendCommand(ON)
              if ((Rollo_auf_3.state as Number).intValue <= (Studio_1_Pos.state as Number).intValue +5 && (Rollo_auf_3.state as Number).intValue >= (Studio_1_Pos.state as Number).intValue -5){
                Studio_1_Pro.sendCommand(Rollo_auf_3.state as Number)     
              } 
            IST_2_Switch.sendCommand(OFF)
        }
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Setpoint Wert als sendCommand übergeben

Beitrag von udo1toni »

instanceof ist ein Operator (so wie kleiner, größer) und bedeutet "Ist eine Instanz von" (na ja, das hast Du sicher selbst auch schon so übersetzt). Den Wert kann man so oder so zurück geben, man sollte halt, bevor man einfach voraussetzt, dass sich im Status schon eine Zahl befinden wird, lieber prüfen, ob das auch der Fall ist. Wenn das Item nicht initialisiert ist, bekommt man sonst einen NULL-Pointer Error (was ca. 20 Zeilen im Log sind, hässlich.)

Zu Deinem eigentlichen Problem: Du hast den Bool'schen Operator falsch gesetzt. Der Befehl soll ausgeführt werden, wenn der Rollladen zu weit oben ODER zu weit unten steht. Dein Vergleich lautet aber auf zu weit oben UND zu weit unten, was niemals zutreffen kann.

Code: Alles auswählen

if (azim > ss3) {
    IST_3_Switch.sendCommand(ON)
        if ((Studio_1_Pos.state as Number) > (Rollo_auf_3.state as Number) + 4 || (Studio_1_Pos.state as Number) < (Rollo_auf_3.state as Number) - 4) {
            Studio_1_Pro.sendCommand(Rollo_auf_3.state as Number)     
        } 
        IST_2_Switch.sendCommand(OFF)
    }
Ich bin mir recht sicher, dass Du auf .intValue an dieser Stelle verzichten kannst.
Ich habe im Vergleich die Positionen jeweils getauscht, das hat den Hintergrund, dass ein Istwert mit einem Sollwert (+/- Spielraum) verglichen wird. Ist die Abweichung zu groß, wird der Sollwert als Befehl gesendet. Es erscheint mir übersichtlicher, den Vergleich so herum aufzubauen.

Du hast offensichtlich zwei Items für Steuerung und Position des Ladens, hat das einen besonderen Grund? Für gewöhnlich sollte ein Item hierfür ausreichen. Welches Binding hängt denn an den Items?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Wohnort: bei Mannheim

Re: Setpoint Wert als sendCommand übergeben

Beitrag von Joe »

Hi Udo,
vielen Dank für Deine Hilfe hat super funktioniert. Da hatte ich wohl was verdreht shit :? und && oder || :idea:
Naja ich bin nicht sicher ob das was ich da gerade bau so 100% ideal ist. Der Plan ist die Rollos auf Basis des Azimuth %-Satzes auf eine bestimmte Position bei einem bestimmten %-Satz zu steuern.
Dabei möchte ich jedoch die Möglichkeit haben alle Parameter frei zu bestimmen (wann was passieren soll).
Im zweiten Schritt solle noch die Abhängigkeit von Bewölkung, Temp und Windstärke eine Rolle spielen--- LEVEL 3.9 ----
Bin noch am Testen aktuell schaut das ganze so aus, später sollen noch einige Zeilen die jetzt zur Überprüfung sichtbar sind verschwinden.
Steuerung01.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: Setpoint Wert als sendCommand übergeben

Beitrag von sihui »

Joe hat geschrieben: 5. Jun 2019 23:33 Der Plan ist die Rollos auf Basis des Azimuth %-Satzes auf eine bestimmte Position bei einem bestimmten %-Satz zu steuern.
Vielleicht findest du einige weitere Anregungen hier:

viewtopic.php?f=8&t=2193&start=10#p9436
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Wohnort: bei Mannheim

Re: Setpoint Wert als sendCommand übergeben

Beitrag von Joe »

Gibt es einen Befehl in OH, der nach dem Reboot vom Pi (somit auch OH) die letzten eingegebenen Werte wieder automatisch setzt? Nach dem Reboot oder Stromausfall sind aktuell alle Werte gelöscht? Eine Alternative wäre auch eine gewisse Vorbelegung der Werte fest im script zu hinterlegen die dann nach dem Stromausfall erst mal wieder da sind und ggfl. nur modifiziert werden müssen +/- 20 oder so...nicht das ich in 0,5'er Schritten bis auf 321,0 hochklicken muss :-)

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Setpoint Wert als sendCommand übergeben

Beitrag von PeterA »

Klaro,

mit rrd4j persistence:
im file:

rrd4j.persist

Code: Alles auswählen

Strategies {
    everyMinute : "0 * * * * ?"
    everyHour : "0 0 * * * ?"
    everyDay : "0 0 0 * * ?"
    
}
Items {
    Abluftfeuchte : strategy = everyMinute, everyChange, restoreOnStartup
}
So kann das z.b aussehen.
"restoreOnStartup" schreibt dann den Wert zurück ins Item.
Aber Achtung...
Bei meiner Verschattungsrule kommt der Wert mit einer Kommastelle zb Azimuth 135.0 nach einem Reboot zurück ins Item
das mag die Rule nicht.
Hier ändere ich den Wert dann manuell kurz und dann passt das wieder.
Zumindest musst Du dann nicht mehr von 0 auf 200 oder so klickern :)

Gruß

Peter
- OpenHab 2.4
#PWRUP

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Wohnort: bei Mannheim

Re: Setpoint Wert als sendCommand übergeben

Beitrag von Joe »

Danke Peter

Antworten