
ich hab alles wie oben beschrieben, gemacht. Aber trotzdem kein Erfolg.
Code:
smarthome@raspberrypi:~$ python3 -c "import sys;print(sys.stdout.encoding)" ANSI_X3.4-1968

smarthome@raspberrypi:~$ python3 -c "import sys;print(sys.stdout.encoding)" ANSI_X3.4-1968
/usr/local/bin/
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
# ################################################## ##################
# Imports
# ################################################## ##################
import json
import os
import argparse
from http.server import BaseHTTPRequestHandler, HTTPServer
import locale
import socketserver
import logging
import logging.handlers
import threading
import configparser
import signal
import time
import sys
import io
for s in ("stdin", "stdout", "stderr"):
setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8"))
from lib_sonos import utils
from lib_sonos import definitions
from lib_sonos.sonos_service import SonosServerService
from lib_sonos import daemon
from lib_sonos import sonos_commands
# ################################################## ##################
# GLOBALS
# ################################################## ##################
for s in ("stdin", "stdout", "stderr"):
setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8"))
/etc/environment
PYTHONIOENCODING=UTF-8
python3 -c "import sys;print(sys.stdout.encoding)"
UTF-8
/usr/local/bin/
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
# ####################################################################
# Imports
# ####################################################################
import json
import os
import argparse
from http.server import BaseHTTPRequestHandler, HTTPServer
import locale
import socketserver
import logging
import logging.handlers
import threading
import configparser
import signal
import time
import sys
import io
for s in ("stdin", "stdout", "stderr"):
setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8"))
from lib_sonos import utils
from lib_sonos import definitions
from lib_sonos.sonos_service import SonosServerService
from lib_sonos import daemon
from lib_sonos import sonos_commands
# ####################################################################
# GLOBALS
# ####################################################################
import requests
command_service = None
homedir = os.path.dirname(os.path.realpath(__file__))
logger = logging.getLogger('')
class SonosHttpHandler(BaseHTTPRequestHandler):
def do_GET(self):
try:
global command_service
result, response = command_service.do_work(self.client_address[0], self.path)
if result:
self.send_response(definitions.HTTP_SUCCESS, 'OK')
else:
self.send_response(definitions.HTTP_ERROR, 'Bad request')
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write("{}".format(response).encode('utf-8'))
finally:
self.connection.close()
def do_POST(self):
try:
size = int(self.headers["Content-length"])
command = self.rfile.read(size).decode('utf-8')
try:
cmd_obj = json.loads(command, cls=sonos_commands.MyDecoder)
except AttributeError as err:
err_command = list(filter(None, err.args[0].split("'")))[-1]
self.make_response(False, "No command '{command}' found!".format(command=err_command))
return
status, response = cmd_obj.run()
self.make_response(status, response)
logger.debug('Server response -- status: {status} -- response: {response}'.format(status=status,
response=response))
finally:
self.connection.close()
def make_response(self, status, response):
if status:
self.send_response(definitions.HTTP_SUCCESS, 'OK')
else:
self.send_response(definitions.HTTP_ERROR, 'Bad request')
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write("<html><head><title>Sonos Broker</title></head>".encode('utf-8'))
self.wfile.write("<body>{response}".format(response=response).encode('utf-8'))
self.wfile.write("</body></html>".encode('utf-8'))
class ThreadedHTTPServer(socketserver.ThreadingMixIn, HTTPServer):
"""Handle requests in a separate thread."""
class SonosBroker():
@property
def loghandler(self):
return self._loghandler
@property
def list_only(self):
return self._list_only
@list_only.setter
def list_only(self, value):
self._list_only = value
def __init__(self, debug=False, config=None):
global command_service
global homedir
global logger
self._debug = debug
self._loghandler = None
self._http_server = None
self._host = ''
self._port = ''
self._tts_local_mode = False
self._save_path = None
self._server_url = None
self._quota = None
self._server_ip = None
self._logfile = None
self._port = definitions.DEFAULT_PORT
self._host = definitions.DEFAULT_HOST
self._sonos_service = None
self._server_active = True
self._list_only = False
self._config = config
# ############################################################
# Signal Handling
# ############################################################
signal.signal(signal.SIGHUP, self.stop)
signal.signal(signal.SIGINT, self.stop)
signal.signal(signal.SIGTERM, self.stop)
config = configparser.ConfigParser()
if self._config is None:
config_path = os.path.join(homedir, definitions.DEFAULT_CFG)
else:
config_path = self._config
config.read(config_path)
# ############################################################
# Logging
# ############################################################
if config.has_section('logging'):
if config.has_option('logging', 'loglevel'):
loglevel = config.get('logging', 'loglevel')
else:
loglevel = 'warning'
if self._debug:
loglevel = 'debug'
if config.has_option('logging', 'logfile'):
self._logfile = config.get('logging', 'logfile').strip("\"").strip("'")
else:
self._logfile = definitions.DEFAULT_LOG
self._logfile = os.path.expanduser(self._logfile)
self._logfile = os.path.expandvars(self._logfile)
if not os.path.isabs(self._logfile):
self._logfile = os.path.join(homedir, self._logfile)
try:
if not os.path.exists(os.path.dirname(self._logfile)):
os.makedirs(os.path.dirname(self._logfile))
except Exception:
logger.error("Couldn't create logfile path '{path}'. Using default path {'def_path}'!".format(
path=os.path.dirname(self._logfile, def_path=definitions.DEFAULT_LOG)))
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
raise ValueError('Invalid log level: %s' % loglevel)
logdate = "%Y-%m-%d %H:%M:%S"
logformat = "%(asctime)s %(levelname)-8s %(threadName)-12s %(message)s"
if numeric_level == logging.DEBUG:
logdate = None
logformat = "%(asctime)s %(levelname)-" \
"8s %(threadName)-12s %(message)s -- %(filename)s:%(funcName)s:%(lineno)d"
logging.basicConfig(level=numeric_level, format=logformat, datefmt=logdate)
#############################################################
# logfile write test
#############################################################
if self._logfile:
os.umask(0o002)
try:
with open(self._logfile, 'a') as f:
f.write("Init sonos broker {version}\n".format(version=definitions.VERSION))
except IOError as e:
print("Error creating logfile {}: {}".format(self._logfile, e))
try:
formatter = logging.Formatter(logformat, logdate)
self._loghandler = logging.handlers.TimedRotatingFileHandler(self._logfile, when='midnight',
backupCount=7)
self._loghandler.setLevel(numeric_level)
self._loghandler.setFormatter(formatter)
if numeric_level == logging.DEBUG: # clean log
self._loghandler.doRollover()
logger.addHandler(self._loghandler)
# set the loglevel for soco framework
logging.getLogger('soco.core').addHandler(self._loghandler)
except IOError as e:
print("Error creating logfile {}: {}".format(self._logfile, e))
if config.has_section('sonos_broker'):
if config.has_option('sonos_broker', 'server_ip'):
self._server_ip = config.get('sonos_broker', 'server_ip')
if config.has_option('sonos_broker', 'host'):
self._host = config.get('sonos_broker', 'host')
if config.has_option('sonos_broker', 'port'):
self._port = config.getint('sonos_broker', 'port')
if not self._server_ip:
self._server_ip = utils.get_lan_ip()
if not self._server_ip:
raise Exception("Could not detect the internal server ip automatically! Set the ip address "
"manually (see config file)")
if config.has_section('google_tts'):
if config.has_option('google_tts', 'enabled'):
self._tts_local_mode = config.getboolean('google_tts', 'enabled')
if self._tts_local_mode:
if config.has_option('google_tts', 'save_path'):
self._save_path = config.get('google_tts', 'save_path')
if config.has_option('google_tts', 'server_url'):
self._server_url = config.get('google_tts', 'server_url')
if config.has_option('google_tts', 'quota'):
self._quota = config.getint('google_tts', 'quota')
if self._tts_local_mode and not self._save_path:
logger.warning('No local save path given!')
self._tts_local_mode = False
if self._tts_local_mode and not self._server_url:
logger.warning('No local server url given!')
self._tts_local_mode = False
if self._tts_local_mode and not self._quota:
self._quota = definitions.DEFAULT_QUOTA
if self._tts_local_mode:
if not utils.check_directory_permissions(self._save_path):
logger.warning('No sufficient folder permissions in \'{}\'!'.format(self._save_path))
self._tts_local_mode = False
else:
free_diskspace = utils.get_free_space_mb(self._save_path)
logger.info('Free diskspace: {} mb'.format(free_diskspace))
if free_diskspace < self._quota:
logger.warning(
'Not enough disk space left on \'{}\'. At least {} mb of free diskspace required!'.format(
self._save_path,
self._quota))
logger.warning("\nIgnore this warning, if the snippet directoy is a smb or cifs mounted "
"directory.")
if not self._tts_local_mode:
logger.debug("Google-TTS disabled!")
else:
logger.debug("Google-TTS 'local mode' enabled!")
logger.debug('server_url: {}'.format(self._server_url))
logger.debug('save_path: {}'.format(self._save_path))
def start(self):
global command_service
logger.info("Sonos Broker v{version}".format(version=definitions.VERSION))
logger.info(
"Starting server with ip address {ip} ... be sure this is correct.".format(ip=self._server_ip))
time.sleep(1)
self._sonos_service = SonosServerService(self._server_ip, self._port, self._server_url, self._save_path,
self._quota, self._tts_local_mode)
self._http_server = ThreadedHTTPServer((self._host, self._port), SonosHttpHandler)
logger.info('Starting http server, use <Ctrl-C> to stop')
while self._server_active:
self._http_server.serve_forever()
def stop(self):
logger.debug('unsubscribing from sonos speakers ...')
if self._sonos_service is not None:
self._sonos_service.unsubscribe_speaker_events()
if self._http_server:
self._server_active = False
logger.debug('closing http server ...')
self._http_server.socket.close()
for thread in threading.enumerate():
try:
thread.join(2)
except:
pass
if threading.active_count() > 1:
for thread in threading.enumerate():
logger.info("Thread: {}, still alive".format(thread.name))
else:
logger.info("Sonos Broker stopped")
def kill(pid, wait=10):
delay = 0.25
waited = 0
if pid:
os.kill(pid, signal.SIGTERM)
while waited < wait:
try:
os.kill(pid, 0)
except OSError:
os._exit(0)
waited += delay
time.sleep(delay)
try:
os.kill(pid, signal.SIGKILL)
except OSError:
os._exit(0)
def scan():
print('\n\nScanning for Sonos speaker in the network ...')
soco_speakers = SonosServerService._discover()
suffix = ''
if len(soco_speakers) > 1:
suffix = "s"
print("Found {} speaker{} in the network.\n".format(len(soco_speakers), suffix))
for speaker in soco_speakers:
try:
info = speaker.get_speaker_info(timeout=5)
print("\n{}".format(speaker.uid))
print("-" * len(speaker.uid))
print("\tip :\t{}".format(speaker.ip_address))
print("\tname :\t{}".format(speaker.player_name))
print("\tmodel:\t{}\n".format(info['model_name']))
except requests.ConnectionError:
print("Speaker '{uid}' seems to be offline.".format(uid=speaker.uid))
continue
except Exception as ex:
print('unknown error')
print(ex)
if __name__ == '__main__':
argparser = argparse.ArgumentParser()
subparsers = argparser.add_subparsers(dest="subparser_name")
start_parser = subparsers.add_parser(name='start', help="Starts the Sonos Broker. ")
start_parser.add_argument('-d', '--debug', help='Debug Mode: Broker stays in foreground with verbose output',
action='store_true')
start_parser.add_argument('-c', '--config', help='[Optional] path to a config file.')
stop_parser = subparsers.add_parser(name='stop', help="Stops the Sonos Broker.")
stop_parser = subparsers.add_parser(name='list', help="Lists all Sonos speaker in the network.")
args = argparser.parse_args()
if args.subparser_name == "stop":
print('Shutting down Sonos Broker ...')
kill(daemon.get_pid(__file__))
elif args.subparser_name == "list":
scan()
elif args.subparser_name == "start":
config_path = definitions.DEFAULT_CFG
if args.config:
config_path = os.path.abspath(args.config)
if not os.path.exists(config_path):
print("Config file not found [** {path} **]".format(path=os.path.abspath(config_path)))
exit()
broker = SonosBroker(args.debug, config=config_path)
if locale.getdefaultlocale() == (None, None):
locale.setlocale(locale.LC_ALL, 'C')
else:
locale.setlocale(locale.LC_ALL, '')
if not args.debug:
d = daemon.Daemonize(app=__name__, pid=definitions.DEFAULT_PID, action=broker.start,
keep_fds=[broker.loghandler.stream.fileno()])
d.start()
else:
broker.start()
else:
print("Unknown command!")
exit()
2017-01-02 12:54:12,686 INFO Thread-43 Received status 200 from 192.168.1.24 -- services.py:send_command:392
2017-01-02 12:54:12,721 INFO Thread-43 registered clients: 192.168.1.13:[9999] -- udp_broker.py:udp_send:43
2017-01-02 12:54:12,727 INFO Thread-43 sending sonos speaker data: {
"additional_zone_members": "",
"alarms": "",
"balance": 0,
"bass": 0,
"display_version": "7.0",
"hardware_version": "1.20.1.6-2",
"household_id": "Sonos_NK5GZK7PASLUh5Vei3SIuPaCKx",
"ip": "192.168.1.24",
"is_coordinator": true,
"led": 1,
"loudness": 1,
"mac_address": "94-9F-3E-70-72-DC",
"max_volume": -1,
"model": "Sonos PLAY:1",
"model_number": "S12",
"mute": 0,
"pause": 0,
"play": 1,
"playlist_position": "1",
"playlist_total_tracks": "12",
"playmode": "normal",
"radio_show": "",
"radio_station": "Hitradio Ö3",
"serial_number": "94-9F-3E-70-72-DC:F",
"software_version": "34.7-35162c",
"sonos_playlists": "Best of 2016,Fit 2017,Motivation,Rock Party",
"status": true,
"stop": 0,
"streamtype": "radio",
"track_album": "",
"track_album_art": "http://192.168.1.24:1400/getaa?s=1&u=x-sonosapi-stream%3as8007%3fsid%3d254%26sn%3d0",
"track_artist": "",
"track_duration": "00:00:00",
"track_position": "0:00:00",
"track_title": "",
"track_uri": "mms://apasf.apa.at/OE3_Live_Audio",
"treble": 0,
"uid": "rincon_949f3e7072dc01400",
"volume": 27,
"wifi_state": 1,
"zone_icon": "/img/icon-S12.png",
"zone_name": "Wohnzimmer"
} -- udp_broker.py:udp_send:44
--- Logging error ---
Traceback (most recent call last):
File "/usr/local/lib/python3.5/logging/__init__.py", line 982, in emit
stream.write(msg)
UnicodeEncodeError: 'ascii' codec can't encode character '\xd6' in position 681: ordinal not in range(128)
Call stack:
File "/usr/local/lib/python3.5/threading.py", line 882, in _bootstrap
self._bootstrap_inner()
File "/usr/local/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
File "/usr/local/lib/python3.5/threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python3.5/socketserver.py", line 625, in process_request_thread
self.finish_request(request, client_address)
File "/usr/local/lib/python3.5/socketserver.py", line 354, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/local/lib/python3.5/socketserver.py", line 681, in __init__
self.handle()
File "/usr/local/lib/python3.5/http/server.py", line 422, in handle
self.handle_one_request()
File "/usr/local/lib/python3.5/http/server.py", line 410, in handle_one_request
method()
File "/usr/local/bin/sonos_broker", line 65, in do_POST
status, response = cmd_obj.run()
File "/usr/local/lib/python3.5/site-packages/lib_sonos/sonos_commands.py", line 141, in run
sonos_speaker.sonos_speakers[self.uid].send()
File "/usr/local/lib/python3.5/site-packages/lib_sonos/sonos_speaker.py", line 1353, in send
self._send()
File "/usr/local/lib/python3.5/site-packages/lib_sonos/sonos_speaker.py", line 1376, in _send
udp_broker.UdpBroker.udp_send(data)
File "/usr/local/lib/python3.5/site-packages/lib_sonos/udp_broker.py", line 44, in udp_send
logger.info("sending sonos speaker data: {}".format(data))
Message: 'sending sonos speaker data: {\n "additional_zone_members": "",\n "alarms": "",\n "balance": 0,\n "bass": 0,\n "display_version": "7.0",\n "hardware_version": "1.20.1.6-2",\n "household_id": "Sonos_NK5GZK7PASLUh5Vei3SIuPaCKx",\n "ip": "192.168.1.24",\n "is_coordinator": true,\n "led": 1,\n "loudness": 1,\n "mac_address": "94-9F-3E-70-72-DC",\n "max_volume": -1,\n "model": "Sonos PLAY:1",\n "model_number": "S12",\n "mute": 0,\n "pause": 0,\n "play": 1,\n "playlist_position": "1",\n "playlist_total_tracks": "12",\n "playmode": "normal",\n "radio_show": "",\n "radio_station": "Hitradio Ö3",\n "serial_number": "94-9F-3E-70-72-DC:F",\n "software_version": "34.7-35162c",\n "sonos_playlists": "Best of 2016,Fit 2017,Motivation,Rock Party",\n "status": true,\n "stop": 0,\n "streamtype": "radio",\n "track_album": "",\n "track_album_art": "http://192.168.1.24:1400/getaa?s=1&u=x-sonosapi-stream%3as8007%3fsid%3d254%26sn%3d0",\n "track_artist": "",\n "track_duration": "00:00:00",\n "track_position": "0:00:00",\n "track_title": "",\n "track_uri": "mms://apasf.apa.at/OE3_Live_Audio",\n "treble": 0,\n "uid": "rincon_949f3e7072dc01400",\n "volume": 27,\n "wifi_state": 1,\n "zone_icon": "/img/icon-S12.png",\n "zone_name": "Wohnzimmer"\n}'
Arguments: ()
192.168.1.13 - - [02/Jan/2017 12:54:12] "POST / HTTP/1.1" 200 -
sonos_broker


