Ankündigung

Einklappen
Keine Ankündigung bisher.

Philips Hue Motion Sensor > Amazon Echo Control

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

    Philips Hue Motion Sensor > Amazon Echo Control

    Hallo zusammen,

    ich lese den HueMotion Sensor aus um damit bei Bewegungserkennung den Radio über einen Amazon Echo zu starten.
    Dazu habe ich eine Rule erstellt, welche bei Bewegung das Radio startet.. das funktioniert auch ohne Probleme.
    Hier die Rule:

    Code:
     [COLOR=#c586c0]rule[/COLOR][COLOR=#d4d4d4] [/COLOR][COLOR=#ce9178]"Start the radio once I enter the bathroom"[/COLOR]
      [COLOR=#c586c0]when[/COLOR]
      [COLOR=#569cd6]Item[/COLOR][COLOR=#d4d4d4] [/COLOR][COLOR=#4ec9b0]HueMotion[/COLOR][COLOR=#d4d4d4] changed to [/COLOR][COLOR=#b5cea8]ON[/COLOR]
      [COLOR=#c586c0]then[/COLOR]
      [COLOR=#608b4e]//  if (EchoDot_RadioStationId.state.toString != '[/COLOR][COLOR=#ce9178]s0000[/COLOR][COLOR=#608b4e]') {[/COLOR]
      [COLOR=#d4d4d4]    [/COLOR][COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4] ([/COLOR][COLOR=#4ec9b0]EchoDot_Player[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]state[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]toString [/COLOR][COLOR=#d4d4d4]!=[/COLOR][COLOR=#d4d4d4] [/COLOR][COLOR=#ce9178]'PLAY'[/COLOR][COLOR=#d4d4d4]) {[/COLOR]
      [COLOR=#4ec9b0]EchoDot_RadioStationId[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]sendCommand([/COLOR][COLOR=#ce9178]'s0000'[/COLOR][COLOR=#d4d4d4])[/COLOR]
      [COLOR=#d4d4d4]    }[/COLOR]
      [COLOR=#c586c0]end[/COLOR]
    Nun habe ich lediglich noch das Problem, dass die Musik sofort wieder ausgeschalten wird sobald der HueMotion Sensor keine Bewegung mehr erfasst.
    Ich frage den Sensor alle 5 Sekunden ab damit die Musik beim Betreten des Raumes sofort angeht...

    Ich dachte da an eine rule mit einer Schleife bzw. einer Verzögerung...?

    Hier mein Ansatz:
    Code:
     [COLOR=#c586c0]rule[/COLOR][COLOR=#d4d4d4] [/COLOR][COLOR=#ce9178]"Stop the radio once i leave the bathroom"[/COLOR]
      [COLOR=#c586c0]when[/COLOR]
      [COLOR=#d4d4d4]    [/COLOR][COLOR=#569cd6]Item[/COLOR][COLOR=#d4d4d4] [/COLOR][COLOR=#4ec9b0]HueMotion[/COLOR][COLOR=#d4d4d4] changed to [/COLOR][COLOR=#b5cea8]OFF[/COLOR]
      [COLOR=#c586c0]then[/COLOR]
      [COLOR=#d4d4d4]    [/COLOR][COLOR=#4ec9b0]Thread[/COLOR][COLOR=#c586c0]::[/COLOR][COLOR=#d4d4d4]sleep([/COLOR][COLOR=#b5cea8]60000[/COLOR][COLOR=#d4d4d4])            [/COLOR][COLOR=#608b4e]// Warte ein Minute[/COLOR]
      [COLOR=#d4d4d4]    [/COLOR][COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4] ([/COLOR][COLOR=#4ec9b0]HueMotion[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]state[/COLOR][COLOR=#d4d4d4]==[/COLOR][COLOR=#d4d4d4] [/COLOR][COLOR=#b5cea8]OFF[/COLOR][COLOR=#d4d4d4]) {[/COLOR]
      [COLOR=#d4d4d4]        [/COLOR][COLOR=#4ec9b0]EchoDot_Player[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]sendCommand([/COLOR][COLOR=#ce9178]'PAUSE'[/COLOR][COLOR=#d4d4d4])[/COLOR]
      [COLOR=#d4d4d4]    }[/COLOR]
      [COLOR=#c586c0]end[/COLOR]

    Ich möchte das Radio erst auschalten wenn innerhalb einer Minute keine Bewegung mehr erfasst wird.

    Vielen dank




    #2
    Das kann man so machen. Ist dann aber K.cke...

    Das Problem dabei ist, dass openHAB (und vor allem die Rule Engine) Event-basiert ist. Konkret bedeutet dass, Deine Rule kann durchaus mehrfach getriggert werden (Bewegung wird registriert, nicht, sofort wieder, nicht... Da der Zustand alle 5 Sekunden abgefragt wird, kann der Zustand auch alle 5 Sekunden wechseln. Zumindest, was die OFF-Rule betrifft, kann die Rule innerhalb 40 Sekunden 5-mal gestartet werden. Da openHAB nur 5 Rules gleichzeitig ausführen kann, ist danach Schluss (es wird 20 Sekunden gar keine Rule mehr ausgeführt, bis eben wieder ein Thread frei ist).

    Die korrekte Form, so etwas zu lösen, ist ein Timer:
    Code:
    var Timer tMotionTimeout = null // Timer definieren und initialisieren
    
    rule "Start/Stop radio in the bathroom"
    when
        Item HueMotion changed
    then
        if(HueMotion.state == ON) {  // Bewegung registriert
            if(tMotionTimeout !== null) {  // Falls Timeout läuft
                tMotionTimeout.cancel  // stoppe Timeout
                tMotionTimeout = null   // und initialisiere Timer
            }
            if (EchoDot_Player.state.toString !='PLAY')  // Falls Musik nicht läuft
                EchoDot_RadioStationId.sendCommand('s0000')  // Musik starten
        else {  // keine Bewegung
            if(tMotionTimeout !== null)  // falls Timeout läuft
                tMotionTimeout.cancel  // Breche Timeout ab
            tMotionTimeout = createTimer (now.plusMinutes(1), [ |  // Timeout in einer Minute ab jetzt
                EchoDot_Player.sendCommand('PAUSE')  // pausiere Musik
                tMotionTimeout = null  // initialisiere Timer
            ])
        }
    end
    Die Theorie dahinter:
    • Falls Bewegung registriert wurde, wird der Timer, falls vorhanden, gecancelt. Falls die Musik noch nicht läuft, wird sie gestartet.
    • Fallls keine Bewegung registriert wurde, wird ein eventuell vorhandener Timer gecancelt. anschließend wird ein neuer Timer angelegt und eingeplant.
    • Wenn der Timer nicht abgebrochen wird (1. Punkt), führt der Scheduler zum definierten Zeitpunkt den geplanten Code aus. Dabei wird die Wiedergabe pausiert und der Timer zurückgesetzt.
    Vorteile:
    1. Es wird nur eine Rule benötigt (könnte man aber so auch mit Deinem Code lösen).
    2. Die Rule läuft nur wenige Millisekunden.
    3. Ein geplanter Timer wird abgebrochen, falls erneut getriggert wird.
    4. Der Timer braucht keinen Thread! Erst in dem Moment, in dem der geplante Code ausgeführt wird, nutzt der Scheduler einen weiteren Thread Pool zur Ausführung (Wenn ich mich richtig erinnere, stehen auch in diesem Pool 5 Threads zur Verfügung, spielt aber nur eine untergeordnete Rolle, da auch dieser Code nur wenige Millisekunden läuft, mithin ist die Gefahr einer Kollision äußerst gering.

    Kommentar


      #3
      Hi, vielen Dank für die schnelle Antwort.
      Die Rule funktioniert, ich bin mir nur nicht ganz sicher ob Sie zu 100% funktioniert wie sie sollte.

      Wenn ich ins log schaue sehe ich das der HueMotion Sensor noch mal Bewegung registriert hat:
      Code:
      2018-07-26 11:18:55.793 [vent.ItemStateChangedEvent] - HueMotion changed from OFF to ON
      Allerdings wir genau eine Minute später dann obwohl der Sensor wieder ausgelöst hat die Musik pausiert:
      Code:
      2018-07-26 11:19:55.807 [ome.event.ItemCommandEvent] - Item 'EchoDot_Player' received command PAUSE
      Woran kann das liegen?

      Kommentar


        #4
        Zitat von crax Beitrag anzeigen
        Hi, vielen Dank für die schnelle Antwort.
        Die Rule funktioniert, ich bin mir nur nicht ganz sicher ob Sie zu 100% funktioniert wie sie sollte.

        Wenn ich ins log schaue sehe ich das der HueMotion Sensor noch mal Bewegung registriert hat:
        Code:
        2018-07-26 11:18:55.793 [vent.ItemStateChangedEvent] - HueMotion changed from OFF to ON
        Allerdings wir genau eine Minute später dann obwohl der Sensor wieder ausgelöst hat die Musik pausiert:
        Code:
        2018-07-26 11:19:55.807 [ome.event.ItemCommandEvent] - Item 'EchoDot_Player' received command PAUSE
        Woran kann das liegen?
        Hat sich erledigt, hatte noch eine zweite Rule aktiv
        VIelen Dank.

        Kommentar

        Lädt...
        X