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
HTML
<!-- 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>