Sonos Doorbell Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

astrong
Beiträge: 39
Registriert: 10. Nov 2020 09:14
Answers: 0

Sonos Doorbell Rule

Beitrag von astrong »

Hallo Zusammen,
ich kämpfe gerade mit meinen Sonos Türklingeln.

Im OG und EG habe ich eine Sonos.

Soweit klappt alles.
Ich habe eine Kinderzimmerabfrage mit drin: Wenn Jalousie unten, spiele Türklingel "leiser" ab.
Folgende Phänomene habe ich:

-Der Ton auf der Sonos kommt erst 5-8 Sekunde nachdem ich die Türklingel (Kontakt CLOSED) betätigt habe
-Wenn der Doorbell ton abgespielt wurde und die Sonos aktuell kein Lied abspielt, startet direkt danach das letzte Lied, welches ich vom Handy per Bluetooth abgespielt hatte, unabhängig ob Handy verbunden oder nicht.
-Teilweise wird die Doorbell.mp3 nochmal abgespielt und mitten drin unterbrochen. Quasi: Spiele die mp3 1,5mal ab.


Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: Binareingang_Klingel_EG_Binareingang_Turklingel
      previousState: OPEN
      state: CLOSED
    type: core.ItemStateChangeTrigger
conditions:
  - inputs: {}
    id: "3"
    configuration:
      itemName: OG_Jalousieaktor_4_Jalousie_OG_Kind_Sud
      operator: ">"
      state: "80"
    type: core.ItemStateCondition
actions:
  - inputs: {}
    id: "2"
    configuration:
      volume: 25
      sink: sonos:Era100:RINCON_F0F6C1A58B5401400
      sound: doorbell.mp3
    type: media.PlayAction

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Sonos Doorbell Rule

Beitrag von nw378 »

Ich vermute, das liegt eher an der Sonos als an OH.

* OH feuert den Befehl einmalig und mehr oder weniger sofort. Die 5...8 Sekunden würde ich der Reaktionszeit der Sonos zuschanzen.
Versuchsweise könntest Du ja mal versuchen, auf einem anderen Gerät die MP3 abspielen zu lassen.

* Bei dem Lied vom Handy ist definitiv die Sonos der Verursacher, woher soll OH denn davon wissen?

* Zweimaliges Spielen: Tritt das in anderer Konstellation auch auf? Wenn Du bspw. vom einen Handy auf ein anderes wechselt als "Player"?
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Benutzeravatar
udo1toni
Beiträge: 15246
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Sonos Doorbell Rule

Beitrag von udo1toni »

