Ankündigung

Einklappen
Keine Ankündigung bisher.

Openhab Regelwerk

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

    Openhab Regelwerk

    Hallo zusammen,

    zuerst einmal um mich vorzustellen, ich bin Michael aus Köln, ich nutze vorwiegend Openhab und (nicht lynchen) Z-Wave. Ich bin also im wesentlichen hier um Austausch und Supportmöglichkeiten bezüglich Openhab und Habmin zu nutzen. Sollte das nicht gewollt sein, bitte melden, dann muss ich mir anderweitigen Kontakt zu dem Thema suchen.


    Dazu muss ich auch direkt mit einer Frage zu einer Regel die ich Habmin gebastelt habe aufwarten:

    // Imports
    import org.openhab.core.library.types.*
    import org.openhab.core.persistence.*
    import org.openhab.model.script.actions.*

    // Global Variables

    rule "Fenstersteuerung"
    when
    Time cron "0/20 * * * * ?"
    then
    if ((Licht_Sensor_Tuer.historicState(now.minusMinutes (10)).state == 0)) {
    if ((Jalousie5.state != 0)) {
    sendCommand(Jalousie5, OFF)
    }


    Die Jalousie soll also immer dann runter fahren, wenn der Sensor schon über 10 Minuten auf 0 steht. Aber irgendwie klappt das ganze nicht. Der Server sendet das Signal dauerhaft raus, sobald die Regel ausgeführt wird.
    Ich habe das ganze auch schon mit "Wert kleiner 10" versucht, aber das führt zum selben Ergebnis.

    Verstehe ich das einfach falsch oder habe ich einfach nen totalen Denkfehler? Oder hat openhab bei mir da nen Bug?

    Danke falls einer helfen kann

    Grüße
    Mike


    ---

    Äh sorry kann das jemand nach Openhab verschieben? Direkt falsch gepostet :/

    #2
    Zitat von Elfearo Beitrag anzeigen
    ich nutze vorwiegend Openhab und (nicht lynchen) Z-Wave.
    Super! Dann bist Du hier (openHAB - KNX-User-Forum) genau richtig. Nicht davon irritieren lassen, dass dies ein Unterforum des knx-user-forums ist, das ist eher historisch begründet (auch wenn viele mit openHAB knx automatisieren darf jeder gerne andere Dinge nutzen )


    // Imports
    import org.openhab.core.library.types.*
    import org.openhab.core.persistence.*
    import org.openhab.model.script.actions.*

    // Global Variables

    rule "Fenstersteuerung"
    when
    Time cron "0/20 * * * * ?"
    then
    if ((Licht_Sensor_Tuer.historicState(now.minusMinutes (10)).state == 0)) {
    if ((Jalousie5.state != 0)) {
    sendCommand(Jalousie5, OFF)
    }
    Wahrscheinlich hast Du es nur vergessen, hier zu posten, aber am Ende fehlt noch ein end.

    Ich denke, die Abfrage
    Code:
    if ((Jalousie5.state != 0))
    wird immer matchen, denn .state liefert einen Status, keine Zahl. Du kannst eventuell mit
    Code:
    as DecimalType
    eine Typumwandlung erzwingen, oder besser (weil kein Gefrickel) 1. die Jalousie in die gewünschte Position fahren und anschließend an der osgi-Console mittels
    Code:
    openhab status Jalousie5
    nachschauen, welchen Status die Jalousie in der Position tatsächlich hat (vermutlich DOWN).
    Wahrscheinlich ist es auch günstiger, erst den Status der Jalousie als Bedingung auszuwerten, weil für den historicState jedesmal eine Datenbankabfrage ausgeführt werden muss, der aktuelle Status ist aber direkt in der openhab-Registry vorhanden.

    Kommentar


      #3
      Ich würde die Regel noch etwas schlanker gestalten. Der Cron-Timer ist eigentlich überflüssig:

      Code:
      var Timer tJalousie =null
      ...
      rule "Fenstersteuerung"
      when
      Licht_Sensor_Tuer.stage changed to 0
      then
      
      createTimer(tJalousie.plusminutes(10)) [|
      sendCommand(Jalousie5, OFF)]
      
      end
      Also wenn der Sensor den Status 0 liefert - wird ein Timer erzeugt, der 10min später die Jalousie schließt.

      Das kann man dann noch beliebig verfeinern mit der Abfrage nach dem Jalousie Status (kannst du aber auch übergehen - wenn die Jalousie geschlossen werden soll, ist der vorherige Status ja egal). Aber so hast du keinen wiederkehrenden Cron job der das System belastet.

      Kommentar


        #4
        Halli hallo,

        dann bin ja beruhigt, es gibt ja teilweise diese Foren, welche sich auf ein Thema einschiessen und nichts anderes akzeptieren. Vielen dank schon mal für eure Ansätze.

        @udo1toni

        Ich habe gerade versucht das zu testen. Leider gibt es bei mir im Linux den Befehl openhab gar nicht. Die osgi-Console habe ich bisher auch noch nie ausprobiert, keine Ahnung ob überhaupt vorhanden bei mir (rapsberry pi mit raspbian und aktuell noch openhab 1.5)

        Ich sehe aber in meinem Openhab immer:
        Jalousie5 state updated to OFF


        Habe es jetzt getestet mit Off und hänge wieder im Dauerloop, kurioserweise ignoriert er auch meinen Cron und führt es bei jedem Update der Jalousien erneut aus :/

        Regel aktuell:

        rule "Fenstersteuerung"
        when
        Time cron "0/20 * * * * ?"

        then
        if ((Licht_Sensor_Tuer.historicState(now.minusMinutes (10)).state == 0)) {
        if ((Jalousie5.state != OFF)) {
        sendCommand(Jalousie5, OFF)
        }
        end
        Openhab log:


        2015-02-14 19:39:22 - Jalousie5 received command OFF
        2015-02-14 19:39:22 - Jalousie5 state updated to OFF
        2015-02-14 19:39:42 - Jalousie5 received command OFF
        2015-02-14 19:39:42 - Jalousie5 state updated to OFF
        2015-02-14 19:40:42 - Jalousie5 received command OFF
        2015-02-14 19:40:42 - Jalousie5 state updated to OFF

        usw.


        @Tulamidan

        Bestünde dann nicht das Risiko, wenn z.B. ein Autolicht auf den Sensor leuchtet, dass der Timer auslöst und möglicherweise mitten in der Nacht alle Jalousien hoch gehen? Natürlich besteht das Risiko bei meiner Regel auch, aber eben nur dann, wenn der Sensor für 15 Minuten angeleuchtet wird.

        Kommentar


          #5
          Mit deinen Bedenken hast du Recht. Ein Auto würde dir die Jalousien wieder öffnen das ist natürlich nicht so doll.
          Du könntest in den timer noch mal ein if statement einbauen( wenn 10min später immer noch hell/dunkel ist). Das müsste eigentlich klappen und dann das Auto Problem lösen.

          Kommentar


            #6
            Also, die osgi-console ist das Fenster, was auf geht, wenn Du mit ./start.sh openHAB startest. Also das Fenster, in dem Du alle Informationen wie Statusänderungen usw. siehst.
            Da Du den Status auch so siehst, musst Du natürlich nicht exta den Befehl eintippen
            Was mich etwas wundert ist, dass Du einen State OFF empfängst. Wobei das evtl. an Z-Wave liegen mag, hab ich nicht im Einsatz. Vielleicht liegt es aber auch daran, wie Du Dein Item definiert hast.
            Normalerweise sollte jedenfalls ein Rollershutter-Item die Statu UP und DOWN (oder doch 0 und 100?) zurückliefern.

            Was Deine Befürchtung ob des Scheinwerfers betrifft: Die rule wird ja nur getriggert, wenn der Sensor kein Licht mehr erkennt (changed to 0), dann wird der Timer gestartet, wenn der abgelaufen ist, Wird die Jalousie geschlossen.

            Eine elegante Möglichkeit, die Jalousien ganz unabhängig von vorbeifahrenden Autos zu steuern ist übrigens das Astro-Binding, was sogar eine komfortable Möglichkeit bietet, z.B. 10 Minuten vor einem Ereignis eine Aktion auszulösen:
            Code:
            Switch Sunrise_Event  "Aufgang [%s]" (MyAstro) {astro="planet=sun, type=rise, property=start, offset=-25"}
            Dann reicht eine Regel
            Code:
            [...]
            when
            Item Sunrise_Event changed to ON
            then
            [...]
            und die Jalousien fahren 25 Minuten vor Sonnenaufgang auf ganz ohne Sensor.

            Kommentar


              #7
              Zitat von Tulamidan Beitrag anzeigen
              Ein Auto würde dir die Jalousien wieder öffnen
              Sehe ich nicht so, jedenfalls nicht die Regel, die hier zu sehen ist. Da gibt es gar keinen Befehl zum Öffnen der Jalousie...

              Kommentar


                #8
                Oh sorry, klar in der aktuellen Regelung geht da gar nix hoch. Ich habe die Rule vereinfacht geschrieben, natürlich soll sie später auch aufs Gegenteil reagieren und die Jalousie herauffahren.

                Starten tue ich Openhaben über den Befehl:
                service openhab start

                also als Service, da kriege ich kein direktes Feedback. Aber über die Logs sehe ich denke ich alles was ich brauche, nur so Live-Statusabfragen gehen natürlich leider nicht.

                Hier ist mal meine Item definition, vielleicht hab ichs ja da versaubeultelt?

                Rollershutter Jalousie5 "Jalousie Männerzimmer" <rollershutter> (Jalousien) {zwave="8:command=SWITCH_MULTILEVEL,refresh_interv al=30" }
                Und nur mal als Fullquote, die gesamte Rule mit allen Jalousien und mit auf und ab, nicht damit ich hier mit Halbzitaten irgendwas weggelassen habe, wo nachher der Fehler dran hängt:

                // This rule file is autogenerated by HABmin.
                // Any changes made manually to this file will be overwritten next time HABmin rules are saved.

                // Imports
                import org.openhab.core.library.types.*
                import org.openhab.core.persistence.*
                import org.openhab.model.script.actions.*

                // Global Variables

                rule "Fenstersteuerung"
                when
                Time cron "0/20 * * * * ?"

                then
                if ((Licht_Sensor_Tuer.historicState(now.minusMinutes (10)).state == 0)) {
                if ((Jalousie5.state != OFF)) {
                sendCommand(Jalousie5, OFF)
                }

                if ((Jalousie6.state != OFF)) {
                sendCommand(Jalousie6, OFF)
                }

                if ((Jalousie7.state != OFF)) {
                sendCommand(Jalousie7, OFF)
                }

                if ((Jalousie8.state != OFF)) {
                sendCommand(Jalousie8, OFF)
                }

                if ((Jalousie9.state != OFF)) {
                sendCommand(Jalousie9, OFF)
                }

                if ((Jalousie10.state != OFF)) {
                sendCommand(Jalousie10, OFF)
                }

                if ((Jalousie3.state != OFF)) {
                sendCommand(Jalousie3, OFF)
                }

                if ((Jalousie4.state != OFF)) {
                sendCommand(Jalousie4, OFF)
                }
                }
                else if ((Licht_Sensor_Tuer.historicState(now.minusMinutes (10)).state > 900)) {
                if ((Jalousie5.state < 90)) {
                sendCommand(Jalousie5, ON)
                }

                if ((Jalousie6.state < 90)) {
                sendCommand(Jalousie6, ON)
                }

                if ((Jalousie7.state < 90)) {
                sendCommand(Jalousie7, ON)
                }

                if ((Jalousie8.state < 90)) {
                sendCommand(Jalousie8, ON)
                }
                }
                end

                Kommentar


                  #9
                  Zitat von Elfearo Beitrag anzeigen
                  Starten tue ich Openhaben über den Befehl:
                  service openhab start

                  also als Service, da kriege ich kein direktes Feedback. Aber über die Logs sehe ich denke ich alles was ich brauche, nur so Live-Statusabfragen gehen natürlich leider nicht.
                  Kommt natürlich drauf an, welches Script Du verwendest wenn Du das Script mit screen einsetzt, reicht ein
                  Code:
                  sudo -u openhab-user screen -r openhab
                  aus, um auf die osgi-Console zu wechseln. Wenn der aktuelle User auch der openhab-user ist und keine weitere screen-session läuft, reicht sogar ein
                  Code:
                  screen -r
                  um auf die osgi-Console zu wechseln.
                  Alternativ ist, wenn ich mich recht erinnere, bei dem anderen Startscript ein Telnet-Zugang eingerichtet, dann reicht ein
                  Code:
                  telnet localhost:port
                  um auf die osgi-Console zu wechseln, und dann musst Du, glaube ich, nichtmal das 'openhab' vor den Befehl setzen (kannst Du mit 'help' ausprobieren, ist die Help-Liste sehr lang, musst Du 'openhab help' eintippen).

                  Ich hab mal bei mir (knx) nachgeschaut, da liefert der Status entweder 0 oder 100 zurück. Dabei steht 100 für geschlossen und 0 für offen(!) vielleicht hängt es ja daran.
                  Spaßeshalber kannst Du in den rules auch ein logging einbauen, mit logInfo(Quelle,Meldung,Variable) kannst Du dann bequem den Status oder was auch immer zu jedem beliebigen Zeitpunkt ausgeben, den findest Du dann natürlich in openhab.log, ist ja eine Meldung, kein Event.

                  Kommentar


                    #10
                    Huhu habs grad mal überprüft, also 99 gibt er mir als Status aus, nachdem ich alle geöffnet habe.

                    Ich komme noch nicht so wirklich mit den Feinheiten und der Programmierung von Openhab klar, aber ich bin jetzt einfach den Umweg gegangen und habe das Refresh interval der Rollade gesteigert, damit gibt sie jetzt öfter den Status zurück.


                    Aktuell ist also angebl. 99 bei offen.

                    Geschlossen dagegen gibt mir im Log aus:
                    2015-02-15 17:04:49 - Jalousie5 state updated to DOWN
                    2015-02-15 17:04:49 - Jalousie5 received command DOWN
                    2015-02-15 17:06:43 - Jalousie5 state updated to 0

                    Also erst Updatet er den State zu Down und zwar in dem Moment wo ich sie runter fahre und dann zu 0. Kann es sein, dass hier mein Problem liegt?

                    Durch das ausführen der Rule wird der Status auf Down gesetzt und dann später auf 0? Ich werde die Rule mal versuchen zu verfeinern, dass er nur dann runter sendet, wenn es weder 0 noch Down ist.


                    Sorry für das viele hin und her, ggf. ist es am Ende ein simpler Fehler, der meiner Anfängerhaftigkeit geschuldet ist.

                    Kommentar


                      #11
                      Na das ist sehr seltsam. Wenn man im images-Ordner nachschaut, kann man ja gut sehen, dass der DOWN-Status als Zahl 100 zurückgeben müsste und der UP-Status die 0 (anhand der Bilder für geschlossenen und offenen Laden).
                      Und der Status dürfte auch nicht "einfach so" auf einen anderen Wert springen, also ohne dass es zeitnah eine Aktion des Aktors gab.

                      Leider hab ich von zwave keine Ahnung, da muss also jemand anderes einen Blick drauf werfen.

                      In der Beschreibung für das zwave-Binding hab ich noch einen optionalen Parameter invert_state=true gefunden, eventuell hilft der, dass der korrekte Status rückgemeldet wird. Andererseits wird ja der Befehl schon richtig ausgeführt...

                      Wenn ich richtig informiert bin, ist der Entwickler des zwave-Bindings nur bei Google-Groups unterwegs, im englischen Forum.

                      Kommentar


                        #12
                        Hiho,

                        also ich habe jetzt meine Config auf den Pi2 übertragen.
                        Im übrigen habe ich jetzt auch die normale installation gewählt und kann jetzt auch per osgi console stati abfrafgen etc.

                        Also bei mir ist 99 definitiv oben und 0 unten.


                        Er schickt es raus und ich kann es abfragen, aber das Ding macht weriter die Fehler.


                        Grüße
                        Mike

                        Kommentar


                          #13
                          Ich glaube ich habe es gefunden. Ich vermute es lag an dem "off" Befehl den ich sende. Dieser scheint kurzzeitig den Status auch auf off gesetzt zu haben und damit eine Loop verursacht zu haben.

                          Ich habe es jetzt auf 99 für öffnen und 0 für geschlossen umgestellt, seitdem keine Probleme.

                          Jetzt nur noch eine letzte Frage, bevor die Regel m.E. so okay ist:

                          Ich kämpfe noch mit den zeiten, wäre das okay so? :

                          Time cron "0 0 10 * * ?"
                          or
                          Time cron "0 0 11 * * ?"
                          or
                          Time cron "0 0 12 * * ?"
                          or
                          Time cron "0 0 13 * * ?"
                          or
                          Time cron "0 0 18 * * ?"
                          or
                          Time cron "0 30 18 * * ?"
                          or
                          Time cron "0 0 19 * * ?"
                          or
                          Time cron "0 30 19 * * ?"
                          or
                          Time cron "0 0 20 * * ?"
                          or
                          Time cron "0 30 20 * * ?"
                          or
                          Time cron "0 0 21 * * ?"
                          or
                          Time cron "0 30 21 * * ?"
                          or
                          Time cron "0 0 22 * * ?"
                          or
                          Time cron "0 0 23 * * ?"


                          Ich will es also zu verschiedenen Stunden auslösen, damit es nicht mal morgens um 3 hoch geht, oder Mittags um 4, deshalb die Ausführung nur zu definierten Stunden. Geht das so?

                          Kommentar


                            #14
                            Ich verstehe ehrlich gesagt nicht, was Du damit bezweckst... !?!

                            Kommentar


                              #15
                              Hi,

                              ich möchte die Regelausführung nur zu bestimmten Zeiten haben. Bezwecken soll das ganze, dass man .z.B. auch mal Mittags eine Jalousie manuell runter machen kann oder hoch, ohne das die Regel sofort zuschlägt und quasi den Jalousiezustand der aktuellen Zeit aufzwingt.

                              Gleichzeitig soll die Regel erst ab 10 Uhr ausgeführt werden, da ich keine Lust habe v.a. am Wochenende früh geweckt zu werden, weil es draussen schon hell ist.


                              Oder gibt es da eine elegantere Methode? Ich hab leider noch nicht ganz gerafft, wie ich innerhalb einer Regel z.B. einfach sagen könnte "machs nicht vor 10 Uhr", deshalb dieser Weg, bei dem die Regel vor 10 einfach nicht ausgeführt wird.

                              Stand jetzt scheint es bei der vollen Stunde zu klappen, bei den halben nicht. Irgendwas hab ich da noch falsch

                              Grüße
                              Michael

                              Kommentar

                              Lädt...
                              X