Hi!
Is it possible to control the Sonos Plugin from Python?
I.e. set a player volume based on some other parameter.
Best regards, L
#!/usr/bin/env python
#
# Remote control for the Sonos sound system.
#
# Copyright (c) 2014, Matthias Friedrich <matt@mafr.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
from __future__ import print_function
import argparse
import soco
# Hostname or IP address of your speaker.
DEVICE_ADDRESS = '192.168.178.36'
# Speaker volume cutoff for safety :)
MAX_VOLUME = 20
QUEUE_FMT = '{pos:3}. {item.creator} - {item.title}'
STATUS_FMT = '''\
{artist} - {title}
{album}
{position} - {duration}, pos {playlist_position}, vol {vol}\
'''
def mk_parser(subparsers, name, fun):
parser = subparsers.add_parser(name)
parser.set_defaults(fun=fun)
return parser
def play(args):
if args.track_no is None:
args.dev.play()
else:
args.dev.play_from_queue(args.track_no)
def volume(args):
if args.volume is not None:
vol = args.dev.volume + (1 if args.volume == '+' else -1)
args.dev.volume = min(vol, MAX_VOLUME)
print(args.dev.volume)
def status(args):
print(STATUS_FMT.format(
vol=args.dev.volume,
**args.dev.get_current_track_info()
))
def queue(args):
for pos, track in enumerate(args.dev.get_queue()):
print(QUEUE_FMT.format(pos=pos, item=track))
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
mk_parser(subparsers, 'queue', queue)
mk_parser(subparsers, 'status', status)
mk_parser(subparsers, 'next', lambda a: a.dev.next())
mk_parser(subparsers, 'previous', lambda a: a.dev.previous())
mk_parser(subparsers, 'pause', lambda a: a.dev.pause())
parser_play = subparsers.add_parser('play')
parser_play.add_argument('track_no', metavar='N', type=int, nargs='?',
help='Queue track number to play (0-based)')
parser_play.set_defaults(fun=play)
parser_volume = subparsers.add_parser('volume')
parser_volume.add_argument('volume', metavar='X', choices=('+', '-'), nargs='?',
help='Increase ("+") or decrese ("-") volume level')
parser_volume.set_defaults(fun=volume)
if __name__ == '__main__':
device = soco.SoCo(DEVICE_ADDRESS)
parser.set_defaults(dev=device)
args = parser.parse_args()
if hasattr(args, 'fun'):
args.fun(args)
else:
parser.parse_args(['-h'])
# EOF
Colorado4Wheeler wrote:I don't see why not. A quick search on Google found a few folks who are doing it on their Linux box. As long as there is a way to get to the data it can be parsed with Python. Here's one that someone posted that looks like it might be a good starting place for you (I don't personally have a Sonos so I don't know what the API looks like for it):
SonosPlugin = indigo.server.getPlugin("com.ssi.indigoplugin.Sonos")
if SonosPlugin.isEnabled():
SonosPlugin.executeAction(deviceId=[deviceId], "Volume", props={'setting':str(volumeVariable)})
FlyingDiver wrote:Colorado4Wheeler wrote:I don't see why not. A quick search on Google found a few folks who are doing it on their Linux box. As long as there is a way to get to the data it can be parsed with Python. Here's one that someone posted that looks like it might be a good starting place for you (I don't personally have a Sonos so I don't know what the API looks like for it):
I think he meant controlling Nick's Sonos plugin from a python script running in Indigo.
Nick has a couple examples of doing this on his website: https://vulture.lagaros.com/wiki/pages/ ... tions.html
Code for changing volume would be something like:
- Code: Select all
SonosPlugin = indigo.server.getPlugin("com.ssi.indigoplugin.Sonos")
if SonosPlugin.isEnabled():
SonosPlugin.executeAction(deviceId=[deviceId], "Volume", props={'setting':str(volumeVariable)})
SonosPlugin = indigo.server.getPlugin("com.ssi.indigoplugin.Sonos")
if SonosPlugin.isEnabled():
SonosPlugin.executeAction(deviceId=[769403082], "actionPlay")
SonosPlugin = indigo.server.getPlugin("com.ssi.indigoplugin.Sonos")
if SonosPlugin.isEnabled():
SonosPlugin.executeAction(deviceId=769403082, "actionPlay")
SonosPlugin = indigo.server.getPlugin("com.ssi.indigoplugin.Sonos")
if SonosPlugin.isEnabled():
SonosPlugin.executeAction("actionPlay", deviceId=769403082)
SonosPlugin = indigo.server.getPlugin("com.ssi.indigoplugin.Sonos")
if SonosPlugin.isEnabled():
SonosPlugin.executeAction("actionVolume", props={'setting':str(volVar)}, deviceId=769403082)
SonosPlugin = indigo.server.getPlugin("com.ssi.indigoplugin.Sonos")
if SonosPlugin.isEnabled():
SonosPlugin.executeAction("actionZP_LIST", deviceId=388657864, props={'setting':"Movies",'mode':"Replace Queue"})
Users browsing this forum: No registered users and 5 guests