python3 -c "import sys;print(sys.stdout.encoding)"
ANSI_X3.4-1968
import sys
import io
for s in ("stdin", "stdout", "stderr"):
setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8"))
locale -a
smarthome@raspberrypi:/usr/local/bin$ locale -a C C.UTF-8 POSIX de_DE.utf8 en_GB.utf8
python3 -c "import sys;print(sys.stdout.encoding)"
locale -a
smarthome@raspberrypi:/usr/local/bin$ locale -a C C.UTF-8 POSIX de_DE.utf8 en_GB.utf8
2017-01-01 18:21:37,706 DEBUG Thread-6 Starting new HTTP connection (1): 192.168.178.21 -- connectionpool.py:_new_conn:212
2017-01-01 18:21:37,749 DEBUG Thread-6 http://192.168.178.21:1400 "POST /MediaRenderer/AVTransport/Control HTTP/1.1" 200 1375 -- connectionpool.py:_make_request:400
2017-01-01 18:21:37,758 DEBUG Thread-6 Received {'Server': 'Linux UPnP/1.0 Sonos/34.7-35162c (ZPS1)', 'CONTENT-TYPE': 'text/xml; charset="utf-8"', 'CONTENT-LENGTH': '1375', 'Connection': 'close', 'EXT': ''}, <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetPositionInfoResponse xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><Track>1</Track><TrackDuration>0:00:00</TrackDuration><TrackMetaData><DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="-1" parentID="-1" restricted="true"><res protocolInfo="x-rincon-mp3radio:*:*:*">x-rincon-mp3radio://br-mp3-bayern3-m.akacast.akamaistream.net/7/442/142692/v1/gnl.akacast.akamaistream.net/br_mp3_bayern3_m</res><r:streamContent>Studio-Hotline: 0800 / 800 3 800 (gebührenfrei)</r:streamContent><dc:title>br_mp3_bayern3_m</dc:title><upnp:class>object.item</upnp:class></item></DIDL-Lite></TrackMetaData><TrackURI>x-rincon-mp3radio://br-mp3-bayern3-m.akacast.akamaistream.net/7/442/142692/v1/gnl.akacast.akamaistream.net/br_mp3_bayern3_m</TrackURI><RelTime>0:00:00</RelTime><AbsTime>NOT_IMPLEMENTED</AbsTime><RelCount>2147483647</RelCount><AbsCount>2147483647</AbsCount></u:GetPositionInfoResponse></s:Body></s:Envelope> -- services.py:send_command:389
2017-01-01 18:21:37,760 INFO Thread-6 Received status 200 from 192.168.178.21 -- services.py:send_command:392
2017-01-01 18:21:37,762 INFO Thread-6 registered clients: -- udp_broker.py:udp_send:43
2017-01-01 18:21:37,762 INFO Thread-6 sending sonos speaker data: {
"radio_show": "Sonntags-Hitmix",
"radio_station": "Bayern 3",
"track_album_art": "http://192.168.178.21:1400/getaa?s=1&u=x-sonosapi-stream%3as14991%3fsid%3d254%26flags%3d8224%26sn%3d0",
"track_artist": "Studio",
"track_title": "Studio-Hotline: 0800 / 800 3 800 (Gebührenfrei)",
"uid": "rincon_000xxxxxxxxxxxxxxxxxxxx"
} -- udp_broker.py:udp_send:44
locale -a
-- services.py:send_command:382
2017-01-01 16:48:15,729 DEBUG Thread-1 Starting new HTTP connection (1): 192.168.1.24 -- connectionpool.py:_new_conn:212
2017-01-01 16:48:15,763 DEBUG Thread-1 http://192.168.1.24:1400 "POST /MediaRenderer/AVTransport/Control HTTP/1.1" 200 1375 -- connectionpool.py:_make_request:400
2017-01-01 16:48:15,788 DEBUG Thread-1 Received {'Server': 'Linux UPnP/1.0 Sonos/34.7-35162c (ZPS12)', 'EXT': '', 'CONTENT-LENGTH': '1375', 'Connection': 'close', 'CONTENT-TYPE': 'text/xml; charset="utf-8"'}, <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetPositionInfoResponse xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><Track>1</Track><TrackDuration>0:00:00</TrackDuration><TrackMetaData><DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="-1" parentID="-1" restricted="true"><res protocolInfo="x-rincon-mp3radio:*:*:*">x-rincon-mp3radio://br-mp3-bayern3-m.akacast.akamaistream.net/7/442/142692/v1/gnl.akacast.akamaistream.net/br_mp3_bayern3_m</res><r:streamContent>Studio-Hotline: 0800 / 800 3 800 (geb\xfchrenfrei)</r:streamContent><dc:title>br_mp3_bayern3_m</dc:title><upnp:class>object.item</upnp:class></item></DIDL-Lite></TrackMetaData><TrackURI>x-rincon-mp3radio://br-mp3-bayern3-m.akacast.akamaistream.net/7/442/142692/v1/gnl.akacast.akamaistream.net/br_mp3_bayern3_m</TrackURI><RelTime>0:00:00</RelTime><AbsTime>NOT_IMPLEMENTED</AbsTime><RelCount>2147483647</RelCount><AbsCount>2147483647</AbsCount></u:GetPositionInfoResponse></s:Body></s:Envelope> -- services.py:send_command:389
--- Logging error ---
Traceback (most recent call last):
File "/usr/local/lib/python3.5/logging/__init__.py", line 982, in emit
stream.write(msg)
UnicodeEncodeError: 'ascii' codec can't encode character '\xfc' in position 1096: ordinal not in range(128)
Call stack:
File "/usr/local/lib/python3.5/threading.py", line 882, in _bootstrap
self._bootstrap_inner()
File "/usr/local/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
File "/usr/local/lib/python3.5/threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python3.5/site-packages/lib_sonos/sonos_service.py", line 206, in process_events
self.handle_AVTransport_event(speaker, event.variables)
File "/usr/local/lib/python3.5/site-packages/lib_sonos/sonos_service.py", line 344, in handle_AVTransport_event
speaker.get_trackposition(force_refresh=True)
File "/usr/local/lib/python3.5/site-packages/lib_sonos/sonos_speaker.py", line 566, in get_trackposition
track_info = self.soco.get_current_track_info()
File "/usr/local/lib/python3.5/site-packages/soco/core.py", line 1039, in get_current_track_info
('Channel', 'Master')
File "/usr/local/lib/python3.5/site-packages/soco/services.py", line 181, in _dispatcher
return self.send_command(action, *args, **kwargs)
File "/usr/local/lib/python3.5/site-packages/soco/services.py", line 389, in send_command
log.debug("Received %s, %s", response.headers, response.text)
Message: 'Received %s, %s'
Arguments: ({'Server': 'Linux UPnP/1.0 Sonos/34.7-35162c (ZPS12)', 'EXT': '', 'CONTENT-LENGTH': '1375', 'Connection': 'close', 'CONTENT-TYPE': 'text/xml; charset="utf-8"'}, '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetPositionInfoResponse xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><Track>1</Track><TrackDuration>0:00:00</TrackDuration><TrackMetaData><DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="-1" parentID="-1" restricted="true"><res protocolInfo="x-rincon-mp3radio:*:*:*">x-rincon-mp3radio://br-mp3-bayern3-m.akacast.akamaistream.net/7/442/142692/v1/gnl.akacast.akamaistream.net/br_mp3_bayern3_m</res><r:streamContent>Studio-Hotline: 0800 / 800 3 800 (geb\xfchrenfrei)</r:streamContent><dc:title>br_mp3_bayern3_m</dc:title><upnp:class>object.item</upnp:class></item></DIDL-Lite></TrackMetaData><TrackURI>x-rincon-mp3radio://br-mp3-bayern3-m.akacast.akamaistream.net/7/442/142692/v1/gnl.akacast.akamaistream.net/br_mp3_bayern3_m</TrackURI><RelTime>0:00:00</RelTime><AbsTime>NOT_IMPLEMENTED</AbsTime><RelCount>2147483647</RelCount><AbsCount>2147483647</AbsCount></u:GetPositionInfoResponse></s:Body></s:Envelope>')
2017-01-01 16:48:15,837 INFO Thread-1 Received status 200 from 192.168.1.24 -- services.py:send_command:392
2017-01-01 16:48:15,855 INFO Thread-1 registered clients: 192.168.1.13:[9999] -- udp_broker.py:udp_send:43
2017-01-01 16:48:15,862 INFO Thread-1 sending sonos speaker data: {
"radio_show": "Sonntags-Hitmix",
"radio_station": "Bayern 3",
"track_album_art": "http://192.168.1.24:1400/getaa?s=1&u=x-sonosapi-stream%3as14991%3fsid%3d254%26sn%3d0",
"track_artist": "Studio",
"track_title": "Studio-Hotline: 0800 / 800 3 800 (Geb\xfchrenfrei)",
"uid": "rincon_949f3e7072dc01400"
} -- udp_broker.py:udp_send:44
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.


Einen Kommentar schreiben: