Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit der Rule "Sunset"

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

    [Codebeispiel] Problem mit der Rule "Sunset"

    Hallo Leute,

    ich habe ein Problem mit der Rule "Sunset" in Openhab.
    Ich möchte z.B. die Außenbeleuchtung einschalten, sobald die Sonne untergeht.
    Ich bekomme die Zeit vom Sonnenuntergang aber irgendwie nicht ins Openhab.
    Habe mir daher den Code von einer anderen Seite kopiert (API-Code erstmal egal).
    Da sind aber noch Klinken drin, die ich nicht finde.
    Weitere Infos:

    Ich habe openhab auf dem Raspberry laufen.
    Das Verzeichnis ist

    /opt/openhab

    Meine Settings sind folgende:


    /opt/openhab/configuration/items
    Haus.item

    Code:
    /* Sonnenuntergang */
    String  strSunset     "Sunset [%s]"    <clock>    { http="<[http://api.wunderground.com/api/3f7804104c56181a/astronomy/q/LI/schaan.xml:21600000:XSLT(wunderground_sunset.xsl)]" }

    /opt/openhab/configuration/rule
    sunset.rule

    Code:
    import org.joda.time.*
    
    var Timer tIndoorLights
    
    rule "React to sunset"
    when 
            Time cron "0 0 16 * * ?"   // Every day 16:00 hours, evaluate sunset
    then
        var year   = now.getYear
        var month  = now.getMonthOfYear
        var day    = now.getDayOfMonth
        var datum  = year+"-"+month+"-"+day+" "+strSunset.state
        logInfo("Sunset","datum = " + datum)
        var DateTime sunset = parse(year+"-"+month+"-"+day+"T"+strSunset.state)
        
        /*
         * Indoor Lights
         */
         // Cancel timer to avoid reschedule
        if(tIndoorLights!=null) {
            logInfo("Sunset","Timer tIndoorLights cancelled") 
            tIndoorLights.cancel()
        }
        logInfo("Sunset","Timer tIndoorLights created") 
        tIndoorLights = createTimer(sunset.minusMinutes(15)) [|
            logInfo("Sunset","Timer tIndoorLights executed") 
            gSunset?.members.forEach(Switch|
                    sendCommand(Switch, ON)
            )
        ]
    end

    opt/openhab/configuration/transform
    wunderground_sunset.xls

    Code:
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
            
            <xsl:output indent="yes" method="xml" encoding="UTF-8" omit-xml-declaration="yes" />
    
            <xsl:template match="/">
                    <!-- format: hh:mm:ss -->
                    <xsl:value-of select="//sunset/hour/text()" /><xsl:text>:</xsl:text><xsl:value-of select="//sunset/minute/text()" /><xsl:text>:00</xsl:text>
            </xsl:template>
    
    </xsl:stylesheet>
    Irgendwie haut das bei mir nicht hin.
    Habe ich da noch Fehler drin?
    Ist sicherlich nur eine Kleinigkeit.
    Wäre nett wenn mir jemand dabei helfen könnte.
    Ich kenne mich mit den Rules und der Syntax noch nicht so aus.

    Gruß
    The Yankee

    #2
    Hallo,

    nimm doch einfach das Astro-Binding.

    Gruß,
    Martin

    Kommentar


      #3
      Was genau tut denn nicht?
      Wird die regel ausgeführt um den Timer zu erstellen?

      Hast du irgendwelche Einträge im openhab.log?

      Hast du OH mal im debug modus laufen lassen wenn der Timer erstellt worden ist? Und wenn er ausgeführt werden sollte?

      Vom ersten Blick her sehe ich keine Issues. Das http Binding hast du im addon Folder?

      Grüsse
      Karsten

      Kommentar


        #4
        Und Deine Regel kannst Du dann auch direkt vom Sonnenstand abhängig machen. Dazu kannst Du folgende Regel verwenden:

        Code:
        rule "Dawn_Rule"
        when
            System started or
            Item Sun_Elevation changed
        then
            postUpdate(Sun_DawnTwilight_Solar,          if ( Sun_Elevation.state < 0   ) { ON } else { OFF } )
            postUpdate(Sun_DawnTwilight_Civil,          if ( Sun_Elevation.state < -6  ) { ON } else { OFF } )
            postUpdate(Sun_DawnTwilight_Nautical,       if ( Sun_Elevation.state < -12 ) { ON } else { OFF } )
            postUpdate(Sun_DawnTwilight_Astronomical,   if ( Sun_Elevation.state < -18 ) { ON } else { OFF } )
        end
        und

        Code:
        rule "Rollos_Abends_runter_1"
        when
            Item Sun_DawnTwilight_Solar changed to ON
        then
        ....
        BTW: Meine Dämmerungs-Switches sind aus astronomischer Sicht nicht ganz korrekt, weil sie die ganze Nacht auf ON stehen. Korrekterweise dauert die Dämmerung aber nicht die ganze Nacht. Für die Automatisierung ist das bei mir aber vollkommen irrelevant.


        Oder noch besser, wenn Du das Astro-Binding in der Version 1.6.0 nimmst (ist auf obiger Seite verlinkt). Da kannst Du diese Dämmerungen direkt aus dem Binding erhalten - ohne weitere Regeln.

        Gruß,
        Martin

        Kommentar


          #5
          Hallo Leute,

          danke für den Tip mit dem Astro-Binding.

          Habe auch alles von der Astro-Binding-Wiki in meine Settings eingebaut.
          Hat alles gut geklappt...

          aber:

          Jetzt möchte ich die Außenbeleuchtung bei Sonnenuntergang einschalten.
          Habe dafür folgende Rule erstellt:

          Meine Items:

          Code:
          Number   	Azimuth        			"Azimuth [%.2f]"         											{astro="type=AZIMUTH"}
          Number   	Elevation      			"Elevation [%.2f]"       											{astro="type=ELEVATION"}
          
          DateTime 	Sunrise_Time   			"Sonnenaufgang [%1$tH:%1$tM]"  										{astro="type=SUNRISE_TIME"}
          DateTime 	Noon_Time      			"Noon [%1$tH:%1$tM]"     											{astro="type=NOON_TIME"}
          DateTime 	Sunset_Time    			"Sonnenuntergang [%1$tH:%1$tM]"   									{astro="type=SUNSET_TIME"}
          
          Switch   	Sunrise_Event                           													{astro="type=SUNRISE"}
          Switch   	Noon_Event                              													{astro="type=NOON"}
          Switch   	Sunset_Event                            													{astro="type=SUNSET"}

          Rule Licht an (Soll bei Sonnenuntergang passieren)
          Code:
          rule "Licht Vordertuer an"
              when
                  Item Sunset_Event receive command ON
              then
                  sendCommand(Licht_Aussen_Vordertuer, ON)
          end

          Licht aus (Soll um 22:30 passieren)

          Code:
          rule "Licht Vordertuer aus"
          
          when
          
                  Time cron "30 22 0 * * ?"   // taeglich 22:30
          
          then
          
                  sendCommand(Licht_Aussen_Vordertuer, OFF)
          
          end

          Die Rules werden geladen, aber nicht abgearbeitet. Es passiert auch nichts auf dem Bus.
          Ist da noch ein Fehler in der Syntax?

          Kann ich auch beide Bedingungen in eine Rule schreiben?
          Wenn ja, worauf muss ich da achten?

          Kommentar


            #6
            Moin,

            ähm ich so als openhab Anfänger, deine knx GAs hast du aber schon mit in den Items drin??

            Gruss
            PhilW
            Google oder Wiki-Hilfe-Hinweise nehme ich nur an wenn sie mich total blamieren..... dann ertrage ich sie auch in Demut und Dankbarkeit;-)

            Kommentar


              #7
              Zitat von Yankee0815 Beitrag anzeigen
              Code:
              rule "Licht Vordertuer an"
                  when
                      Item Sunset_Event receive command ON
                  then
                      sendCommand(Licht_Aussen_Vordertuer, ON)
              end
              Es sollte received heißen :-)
              Licht aus (Soll um 22:30 passieren)

              Code:
              rule "Licht Vordertuer aus"
              
              when
              
                      Time cron "30 22 0 * * ?"   // taeglich 22:30
              
              then
              
                      sendCommand(Licht_Aussen_Vordertuer, OFF)
              
              end
              Da es sich um Quartz-cron handelt, triggerst Du auf 0 Uhr 22 Minuten und 30 Sekunden. Wäre es das normale Linux-Cron, würdest Du auf 22:30 triggern, allerdings an keinem Tag (der nullte Tag im Monat). Für openHAB sollte es "0 30 22 * * ?" heißen
              Kann ich auch beide Bedingungen in eine Rule schreiben?
              Eher nicht. Du könntest natürlich eine Rule auf beide Ereignisse triggern lassen, müsstest dann aber anschließend doch wieder schauen, welches Ereignis nun eingetreten ist.

              Kommentar


                #8
                Hat Super geklappt.
                Die Zeit hatte ich falsch angegeben.

                Danke für die Tips...

                Kommentar


                  #9
                  immer gerne :-)

                  Kommentar

                  Lädt...
                  X