Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeitschaltuhr Openhab

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

    Zeitschaltuhr Openhab

    Schönen Sonntag miteinander,

    ich bräuchte Hilfe bei folgendem Codefragment:

    import org.openhab.core.library.types.*
    import org.openhab.core.persistence.*
    import org.openhab.model.script.actions.*
    rule "LichtDecke_KG_Waschkueche ausschalten nach 20 Minuten"
    when
    Item LichtDecke_KG_Waschkueche changed from 0 to 1
    then

    createTimer(now.plusMinutes(20) [| sendCommand(LichtDecke_KG_Waschkueche, 1)]

    sendTelegram("bot1", "openHAB Test ...")
    end

    Ziel der Regel soll sein, bei Räumen die wenig genutzt werden und bei denen sich kein Bewegungsmelder rentiert, dass Licht nach 20 Minuten automatisch auszuschalten.

    Der Lichtstatus wird in Openhab richtig erkannt. In Grafana wir der Status auch richtig geschrieben mit 1.00 bzw, 0.

    Versucht habe ich die Quelle:

    https://klenzel.de/3125

    abzuändern, sodass Sie für meine Bedürfnisse passt - Leider ohne Erfolg.

    Gerne hätte ich das auch in einer Gruppe, aber vorerst würde es mir auch mit einem item genügen. Könnte mir da einer einen Tipp geben?

    Grüße

    Markus


    Zuletzt geändert von Markus784; 11.11.2018, 13:00. Grund: Formatierung stimmte nicht

    #2
    Nutzt Du openHAB2? Dann sind die aufgeführten imports so nicht nicht erlaubt. Allerdings brauchst Du sie in OH2 auch gar nicht
    Was für ein Binding nutzt Du denn für die Lampen? Normalerweise sollte ein Schalter mit einem Switch Item gebaut werden. Switch Items haben niemals einen Zustand 0 oder 1, sondern OFF oder ON.
    Grundsätzlich sollte die Rule so aussehen:
    Code:
    var Timer tWaschKueche = null
    
    rule "Lichtautomatik"
    when
        Item LichtDecke_KG_Waschkueche changed
    then
        if(tWaschKueche !== null) tWaschKueche.cancel
        if(LichtDecke_KG_Waschkueche.state == ON)
            tWaschKueche = createTimer(now.plusMinutes(20),[
                LichtDecke_KG_Waschkueche.sendCommand(OFF)
                sendTelegram("bot1", "openHAB Test ...")
                tWaschKueche = null
            ])
    end
    Die Rule triggert, sobald sich der Zustand des Lichts ändert. Zuerst wird ein eventuell laufender Timer abgebrochen. Ist das Licht eingeschaltet, wird ein neuer Timer angelegt. Wird vor Erreichen des Timers das Licht manuell ausgeschaltet, so wird der Timer von der Rule abgebrochen.
    Läuft der Timer ab, so wird der Code im Lambda ausgeführt. Das Licht wird ausgeschaltet, eine Nachricht wird versandt und zum Abschluss wird der Timer auf null gesetzt.

    Falls Du die Schalter tatsächlich mit Number Items realisieren musst, kannst Du natürlich statt des ON auch auf 1 abfragen und statt des OFF auch eine 0 senden.

    In diesem Post siehst Du auch, wie man richtig formatiert
    Zuletzt geändert von udo1toni; 11.11.2018, 14:52. Grund: Irgendein Fehler ist immer drin...

    Kommentar


      #3
      vielen Dank udo

      ja ich nutze openhab2.

      Es funktioniert jetzt natürlich :-)

      Darf ich dich noch 2 Verständnissachen fragen?

      1- Warum funktioniert das nicht mit 0 und 1 - hat das irgendeinen Grund? Ich hab jetzt gedacht, da es in grafana auch 1 und 0 schreibt, das es damit besser geht.

      und

      2. Wie mach ich das, dass das Licht vielleicht vorher dreißig Sekunden lang blinkt?

      Danke für eure und deine Hilfe!

      Kommentar


        #4
        Zu 1.: Naja, der Status ist halt ON oder OFF. openHAB (bzw. die verschiedenen Persistences und Bindings) setzt diese beiden Signale je nach Bedarf um. Grafana speichert am liebsten Zahlen, da ist es naheliegend, 1 und 0 zu nehmen.

        Zu 2.: Du kannst das mit einem entsprechenden Timer erledigen, wobei ich hier eine simple state machine empfehlen möchte. Du kannst Dir das Ganze wie einen mechanischen Programmschalter einer Spül- oder Waschmaschine vorstellen:
        Code:
        var Timer tWaschKueche = null
        var Number nWaschKueche = 0
        
        rule "Lichtautomatik"
        when
            Item LichtDecke_KG_Waschkueche changed
        then
            if(tWaschKueche !== null) tWaschKueche.cancel                 // alten Timer löschen, falls vorhanden
            nWaschKueche = 0                                              // Zähler auf 0
            if(LichtDecke_KG_Waschkueche.state == ON)                     // falls das Licht an ist
                tWaschKueche = createTimer(now.plusSeconds(20*60-30),[    // Timer anlegen
                    if(nWaschKueche < 21) {                               // Zähler Endstand nicht erreicht
                        nWaschKueche = nWaschKueche + 1                   // Zähler erhöhen
                        if(nWaschKueche % 2 == 1) {                       // falls ungerade
                            LichtDecke_KG_Waschkueche.sendCommand(OFF)
                            tWaschKueche.reschedule(now.plusMillis(700))
                        } else {                                          // falls gerade
                            LichtDecke_KG_Waschkueche.sendCommand(OFF)
                            tWaschKueche.reschedule(now.plusMillis(2300))
                        }
                    } else {                                              // Zähler Endstand erreicht!
                       LichtDecke_KG_Waschkueche.sendCommand(OFF)
                       sendTelegram("bot1", "openHAB Test ...")
                       tWaschKueche = null
                    }
                ])
        end
        Ich hoffe der Unterschied wird klar. Es gibt eine weitere Variable nWaschKueche, die wird verwendet, um das Blinken zu steuern.

        Innerhalb des Lambda wird diese Variable immer wieder überprüft.
        Solange sie kleiner als 21 ist, wird die Variable hochgezählt.
        Ist die Variable danach ungerade, wird das Licht ausgeschaltet und der Timer nach 700 Millisekunden erneut aufgerufen.
        Ist die Variable danach gerade, wird das Licht eingeschaltet und der Timer nach 2300 Millisekunden erneut aufgerufen.
        Sobald die Variable die 21 erreicht, wird das Licht ausgeschaltet und der Timer gelöscht.

        Natürlich müssen die 30 Sekunden vorher abgezogen werden, entsprechend läuft der 1. Timer schon nach 19 Minuten und 30 Sekunden ab.

        Weiterhin sollte man eine solche Lichtshow nur mit Lampen und Steuergeräten machen, die das auf Dauer aushalten.

        Kommentar


          #5
          Super. Danke für die Hilfe. Werd ich ausprobieren!

          Kommentar

          Lädt...
          X