Ankündigung

Einklappen

Sammelbestellung ETS5-UPGRADE nähert sich dem Ende...

Die Sammelbestellung für ETS5 UPGRADE nähert sich dem Ende! Infos unter: Link
Mehr anzeigen
Weniger anzeigen

Motion Alarm von Außenkamera als Auslöser für Licht

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

    Motion Alarm von Außenkamera als Auslöser für Licht

    Hallo zusammen,

    ich habe auf der Terrasse eine Kamera und einen Lichtstrahler an der Hauswand.

    Nun möchte ich, dass wenn Dämmerung=ON und Strahlerautomatik sperren=OFF (Schalter um die Strahlerautomatik zu unterbrechen) der Strahler angeht bis der Motion Alarm wieder auf Off springt.

    Eigentlich einfach zu programmieren aber:

    Der Motion Alarm wird ausgelöst und der Strahler geht an. Dann habe ich in der Kamera ein Anti Dither definiert, dass es 60 Sekunden dauert bis der nächste Motion Alarm ausgelöst werden kann. Sodass also der Strahler 60 Sekunden leuchtet bis der Motion Alarm auf Off springt.

    Soweit die Logik.

    Problem ist aber, dass wenn der Motion Alarm auf Off springt und der Strahler dann ausgeht, wird das langsame ausblenden des Strahlers schon wieder als Bewegung erkannt, sodass eine Dauerschleife entsteht.

    Ich habe zum anschalten nun folgende Regel gebaut:

    Code:
    rule "Bei Motionalarm auf der Terrasse und Garten, Strahler an"
    
    when
    
    Item au_kamera_terrasse_MotionAlarm changed to ON
    
    then
    
    if(ws_daemmerung.state == OPEN) {
    
    if (sp_lichtautomatik_garten.state == OFF) {
    
    au_geraetehaus_strahler_switch.sendCommand(ON)
    var DecimalType hue = new DecimalType(44)
    var PercentType sat = new PercentType(56)
    var PercentType bright = new PercentType(70)
    var HSBType light = new HSBType(hue,sat,bright)
    au_geraetehaus_strahler_color.sendCommand(light.to String)
    
    }
    }
    end
    Nun brauche ich eine Ausschaltregel, die irgendwie vermeidet, dass die Kamera das Ausschalten des Lichtes wieder als MotionAlarm erkennt.

    Ich kann generell den Motion Alarm der Kamera über Openhab komplett ausschalten, sodass ich mir folgendes überlegt hatte:


    Code:
    rule "Bei Motionalarm aus auf der Terrasse und Garten, Strahler aus"
    
    /when
    
    /Item au_kamera_terrasse_MotionAlarm changed to OFF
    
    then
    
    if (sp_lichtautomatik_garten.state == OFF) {
    
    if (au_geraetehaus_strahler_switch.state == ON) {
    
    au_kamera_terrasse_EnableMotion.sendCommand(OFF)
    
    timer1=createTimer(now.plusSeconds(5) [|
    
    au_geraetehaus_strahler_switch.sendCommand(OFF)
    
    ])
    
    timer2=createTimer(now.plusSeconds(3) [|
    
    au_kamera_terrasse_EnableMotion.sendCommand(ON)
    
    ])
    
    }
    }
    end
    Wenn also der Motion Alarm auf off spring wird geprüft, ob die Strahlerautomatik sperren aus ist und das Licht auch an ist. Dann wird die MotionDetection der Kamera ausgeschaltet. Dann wird 5 Sekunden gewartet, um Verzögerungen in der Kommunikation zur Kamera abzufangen und der Strahler ausgeschaltet. Danach läuft wieder eine Verzögerung von 3 Sekunden ab und die Motion Detection wird wieder eingeschaltet damit die nächste Bewegung wieder erkannt wird.

    Irgendwie greifen bei mir die ganzen Verzögerungen nicht, sodass ich trotzdem Dauerschleifen hab.

    Vielleicht hat ja jemand eine bessere Idee wie ich das lösen könnte.

    Danke Euch


    #2
    Das ist ja auch kein Wunder denn der 2. Timer wird unmittelbar nach Anlegen des 1. Timers angelegt, läuft also ab, bevor das Licht überhaupt aus geht. Die Tippfehler ignoriere ich hier mal
    Du hast hier grob drei Möglichkeiten:
    1. Du machst es genau wie bisher, allerdings lässt Du den 2. Timer acht Sekunden verzögern (also fünf Sekunden vom 1. Timer plus die drei Sekunden).
    2. Du legst den 2. Timer an, wenn der 1. Timer abläuft.
    3. Du verwendest nur einen Timer.
    Code:
    var Timer tMotion = null
    
    rule "Bei Motionalarm aus auf der Terrasse und Garten, Strahler aus"
    when
        Item au_kamera_terrasse_MotionAlarm changed to OFF
    then
        if(sp_lichtautomatik_garten.state == OFF && au_geraetehaus_strahler_switch.state == ON) {
            tMotion?.cancel
            au_kamera_terrasse_EnableMotion.sendCommand(OFF)
            tMotion = createTimer(now.plusSeconds(5), [|
                if(au_geraetehaus_strahler_switch.state == ON) {
                    au_geraetehaus_strahler_switch.sendCommand(OFF)
                    tMotion.reschedule(now.plusSeconds(3))
                } else {
                    au_kamera_terrasse_EnableMotion.sendCommand(ON)
                }
            ])
        }
    end
    Da es möglich ist, dass eine weitere Bewegung erfasst wird, bevor der Timer abläuft, solltest Du in der Einschalt-Regel zuerst den Timer mittels tMotion?.cancel abbrechen, um zu verhindern, dass das Licht ein- und vom letzten Timer sofort wieder ausgeschaltet wird. Ebenso müsstest Du dann natürlich darauf achten, dass EnableMotion auch wieder aktiviert wird. Dieser Punkt gilt unabhängig von der Umsetzung der Timer

    Kommentar


      #3
      cool besten dank. perfekt.

      Kommentar


        #4
        Ich habe gerade mal alles getestet und habe festgestellt, dass die Kamera beim deaktvieren des Motion Alarm den Anti Dither auf 1 Sekunde zurücksetzt.

        Sodass der Motion Alarm dann nicht 60 sekunden an bleibt und die Lampe damit 60 Sekunden leuchtet sondern nur noch 1 Sekunde bis ich diesen Wert in der Kamera wieder auf 60 setze.

        Hast du noch eine andere Idee wie man das lösen könnte?

        Mir fällt nur noch ein fester Timer ein, der vor Ablauf des umschalten des Motion Alarms auf Off die Kamera ausschaltet, sodass das ausschalten nicht als Bewegung erkannt wird oder?

        Kommentar


          #5
          Du kannst ein eigenes Enable-Item (ohne Binding) einbauen.
          In der Rule, die das Licht schaltet, prüfst Du zusätzlich den Status dieses Items und schaltest nur, wenn das Item (z.B.) auf ON steht. Dieses Item schaltest Du dann über den Timer an und aus, statt die Kamera selbst umzuschalten.
          Zuletzt geändert von udo1toni; 20.11.2020, 23:20.

          Kommentar


            #6
            Könntest du mir das mal anhand meiner Rule mal umsetzen? Wäre total cool.

            Kommentar


              #7
              Meine Variante wäre:
              Code:
              var Timer tMotion = null
              
              rule "Motionalarm Änderung auf der Terrasse und Garten"
              when
                  Item au_kamera_terrasse_MotionAlarm changed
              then
                  if(newState == ON) {                                               // Motionalarm ON
                      if(ws_daemmerung.state == OPEN && motionEnabled.state == ON && sp_lichtautomatik_garten.state == OFF) {
                          tMotion?.cancel
                          au_geraetehaus_strahler_switch.sendCommand(ON)
                          var DecimalType hue = new DecimalType(44)
                          var PercentType sat = new PercentType(56)
                          var PercentType bright = new PercentType(70)
                          var HSBType light = new HSBType(hue,sat,bright)
                          au_geraetehaus_strahler_color.sendCommand(light.toString)
                      }
                  } else {                                                           // Motionalarm OFF
                      tMotion?.cancel
                      if(sp_lichtautomatik_garten.state == OFF && au_geraetehaus_strahler_switch.state == ON) {
                          motionEnabled.postUpdate(OFF)
                          tMotion = createTimer(now.plusSeconds(5), [|
                              if(au_geraetehaus_strahler_switch.state == ON) {
                                  au_geraetehaus_strahler_switch.sendCommand(OFF)
                                  tMotion.reschedule(now.plusSeconds(3))
                              } else {
                                  motionEnabled.postUpdate(ON)
                              }
                          ])
                      }
                  }
              end
              Es ist also nur ein weiteres Switch Item mit dem Namen motionEnabled notwendig. Das Item muss nur angelegt werden, es braucht weder Label noch muss es irgendwo sichtbar sein. Es dient lediglich dem Zweck, zu verhindern, dass die erkannte Bewegung das Licht einschaltet. Das heißt, die Rule wird zwar getriggert, aber es gescheiht nichts.
              Die Rule kümmert sich sowohl um das Einschalten als auch das Ausschalten der Beleuchtung.
              Man könnte auch eine globale Variable nutzen, um motionEnable abzubilden, das würde sogar noch ein bisschen Code einsparen. Und grundsätzlich könnte der 1. Timer sogar entfallen, da die Kamera ja nicht mehr umgesteuert wird. Also so:
              Code:
              var Timer tMotion = null
              var Boolean bMotionEnabled = true
              
              rule "Motionalarm Änderung auf der Terrasse und Garten"
              when
                  Item au_kamera_terrasse_MotionAlarm changed
              then
                  if(newState == ON) {                                               // Motionalarm ON
                      if(ws_daemmerung.state == OPEN && bMotionEnabled && sp_lichtautomatik_garten.state == OFF) {
                          au_geraetehaus_strahler_switch.sendCommand(ON)
                          var DecimalType hue = new DecimalType(44)
                          var PercentType sat = new PercentType(56)
                          var PercentType bright = new PercentType(70)
                          var HSBType light = new HSBType(hue,sat,bright)
                          au_geraetehaus_strahler_color.sendCommand(light.toString)
                      }
                  } else {                                                           // Motionalarm OFF
                      tMotion?.cancel
                      if(sp_lichtautomatik_garten.state == OFF && au_geraetehaus_strahler_switch.state == ON) {
                          bMotionEnabled = false
                          au_geraetehaus_strahler_switch.sendCommand(OFF)
                          tMotion = createTimer(now.plusSeconds(3), [|
                              bMotionEnabled = true
                          ])
                      }
                  }
              end
              Diese Variante (Licht sofort aus) funktioniert aber nur mit der globalen Variable, denn openHAB schaltet Items asynchron, das heißt, es besteht eine gute Chance, dass die Bewegung erkannt wird, noch bevor motionEnable den neuen Status hat. Variablen werden hingegen synchron verarbeitet, wenn der Schaltbefehl folgt, ist die Variable schon auf false und die ausgelöste Rule kann das Licht nicht mehr einschalten.
              Zuletzt geändert von udo1toni; 21.11.2020, 03:27.

              Kommentar


                #8
                Besten Dank für die Arbeit. Echt Mega.

                Ich habe es mal implementiert, aber jetzt passiert nichts mehr. Ich habe auch motionEnabled angelegt als item. Ich sehe in den Logs, dass der Motion Alarm getriggert wird aber es passiert nichts mehr.
                Zuletzt geändert von SaschaQ; 21.11.2020, 08:01.

                Kommentar


                  #9
                  Welche Version von openHAB nutzt Du denn? Meine erste Vermutung wäre, dass es die implizite Variable newState bei Dir noch nicht gibt. Dann nimm diese Variante:
                  Code:
                  var Timer tMotion = null
                  var Boolean bMotionEnabled = true
                  
                  rule "Motionalarm Änderung auf der Terrasse und Garten"
                  when
                      Item au_kamera_terrasse_MotionAlarm changed
                  then
                      if(au_kamera_terrasse_MotionAlarm.state == ON) {                                               // Motionalarm ON
                          if(ws_daemmerung.state == OPEN && bMotionEnabled && sp_lichtautomatik_garten.state == OFF) {
                              au_geraetehaus_strahler_switch.sendCommand(ON)
                              var DecimalType hue = new DecimalType(44)
                              var PercentType sat = new PercentType(56)
                              var PercentType bright = new PercentType(70)
                              var HSBType light = new HSBType(hue,sat,bright)
                              au_geraetehaus_strahler_color.sendCommand(light.toString)
                          }
                      } else {                                                           // Motionalarm OFF
                          tMotion?.cancel
                          if(sp_lichtautomatik_garten.state == OFF && au_geraetehaus_strahler_switch.state == ON) {
                              bMotionEnabled = false
                              au_geraetehaus_strahler_switch.sendCommand(OFF)
                              tMotion = createTimer(now.plusSeconds(3), [|
                                  bMotionEnabled = true
                              ])
                          }
                      }
                  end

                  Kommentar


                    #10
                    Ich habe 2.5.10

                    Funktioniert jetzt bestens, genauso wie ich es mir vorgestellt habe.

                    Danke dir
                    Zuletzt geändert von SaschaQ; 22.11.2020, 12:54.

                    Kommentar

                    Lädt...
                    X