UNPKG

node-red-contrib-sonos-plus

Version:

A set of Node-RED nodes to control SONOS player in your local network.

270 lines (241 loc) 10.3 kB
<!-- Sonos Universal Node --> <!-- Registering Node (JavaScript) --> <script type="text/javascript"> /* global RED */ /* eslint no-undef: "error" */ RED.nodes.registerType('sonos-universal', { category: 'sonosplus', defaults: { // the editable properties of this node confignode: { value: '', type: 'sonos-config' }, command: { value: 'message', required: true }, state: { value: '', validate: RED.validators.typedInput('stateType') }, stateType: { value: 'str' }, avoidCheckPlayerAvailability: { value: false }, name: { value: '' } }, inputs: 1, // set the number of inputs - only 0 or 1 outputs: 1, // set the number of outputs - 0 to n icon: 'sonos.png', // saved in icons/myicon.png color: '#AAAAAA', label: function () { let found = universalCmdList.find(item => item.cmd === this.command); let nodeLabel = this.name || found.cmd || 'Universal' return nodeLabel; }, oneditprepare: function () { // set up list for command for (var i = 0; i < universalCmdList.length; i++) { $('#node-input-command').append($('<option></option>').attr('value', universalCmdList[i].cmd).text(universalCmdList[i].cmd)); } // selected command $('#node-input-command').val(this.command); // set up typed input for state $('#node-input-state').typedInput({ default: 'str', typeField: $('#node-input-stateType'), types: ['str', 'num'] }); }, paletteLabel: 'Universal' }); </script> <!-- Setting design and inputs for node panel (HTML)--> <script type="text/html" data-template-name="sonos-universal"> <div id="main-props"> <!-- Config node --> <div class="form-row"> <label for="node-input-confignode"> Config Node</label> <input type="text" id="node-input-confignode"/> </div> <div class="form-tips"> <b>Config node</b>: Please select a config node. Config node stores the DNS name or ipv4 address or the serial number of a SONOS-Player. <br><br> Some commands accept msg.playerName. Providing msg.playerName overrules the config node player.<br><br> The command (Topic) is being send to the specified SONOS-Player. In case of a group command the command is send to the coordinator of that group. </div><br> <!-- Topic (Command selection) --> <div class="form-row"> <label for="node-input-command"><i class="fa fa-tasks"></i> Topic</label> <select id="node-input-command" style="width:70%"></select> </div> <div class="form-tips"> <b>Topic</b>: Please select a command or leave "message" to provide the command in msg.topic. A selected command overrules any command given in msg.topic. </div><br> <!-- payload (state) --> <div class="form-row"> <label for="node-input-state"><i class="fa fa-envelope"></i> Payload</label> <input type="text" id="node-input-state" style="width:70%" placeholder="Leave blank (type string) to use msg.payload"/> <input type="hidden" id="node-input-stateType"/> </div> <div class="form-tips"> <b>Payload</b>: Some commands needs additional data such as on|off - <a href=https://github.com/hklages/node-red-contrib-sonos-plus/wiki/A.1-Universal-Node>see documentation.</a> You can enter this data either here or provide it in msg.payload.<br> Entered data overrules data given in msg.payload. </div><br> <!-- SONOS player Availability Check --> <div class="form-row"> <label for="node-input-avoidCheckPlayerAvailability"> Reachability</label> <input type="checkbox" id="node-input-avoidCheckPlayerAvailability" style="display: inline-block; vertical-align: top; width:auto;"/> Do NOT check the availability of Sonos-Player. </div> <div class="form-tips"> <b>Reachability</b>: By default the reachability of the SONOS player is checked at deployment time. Tik the box to avoid this check. That makes sense for SONOS-player being not always "On". <br><br> This option does NOT work for config nodes, where the IP address is missing. </div><br> <!-- Node name --> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="This node name"/> </div> </div> </script> <script type="text/javascript"> // universalCmdList has to be kept in sync with the table .js file! First item is message! // Message first, all others in lexical order, ascending const universalCmdList = [ { cmd: "message" }, { cmd: "coordinator.delegate" }, { cmd: "group.adjust.volume" }, { cmd: "group.cancel.sleeptimer" }, { cmd: "group.clear.queue" }, { cmd: "group.create.snap" }, { cmd: "group.create.volumesnap" }, { cmd: "group.get.actions" }, { cmd: "group.get.crossfade" }, { cmd: "group.get.members" }, { cmd: "group.get.mutestate" }, { cmd: "group.get.playbackstate" }, { cmd: "group.get.queue" }, { cmd: "group.get.queue.length" }, { cmd: "group.get.sleeptimer" }, { cmd: "group.get.state" }, { cmd: "group.get.trackplus" }, { cmd: "group.get.volume" }, { cmd: "group.next.track" }, { cmd: "group.pause" }, { cmd: "group.play" }, { cmd: "group.play.export" }, { cmd: "group.play.library.album" }, { cmd: "group.play.library.artist" }, { cmd: "group.play.library.playlist" }, { cmd: "group.play.library.track" }, { cmd: "group.play.mysonos" }, { cmd: "group.play.notification" }, { cmd: "group.play.queue" }, { cmd: "group.play.snap" }, { cmd: "group.play.sonosplaylist" }, { cmd: "group.play.streamhttp" }, { cmd: "group.play.track" }, { cmd: "group.play.tunein" }, { cmd: "group.previous.track" }, { cmd: "group.queue.library.album" }, { cmd: "group.queue.library.artist" }, { cmd: "group.queue.library.playlist" }, { cmd: "group.queue.library.track" }, { cmd: "group.queue.sonosplaylist" }, { cmd: "group.queue.uri" }, { cmd: "group.queue.urispotify" }, { cmd: "group.remove.tracks" }, { cmd: "group.save.queue" }, { cmd: "group.seek" }, { cmd: "group.seek.delta" }, { cmd: "group.set.crossfade" }, { cmd: "group.set.mutestate" }, { cmd: "group.set.queuemode" }, { cmd: "group.set.sleeptimer" }, { cmd: "group.set.volume" }, { cmd: "group.stop" }, { cmd: "group.toggle.playback" }, { cmd: "household.add.subwoofer" }, { cmd: "household.add.satellites" }, { cmd: "household.create.group" }, { cmd: "household.create.stereopair" }, { cmd: "household.disable.alarm" }, { cmd: "household.enable.alarm" }, { cmd: "household.get.alarms" }, { cmd: "household.get.musiclibrary.options" }, { cmd: "household.get.groups" }, { cmd: "household.get.sonosplaylists" }, { cmd: "household.get.sonosplaylisttracks" }, { cmd: "household.remove.satellites" }, { cmd: "household.remove.sonosplaylist" }, { cmd: "household.separate.group" }, { cmd: "household.separate.stereopair" }, { cmd: "household.set.alarmTime" }, { cmd: "household.test.player" }, { cmd: "household.update.musiclibrary" }, { cmd: "household.wakeup.player" }, { cmd: "joiner.play.notification" }, { cmd: "player.adjust.volume" }, { cmd: "player.become.standalone" }, { cmd: "player.get.bass" }, { cmd: "player.get.batterylevel" }, { cmd: "player.get.buttonlockstate" }, { cmd: "player.get.dialoglevel" }, { cmd: "player.get.led" }, { cmd: "player.get.loudness" }, { cmd: "player.get.mutestate" }, { cmd: "player.get.nightmode" }, { cmd: "player.get.properties" }, { cmd: "player.get.queue" }, { cmd: "player.get.role" }, { cmd: "player.get.subgain" }, { cmd: "player.get.treble" }, { cmd: "player.get.volume" }, { cmd: "player.get.subwoofer" }, { cmd: "player.join.group" }, { cmd: "player.play.avtransport" }, { cmd: "player.play.clip" }, { cmd: "player.play.linein" }, { cmd: "player.play.tv" }, { cmd: "player.set.bass" }, { cmd: "player.set.buttonlockstate" }, { cmd: "player.set.dialoglevel" }, { cmd: "player.set.led" }, { cmd: "player.set.loudness" }, { cmd: "player.set.mutestate" }, { cmd: "player.set.nightmode" }, { cmd: "player.set.subwoofer" }, { cmd: "player.set.subgain" }, { cmd: "player.set.treble" }, { cmd: "player.set.volume" }, { cmd: "player.test" } ] </script> <!-- Help text (HTML) --> <script type="text/html" data-help-name="sonos-universal"> <p>This node provides all commands related to household, groups and players.<p> Command and state can be provided in the dialog or with incoming message - see dialog.<br> For group commands the given player defines the group.<br><br> <a href="https://github.com/hklages/node-red-contrib-sonos-plus/wiki">Introduction</a><br> <a href="https://github.com/hklages/node-red-contrib-sonos-plus/wiki/A.1-Universal-Node">Details Universal node</a> <h1>Input</h1> Each command has specific input and output properties. <br><br> The most important properties are: <dl class="message-properties"> <dt>payload <span class="property-type">depend on command</span></dt> <dd>The case sensitive new state/message like on/off, uri, .... </dd> <dt class="required">topic <span class="property-type">string</span></dt> <dd>The command like group.play, group.play.queue, ...</dd> <dt>playerName <span class="property-type">string</span></dt> <dd>The SONOS player name (such as kitchen), will overrule the given player in config node</dd> </dl> <br> <h1>Output</h3> All "get/export" commands outputs data to msg.payload. <dl class="message-properties"> <dt>payload <span class="property-type">string</span> </dt> <dd>In case of <b>get/export</b> the requested data is being provided.</dd> </dl> </script>