Du hast offensichtlich zwei Rules für die gleiche Aufgabe, die gezeigte Rule dreht die Lautstärke runter,
Wie sieht die andere Rule aus?
Sinnvoller wäre es, hier eine Rule mit Script als Action zu verwenden. Wenn Du Dich nicht mit der DSL auseinandersetzen willst, nimm am besten Blockly, das ist auch für Anfänger gut zu bedienen (weil es Dir nur gültige Befehle anbietet - Allenfalls kannst Du dann bei Itemnamen pfuschen...

Als Blockly Code in yaml sähe das so aus:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: Binareingang_Klingel_EG_Binareingang_Turklingel
      state: CLOSED
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      blockSource: <xml
        xmlns="https://developers.google.com/blockly/xml"><variables><variable
        id="zRN^)Q~m1=usGUkrp2*X">vol</variable></variables><block
        type="variables_set" id="Py7v9_r%D,jJ]T]zr:_/" x="159" y="56"><field
        name="VAR" id="zRN^)Q~m1=usGUkrp2*X">vol</field><value
        name="VALUE"><block type="math_number" id="q2D|urja7SM/c,Dd|2ZW"><field
        name="NUM">60</field></block></value><next><block type="controls_if"
        id="9}XGSd[_#sO40/;S9xFp"><value name="IF0"><block type="logic_compare"
        id="~CV[du{DA6Im/6jHz9cP"><field name="OP">GT</field><value
        name="A"><block type="oh_getitem_attribute"
        id="oLgi{YE0D`30Yq5`YReJ"><mutation
        attributeName="NumericState"></mutation><field
        name="attributeName">NumericState</field><value name="item"><shadow
        type="oh_getitem" id="lg+-ZIGzHY`dFinUYK-f"><value
        name="itemName"><shadow type="oh_item"
        id="Z::_woKg.S{D;-gEzPO6"><mutation itemName="MyItem"
        itemLabel="MyItem"></mutation><field
        name="itemName">MyItem</field></shadow></value></shadow><block
        type="oh_getitem" id="yaw*RJ$h;C*z=r5/_9dE"><value
        name="itemName"><shadow type="oh_item"
        id="Z::_woKg.S{D;-gEzPO6"><mutation itemName="MyItem"
        itemLabel="MyItem"></mutation><field
        name="itemName">MyItem</field></shadow><block type="oh_item"
        id="Eh~Q)|Oy71)MMg]9hb@x"><mutation
        itemName="OG_Jalousieaktor_4_Jalousie_OG_Kind_Sud"
        itemLabel=""></mutation><field
        name="itemName">OG_Jalousieaktor_4_Jalousie_OG_Kind_Sud</field></block></value></block></value></block></value><value
        name="B"><block type="math_number" id="mYy0;)0*@UPDwd.My9h2"><field
        name="NUM">80</field></block></value></block></value><statement
        name="DO0"><block type="variables_set" id="n*~u1=Ener5U_OEW!0_h"><field
        name="VAR" id="zRN^)Q~m1=usGUkrp2*X">vol</field><value
        name="VALUE"><block type="math_number" id="L:oK!(%~3c9wBYOUVmw/"><field
        name="NUM">25</field></block></value></block></statement><next><block
        type="oh_playmedia_sink_volume" id="RWjzgl4sx!AJA9;;4i4K"><value
        name="fileName"><shadow type="text" id="aYd/=J,b!dyIk;c4bS,O"><field
        name="TEXT">doorbell.mp3</field></shadow></value><value
        name="sinkName"><shadow type="oh_audiosink_dropdown"
        id="WvRdhqS%,j(,T?Q/4P{V"><field
        name="sinks">enhancedjavasound</field></shadow></value><value
        name="volume"><shadow type="oh_volumeslider"
        id="A7,BttV#_{/U1boL`m@:"><field name="volume">50</field></shadow><block
        type="variables_get" id="|U](Oadc*$J#0gyCtDlR"><field name="VAR"
        id="zRN^)Q~m1=usGUkrp2*X">vol</field></block></value></block></next></block></next></block></xml>
      type: application/javascript
      script: >
        var vol;

        vol = 35;

        if
        (items.getItem('OG_Jalousieaktor_4_Jalousie_OG_Kind_Sud').numericState >
        80) {
          vol = 25;
        }

        actions.Audio.playSound('enhancedjavasound', 'doorbell.mp3', (vol/100));
    type: script.ScriptAction
Du kannst einfach eine "leere" Rule anlegen, danach auf die Code-Anzeige wechseln und den gesamten yaml Code gegen den von mir geposteten Code austauschen. Einzige Voraussetzung ist, dass Blockly aktiv ist (das JavaScript Scripting Addon muss dazu installiert sein)
Der größte Teil des Codes ist die Blockly Definition, der eigentliche Code ist der Block nach script: >
Der Code definiert eine lokale Variable vol und weist dieser den Wert 35 zu (das wäre die "laute" Klingel). Falls die Jalousie einen Status > 80 hat, wird vol auf 25 geändert.
Abschließend wird die Action playSound ausgeführt.

Achtung: Da ich kein Sonos habe, habe ich auch keine passende sink. Entsprechend musst Du das noch anpassen, d.h. nach dem Einfügen des Codes auf der Codeseite wechselst Du in die Design Ansicht und rufst den Action-Block auf. Dort solltest Du dann diese Ansicht angezeigt bekommen;
Screenshot 2024-11-17 003638.png
Und dort musst Du dann das Drop-down Menü der Audio sink aufklappen und Deine Sonos auswählen.

Ich gehe davon aus, dass ein Teil der Probleme evtl. damit zusammenhängt, dass Du zwei Rules für die gleiche Sache in Betrieb hast.
Das Abspielen des letzten Songs ist in sofern erklärbar, dass die Sonos ja tatsächlich einen gerade abgespielten Song fortsetzen soll, nachdem der Klingelsound vollständig abgespielt wurde. Das darf natürlich nur passieren, wenn die Sonos zum Zeitpunkt des Klingelns auch gerade etwas abgespielt hat,
Ob openHAB hier den Fehler macht oder das Problem bei Sonos liegt, vermag ich nicht einzuschätzen, wie gesagt, ich habe kein Sonos.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

astrong
Beiträge: 39
Registriert: 10. Nov 2020 09:14
Answers: 0

Re: Sonos Doorbell Rule

Beitrag von astrong »

@udot1toni,
ich bewundere deine Motivation und Zeit :D

Dein Script habe ich so übernommen und gleich eine zweite Sonos (obergeschoss) mit dazu.
Ich hatte in Summe sogar 3 Rules am laufen.

Die Rule ist aktiv aber leider wird kein Ton abgespielt.
Kann es an der doorbell.mp3 liegen? Da ich hier nicht explizit die mp3 auswähle sondern nur "bename".

Code: Alles auswählen

script: >
        var vol;



        vol = 45;

        if
        (items.getItem('OG_Jalousieaktor_4_Jalousie_OG_Kind_Sud').numericState >
        80) {
          vol = 25;
        }

        actions.Audio.playSound('sonos:Era100:RINCON_F0F6C1A58B5401400',
        'doorbell.mp3', (vol/100));

        actions.Audio.playSound('sonos:OneSL:RINCON_C438757317E001400',
        'doorbell.mp3', (vol/100));
    type: script.ScriptAction

Benutzeravatar
udo1toni
Beiträge: 15246
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Sonos Doorbell Rule

Beitrag von udo1toni »

Der abzuspielende Ton sollte ebenfalls als Dropdown auswählbar sein.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

astrong
Beiträge: 39
Registriert: 10. Nov 2020 09:14
Answers: 0

Re: Sonos Doorbell Rule

Beitrag von astrong »

Leider nein.
Ist im Blockly ein "freitext" ohne Dropdown.

Benutzeravatar
udo1toni
Beiträge: 15246
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Sonos Doorbell Rule

Beitrag von udo1toni »

Stimmt auffallend... Das heißt, das ist der Vorgabewert der Action.
Im Ausgangspost hast Du allerdings auch doorbell.mp3 angegeben.
Falls Du andere Sounds ausspielen lassen willst, musst Du in der Doku nachschlagen, wie die anzugeben sind :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

astrong
Beiträge: 39
Registriert: 10. Nov 2020 09:14
Answers: 0

Re: Sonos Doorbell Rule

Beitrag von astrong »

Ich werde mit diesem blockly nicht warm...

Code: Alles auswählen

2024-11-18 16:26:46.920 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'c439c9e82b' failed: org.graalvm.polyglot.PolyglotException: TypeError: invokeMember (playSound) on org.openhab.core.model.script.actions.Audio failed due to: no applicable overload found (overloads: [Method[public static void org.openhab.core.model.script.actions.Audio.playSound(java.lang.String,java.lang.String)], Method[public static void org.openhab.core.model.script.actions.Audio.playSound(java.lang.String,java.lang.String,org.openhab.core.library.types.PercentType)], Method[public static void org.openhab.core.model.script.actions.Audio.playSound(java.lang.String,org.openhab.core.library.types.PercentType)], Method[public static void org.openhab.core.model.script.actions.Audio.playSound(java.lang.String)], Method[public static void org.openhab.core.model.script.actions.Audio.playSound(java.lang.String,java.lang.String,float)], Method[public static void org.openhab.core.model.script.actions.Audio.playSound(java.lang.String,float)]], arguments: [sonos:Era100:RINCON_F0F6C1A58B5401400 (String), doorbell.mp3 (String), 0.4 (Double)])
bekomm ich. Die vol Variable will einfach nicht immer klappen...
Wenn ich statt der variable einen festen Wert festlege, dann klappt es...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Sonos Doorbell Rule

Beitrag von Harka »

Moin,
ja, mit dem Block gibt es ein Problem -> https://community.openhab.org/t/play-au ... ing/152381
Dachte das wäre behoben, aber anscheinend... Er nimmt ja nicht mal alle Werte, ist (meiner Vermutung nach) ein Java<>Javascript Problem.

Lösungsvorschlag: Lautstärke vorher separat an das Lautstärke-Item senden (alten Wert vorher speichern um ihn anschließend zurücksetzen zu können) und den einfachen play-audio Block nehmen.

Benutzeravatar
udo1toni
Beiträge: 15246
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Sonos Doorbell Rule

Beitrag von udo1toni »

Alternativ geht natürlich auch eine Rule, die in der DSL geschrieben ist :) Das sähe dann so aus:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: Binareingang_Klingel_EG_Binareingang_Turklingel
      state: CLOSED
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >
        var PercentType vol = 35
        if((OG_Jalousieaktor_4_Jalousie_OG_Kind_Sud.state as Number) > 80) vol = 25

        playSound('doorbell.mp3', vol)
    type: script.ScriptAction
Ungetestet...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten