Ankündigung

Einklappen
Keine Ankündigung bisher.

Rollladen bei Temperaturanstieg herunterfahren

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

    Rollladen bei Temperaturanstieg herunterfahren

    Mit dem Item „Number gTemp_Wohnzimmer "Wohnzimmer [%.1f °C]" <temperature> (gTemp) { knx="<4/1/1" }“ lese ich die Temperatur im Wohnzimmer aus und zeige sie in der OpenHAB-App an. Das funktioniert problemlos.

    Ich will nun um z. B. 09:00 die Temperatur auslesen, den Wert einer Variablen zuweisen und anschließend alle 10 Minuten durch „Time cron“ getriggert prüfen, ob die aktuelle Temperatur inzwischen 2° über dem Wert von 09:00 liegt. Sobald das der Fall ist, soll ein Rollladen herunterfahren (Verschattung). Hat mir jemand einen guten Tip, wie dazu die Variablen (Items) zu definieren und die Regeln zu programmieren sind?

    Im Voraus vielen Dank für nützliche Hinweise.

    #2
    Hallo uldd,


    ich denke, das ganze wirst Du in zwei Rules und zwei Items packen müssen.

    Eine Rule, die Dir immer um 9:00 Uhr den Temperaturwert in ein Item schreibt - dies ist Deine Referenz.
    Eine zweite Rule, die Du per cron zwischen 9 Uhr und z.B. 19 Uhr (bzw. 18:51 das letzte Mal) alle 10 Minuten triggern lässt, die Dir die aktuelle Temperatur einliest und den Vergleich mit deiner Referenz macht.

    Cron für Rule 1: "0 0 9 * * ? *"
    (Sekunde 0, Minute 0, Stunde 9, jeder Tag im Monat, jeden Monat, egal welcher Wochentag, jedes Jahr)


    Cron für Rule 2: "0 1/10 9-18 * * ? *"
    (Sekunde 0, Minute 1 alle 10 Minuten, Stunde 9-18, jeder Tag im Monat, jeden Monat, egal welcher Wochentag, jedes Jahr)

    Falls Du das ganze auf die Sommermonate beschränken willst, wäre diese Ergänzung passend:
    Cron für Rule 1: "0 0 9 * MAY-SEP ? *"
    Cron für Rule 2: "0 1/10 9-18 * MAY-SEP ? *"

    Die zweite Rule wird immer bei Minute "1" beginnend ausgeführt, also erstmals um 9:01, dann 9:11, 9:21, 9:31.... ansonsten werden beide Rules gleichzeitig getriggert und dann könnte es passieren, dass Deine Rule2 schon fertig ist, bevor Rule1 den aktuellen Temperaturwert eingelesen hat.


    Viele Grüße.
    Andreas

    Kommentar


      #3
      Hi,

      ich habe was Ähnliches gemacht. Hier mal als Beispiel:

      Code:
      root@kepler:/opt/openhab/configurations/rules# cat RolloAutomatik.rules
      import org.openhab.core.library.types.*
      
      // Verfahre die Rollos, wenn die Temperatur am Vormittag bereits 20°C erreicht hat
      // und die Sonne länger als 15 Minuten (SunshineDuration) mit 800 Lux (IlluminationTrigger)
      // scheint
      var Number IlluminationTrigger = 800    // Auslösende Beleuchtungssärke in Lux
      var Number TemperatureTrigger = 20      // Auslösende Temperatur in °C
      var Number SunshineDuration = 15        // Auslösende Dauer der gewählten Beleuchtungsstärke in Min.
      
      // Ende des Konfigurationsabschnits
      
      var Number TriggerAM = 0                // Zustand "Rollo-Regel vormittags" 0 -> noch nicht gefeuert, 1 -> gefeuert
      var Number SunshineCounter = 0          // Zaehler f. Anzahl der Helligkeitsmessungen
      
      rule "Rolloautomatik aktivieren"
              when
                      System started
              then
                      Rolloautomatik.sendCommand(ON)
                      TriggerAM = 0
      end
      
      rule "Rollo-Regel Tagesanfang"
              when
                      Time cron "0 20 8 * * ?"
              then
                      if (Rolloautomatik.state == ON) {
                              // Alle Rollos ohne Schlafen und Julian morgens begrenzt hochfahren
                              Rollo_Alle_o_SzJ_begr.sendCommand(OFF)
                      }
      end
      
      rule "Rollo-Regel Tagesende"
              when
                      Time cron "0 0 22 * * ?"
              then
                      if (Rolloautomatik.state == ON) {
                              // Alle Rollos nachts runterfahren und Trigger ruecksetzen"
                              Rollo_Alle.sendCommand(ON)
                      }
                      TriggerAM = 0
      end
      
      rule "Rollo-Regel vormittags"
              when
                      // Regel ist von 08:30 - 11:59 aktiv
                      Time cron "0 30-59 8 * * ?" or
                      Time cron "0 * 9-11 * * ?"
              then
                      logInfo( "Rolloautomatik.rule", "TriggerAM: " + TriggerAM + ", Helligkeit: " + Helligkeit_Carportdurchgang.state + ", Außentemperatur: " + IPWETemp.state)
      
                      if (Rolloautomatik.state == ON && TriggerAM == 0) {
      
                              logInfo( "Rolloautomatik.rule", "Status Item Rolloautomatik: " + Rolloautomatik.state)
      
                              if (Helligkeit_Carportdurchgang.state > IlluminationTrigger) {
                                      SunshineCounter = SunshineCounter + 1
                              } else {
                                      SunshineCounter = 0
                              }
                              logInfo( "Rolloautomatik.rule", "Sonnescheindauer > " + IlluminationTrigger + " Lux (SunshineCounter): " + SunshineCounter)
      
      
                              if ((SunshineCounter >= SunshineDuration && IPWETemp.state >= TemperatureTrigger) {
                                      logInfo( "Rolloautomatik.rule", "Mindessonnenscheindauer (" + SunshineDuration + ") und Mindestemperatur (" + TemperatureTrigger + ") erreicht.")
      
                                      TriggerAM = 1
                                      // do actions here
                                      logInfo( "Rolloautomatik.rule", "Beschatten. Helligkeit: " + Helligkeit_Carportdurchgang.state)
                                      callScript("beschattung.script")
                              }
                      }
      end
      
      rule "Rollo-Regel Info Automatik deaktiviert"
              when
                      Time cron "0 0 19 * * ?"
              then
                      if (Rolloautomatik.state == OFF) {
                              notifyMyAndroid('Rolloautomatik deaktiviert', 'Die Rolloautomatik ist derzeit deaktiviert. Rollos verfahren nicht automatisch.')
                      }
      end
      
      rule "Beschattung"
              when
                      Item Beschattung received command ON
              then
                      callScript("beschattung.script")
                      createTimer(now.plusSeconds(1)) [| Beschattung.sendCommand(OFF) ]
      end
      root@kepler:/opt/openhab/configurations/rules#
      Und hier noch das das Skript, das aufgerufen wird:

      Code:
      root@kepler:/opt/openhab/configurations/scripts# cat beschattung.script
      // Fahre gelistete Rollos in Beschattungsposition
      Rollo_KG_Hobbyraum.sendCommand(70)
      Rollo_EG_Bad.sendCommand(70)
      Rollo_DG_Bad.sendCommand(70)
      Rollo_EG_Wohnzimmer_Ost.sendCommand(70)
      Rollo_EG_Terrassentuer.sendCommand(70)
      Rollo_EG_Esszimmer.sendCommand(70)
      Rollo_EG_Kueche_Nord_West.sendCommand(70)
      Rollo_DG_Schlafen_Sued.sendCommand(70)
      Rollo_DG_Julian_Sued.sendCommand(70)
      root@kepler:/opt/openhab/configurations/scripts#
      Screenshot:
      image_33540.png
      Zuletzt geändert von thoern; 04.05.2016, 10:00.

      Kommentar


        #4
        Vielen Dank an imhofa und thoern – leider habe ich es noch nicht hinbekommen. Ich vermute mal, dass die Tatsache meiner Unerfahrenheit in Java und dabei speziell bei der Variablenbehandlung eine Rolle spielt.

        Die Temperatur habe ich als Item definiert
        Number gTemp_Wohnzimmer "Wohnzimmer [%.1f °C]" <temperature> (gTemp) { knx="<4/1/1" }
        also als float. Das funktioniert in der UI-Anzeige fehlerfrei.

        Im Rules-File habe ich nun die Variablen
        var Number deltaTemp = 2f // Differenztemperatur Erwärmung, ebenfalls float
        var Number refTemp // Referenztemperatur, darüber soll der Rollladen herunterfahren

        definiert.

        Meine Rules sind
        rule "Berechnung Referenztemperatur"
        when
        Time cron " 0 0 9 * * ? "
        then
        refTemp = gTemp_OG1W_Arbeiten_U + deltaTemp //Temperatur um 9:00 + 2,0°
        end

        Hier müsste nun ein Wert herauskommen, der 2° über der um 9:00 gemessenen Wohnzimmertemperatur liegt. Hier scheint aber schon etwas nicht zu stimmen.

        Anschließend soll dieser Wert alle 10 Minuten mit der nun aktuellen Wohnzimmertemperatur verglichen werden. Nur falls die Temperatur darüber liegt, soll der Rollladen herunterfahren - er tut es aber generell:
        rule "TempSchalten"
        when
        Time cron " 0 1/10 9-18 * * ? *"
        then
        if(gTemp_Wohnzimmer.state > refTemp) {
        sendCommand(Rolladen_Wohnzimmer, DOWN)
        }
        end

        Wo liegt mein / liegen meine Fehler?

        Im Voraus vielen Dank für Tips.

        Kommentar


          #5
          Hi,

          Erster Tipp: statt für die Referenz-Temperatur eine Variable zu nutzen, nimm lieber ein Item. Der erste Vorteil ist, dass der Wert in der UI zur Verfügung steht, falls Du ihn anzeigen willst, der zweite Vorteil ist, dass der Wert im gesamten System zur Verfügung steht, nicht nur in dem Rules-File, in welchem Du die Variable definierst.

          Ich bin mir nicht sicher, ob die Schreibweise 2f für deltaTemp zulässig ist, im Zweifel kannst Du den Wert auch als 2.0 schreiben. Oder Du definierst die Variable als Float, nicht als Number.

          Wenn Du in einer Rule auf den Status eines Items zugreifen willst, musst Du Item.state verwenden, eventuell ergänzt um as DecimalType (das dürfte hier der Fall sein), die entsprechende Zeile muss also vermutlich
          Code:
          [FONT=courier new]refTemp = (gTemp_OG1W_Arbeiten_U.state as DecimalType) + deltaTemp //Temperatur um 9:00 + 2,0°[/FONT]
          lauten. Um zu sehen, ob die Rule korrekte Werte liefert, bietet es sich an, eine Logzeile in openhab.log zu erzeugen:
          Code:
          logInfo("Reftemp","Referenztemperatur um 09:00 Uhr: {}",refTemp)
          Die Zeile kannst Du einfach noch vor dem end einfügen.

          In der Schalt-Rule sollte alles gut sein. Allerdings empfehle ich immer, statt der Action sendCommand(Item,Value) die Methode Item.sendCommand(Value)zu verwenden:
          Code:
          [FONT=courier new]Rolladen_Wohnzimmer.sendCommand(DOWN)[/FONT]
          Hintergrund ist, dass seit ca. OH1.8.1 das Verhalten der Action nicht deckungsgleich zur Methode ist, die Action funktioniert häufig nicht wie erwartet.
          Die geschwungenen Klammern sind in diesem Fall unnötig, da die Anweisung die einzige im if-Block ist - Aber vielleicht möchtest Du dort auch ein logInfo einbauen, dann...

          Das Ganze ist übrigens nicht Java, sondern eine DSL, aufbauend auf XText und XTend. Es gibt also starke Ähnlichkeiten zu Java, aber nicht alles, was in Java selbstverständlich funktioniert, funktioniert auch in den openHAB Rules (natürlich gilt das auch umgekehrt).

          Kommentar

          Lädt...
          X