var und val

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

var und val

Beitrag von Boxana »

Hallo,
wenn ich Udo in seinen diversen antworten und Erklärungen richtig verstanden habe, ist ein val in der Laufzeit nicht mehr zu ändern.
nur wo muss ein var deklariert werden?
in der Rule oder global wenn dort if's sind?

Code: Alles auswählen

then
    if (Garagen_Tor_unten.state == ON ){
        Garage_AUF_ZU.postUpdate ("0")
    }
    if (Garage_Automatic.state == OFF) {
        val val_garage_zu = "Garage wurde mmanuell geschlossen,"
        } else {
        val val_garage_zu = "Garage wurde automatisch geschlossen,"
       }
    if (GA_DL_on_of.state==ON) {
        var val_garage_licht = " Licht ist an."
        d_Garage_Statussmeldung.sendCommand("Garagentor zu, Licht ist noch an!")
        } else {
            d_Garage_Statussmeldung.sendCommand("Das Garagentor ist zu!") 
            var val_garage_licht = " Licht ist aus."
            logInfo("d_Garage", val_garage_zu + val_garage_licht )
        }
end
2020-03-18 15:40:42.927 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'garagentor.rules', using it anyway:
The value of the local variable val_garage_zu is not used
The value of the local variable val_garage_zu is not used
The value of the local variable val_garage_licht is not used
2020-03-18 15:40:42.962 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'garagentor.rules'
Rule 'Garagentor status': The name 'val_garage_zu' cannot be resolved to an item or type; line 61, column 33, length 13

Ziel:
Das Garagentor meldet zu dann soll geprüft werden ob manuell oder Automatik und ob Licht an oder aus.
Da fehlen noch schritte was passieren soll wenn Automatik an u.s.w. aber da muss ich erst meinen Fehler erkennen den ich bis hier gemacht haben.

Kann ich eventuell die If's in diesem teil auch noch anders verschachteln, alles zum erstem if?
Openhab auf einem Qnap NAS
Gruß
Christian

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: var und val

Beitrag von Boxana »

Das if habe ich jetzt so verschachtelt aber das mit den var ist mir ein rätsel.

Code: Alles auswählen

rule "Garagentor status"

when
    
    
   // Item Garagen_Tor_oben changed or Item Garagen_Tor_unten changed or Item Garagen_Tor_bewegung changed
   Item Garagen_Tor_unten changed 
then
    if (Garagen_Tor_unten.state == ON ){
        Garage_AUF_ZU.postUpdate ("0")    
        if (Garage_Automatic.state != ON) {
            var val_garage_licht = "Garage wurde mmanuell geschlossen,"
        } else {
            var val_garage_licht = "Garage wurde automatisch geschlossen,"
       }
        if (GA_DL_on_of.state==ON) {
            var val_garage_licht = " Licht ist an."
            d_Garage_Statussmeldung.sendCommand("Garagentor zu, Licht ist noch an!")
        } else {
            d_Garage_Statussmeldung.sendCommand("Das Garagentor ist zu!") 
            var val_garage_licht = " Licht ist aus."
            logInfo("d_Garage", val_garage_zu.state )
        }
    }
    
end
Openhab auf einem Qnap NAS
Gruß
Christian

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: var und val

Beitrag von Boxana »

So geht es

Code: Alles auswählen

rule "Garagentor status"

when
   Item Garagen_Tor_unten changed 
then

    if (Garagen_Tor_unten.state == ON ){
        Garage_AUF_ZU.postUpdate ("0")    
        if (Garage_Automatic.state != ON) {
        } else {
       }
        if (GA_DL_on_of.state==ON) {
            d_Garage_Statussmeldung.sendCommand("Garagentor zu, Licht ist noch an!")
        } else {
            d_Garage_Statussmeldung.sendCommand("Das Garagentor ist zu!")      
        }
    }
end
Openhab auf einem Qnap NAS
Gruß
Christian

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

Re: var und val

Beitrag von udo1toni »

Ich erläutere das mal...

val ist das Schlüsselwort für Value, oder auf "deutch" Konstante.
var ist das Schlüsselwort für Variable.

Variablen und Konstanten sind grundsätzlich nur im eigenen Kontext gültig, allerdings wird der Kontext vererbt. Das heißt:

val/var außerhalb der Rules -> gültig über alle Rules (mindestens in der gleichen Datei, eventuell aber auch systemweit - Mindestens kommt es zu einer Kollision, falls man die gleiche globale Variable in mehreren Dateien setzt)
val/var innerhalb einer Rule -> gültig nur innerhalb der Rule
val/var innerhalb eines if-Statements -> gültig nur innerhalb des if-Statements. Was auch erklärt, warum Deine Rule so, wie Du sie geschrieben hast, nicht funktionieren kann.
Das gleiche gilt sinngemäß auch für andere Kontexte, ob nun while, for, switch-case oder auch nur {}

Es gibt noch einen weiteren Punkt, der wichtig ist. Wenn man einen Timer verwendet, so ist dies ein eigener Kontext, das heißt, auch wenn eine Variable in der Rule vor dem Anlegen des Timers definiert wurde, ist sie innerhalb des Timers nicht existent.

Für Deine Rule bedeutet dies:

Code: Alles auswählen

rule "Garagentor status"
when
   Item Garagen_Tor_unten changed
then
    if (Garagen_Tor_unten.state == ON ){
        var val_garage_licht = ""
        Garage_AUF_ZU.postUpdate ("0")    
        if (Garage_Automatic.state != ON) {
            val_garage_licht = "Garage wurde mmanuell geschlossen,"
        } else {
            val_garage_licht = "Garage wurde automatisch geschlossen,"
        }
        if (GA_DL_on_of.state==ON) {
            val_garage_licht = val_garage_licht + " Licht ist an."
            d_Garage_Statussmeldung.sendCommand("Garagentor zu, Licht ist noch an!")
        } else {
            d_Garage_Statussmeldung.sendCommand("Das Garagentor ist zu!") 
            val_garage_licht = val_garage_licht + " Licht ist aus."
            logInfo("d_Garage", val_garage_zu.state )
        }
        logInfo("d_Garage",val_garage_licht)
    }
end
Ich gehe davon aus, dass Du den Text zusammensetzen wolltest. Dazu musst Du aber den ersten Teil zum zweiten Teil "hinzuaddieren". Ich hab das mal so eingebaut...

Das von mir hinzugefügte letzte logInfo kann den Inhalt der Variablen ausgeben, da die Variable innerhalb des Kontextes existiert.
Am Ende der Rule existiert die Variable aber nicht mehr, also auch nicht außerhalb der Rule.
Nur, weil Du die Variable innerhalb der Rule gar nicht mehr verwendest...
Auffällig ist noch Dein logInfo, wo Du val_garage_zu verwendest, allerdings mit dem Zusatz .state, was dann hieße, dass es sich um ein Item handelt. Es ist mehr als suboptimal, Schlüsselworte als Bestandteil von Namen zu verwenden, die damit nicht in Verbindung stehen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: var und val

Beitrag von Boxana »

angenommen ich möchte die variable erhalten, reicht es dann aus sie an den Anfang der Datei zu deklarieren?

var var_garage_licht = ""

und in deiner Korrektur hast du logInfo("d_Garage",val_garage_licht) vor die letzte } geschrieben, wenn es danach geschrieben wird ist sie leer da sie nicht mehr innerhalb der if schleife ist.
ist das richtig?
Openhab auf einem Qnap NAS
Gruß
Christian

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: var und val

Beitrag von Boxana »

Danke Udo,

habe das .state weggenommen.
Rule 'Garagentor zu status': 'state' is not a member of 'java.lang.String';
[code
rule "Garagentor zu status"
when
Item Garagen_Tor_unten changed
then

if (Garagen_Tor_unten.state == ON ){
var var_garage_zu = ""
Garage_AUF_ZU.postUpdate ("0")
if (Garage_Automatic.state != ON) {
var_garage_zu = "Garage wurde mmanuell geschlossen,"
} else {
var_garage_zu = "Garage wurde automatisch geschlossen,"
}
if (GA_DL_on_of.state==ON) {
d_Garage_Statussmeldung.sendCommand("Garagentor zu, Licht ist noch an!")
var_garage_zu = var_garage_zu + "Licht ist an."
} else {
d_Garage_Statussmeldung.sendCommand("Das Garagentor ist zu!")
var_garage_zu = var_garage_zu + "Licht ist aus."
}
logInfo("d_Garage", var_garage_zu )
}
end


[/code]
[ipse.smarthome.model.script.d_Garage] - Garage wurde automatisch geschlossen,Licht ist aus.
Openhab auf einem Qnap NAS
Gruß
Christian

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: var und val

Beitrag von Boxana »

Hallo Udo,
ich spreche dich mal direkt an. Nicht das du denkst ich habe ein Problem und frage dann direkt hier, aber ich suche den ganzen Tag schon nach einem Grund warum ich nicht weiterkomme.
Ich habe viele Post's von dir gelesen auch in anderen Foren aber ich scheitere.

Wenn ich eine Zeit für einen Timer über einen Slider stellen möchte und das dann als val an den timer übergebe Passiert nichts, wenn ich die Zeit fest einstelle (1) dann geht es.

Ich habe viele Beispiele von dir und anderen Usern probiert, aber ohne erfolg.

Code: Alles auswählen

rule "Garagentor auf status"
when
   Item Garagen_Tor_oben changed 
then
    if (Garagen_Tor_oben.state == ON ){
        var var_garage_auf = ""
        d_Garage_Statussmeldung.sendCommand("Das Garagentor ist oben!")
        Garage_Statuss_senden.sendCommand(" ist offen.  ")
        Garage_AUF_ZU.postUpdate ("0")    
        if (Garage_Automatic.state != ON) {
            var_garage_auf = "Garage wurde ohne Automatik geöffnt, "
        } else {
            val Integer GARAGE_OT = (garage_time_to_close.state as DecimalType).intValue
            //val Integer GARAGE_OT = garage_time_to_close.state as Number
            createTimer(now.plusMinutes(GARAGE_OT)) [
                |sendCommand(GA_To_zu_Stop,ON)
                ]
            var_garage_auf = "Garage wurde mit Automatik geöffnet, "
       }
    logInfo("d_Garage", var_garage_auf )
    }
end
So sieht es im Moment aus. Ich wollte eigentlich die Variable nach ganz oben in die Datei setzen damit ich den Timer auch in anderen Rules beeinflussen kann ( an und aus) aber ich bekomme es nicht mal so hin.
Openhab auf einem Qnap NAS
Gruß
Christian

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: var und val

Beitrag von Boxana »

ich habe nichts geändert und es geht jetzt ?

Habe irgendwo gelesen das du gesagt hast das es vorkommt das rules nicht bendet werden oder hängen können und OH neu gestartet.
Openhab auf einem Qnap NAS
Gruß
Christian

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

Re: var und val

Beitrag von udo1toni »

So wie ich Deinen bisherigen Code verstehe, willst Du, dass das Tor bei Automatikbetrieb nach einer einstellbaren Zeit wieder zu fährt.
Prinzipiell sollte Deine Rule das auch möglich machen. Allerdings gibt es ein Aber dazu.
Du verwendest nämlich den Timer ohne Zeiger, das ist eher ungünstig.
Auch die Benennung Deiner Variablen und Konstanten ist nicht schön, es sieht doch alles etwas unaufgeräumt aus.
Wenn ich die Items richtig interpretiere, hast Du ein Item, welches die obere Endlage des Tors meldet, ein weiteres Item, welches dasselbe für die untere Endlage tut und ein Item, welches den Motor startet und stoppt. Oder hast Du zwei Items für den Motor?
Egal, nur so als Vorschlag:

Code: Alles auswählen

// Globale Variablen immer zu Beginn der Datei definieren!
var Timer tGarageClose = null                                                        // Timer für Automatikbetrieb Garagentor

rule "Garagentor status"
when
    Item Garagen_Tor_oben changed or                                                 // obere Endlage
    Item Garagen_Tor_unten changed                                                   // untere Endlage
then
    var Integer iGarageOpenTime = 1                                                  // Default Automatikzeit
    if(garage_time_to_close.state instanceof Number)                                 // Falls das Item einen gültigen Wert liefert
        iGarageOpenTime = (garage_time_to_close.state as Number).intValue            // nimm diesen Wert
    var String strMessage = ""                                                       // Varibale für Meldung
    tGarageClose?.cancel                                                             // Falls Timer läuft, abbrechen

    if (Garagen_Tor_oben.state == ON ){                                              // falls obere Endlage
        strMessage = strMessage + "vollständig geöffnet - Automatik "               // Meldung
        if (Garage_Automatic.state != ON) {                                          // Falls Automatik aus
            strMessage = strMessage + "aus."                                         // Meldung ergänzen
        } else {                                                                     // Falls Automaitk an
            strMessage = strMessage + "an."                                          // Meldung ergänzen
            tGarageClose = createTimer(now.plusMinutes(iGarageOpenTime), [ |         // und Timer zum Schließen anlegen
                GA_To_zu_Stop.sendCommand(ON)                                        // Schließbefehl senden
                ])
        }
    } else if(Garagen_Tor_unten.state == ON) {                                       // falls untere Endlage
        strMessage = strMessage + "vollständig geschlossen"                          // Meldung
    } else {                                                                         // falls weder unten noch oben
        strMessage = strMessage + "teilweise geöffnet"                               // Meldung
    }
    logInfo("d_Garage", "Garagentor: {}", strMessage)                                // Meldung ins Log
    d_Garage_Statussmeldung.postUpdate(strMessage)                                   // und ins Meldungsitem
end
Was ich nicht so ganz verstehe, sind Deine weiteren Items. Ich hab sie jetzt mal weg gelassen, das redundante Information. Wen Du das Item d_Garage_Statussmeldung so anlegst:

Code: Alles auswählen

String d_Garage_Statussmeldung "Garage [%s]" 
bekommst Du den Meldungstext rechts und das Label links. Wobei der Meldetext vermutlich zu lang ist... ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: var und val

Beitrag von Boxana »

Wenn ich jetzt den Timer mit variable am Anfang der Datei deklariere dann habe ich den zugriff auf den Timer (Variable) in der ganzen Rule.

Kann ich dann an beliebiger stelle in der Datei eine Rule schreiben, die über eine If schleife den Timer an und ausschalten kann?

wenn
triger schalter
if off
GA_TIMER = null
else
val Integer GARAGE_OT = (garage_time_to_close.state as DecimalType).intValue
//val Integer GARAGE_OT = garage_time_to_close.state as Number
GA_TIMER = createTimer(now.plusMinutes(GARAGE_OT)) [
|sendCommand(GA_To_zu_Stop,ON)
]
end

oder kann man das jetzt vereinfachen da der timer ja jetzt in der Variable ist?


Code: Alles auswählen

var Timer GA_TIMER = null

rule "Garagentor auf status"
when
   Item Garagen_Tor_oben changed 
then
    if (Garagen_Tor_oben.state == ON ){
        var var_garage_auf = ""
        d_Garage_Statussmeldung.sendCommand("Das Garagentor ist oben!")
        Garage_Statuss_senden.sendCommand(" ist offen.  ")
        Garage_AUF_ZU.postUpdate ("0")    
        if (Garage_Automatic.state != ON) {
            var_garage_auf = "Garage wurde ohne Automatik geöffnt, "
        } else {
            val Integer GARAGE_OT = (garage_time_to_close.state as DecimalType).intValue
            //val Integer GARAGE_OT = garage_time_to_close.state as Number
            GA_TIMER = createTimer(now.plusMinutes(GARAGE_OT)) [
                |sendCommand(GA_To_zu_Stop,ON)
                ]
            var_garage_auf = "Garage wurde mit Automatik geöffnet, "
       }
    logInfo("d_Garage", var_garage_auf )
    }
end
Openhab auf einem Qnap NAS
Gruß
Christian

Antworten