Umzug von OH 2.4 zu 3.x: wie alte Rules mitnehmen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

ElBombo1
Beiträge: 39
Registriert: 15. Jul 2019 11:17
Answers: 0
Wohnort: Münster in Hessen

Re: Umzug von OH 2.4 zu 3.x: wie alte Rules mitnehmen

Beitrag von ElBombo1 »

Buenos dias.
Schau bitte mal in Dein log, was exakt!) als Wert ausgegeben wird, wenn das Ereignis FlurEGWandthermostatHomematicIP_Humidity changed auftritt.
Kann es sein, dass dann nicht (z.B.) 60 gemeldet wird, sondern 60 Prozent (%)?
Jawooohl, wie so oft, hast du Recht! Wird mit % angegeben. UoM Item??? Okay, das ist mir fremd...

Code: Alles auswählen

2022-01-05 15:49:38.358 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'FlurEGWandthermostatHomematicIP_Humidity' changed from 44 % to 43 %
Ich werde den Code probieren und Rückmeldung geben.
Vielen Dank an Dich!

Eloy

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

Re: Umzug von OH 2.4 zu 3.x: wie alte Rules mitnehmen

Beitrag von udo1toni »

UoM steht für Units of Measurement. Dabei wird im Status des Number Items eben auch die passende Einheit mit angegeben. Der Witz dabei ist, dass dies unbegrenzt gilt. Stell Dir vor, Du hast ein Messgerät, welches die Temperatur misst. Die Einheit ist °C. Ich kann aber erzwingen, dass die Temperatur in K ausgegeben wird. Alles, was ich dazu tun muss, ist als Unit K anzugeben. Ich muss nicht + 273,15 rechnen. Selbstverständlich kann ich auch °F ausgeben lassen. Und ich kann sogar 20 °C + 15 °F rechnen und bekomme ein sinnvolles Ergebnis angezeigt (gerne auch wieder in einer anderen Einheit...)
Wenn man in der Main UI die einheiten von metrisch auf imperial umstellt, werden als Standard Einheiten eben die imperialen genommen, also °, Meilen, Gallonen, keine Ahnung... und der Anwender muss sich um nichts kümmern, solange die angebundenen Geräte UoM unterstützen.
Nachteil ist halt, dass nun immer die Einheit mitgeschleppt wird, und das an einer Stelle, die evtl. bei Berechnungen störend ist. Aber wie oben gezeigt kann man auf unterschiedliche Weise das Problem umschiffen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

ElBombo1
Beiträge: 39
Registriert: 15. Jul 2019 11:17
Answers: 0
Wohnort: Münster in Hessen

Re: Umzug von OH 2.4 zu 3.x: wie alte Rules mitnehmen

Beitrag von ElBombo1 »

Also als erstes, Danke für die Erklärung zu UoM. Das habe ich nun definitiv verstanden!

Zu Deiner absolut grandios verbesserten Rule kann ich nur sagen, DANKE!!! Dat Ding läuft!
Warum auch immer hat es eine Weile gedauert bis sie gegriffen hat, bin dann entrüstet hoch gegangen... und als ich wieder kam, Stand der virtuelle Schalter auf ON und sowohl meine map Transformation als auch die rote Farbe im Widget waren aktiv :)
Nach kurzem Nachdenken kam mir dann, ja klar, es gab halt keine Humidity Änderung in der Zeit direkt nach Erstellen der Rule, aber zum Glück danach :mrgreen:

Darf ich dich (an dieser Stelle) um eine letzte Erläuterung bzw. Verbesserung meiner hinzugefügten Kommentaren in der Rule bitten? Ich würde es gerne bis zum Ende hin verstehen, was und wie du es genau gemacht hast. Das wäre echt klasse! (Überall wo die 3 Fragezeichen sind, habe ich die "Problemschen" :roll: )

Nachfolgend die komplette lauffähige Rule. Hoffe das auch anderen wie mir dadurch geholfen wird.

Code: Alles auswählen

rule "Humidity Alarm Flur EG"
when
    Item FlurEGWandthermostatHomematicIP_Humidity changed                       // Wenn sich die Feuchte ändert

then
    val hum = if(FlurEGWandthermostatHomematicIP_Humidity.state instanceof Number) (FlurEGWandthermostatHomematicIP_Humidity.state as Number).intValue else 60      // erstellen der Konstante "hum" aus meinem Humidity Item, if ??? ... (ab hier verließen sie ihn)
    var soll = HumidityAlarmSchalterFlurEG.state                                // erstellen der Variable soll = der virtuelle Schalter state von Flur EG
    var myStr = "zurück"                                                        // erstellen der Variable myStr, Füllwort für {} ???
    if(hum > 60)                                                                // falls die Humidity größer 60
        soll = ON                                                               // setze Humidity Schalter Flur EG auf ON
    if(hum < 60) {                                                              // falls die Humidity kleiner 60
        soll = OFF                                                              // setze Humidity Schalter Flur EG auf OFF
        myStr = "zurück"                                                        // Füllwort 
    }
    if(HumidityAlarmSchalterFlurEG.state != soll) {                             // falls Humidity Schalter Flur EG state ungleich (Bedingung > oder < 40 ???)
        HumidityAlarmSchalterFlurEG.sendCommand(soll.toString)                  // Humidity Schalter Flur EG entweder ON oder OFF aus der Variable soll ???
        logInfo("HumidityAlarm","Humidity Alarm Flur EG wird {}gesetzt",myStr)  // log Eintrag, Variable "myStr" wird entsprechend der aktuellen Bedingung entweder über die {} davor eingetragen oder auch eben nicht ???
    }
end
Saludos y muchas gracias Udo

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

Re: Umzug von OH 2.4 zu 3.x: wie alte Rules mitnehmen

Beitrag von udo1toni »

Aber gerne :)

Code: Alles auswählen

val hum = if(FlurEGWandthermostatHomematicIP_Humidity.state instanceof Number) (FlurEGWandthermostatHomematicIP_Humidity.state as Number).intValue else 60
Ich arbeite hier mit dem ternären Operator. Grundform: if(a) b else c -> sollte a zutreffen, nimm b, ansonsten nimm c

Ich bringe das Ganze mal in eine etwas andere Form:

Code: Alles auswählen

var hum = 60 
if(FlurEGWandthermostatHomematicIP_Humidity.state instanceof Number) 
    hum = (FlurEGWandthermostatHomematicIP_Humidity.state as Number).intValue 
Diese drei Zeilen sind das Äquivalent für die eine Zeile, es wird aber etwas klarer, was hier passiert.
Die Variable hum bekommt einen Default Wert 60 (dies ist der Wert, welcher keine Aktion auslöst, weder ON noch OFF)
Falls das Item FlurEGWandthermostatHomematicIP_Humidity im Status eine Zahl stehen hat (das ist nicht zwingend der Fall!) wird anschließend diese Zahl in der Variablen hum gespeichert.

Warum nun der ternäre Operator? Eine Konstante (val statt var) kann nur einmalig einen Wert zugewiesen bekommen, über den ternären Operator kann ich aber die Möglichkeit abfangen, dass das Item keinen gültigen Wert liefert.

Code: Alles auswählen

var myStr = "" // erstellen der Variable myStr, Füllwort für {} ???
Die Variable ist in meinem Code an dieser Stelle mit einem leeren String gefüllt, das hat schon seine Richtigkeit! Ich verwende diese Variable hinten im logInfo().
Falls der gesendete Befehl ON ist, lautet der Satz "Humidity Alarm Flur EG wird gesetzt",
falls der Befehl OFF ist, lautet der Satz "Humidity Alarm Flur EG wird zurück gesetzt",
weil logInfo() die {} durch den Inhalt der Variable myStr substituiert.
Wenn OFF gesendet werden soll, wird myStr auf "zurück " gesetzt (auch das Leerzeichen hatte seinen Grund... in diesem Fall stört es aber nicht weiter, ob nun zurück gesetzt oder zurückgesetzt spielt letztlich keine Rolle)

Um die letzten drei Zeilen Code zu verstehen, muss man die oberen Zeilen verstanden haben:

Code: Alles auswählen

var soll = HumidityAlarmSchalterFlurEG.state
Die aktuelle Schaltstellung wird in die Variable soll geladen. Somit ist der aktuelle Schaltzustand nun der Sollzustand des Schalters.

