NEWS
Sonos Lautstärke regeln
-
Ist komisch, hast Du nun 2 Taster einen mit 4:3 und einen mit 0:0 und das kommt aus der gleichen Node raus? Kann man da nicht 2 Nodes verwenden?
Wenn das so ist, dass man bei dem 2. Taster zwischen drücken und loslassen nicht unterscheiden kann, dann ist mir das egal, sondern dann nehme ich einfach größer 0 für einen Taster (lauter) und =0 (leiser). Die erste Nachricht triggert, die zweite Nachricht stoppt.
Das müsste dann ja OK sein. Zur Sicherheit macht man noch einen Timer ggf. dass der Trigger nicht unendlich lange läuft.
-
@mickym
so passiert es jetzt wenn ich so drücke wie du geschrieben hast. Ich habe eine Gira TastSensor 4. dieser hat 4 WIppen oder aber 8 Tasten jenachdem wie man ihn konfiguriert. Ich möchte es aber eigentlich über eine Taste machen mit Umschaltfunktion)Das kommt aus einer Node Aufteilen würde nur funktionieren wenn ich es als Wippe mache. Da ich aber eigentlich die zweite Taste mache um dann die Playlist auszuwählen ist das eher ungünstig.
Ich hau mich erstmal hin, ich schau morgen früh noch mal rein :-). Danke schon mal.
-
So ich hab es mir einfach gemacht. 4 erhöht Lautstärke, 0 die erniedrigt die Lautstärke. Die jeweils 2. Nachricht - also Taste wird losgelassen, stoppt (egal ob da 3 oder 0 geliefert wird).
-
Guten Morgen, habe es gerade getestet, sehr geil das funktioniert
Ein fettes Dankeschön für deine Geduld :-). Mal schauen was mir hier noch einfällt^^.
darüber lass ich mir ja Titel und Artist im Dashboard anzeigen, ich möchte aber wenn die Musik gestoppt ist dass das Feld leer ist. Hab dann den Status abgegriffen und wollte ein "Leerzeichen" setzen wenn Status false ist. Die Iobroker Inject setzt den Status aber sofort wieder auf den Artist der noch hinterlegt ist. Wollte das mit einer Art Wenn funktion machen aber das will nicht so weil die den Text nicht durchlässt.
)
-
@saranger einfach den Status in einer Flow Variable speichern und mit je einer switchnode die Ausgabe der beiden anderen iobroker In Nodes blockieren oder durchlassen
-
@mickym ok muss ich später mal googeln was die flow Variable ist.
-
@saranger einfach den Status als variable im Kontext abspeichern.
Nennen wir die Variable mal „Status“. Dann nimmst Du, wo der Status rauskommt eine Change Node und speicherst die payload der Nachricht.
Also setze flow.status auf msg.payload. Du kannst dafür einfach eine weitere Regel in der bereits vorhandenen Change-Node nutzen.
In den Switch nodes hinter, die beim Status „false“ blockieren sollen, konfigurierst:
Wenn flow.status ist true, dann werden Titel und Interpret nur durchgelassen, wenn der Status true ist.Alternative wäre es die beiden anderen iobroker-in nodes gar nicht triggern zu lassen und nur bei Play aktiv die beiden Datenpunkte mit einer iobroker-get Node auszulesen. In diesem einfachen Fall fände ich das sogar eleganter und sauberer gelöst, da man da nicht warten muss, bis der Datenpunkt aktualisiert wird und der Trigger eindeutig ist. Also einfach an den switch-Node noch einen Ausgang für true, und mit 2 get nodes die text nodes beschreiben.
-
@mickym Die zweite Lösung passt :-). Ich weis nicht wie ich das alles raus finden soll ohne das Forum bzw. dich
-
@saranger mit der Zeit schult sich der logische Verstand. Man muss nur systematisch vorgehen. Am Besten - was triggert meinen Flow - also mit was fange ich links an - und welche Aktion oder Ausgabe erwarte ich - mit was endet der Flow rechts. Dann weißt Du wie die Ausgabe aussehen bzw. welches Format oder Kommando Dein Aktor erwartet. Dazwischen transformierst Du das Nachrichtenobjekt unter Einbeziehung ggf. weiterer logischer Parameter.
Dazu erst mal gar nicht zu technisch denken, sondern wirklich was triggert:
Das kann eine Aktion von jemand sein (du betätigst einen Schalter), die Meldung eines Sensors, eine Uhrzeit, der Sonnenstand, ein Zeitintervall oder auch ein Wetterereignis. Wahrscheinlich gibts nach was, was mir gerade nicht einfällt.
Die Ausgabe ist entweder etwas auf dem Dashboard oder das Steuern eines Gerätes. Und diesen Weg vom Trigger zum Ausgang kannst Du in NodeRed grafisch darstellen. Wenn was nicht funktioniert mit Debug Nodes von links nach rechts (wie Du normalerweise liest) abschnittsweise schauen, ob Dein Nachrichtenobjekt noch dem entspricht, was Du erwartest. -
@mickym einen guten Abend :-). Ich würde noch einmal deine Untersützung bei diesem Thema benötigen. Ich habe jetzt ein Touch KNX Display und versuche gerade da die Lautstärke über den Slider zu regeln, leider krieg ich das nicht umgesetzt. Der Slider hat 1 byte für die Lautstärke, leider fehlt mir die Idee wie ich das an nodered übergebe um die Lautstörke zu erhöhen hast du da eine idee?
Viele Grüße
-
@saranger Nun mit einem Byte solltest Du ja dann Werte zwischen 0 und 255 bekommen. Ggf. installiere Dir mal die Buffer Node um das Byte zu isolieren. Das KNX solltest Du ja selbst über die Nodes reinbekommen.
https://flows.nodered.org/node/node-red-contrib-buffer-parser
ggf. musst halt den Output hier posten, damit man das mittels einer Inject node nachvollziehen kann.
-
@mickym ich nutze ja den von dir erstellten Code. 1 Byte habe ich schon versucht aber ich kann in knx ultimate nicht 1 byte auswählen. Die richtige Position wo ich die KNX Ga einfügen habe ich da leider auch noch nicht gefunden.
{ "id": "3b0bbffb2f1260a1", "type": "tab", "label": "SONOS Küche", "disabled": true, "info": "", "env": [] }, { "id": "eea2cc880eef7afd", "type": "knxUltimate", "z": "3b0bbffb2f1260a1", "server": "6fc013af.98132c", "topic": "9/1/1", "outputtopic": "", "dpt": "5.001", "initialread": 0, "notifyreadrequest": false, "notifyresponse": false, "notifywrite": true, "notifyreadrequestalsorespondtobus": false, "notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized": "0", "listenallga": false, "name": "E2 - Sonos - Lautstärke", "outputtype": "write", "outputRBE": true, "inputRBE": false, "formatmultiplyvalue": 1, "formatnegativevalue": "leave", "formatdecimalsvalue": 999, "passthrough": "no", "x": 220, "y": 300, "wires": [ [ "6eeb84cae72dc350", "8d821701704626ce" ] ] }, { "id": "721838a9e1face5f", "type": "ioBroker in", "z": "3b0bbffb2f1260a1", "name": "E2 - Sonos - Lautstärke", "topic": "sonos.0.root.192_168_2_163.volume", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "fireOnStart": "false", "x": 1460, "y": 400, "wires": [ [ "00949f1cd219d931", "7d2bbada5346609e" ] ] }, { "id": "ded6cd44f4941843", "type": "split", "z": "3b0bbffb2f1260a1", "name": "", "splt": "2", "spltType": "len", "arraySplt": 1, "arraySpltType": "len", "stream": true, "addname": "", "x": 690, "y": 400, "wires": [ [ "c5d56b5c7dad46e7" ] ] }, { "id": "8d821701704626ce", "type": "change", "z": "3b0bbffb2f1260a1", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "$string(payload)\t", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 530, "y": 400, "wires": [ [ "ded6cd44f4941843" ] ] }, { "id": "6eeb84cae72dc350", "type": "switch", "z": "3b0bbffb2f1260a1", "name": "lauter/leiser", "property": "payload", "propertyType": "msg", "rules": [ { "t": "eq", "v": "4", "vt": "num" }, { "t": "eq", "v": "0", "vt": "num" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 510, "y": 300, "wires": [ [ "b44e2b0a7f76c424" ], [ "3f86a5b4c6c3f4ab" ] ], "outputLabels": [ "lauter", "leiser" ] }, { "id": "b44e2b0a7f76c424", "type": "change", "z": "3b0bbffb2f1260a1", "name": "", "rules": [ { "t": "set", "p": "lauter", "pt": "msg", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 700, "y": 280, "wires": [ [ "74edfcad54dbab9b" ] ] }, { "id": "3f86a5b4c6c3f4ab", "type": "change", "z": "3b0bbffb2f1260a1", "name": "", "rules": [ { "t": "set", "p": "lauter", "pt": "msg", "to": "false", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 700, "y": 320, "wires": [ [ "74edfcad54dbab9b" ] ] }, { "id": "00949f1cd219d931", "type": "ui_slider", "z": "3b0bbffb2f1260a1", "name": "", "label": "Lautstärke", "tooltip": "", "group": "50c891e83acc4eec", "order": 0, "width": 0, "height": 0, "passthru": true, "outs": "end", "topic": "topic", "topicType": "msg", "min": "0", "max": "100", "step": 1, "className": "", "x": 1670, "y": 300, "wires": [ [ "0912ceb3f4b48077" ] ] }, { "id": "f80ff9f492d577e2", "type": "change", "z": "3b0bbffb2f1260a1", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "volume", "tot": "flow" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1190, "y": 300, "wires": [ [ "a7403b7aedd71329" ] ] }, { "id": "0912ceb3f4b48077", "type": "change", "z": "3b0bbffb2f1260a1", "name": "", "rules": [ { "t": "set", "p": "volume", "pt": "flow", "to": "payload", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1850, "y": 300, "wires": [ [ "9c4512b0d68be67a" ] ] }, { "id": "338764ad03d254b1", "type": "change", "z": "3b0bbffb2f1260a1", "name": "lauter", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload + 1", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1510, "y": 280, "wires": [ [ "00949f1cd219d931" ] ] }, { "id": "5799da8d3fce0518", "type": "change", "z": "3b0bbffb2f1260a1", "name": "leiser", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload - 1", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1510, "y": 320, "wires": [ [ "00949f1cd219d931" ] ] }, { "id": "a7403b7aedd71329", "type": "switch", "z": "3b0bbffb2f1260a1", "name": "", "property": "lauter", "propertyType": "msg", "rules": [ { "t": "true" }, { "t": "false" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 1370, "y": 300, "wires": [ [ "338764ad03d254b1" ], [ "5799da8d3fce0518" ] ], "outputLabels": [ "lauter", "leiser" ] }, { "id": "74edfcad54dbab9b", "type": "trigger", "z": "3b0bbffb2f1260a1", "name": "", "op1": "", "op2": "0", "op1type": "pay", "op2type": "str", "duration": "-250", "extend": false, "overrideDelay": false, "units": "ms", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 950, "y": 300, "wires": [ [ "f80ff9f492d577e2" ] ] }, { "id": "c5d56b5c7dad46e7", "type": "change", "z": "3b0bbffb2f1260a1", "name": "", "rules": [ { "t": "set", "p": "reset", "pt": "msg", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 840, "y": 400, "wires": [ [ "74edfcad54dbab9b" ] ] }, { "id": "4372a809cbc07d83", "type": "comment", "z": "3b0bbffb2f1260a1", "name": "E2 - Gästebad - Lautstärke", "info": "", "x": 210, "y": 220, "wires": [] }, { "id": "7d2bbada5346609e", "type": "knxUltimate", "z": "3b0bbffb2f1260a1", "server": "6fc013af.98132c", "topic": "9/1/4", "outputtopic": "", "dpt": "5.001", "initialread": 0, "notifyreadrequest": false, "notifyresponse": false, "notifywrite": true, "notifyreadrequestalsorespondtobus": false, "notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized": "0", "listenallga": false, "name": "E2 - Sonos - Lautstärke", "outputtype": "write", "outputRBE": false, "inputRBE": false, "formatmultiplyvalue": 1, "formatnegativevalue": "leave", "formatdecimalsvalue": 999, "passthrough": "no", "x": 1770, "y": 400, "wires": [ [] ] }, { "id": "bfb8a256784efcdd", "type": "knxUltimate", "z": "3b0bbffb2f1260a1", "server": "6fc013af.98132c", "topic": "9/1/9", "outputtopic": "", "dpt": "1.007", "initialread": 0, "notifyreadrequest": false, "notifyresponse": false, "notifywrite": true, "notifyreadrequestalsorespondtobus": false, "notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized": "0", "listenallga": false, "name": "E2 - Sonos - Lautstärke", "outputtype": "write", "outputRBE": false, "inputRBE": false, "formatmultiplyvalue": 1, "formatnegativevalue": "leave", "formatdecimalsvalue": 999, "passthrough": "no", "x": 490, "y": 200, "wires": [ [ "6eeb84cae72dc350" ] ] }, { "id": "d899cfbe9785646c", "type": "buffer-array", "z": "3b0bbffb2f1260a1", "name": "", "bufferLen": 6, "startWhenFilled": false, "x": 850, "y": 200, "wires": [ [] ] }, { "id": "9c4512b0d68be67a", "type": "sonos-universal", "z": "3b0bbffb2f1260a1", "confignode": "7167978c626da90a", "command": "player.set.volume", "state": "", "stateType": "num", "avoidCheckPlayerAvailability": true, "name": "", "x": 2090, "y": 300, "wires": [ [] ] }, { "id": "6fc013af.98132c", "type": "knxUltimate-config", "host": "192.168.2.146", "port": "3671", "physAddr": "15.15.22", "suppressACKRequest": true, "csv": "", "KNXEthInterface": "Auto", "KNXEthInterfaceManuallyInput": "", "statusDisplayLastUpdate": true, "statusDisplayDeviceNameWhenALL": true, "statusDisplayDataPoint": false, "stopETSImportIfNoDatapoint": "stop", "loglevel": "error", "name": "Martins KNX", "localEchoInTunneling": true, "delaybetweentelegrams": "40", "delaybetweentelegramsfurtherdelayREAD": "1", "ignoreTelegramsWithRepeatedFlag": false, "keyringFileXML": "" }, { "id": "50c891e83acc4eec", "type": "ui_group", "name": "Musik", "tab": "416beacd.6a5714", "order": 5, "disp": true, "width": "6", "collapse": false, "className": "" }, { "id": "7167978c626da90a", "type": "sonos-config", "name": "Sonos - Gästebad", "serialnum": "38-42-0B-13-DF-EE:F", "ipaddress": "192.168.2.163" }, { "id": "416beacd.6a5714", "type": "ui_tab", "name": "Gästebad", "icon": "dashboard", "order": 8, "disabled": false, "hidden": false } ] code_text
-
@saranger Der Flow nützt mir nichts da ich kein KNX habe. Du sollst Dir die Buffer Node installieren, dann kannst Du das Byte isolieren und als separate Nachricht weiterverarbeiten. Sprich Du nimmst den output der knx ultimate und parsed bzw. zerlegst den output mit der buffer node.
Wie gesagt der Flow nutzt hier wenig, sondern poste lieber den output aus der knx node, wo das von Dir gesuchte Byte enthalten ist.
-
@mickym also ich habe die KNX Node so eingestellt, dass ein % Wert raus kommt zwischen 0-100 und das scheint immer in 5er Schritten zu springen. Sprich wenn ich die Lautstärke bei Sonos auf 50% setze würde und der Wert bei 50% steht kommt über das Plus Touch Symbol immer 5% dazu und bei minus entsprechend minus 5%. Es ist dementsprechend kein Stufenloser Slider sonder nur Buttons.
-
@mickym
hat sich erledigt funktioniert jetzt. Hab jetzt die KNX Ultimate vor den Nodered slider mit zusätzlich eingefügt und klappt. Warum das gestern nicht ging weis ich noch nicht so genau. -
@saranger das ist doch gut, wenn du Deine Probleme selbst lösen kannst. Manchmal waren es nur Kleinigkeiten. Also Glückwunsch und viel Spaß.
-
@mickym so jetzt muss ich doch noch einmal nachfragen, weil ich gerade noch einen weiteren Touchtaster teste und hier ist die Lautstärke wieder ganz anders. Bei lauter gibt der Taster ein True und bei leiser ein false. Jetzt hab ich das gerade mit einem Counter probiert aber das funktioniert leider noch nicht so wirklich. Hast du eine Idee wie ich das umsetzen kann, dass der bei lauter +4 und bei leiser -4 oder ähnliches ausführen kann?
-
@saranger Ja ich habe schon mal einen Taster implementiert, das ist zwar nicht easy. Wobei ich bei einem Taster ja solange in eine Richtung geschaltet haben möchte, wie ich gedrückt halte.
Ich muss mal schauen, ob ich den Flow noch finde - da ich den mal zum Lernen erstellt habe. Wenn es laut und leise mit true und false ist musst Du halt selbst überlegen, wie lange ein Touch gelten soll. Einen richtigen Taster habe ich mal mit VIS simuliert und damit einen Dimmer geregelt und ein- und ausgeschaltet. Das kannst ggf. ja mal anpassen. Brauchst vielleicht bisschen bis Du das verstehst.
Links siehst Du wie ich quasi mit der Maus den Taster bediene. Beim Drücken kommt true beim Loslassen ein false.
Rechts siehst Du immer den zugehörigen Zustand der Lampe. Das müsste sich auf Ein/Aus Laut und Leise genauso anpassen lassen:tasterimplementierung-dimmer-vis-nodered.mp4
Hier der zugehörige Flow - die Ein- und Ausgaben sind deaktiviert und musst halt durch Deine Nodes ggf. ersetzen. Wichtig ist die function Node mit der Du festlegst, ab wann ein Short- oder Longpress erkannt wird.
-
@mickym ja das gedrückt halten geht ja schon mit dem normalen Taster. Jetzt wäre es quasi pro Tastendruck ein True
-
@saranger Schau Dir mal den Flow an und das kleine Video.