Ankündigung

Einklappen
Keine Ankündigung bisher.

Hlfe bei einer Rule zur Übergabe eines Status vom Regensensor auf einen Switch

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Hlfe bei einer Rule zur Übergabe eines Status vom Regensensor auf einen Switch

    Ich würde gerne den Status vom Regensensor an eine Zustandsvariable übergeben. Die Zustandsvariable ist als Switch konfiguiert, Der Regensenor als Contact.

    Die Regel lautet:

    rule"Regenstatus"
    when
    Item Regen changed
    then
    if (Regen.state == OPEN)
    {
    sendCommand(ZV_Regen, ON)
    logInfo("rule.regenstatus","Regen an")

    }
    else if (Regen.state == CLOSE)
    {
    sendCommand(ZV_Regen, OFF)
    logInfo("rule.regenstatus","Regen aus")
    }

    end
    end


    Es funktioniert leider nicht, hat jemand einen Tip für mich?

    #2
    Nur zur Sicherheit: Mit Zustandsvariable meinst Du ein Item, welches ungebunden ist? Variablen werden in rule-Files definiert und bekommen ihre Werte einfach per = zugewiesen.

    Das erste, was mir am Code auffällt, ist Regen.state == CLOSE. Der Status wäre aber CLOSED, nach der Korrektur sollte der entsprechende Code aufgerufen werden.

    Das zweite Problem könnte die Action sein. Die Action sendCommand() ist mit String,String definiert. Unter bestimmten Umständen klappt die automatische Umwandlung zu Strings nicht. Du kannst also entweder Anführungszeichen um die Parameter machen oder (besser) gleich die Methode verwenden:
    Code:
    ZV_Regen.sendCommand(ON)
    Außerdem steht end zweimal da, das könnte bei er Interpretation des Rulefiles auch zu Fehlern führen. Eventuell war das aber auch nur ein Copy&Paste Fehler?

    Aber vielleicht denkst Du auch nur zu kompliziert, denn eigentlich sollte es kein Problem sein, den Sensor statt als Contact direkt als Switch zu definieren. Eine Schaltfunktion in der UI kannst Du unterdrücken, indem Du nicht das Switch Widget, sondern das Text Widget verwendest.

    Kommentar


      #3
      Vielen Dank, es funktioniert. Der entscheidenste Hinweis war der zu dem doppelten End. Den Fehler hatte ich anscheinend bereits bei der Rule davor schon gemacht und er hat dazu geführt das die nachfolgende Rule nicht mehr ausgeführt wurde. Dann noch das D angefügt und es funktioniert!

      Die funktionierende Regel sieht jetzt dann so aus:
      rule"Regenstatus"
      when
      Item Regen changed
      then
      if (Regen.state == OPEN)
      {
      ZV_Regen.sendCommand(ON)
      logInfo("rule.regenstatus","Regen an")
      }
      else if (Regen.state == CLOSED)
      {
      ZV_Regen.sendCommand(OFF)
      logInfo("rule.regenstatus","Regen aus")
      }
      end

      Die Zustandsvariable ist bei mir tatsächlich ein Switch, es ist ein virtueller Schalter in RWE Smarthome. Wenn es regnet sollen bestimmte Abläufe in der RWE Umgebung gestartet werden.

      Kommentar


        #4
        Eine Frage stellt sich leider jetzt doch noch.

        Die Regel wird bei mir alle 3 Minuten ausgeführt, obwohl das Item Regen nicht ändert.

        Auszug aus dem Log
        Code:
        2017-06-15 20:57:09.134 [INFO ] [.model.script.rule.regenstatus] - Regen aus
        2017-06-15 21:00:05.177 [INFO ] [.model.script.rule.regenstatus] - Regen aus
        2017-06-15 21:03:05.503 [INFO ] [.model.script.rule.regenstatus] - Regen aus
        Itemdefinition
        Code:
        Contact Regen "Regensensor" {homematic="address=MEQ1120842, channel=1, parameter=STATE"}
        Rules, die Regel ist ganz unten
        Code:
        import org.openhab.core.persistence.*
        import org.openhab.core.library.*
        import org.openhab.core.items.*
        import org.openhab.core.library.types.*
        import org.openhab.model.script.actions.*
        import org.joda.time.*
        import java.lang.Math.*
        
        
        
        
        
        rule "Luftfeuchte"
            when
             Item KG_Temp changed or
             Item KG_Feuchte changed or
             Item KW_Temp changed or
             Item KW_Feuchte changed or
             Item KV_Temp changed or
             Item KV_Feuchte changed or
             Item Netatmo_Outdoor_Temperature changed or
             Item Netatmo_Outdoor_Humidity changed
           then
              // Variablen
            var Number temp_in = KG_Temp.state as DecimalType        //Innentemperatur in Grad Celsius
            var Number temp_KW = KW_Temp.state as DecimalType        //Innentemperatur in Grad Celsius
            var Number temp_KV = KV_Temp.state as DecimalType        //Innentemperatur in Grad Celsius
            var Number temp_out = Netatmo_Outdoor_Temperature.state as DecimalType                //Außentemperatur in Grad Celsius
        
            var Number abs_hum_in = 0
            var Number abs_hum_out = 0
            var Number td_in = 0
            var Number td_out = 0
            var Number abs_hum_KV = 0
            var Number td_KV = 0
            var Number abs_hum_KW = 0
            var Number td_KW = 0
        
        
            var Number rel_hum_in = KG_Feuchte.state as DecimalType            //relative Feuchte Innen
            var Number rel_hum_KW = KW_Feuchte.state as DecimalType            //relative Feuchte Innen
            var Number rel_hum_KV = KV_Feuchte.state as DecimalType            //relative Feuchte Innen
        
            var Number rel_hum_out = Netatmo_Outdoor_Humidity.state as DecimalType            //relative Feuchte Außen
        
                // Konstanten
            val gas_const = 8314.3
            val mol = 18.016
            var Number ab = 0
            var Number sdd = 0
            var Number dd = 0
            var Number v = 0
            var Number a_out = 0
            var Number b_out = 0
        
            // Parameter a, b
            // wenn T>=0: a = 7.5, b = 237.3 (dies wird wohl immer von den Innenraum zutreffen)
            // wenn T<0:  a = 7.6, b = 240.7 (dies kann für die Außerntemperatur zutreffen)
        
            val a_in=7.5
            val b_in=237.3      
            if (temp_out >= 0) {
                a_out=7.5
                b_out=237.3    
            } else {
                a_out=7.6
                b_out=240.7        
            }
        
            // Formeln
            // Sättingungsdampfdruck:    SDD = 6.1078 * 10^((a*temp)/(b+temp))
            // Dampfdruck:                DD = rel_hum * 100 / SDD
            // Absolute Feuchte:        AF = 10^5 * mol / gas_const * DD / (temp + 273.15)
            // Taupunkt:                TD = b*v/(a-v) mit v = log10(DD / 6.1078)
        
            // absolute Innenfeuchte
            ab = ((a_in * temp_in) / (b_in + temp_in)).doubleValue()
            sdd = 6.1078 * Math::pow(10, ((a_in * temp_in) / (b_in + temp_in)).doubleValue())
            dd = rel_hum_in / 100 * sdd
            v = Math::log10((dd/6.1078).doubleValue())
            abs_hum_in = Math::pow(10, 5) * mol / gas_const * dd / (temp_in + 273.15)
        
            // absolute Vorratfeuchte
            ab = ((a_in * temp_KV) / (b_in + temp_KV)).doubleValue()
            sdd = 6.1078 * Math::pow(10, ((a_in * temp_KV) / (b_in + temp_KV)).doubleValue())
            dd = rel_hum_KV / 100 * sdd
            v = Math::log10((dd/6.1078).doubleValue())
            abs_hum_KV = Math::pow(10, 5) * mol / gas_const * dd / (temp_KV + 273.15)
        
            // absolute Werkstattfeuchte
            ab = ((a_in * temp_KW) / (b_in + temp_KW)).doubleValue()
            sdd = 6.1078 * Math::pow(10, ((a_in * temp_KW) / (b_in + temp_KW)).doubleValue())
            dd = rel_hum_KW / 100 * sdd
            v = Math::log10((dd/6.1078).doubleValue())
            abs_hum_KW = Math::pow(10, 5) * mol / gas_const * dd / (temp_KW + 273.15)
        
            // absolute Außenfeuchte
            ab = ((a_out * temp_out) / (b_out + temp_out)).doubleValue()
            sdd = 6.1078 * Math::pow(10, ((a_out * temp_out) / (b_out + temp_out)).doubleValue())
            dd = rel_hum_out / 100 * sdd
            v = Math::log10((dd/6.1078).doubleValue())
            abs_hum_out = Math::pow(10, 5) * mol / gas_const * dd / (temp_out + 273.15)
        
            //logInfo("Luftfeuchte", "Abs. Luftfeuchte - in: " + abs_hum_in + " g/m3, out: " + abs_hum_out + " g/m3")
            postUpdate(AbsoluteLuft1,abs_hum_in)
            postUpdate(AbsoluteLuft2,abs_hum_out)
            postUpdate(AbsoluteLuftKV,abs_hum_KV)
            postUpdate(AbsoluteLuftKW,abs_hum_KW)
            if ((abs_hum_in - 0.5)> abs_hum_out) // && (Kellerlueftung.state == OPEN) //wenn innen feuchter als außen, dann lüften
        
            {
             // lüften, Fenster öffnen
                // logInfo("Luftfeuchte", "Keller lüften")
            // sendCommand(Kellerlueftung, CLOSED)
            postUpdate(Kellerlueftung,"CLOSED")
        
            } else if (((abs_hum_in - 0.5)<= abs_hum_out) // && (Kellerlueftung.state == CLOSED)
             {
                // nicht lüften, Fenster schließen
                // logInfo("Luftfeuchte", "Kellerfenster schließen")
            // sendCommand(Kellerlueftung, OPEN)
            postUpdate(Kellerlueftung,"OPEN")    
            }
        
        
        end
        
        
        
        rule"Beschattung"
        when
            Item Azimuth changed
        then
            var int azimuth = (Azimuth.state as DecimalType).intValue
            var int elevation = (Elevation.state as DecimalType).intValue
        
        
             if (ZV_Beschattung.state==ON)
            {
                //logInfo("rule.beschattung","Südbeschattungssteuerung ist an.")
        
                if (azimuth > 105 && azimuth < 233 && elevation > 21 && WZ_Rollo1.state!=63) {
                      logInfo("rule.beschattung","Suedfenster beschatten.")
                      WZ_Rollo1.sendCommand(63)
                } else if  (azimuth > 234 && elevation > 15 && WZ_Rollo1.state==63) {
                      logInfo("rule.beschattung","Suedfenster entschatten.")
                      WZ_Rollo1.sendCommand(0)
                }
            {
                if (azimuth > 105 && azimuth < 233 && elevation > 21 && KZ_Rollo.state!=63 && AZ_Temp.state > 20) {
                      logInfo("rule.beschattung","Kinderfenster beschatten.")
                      KZ_Rollo.sendCommand(63)
                } else if  (azimuth > 234 && elevation > 15 && KZ_Rollo.state==63) {
                      logInfo("rule.beschattung","Kinderfenster entschatten.")
                      KZ_Rollo.sendCommand(0)
                }
            {
                //logInfo("rule.beschattung","Schlafzimmerbeschattungssteuerung ist an.")        
        
                if (azimuth > 213 && azimuth < 268 && elevation > 15 && SZ_Rollo.state!=50 && SZ_Rollo.state!=100 && SZ_Temp.state > 21) {
                      logInfo("rule.beschattung","Schlafzimmerfenster beschatten.")
                      SZ_Rollo.sendCommand(50)
        
                } else if  (azimuth > 269 && elevation > 15 && SZ_Rollo.state==50) {
                      logInfo("rule.beschattung","Schlafzimmerfenster entschatten.")
                      SZ_Rollo.sendCommand(0)
                }
                {
                if (azimuth > 213 && azimuth < 268 && elevation > 15 && WK_Rollo2.state!=50 && WK_Rollo2.state!=100 && WK_Temp.state > 21) {
                      logInfo("rule.beschattung","Esszimmerfenster beschatten.")
                      WK_Rollo2.sendCommand(50)
                } else if  (azimuth > 269 && elevation > 15 && WK_Rollo2.state==50) {
                      logInfo("rule.beschattung","Esszimmerfenster entschatten.")
                      WK_Rollo2.sendCommand(0)
                }
        
              }
        
             end
        
        
        rule "Regenstatus"
        
        when
        
            Item Regen changed
        
        then          
            if (Regen.state == OPEN)
            {
                 ZV_Regen.sendCommand(ON)
                 logInfo("rule.regenstatus","Regen an")
                }
            if  (Regen.state == CLOSED)
            {
                 ZV_Regen.sendCommand(OFF)
                 logInfo("rule.regenstatus","Regen aus")
                }
        end
        Kann mir jemand auf die Sprünge helfen?

        Kommentar


          #5
          Eventuell verliert der Sensor kurzzeitig seinen Status und wird dann z.B. uninitialized.
          Um das zu überprüfen, könntest Du die Rule umbauen, indem Du vor das zweite if-Statement ein else setzt, so dass die Zeile

          else if (Regen.state == CLOSED)

          lautet und dann einen weiteren Block vor dem end einfügst, mit
          Code:
          else logInfo ("rule.regenstatus","Item Regen: {}",Regen.state.toString)
          Dann siehst Du, wann der Status wegbricht (wird ja bisher nicht geloggt) und welchen Status das Item dann hat.

          Kommentar


            #6
            Vielen Dank, hat leider noch nicht geholfen,
            Das Log zeigt mir alle 3 Minuten den Regenstatus an:
            Code:
            2017-06-16 12:34:09.158 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 12:37:04.645 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 12:40:05.366 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 12:43:07.699 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 12:46:05.597 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 12:49:04.693 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 12:52:05.267 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 12:55:05.449 [INFO ] [.model.script.rule.regenstatus] - Regen an
            2017-06-16 12:58:05.058 [INFO ] [.model.script.rule.regenstatus] - Regen an
            2017-06-16 13:01:05.904 [INFO ] [.model.script.rule.regenstatus] - Regen an
            2017-06-16 13:04:05.642 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 13:07:12.815 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 13:10:04.685 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 13:13:06.228 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 13:16:05.126 [INFO ] [.model.script.rule.regenstatus] - Regen an
            2017-06-16 13:19:05.958 [INFO ] [.model.script.rule.regenstatus] - Regen an
            2017-06-16 13:22:10.475 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 13:25:05.786 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 13:28:07.654 [INFO ] [.model.script.rule.regenstatus] - Regen an
            2017-06-16 13:31:06.268 [INFO ] [.model.script.rule.regenstatus] - Regen an
            2017-06-16 13:34:05.383 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 13:37:08.197 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 13:40:05.547 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            Ich habe die Regel entsprechend geändert, aber es kommt kein weiterer LogInfo.

            Code:
            rule "Regenstatus"
            
            when
            
                Item Regen changed
            
            then  
            
            
                if (Regen.state == OPEN)
                {
                     ZV_Regen.sendCommand(ON)
                     logInfo("rule.regenstatus","Regen an")
                    }
                else if  (Regen.state == CLOSED)
                {
                     ZV_Regen.sendCommand(OFF)
                     logInfo("rule.regenstatus","Regen aus")
                    }
                else logInfo ("rule.regenstatus","Item Regen: {}",Regen.state.toString)
            
            end
            Wenn man die Loginfo vor das IF zieht funtioniert die Statusausgabe und sieht so aus:
            Code:
            2017-06-16 13:52:03.318 [INFO ] [.model.script.rule.regenstatus] - Item Regen: CLOSED
            2017-06-16 13:52:06.543 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 13:55:03.740 [INFO ] [.model.script.rule.regenstatus] - Item Regen: CLOSED
            2017-06-16 13:55:06.230 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            2017-06-16 13:58:02.848 [INFO ] [.model.script.rule.regenstatus] - Item Regen: CLOSED
            2017-06-16 13:58:05.697 [INFO ] [.model.script.rule.regenstatus] - Regen aus
            Leider kein uninitialized oder ähnliches

            Kommentar


              #7
              Ich habe den Fehler gefunden, bzw die Ursache. Wenn ich die Regel in der Datei über die Beschattungsregelung setze funktioniert es. Der Status wird nicht alle 3 Minuten abgerufen. Die Regelausführung ist zeitlich immer mit der Änderung des Azimuthes zusammengefallen. Das ist die Bedingung für meine Beschattungsregelung. Vermutlich habe ich die Regel irgendwie nicht richtig abgeschlossen und damit wurde dann der Regenstatus mit jedem Ausführen der Beschattungsregelung auch mit ausgefürht.

              Danke für die Hilfe

              Kommentar


                #8
                Ja, stimmt, Du hast da drei öffnende Klammern zu viel, und zwar jeweils zwischen den if-else-blöcken. Eigentlich sollte der Designer da kräftig motzen. Allerdings scheint mir die ganze Regel etwas unvollständig, aber vielleicht hab ich auch nur den falschen Zugang zu der Logik dahinter...
                Zuletzt geändert von udo1toni; 16.06.2017, 13:39.

                Kommentar

                Lädt...
                X