Code: Alles auswählen

if(hum > 60) soll = ON
Falls hum über 60 ist, wird der Sollzustand auf ON gesetzt.

Code: Alles auswählen

if(hum < 60) soll = OFF
Falls hum über 60 ist, wird der Sollzustand auf OFF gesetzt.

Nun kommt Dein Fragezeichen:

Code: Alles auswählen

if(HumidityAlarmSchalterFlurEG.state != soll) { 
Falls der aktuelle Schaltzustand vom soll abweicht (wir erinnern uns... ursprünglich war soll mal exakt dieser Schaltzustand... Nur falls der Sollwert nach unten oder oben abweicht, kann soll von ist abweichen.)
Die geschweifte Klammer fasst alle Befehle zu einem Block zusammen, denn die if-Anweisung bezieht sich auf beide nachfolgenden Befehle.
Die Grenzwerte <> 40 müsstest Du weiter oben ändern. Allerdings bietet es sich fast an, das zusammenzufassen. Also hier noch mal die komplette Rule:

Code: Alles auswählen

rule "Humidity Alarm"
when
    Item FlurEGWandthermostatHomematicIP_Humidity changed                            // Wenn sich die Feuchte ändert
then
    var grenzwert = 60                                                               // Grenzwert, der gehalten werden soll
    var hum = grenzwert                                                              // setze Gernzwert als default
    if(FlurEGWandthermostatHomematicIP_Humidity.state instanceof Number)             // falls Messwert gültig
        hum = (FlurEGWandthermostatHomematicIP_Humidity.state as Number).intValue    // setze hum auf Messwert
    var soll = HumidityAlarmSchalterFlurEG.state                                     // setze aktuellen Schaltzustand als soll
    var myStr = ""                                                                   // inizialisiere den String als leeren String
    if(hum > grenzwert)                                                              // falls die Humidity größer 60
        soll = ON                                                                    // setze Humidity Schalter Flur EG auf ON
    if(hum < grenzwert) {                                                            // falls die Humidity kleiner 60
        soll = OFF                                                                   // setze Humidity Schalter Flur EG auf OFF
        myStr = "zurück "                                                            // Füllwort ergänzen
    }
    if(HumidityAlarmSchalterFlurEG.state != soll) {                                  // Falls Schaltstellung von soll abweicht
        HumidityAlarmSchalterFlurEG.sendCommand(soll.toString)                       // Schalte um
        logInfo("HumidityAlarm","Humidity Alarm Flur EG wird {}gesetzt",myStr)       // und sende eine Zeile ins log
    } else
        logInfo("HumidityAlarm","Humidity Alarm unverändert auf {}",soll)
end
Ich habe hinten noch ein else mit einem zusätzlichen logInfo() ergänzt, so dass die Rule nun bei jedem Trigger etwas ausgibt. Das ist aber letztlich Geschmacksache, sowas müllt oftmals nur das Log zu...
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

ElBombo1
Beiträge: 39
Registriert: 15. Jul 2019 11:17
Answers: 0
Wohnort: Münster in Hessen

Re: Umzug von OH 2.4 zu 3.x: wie alte Rules mitnehmen

Beitrag von ElBombo1 »

Woaho! :o
Danke! Klasse erklärt! Ich denke, ich habe es verstanden obwohl ich schlichtweg nicht deine Programmierfähigkeiten mitbringe... Ich werde jetzt versuchen das nun gelernte in anderen "Anwendungsfällen" weiter zu verwenden.

Ich muss es nochmal sagen, danke das du mich hierbei unterstützt hast. Echt Klasse das es solche Menschen wie dich gibt die anderen so unter die Arme greifen. openHAB ist eine tolle Software und wenn man dann auch noch Spaß am "Automatisieren" und "Visualisieren" hat, einwandfrei. Jetzt weite ich mich so langsam in Richtung Garten aus (so langsam das der weibliche Anteil im Haus es nicht sofort bemerkt :lol: ), die voll automatische Beregnung wird über kurz oder lang das nächste sein was ich angehen werde.

Schönen Abend wünsche ich

Antworten