NEWS
Sonos/Hue - Hilfe/Ideen für Badezimmer Script
-
Liebe Blockly-Pros,
ich arbeite momentan an einer Lösung für eine Automatisierung mit einem Sonos Play:1 und dem Hue Bewegungsmelder. Folgende Funktionen sind bereits (mehr oder weniger) umgesetzt:
- Beim Betreten des Badezimmers wird "Play" ausgelöst und die letzte Musik abgespielt
- Wenn der Bewegungsmelder für 2 Minuten keine Bewegung erkennt, wird die Musik wieder abgestellt ("Pause)
- Wenn eine Person im Bad die Musik händisch deaktiviert, soll sie auch ausbleiben
- Wenn "Play" ausgelöst wird, soll sich die Lautstärke langsam bis zur zuletzt gewählten lautstärke steigern (über ein paar Sekunden)
Der zweite Punkt mit "Pause" funktioniert in meinem aktuellen Script leider nur manchmal.. Der Hue-Bewegungsmelder ist per node-red eingebunden, ich weiß nicht ob es irgendwie am Polling oder doch an einem Fehler in meinem Script liegt. Aber manchmal wenn man sich länger im Bad aufhält, bleibt die Musik an, manchmal geht sie zwischendrin einfach aus. Ich habe dafür bisher keine Lösung gefunden..
Für das "händische Deaktivieren" habe ich aktuell keine Idee, weil ich nicht weiß, inwiefern sich zwischen einer deaktivierung durch das Script und einer von Sonos selbst unterscheiden lässt.. kann man das je nach "Auslösender" Instanz irgendwie unterscheiden? Oder denke ich zu kompliziert?
Für die Lautstärke-Steigerung mangelt es mir offenbar einfach nur an Script-Kenntnissen.. meine Idee war, die zuletzt gewählte Lautstärke immer in einem State abzulegen. Dann könnte man mit einer Schleife über einige Sekunden so lange die Lautstärke um +1 steigern, bis der Wert = State-Wert ist. Aber ich habe noch keine Umsetzung hinbekommen, mit der genau das funktioniert
Dies ist mein aktuelles (halb-)funktionstüchtiges Blockly-Script (der abgeschnittene Teil ist nur noch die Uhrzeit, damit man nachts und früh morgens im Bad keinen Herzinfarkt bekommt..
)
Ich bin für jeden Tipp oder Hinweis sehr dankbar!!
Beste Grüße
Sundance
- Beim Betreten des Badezimmers wird "Play" ausgelöst und die letzte Musik abgespielt
-
@Sundance
ich habe das Ein- und Ausschalten mit Bewegunsmelder (Z-Wave) mit Radio Empfang so gelöst, das der Radiosender wg. Werbung beim Einschalten erstmal mit Volume 0 startet und dann langsam lauter wird.
Das manuelle Ein-und Ausschalten mache ich mit einem Xiaomi Schalter:
-
@Sundance sagte:
Der zweite Punkt mit "Pause" funktioniert in meinem aktuellen Script leider nur manchmal..
Verwende besser Ausführen timeout und stop timeout (falls wieder Bewegung).
@Sundance sagte in Sonos/Hue - Hilfe/Ideen für Badezimmer Script:
kann man das je nach "Auslösender" Instanz irgendwie unterscheiden?
Ja, durch Vergleich vorheriger Ursprung != "system.adapter.javascript.0", wenn man nur bei Update triggert. vorheriger Ursprung ist eine Eigenschaft des Trigger-Datenpunktes.
@Sundance sagte in Sonos/Hue - Hilfe/Ideen für Badezimmer Script:
über einige Sekunden so lange die Lautstärke um +1 steigern, bis der Wert = State-Wert ist.
Dafür gibt es Ausführen Intervall und stop zyklische Ausführung Intervall.
Etwa so
-
@paul53 - herzlichen Dank für deine ausführliche Unterstützung. Ich werde das heute Abend mal nachbauen und dann berichten.
Folgendes fiel mir noch ein: Wie würdest du den Status des "manuellen Stop" wieder zurücksetzen? Ich kann ja bei dem Hue-Bewegungsmelder theoretisch prüfen, ob länger als 10-15 Minuten keine Bewegung erkannt wurde (was ein recht sicherer Indikator wäre, das niemand mehr im Bad ist) und dann wieder zurücksetzen. Ergibt das Sinn, oder hast du vielleicht einen besseren Vorschlag?
Vielen Dank nochmal und beste Grüße
Sundance
-
@Sundance sagte:
Wie würdest du den Status des "manuellen Stop" wieder zurücksetzen?
Im Vorschlag wird er durch manuelle Betätigung von "Play" zurück gesetzt.
-
@paul53 said in Sonos/Hue - Hilfe/Ideen für Badezimmer Script:
@Sundance sagte:
Ja, durch Vergleich vorheriger Ursprung != "system.adapter.javascript.0", wenn man nur bei Update triggert. vorheriger Ursprung ist eine Eigenschaft des Trigger-Datenpunktes.
Diesen Punkt verstehe ich leider nicht ganz - was muss ich für Datenpunkte/States erstellen, oder wie komme ich an den "Urpsprung"? Ich habe das Blockly soweit nachgebaut, aber an dem Punkt komme ich nicht weiter..
Etwa so
Und eine weitere Sache verstehe ich nicht auf Anhieb - wofür ist der zweite Trigger oben in deinem Vorschlag da? (der einfach nur "Wert" als Platzhalter Variable hat) Ich verstehe nicht, was ich meiner variante dort einsetzen/austauschen muss.
Ich danke dir im voraus für deine Hilfe!
Beste Grüße
Sundance
-
@Sundance sagte:
wie komme ich an den "Urpsprung"?
Wert und vorheriger Ursprung sind Eigenschaften des Trigger-Datenpunktes (Blöcke "Trigger"):
-
@paul53 - super, das habe ich gefunden - das funktioniert auch wie erwartet. Leider scheint mit der Abfrage bei den Bewegungsmeldern etwas nicht so zu klappen, wie geplant. Ich poste erstmal mein aktuelles Blockly, vielleicht hast du ja noch eine Idee (oder ich habe irgendwelche Platzhalter falsch "übersetzt"..)
(Der abgeschnittene Teil beinhaltet weitere Voraussetzungen: Anwesenheit, Uhrzeit, "manuellPause", und dass der Sonos grade nicht bereits abspielt)
"Play" wird korrekt ausgelöst, allerdings funktioniert das pausieren nicht konstant - manchmal wird die Nachricht "No Motion Anymore: PAUSING in 3 Minutes" ausgelöst, und wenige Sekunden später wird trotzdem die Pause gesendet.
Ich nutze Hue-Bewegungsmelder, die direkt per Zigbee verbunden sind (da sie so deutlich schneller bzw. direkter auslösen) - kann es sein das sich hier gelegentlich irgendein Abfrage bzw. Polling Intervall überschneidet?
Ich habe einige Debug Logs eingefügt, damit ich besser nachvollziehen kann, wann was passiert. Alle Nachrichten werden zwei mal gepostet, weil ich oben zwei Object-IDs bzw. Haupt-Trigger habe. Kann es auch damit zusammenhängen?
Vielen Dank vorab für deine Unterstützung..
-
@Sundance sagte:
weil ich oben zwei Object-IDs bzw. Haupt-Trigger habe.
Bei zwei Triggern funktioniert die einfache Abfrage von Wert nicht. Außerdem muss die Bewegungserkennung mit ODER verknüpft werden. Prinzip:
-
@paul53 - Okay, die initiale Abfrage von einem der Bewegungsmelder reicht ja erstmal - oder gibt es einen einfachen Weg, zwei Werte abzufragen?
In meinem "Falls" habe ich ja mit ODER gearbeitet, oder macht es einen Unterschied, dass du die externen Ausgänge aktiviert hast?
-
@Sundance sagte:
In meinem "Falls" habe ich ja mit ODER gearbeitet
Was ist rechts noch mit UND verknüpft ?
@Sundance sagte in Sonos/Hue - Hilfe/Ideen für Badezimmer Script:
macht es einen Unterschied, dass du die externen Ausgänge aktiviert hast?
Nein, sieht nur übersichtlicher aus.
-
@paul53 said in Sonos/Hue - Hilfe/Ideen für Badezimmer Script:
Was ist rechts noch mit UND verknüpft ?
Hab es mal etwas übersichtlicher umgebaut - Hier ein Auszug davon:
Ich frage beide BWM, die Anwesenheit, den aktuellen Status der Sonos Box, die "manuellPause" und den Zeitraum ab.
Ich habe jetzt mal auf einen BWM im Trigger reduziert - macht es einen Unterschied, wenn ich danach sowieso im zweiten Trigger die beidem BWMs abfrage?
Vielen Dank
Gruß
sundance
-
Hallo - ich habe mich anfangs auch beim Sonos-schalten auch auf die Bewegungsmelder konzentriert.
Ging soweit - nur wollte ich dann Nachts (z.b. von 0.00 bis 5.00 Uhr) beim Bad/Toiletten-Besuch kein Sonos-Gerät am laufen haben ...
... also neuer Ansatz: Bewegung egal! - Das HUE-Licht (Helligkeit) wird abgefragt!
Da hat ja HUE die geniale Nachtsteuerung der Lampen wo man eine Uhrzeit definieren kann und die Helligkeit - z.b. nur 50% - alles gut, denn Sonos wird ja nur bei 100% geschalten. Dieses funktioniert sehr zuverlässig.
Hui dachte ich - also nehmen wir doch den Helligkeitswert der HUE-Lampe und frage den Status mit Blockly ab und schalte Sonos. Siehe da - alles ist gut!
... hat den weiteren Vorteil das vor dem Abschalten der Lampe sich die Helligkeit der Lampe verringert - also wirds Zeit sich zu Bewegen das es Hell bleibt und Sonos geht ja nur bei 0% aus. Wenns dann Dunkel wird ist dein Sonos auch aus.... hier das Blockly:
<xml xmlns="http://www.w3.org/1999/xhtml"> <block type="on" id="c08~!?}h/;gsL^zE(OMo" x="13" y="12"> <field name="OID">hue.0.Bridge_GR.Bad.level</field> <field name="CONDITION">any</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="controls_if" id="#F]0/Q8r1ut@.?^FOc-6"> <value name="IF0"> <block type="logic_compare" id="IR~LLs/L%xH)P=(Rcz*F"> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="Qz9J,V+C3-4TJsFPJXGN"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="math_number" id="yb+v2-:?bRaB?bM)Wk[j"> <field name="NUM">100</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="0,KyWH6YQux.JP0zd;*k"> <mutation delay_input="false"></mutation> <field name="OID">sonos.0.root.192_168_0_150.favorites_set</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="y2e8}+q(WtF|~z34=UeV"> <field name="TEXT">SWR3</field> </block> </value> <next> <block type="control" id="cR|BEa*?=9#a~oZo#`,T"> <mutation delay_input="false"></mutation> <field name="OID">sonos.0.root.192_168_0_150.play</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="Ln_6B6brsLJ~u+[T/i`N"> <field name="BOOL">TRUE</field> </block> </value> </block> </next> </block> </statement> </block> </statement> </block> </xml>