Ankündigung

Einklappen
Keine Ankündigung bisher.

Rechnen mit Datum/Uhrzeiten in openHAB2 Rules

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

    Rechnen mit Datum/Uhrzeiten in openHAB2 Rules

    Hallo Leute,

    seit dem Umstieg auf openHAB2 habe ich mit dem Events für Sonnenauf- und Untergang zu kämpfen. Der Event über das Astro-Plugin wird ja in OH2 derzeit nicht unterstützt. Das ist einerseits kein Problem, da ich einen Helligkeitssensor in der Wetterstation auf dem Dach habe und damit dann meine Rollläden steuere.
    In einem anderen Gebäude gibt es aber keine Wetterstation und derzeit auch keine anderen Außensensoren, somit habe ich diverse Forenbeiträge aufgegriffen und versuche in den rules den Sonnenaufgang über die vom Astro-Plugin gelieferten Werte

    { channel="astro:sun:local:rise#start" } und { channel="astro:sun:local:set#start" }

    zu lösen, mit Berechnungen.

    Leider habe ich keine einzige Lösung in den Foren etc. gefunden, die in meinem Kontext funktioniert.

    Ich verwende die Methoden "plusMinutes(xx)" und "minusMinutes(xx)" bei eigenen Variablen oder Items. Leider wirft das immer eine Fehler aus. Ich habe das Gefühl, dass das mit diesen beiden Methoden nur in Verbindung mit Timern richtig funktioniert.

    Hier mal ein Beispiel, dass ich ausprobiert habe:

    // Test-Regel Datumsvergleich
    rule "Test_OnTimer"
    when
    Time cron "0 /1 * * * ?"
    then
    // Variable fuer Zeitberechnungen
    var String timTimestamp = String::format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", new Date())
    logInfo("Test_OnTimer", "Aktueller Zeitstempel: " + timTimestamp)
    var year = now.getYear
    var month = now.getMonthOfYear
    var day = now.getDayOfMonth
    var datum = year+"-"+month+"-"+day+" "+Sun_Sunrise_Time.state <--- das funktioniert, ist aber bei den Jahreszahlen
    doppelt gemoppelt, da dies im Datumswert mit drin ist
    logInfo("Test_OnTimer", "Sonnenaufgang: " + datum)

    var DateTime datSunrise = Sun_Sunrise_time.state <--- das funktioniert noch
    logInfo("Test_OnTimer", "Sonnenaufgang: " + datSunrise)

    datSunrise = datSunrise.plusMinutes(30) <--- hier kommt nun die Fehlermeldung
    logInfo("Test_OnTimer", "Sonnenaufgang + 30 Minuten: " + datSunrise)
    end


    Was z. B. auch nicht geht ist folgendes: Der Ansatz die Minuten bis zum Sonnenaufgang ab Mitternacht berechnen, dann so gegen 04:00 Uhr eine cron laufen lassen und dann aus der Differenz von 04:00 Uhr und Mitternacht einen Timer generieren, der dann nach Ablauf (also zu Sonnenaufgang) z. B. die Rollos hochfährt.

    .....
    // Sonnenaufgangszeit in Variable holen
    var DateTime datSunrise = Sun_Sunrise_time.state <-- Sonnenaufgangsdatum und -uhrzeit holen vom Astro-Plugin
    // Minuten berechnen, von Mitternacht ab
    var int intSunriseMinutes = (datSunrise.getHourOfDay() * 60) + datSunrise.getMinuteOfHour()
    // cron Startzeit abziehen: 04:00 Uhr = 4 + 60 = 240 Minuten
    int SunriseMinutes = intSunriseMinutes - 240
    // Timer setzen und starten
    createTimer(now.plusMinutes(intSunriseMinutes)) [|
    //Rollos hoch
    ]
    ......

    Hier nun meine Fragen/Bitten:
    - es heißt doch, dass man in OH2 keine mathematischen oder sonstige Libraries mehr einbinden muss. Ist das richtig oder fehlt mir da vielleicht der eine oder andere import?
    - hat jemand ein funktionierendes Beispiel für die Berechnung des Sonnenaufgangs bzw. Hilfe/Tipps/URLs für funktionierende Beispiele oder Erklärungen für Nicht-Java-Könnende, die es aber gerne lernen würden?
    - sonstige Ansätze (außer den Einbau von Sensoren etc.)?

    Ich dank euch schon mal sakrisch für eure Antworten.

    Habe die Ehre
    Cornel aus bei München
    Zuletzt geändert von cornelw; 20.01.2017, 15:42.

    #2
    Hi,

    ich habe irgendwo im Internet ein Beispiel gefunden (weiss nicht mehr genau) und es für meine Bedürfnisse angepasst:

    Code:
    rule "Aktionen für Sonnenaufgang ausführen"
        when
            Time cron "0 0 2 * * ?"
        then
            logInfo("Zeit.rule", "Rule \"Aktionen für Sonnenaufgang ausführen\" gestartet")
    
      if (Timer_Sonnenaufgang != null)
      {
       logInfo("Zeit.rule", "Timer für Aktion Sonnenaufgang gestoppt")
       Timer_Sonnenaufgang.cancel
       Timer_Sonnenaufgang=null
      }
    
      var Integer akt_minuten
      var Integer sunrise_minuten
      var Integer warte_minuten
    
      // Sonnenaufgang in Minuten nach Mitternacht
      var DateTime sunrise = new DateTime((Sonnenaufgang.state as DateTimeType).calendar.timeInMillis)
    
      sunrise_minuten =  (sunrise.getHourOfDay * 60) + sunrise.getMinuteOfHour
    
      // aktuelle Minute, Berechnung kann evtl entfallen wenn die Regel immer zur selben Zeit läuft
      akt_minuten = (now.getHourOfDay() * 60) + now.getMinuteOfHour
    
      // Vergleich welche Zeit später ist und den Timer setzen, Differenz zur aktuellen Zeit
      warte_minuten = sunrise_minuten.intValue - akt_minuten.intValue
    
      logInfo("Zeit.rule", "Aktionen werden ausgeführt in: " + warte_minuten.toString + " Minuten")
    
      if (warte_minuten > 0)
      {
       Timer_Sonnenaufgang = createTimer(now.plusMinutes(warte_minuten)) [|
        // Aktion ausführen
        logInfo("Zeit.rule", "Aktionen für Sonnenaufgang werden JETZT ausgeführt")
        ....
       ]
      }  
      end

    lg
    Stefan

    Kommentar


      #3
      Hallo Stefan,

      vielen Dank, habe das eben ausprobiert und es scheint zu funktionieren. Wenn ich das so mit meinen Versuchen vergleiche, dann ist klar, dass an der einen und anderen Stelle in meinem Script was gefehlt hat, was zu den Fehlern führte.

      Danke nochmals dafür!

      Kommentar


        #4
        Ich hab es zwar noch nicht ausprobiert, aber die aktuelle Nightly sollte inzwischen Events beherrschen.

        Kommentar

        Lädt...
        X