Ankündigung

Einklappen
Keine Ankündigung bisher.

Garagentor Wächter

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

    Garagentor Wächter

    Hallo zusammen,

    ich plane derzeit einen "Switch" in meiner OpenHab Konfiguration welcher erst erscheint, wenn ein bestimmter Zustand eingetreten ist.

    Rule GaragentorWächter

    wenn das Garagentor seit 5 Minuten offen steht dann aktiviere einen Schalter, mit dem ich das Tor schließen kann.

    Frage: Wie kann ich einen Schalter definieren, welcher im Normal-Zustand nicht aktiv oder (besser noch) nicht sichtbar ist??

    Viele Grüße,
    Jörg

    #2
    In der Sitemap kannst Du Elemente bequem mit der visibility-Eigenschaft ausblenden:
    Code:
    Switch item=myItem visibility=[myContact!="CLOSED"]
    In diesem Fall ist der Switch myItem nur sichtbar, wenn der Kontakt myContact nicht geschlossen ist.
    Da Du das Ganze nach einer Verzögerung haben willst, musst Du natürlich ein virtual Item einführen, an das Du die visibility koppelst, dieses virtual Item kannst Du dann per Rule schalten.
    .items:
    Code:
    Contact myGarageDoor "Garage ist [MAP(contact_de.map):%s]" {...}
    Switch myGarageSwitch "Schließen" {...}
    Switch myGarageSwitchVis
    contact_de.map
    Code:
    OPEN=offen
    CLOSED=geschlossen
    -=-
    undefined=nicht verfügbar
    .sitemap:
    Code:
    Text item=myGarageDoor
    Switch item=myGarageSwitch visibility=[myGarageSwitchVis=="ON"]
    .rules
    Code:
    var Timer garageOpen = null
    
    rule "my GarageSwitch visibility"
    when
        Item myGarageDoor changed
    then
        if (myGarageDoor.state!=CLOSED)
            if(garageOpen==null)
                garageOpen=CreateTimer(now.plusMinutes(5),[
                    myGarageSwitchVis.postUpdate(ON)
                ])
        else {
            myGarageSwitchVis.postUpdate(OFF)
            garageOpen.cancel
            garageOpen = null
        }
    end
    Ohne Garantie, sollte aber so funktionieren

    Kommentar


      #3
      Hallo Udo,

      zunächst einmal VIELEN Dank direkt einen fertigen Code zu senden

      Leider funktioniert dieser nicht, der Designer hatte mir diverse Fehler angezeigt.
      Ich habe das Script dann an meiner Umgebung angepasst und die Fehler im Designer sind nach minimalen Änderungen auch verschwunden.

      Aber => es geht trotzdem nicht

      Items:
      Code:
      Contact Tor_Garage_o               { knx="0/8/15" }
      Contact Tor_Garage_u               { knx="0/8/16" }
      String  Tor_Garage                     "Garagentor        [MAP(de.map):%s]"  <garagedoor> (Garage)
      Switch myGarageSwitchVis
      Sitemap:
      Code:
      Text item=Tor_Garage
      Switch item=Lampe_EG_Flur visibility=[myGarageSwitchVis=="ON"]
      Ich habe erst einmal einen bestehenden Schalter genommen, um die Funktion zu testen

      Rules:
      Code:
      import org.openhab.model.script.actions.*
      
      var Timer garageOpen = null
      
      rule "Garagentorwaechter"
      when
          Item Tor_Garage_u changed
      then
       if (Tor_Garage_u.state!=CLOSED){
        if(garageOpen==null){
        garageOpen = createTimer(now.plusMinutes(2)) [|
         myGarageSwitchVis.postUpdate(ON)
         ]
        }
       } else {
        myGarageSwitchVis.postUpdate(OFF)
        garageOpen.cancel
        garageOpen = null
        }
      end

      Viele Grüße,
      Jörg
      Zuletzt geändert von JoergA; 19.11.2016, 14:58. Grund: Lösung gefunden und Script angepasst

      Kommentar


        #4
        Ah. Du hast zwei Kontakte, das verkompliziert die Sache etwas (aber unwesentlich...)
        Du könntest natürlich zwei Rules verwenden, aber im Zweifel sollte es auch mit einer Rule gehen, die muss dann natürlich auf beide Items triggern, aber sinnvollerweise nur, wenn das Tor in der entsprechenden Endlage ist. Gehen wir davon aus, dass die Kontakte geschlossen sind, wenn das Tor jeweilige Endlage hat, dann müsste es also heißen:
        Code:
        rule "Garagentorwaechter"
        when
            Item Tor_Garage_u changed to CLOSED or
            Item Tor_Garage_o changed to CLOSED
        then
            if (Tor_Garage_o.state==CLOSED) {
                if(garageOpen==null)
                    garageOpen = createTimer(now.plusMinutes(2), [|
                        myGarageSwitchVis.postUpdate(ON)
                    ])
            }
            else if (Tor_Garage_u.state==CLOSED)
                myGarageSwitchVis.postUpdate(OFF)
                if (garageOpen!=null) {
                    garageOpen.cancel
                    garageOpen = null
                }
        end
        Die Klammerungen sollten eigentlich unnötig sein, solange nur ein Befehl da steht, beim ersten if () { } folgt aber ein zweites if(), weshalb die Zuordnung für das else nicht mehr eindeutig ist.
        Im CreateTimer hatte ich tatsächlich den senkrechten Strich vergessen, Asche auf mein Haupt Ob man das Lambda hinter den Aufruf schreibt, oder mit Komma getrennt in den Aufruf, sollte eigentlich keine Auswirkungen haben.
        Weil der Else-Block durch den zweiten Kontakt aufgerufen werden kann, ohne dass ein Timer gestartet wurde, muss überprüft werden, ob der Timer existiert, bevor er gecancelled wird.
        Wie oben erwähnt, kannst Du auch zwei Rules definieren, die dann jeweils nur auf einen Kontakt reagieren. Dann kanst Du Dir natürlich die erneute Abfrage ersparen, welcher Kontakt die Rule getriggert hat.
        Zuletzt geändert von udo1toni; 19.11.2016, 15:30.

        Kommentar


          #5
          Hallöle nochmal,

          ich habe nun den "Taster" wie folgt in der Items angelegt:
          Code:
          Switch Garagentor    "Schließen"         { knx="1/2/3", autoupdate="false"}
          Damit toggeld der Schalter zwar nur kurz, aber ein Taster wäre schon schöner.

          In der Regel nutze ich nur die iOS App.

          Ich habe schon einige Threats hierzu gelesen, aber meistens wird nur auf den "Autoupdate" Parameter referenziert.
          Da diese auch meist schon älter sind, stellt sich mir die Frage, ob dies bereits umgesetzt ist?

          Viele Grüße,
          Jörg

          Kommentar


            #6
            Einen Taster bekommst Du in der Sitemap mit dem passenden Mapping (autoupdate="false" muss dabei auch gesetzt sein, damit der Knopf wieder raus springt):
            Code:
            Switch item=Garagentor visibility=[myGarageSwitchVis=="ON"] mappings=[ON="Los!"]

            Kommentar


              #7
              Perfekt, so finde ich die Lösung schon top und ist seit gestern live!
              Nun werde ich noch mit einem Icon experimentieren, da eine Lampe nicht so passend ist
              Oder wäre auch das folgende möglich
              • Ich habe ein Text Item für die Garage, welches natürlich immer sichtbar/aktiv ist und der Zustand (geschlossen - fährt - offen) wird als Icon korrekt dargestellt.
              • Könnte nun - wenn die Rule erfüllt ist - ein Taster in der gleichen Zeile erscheinen?
              • Und kann ich dieses auch in einer dynamischen Gruppe (also ohne Eintrag in der Sitemap) realisieren?
              Und: Lassen sich Tasten eigentlich in der Breite definieren?? Habe dazu nichts in der Hilfe gefunden.
              Ich habe z.B. einen 3-fach Taster für meinen Lüftungsaktor, welcher genau so breit ist wie dieser Einzel-Taster.

              Vielen Dank auch noch mal für Dein Update zu den beiden Kontakten.
              Ich habe mich jedoch entschlossen, nur den unteren abzufragen. ggfs. hat ja einer das Tor gestoppt bevor diesen den oberen Endschalter erreicht hat und nur der Impuls zum abfahren wurde nicht angenommen oder vergessen.

              Viele Grüße,

              Jörg

              Kommentar


                #8
                Ich habe dies nun wie folgt "gelöst"

                Items:
                Code:
                String Tor_Garage    "Garagentor [MAP(de.map):%s]"  <garagedoor> (Garage)
                Switch Garagentor    "Garagentor"   <garagedoor>   { knx="1/2/3", autoupdate="false"}
                Sitemap
                Code:
                Text item=Tor_Garage visibility=[myGarageSwitchVis=="OFF"]
                Switch item=Garagentor visibility=[myGarageSwitchVis=="ON"] mappings=[ON="schliessen!"]
                Somit is entweder oder zu sehen und der Wechsel geht so schnell, das er gar nicht auffällt

                Bleiben die Fragen zur Breite und dynamischen Gruppe, wozu ich ja dann visibility in der Items setzen müsste?

                Viele Grüße,
                Jörg

                Kommentar


                  #9
                  Update No. 2 von heute Abend

                  Ich habe den Teil zur Überwachung auf geöffnetes Tor jetzt in meine generelle Garagentor Regel übernommen.
                  Wenn dies von generellem Interesse ist, könnte ich alle Eintrage der Items/Sitemap etc. posten und vielleicht findet dies den Weg ins die Samples?

                  Code:
                  import org.openhab.model.script.actions.*
                  
                  var Timer garageOpen = null
                  
                   // Garage
                  
                  rule Garagentor
                  when
                   Item Tor_Garage_o changed or Item Tor_Garage_u changed or
                   System started
                  then
                   if (Tor_Garage_o.state == CLOSED && Tor_Garage_u.state == OPEN) {
                    Tor_Garage.postUpdate("OPEN")
                   } else if (Tor_Garage_o.state == OPEN && Tor_Garage_u.state == CLOSED) {
                    Tor_Garage.postUpdate("CLOSED")
                   } else {//if (Tor_Garage_o.state == OPEN && Tor_Garage_u.state == OPEN) {
                    Tor_Garage.postUpdate("MOVE")
                   }
                  end
                  
                  rule Garage
                  when
                   Item Tor_Garage changed
                  then
                   if (Tor_Garage.state == "MOVE" && previousState == "CLOSED") {
                    if (!pushNotification("Information", "Garagentor fährt auf: " + now)) {
                    sendMail("PersonellID@api.prowlapp.com", "Information", "Garagentor fährt auf: " + now)
                    }
                    // Garagentorwaechter
                    if(garageOpen==null){
                    garageOpen = createTimer(now.plusMinutes(5)) [|
                     myGarageSwitchVis.postUpdate(ON)
                     if (!pushNotification("Achtung", "Garagentor steht offen: " + now)) {
                     sendMail("PersonellID@api.prowlapp.com", "Achtung", "Garagentor steht offen: " + now)
                     }
                     ]
                    }
                  
                   }
                   else if (Tor_Garage.state == "OPEN" && previousState == "MOVE") {
                    if (!pushNotification("Information", "Garagentor ist geöffnet: " + now)) {
                    sendMail("PersonellID@api.prowlapp.com", "Information", "Garagentor ist geöffnet: " + now)
                    }
                   }
                   else if (Tor_Garage.state == "MOVE" && previousState == "OPEN") {
                    if (!pushNotification("Information", "Garagentor fährt zu: " + now)) {
                    sendMail("PersonellID@api.prowlapp.com", "Information", "Garagentor fährt zu: " + now)
                    }
                   }
                   else if (Tor_Garage.state == "CLOSED" && previousState == "MOVE") {
                  
                    garageOpen.cancel
                    garageOpen = null
                  
                    if (myGarageSwitchVis.state == ON) {
                     if (!pushNotification("Information", "Garagentor wurde geschlossen: " + now)) {
                     sendMail("PersonellID@api.prowlapp.com", "Information", "Garagentor wurde geschlossen: " + now)
                     }
                    } else {
                     if (!pushNotification("Information", "Garagentor ist geschlossen: " + now)) {
                     sendMail("PersonellID@api.prowlapp.com", "Information", "Garagentor ist geschlossen: " + now)
                     }
                    }
                    myGarageSwitchVis.postUpdate(OFF)
                   }
                  end
                  Feedback gerne willkommen und nochmal DANKE an Udo für Code und Denkanstöße

                  PS: Ich habe die meisten Prowls für mich deaktiviert und bekomme nur noch den Alarm, wenn das Tor 5 min offen steht oder nach einem Alarm doch noch geschlossen wurde. Die Regel wollte ich jedoch nicht einkürzen, denn man(n) weiß ja nie


                  Gruß,
                  Jörg

                  Kommentar

                  Lädt...
                  X