Ankündigung

Einklappen
Keine Ankündigung bisher.

Sonos Anbindung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • pfischi
    antwortet
    Zitat von Max2612 Beitrag anzeigen
    Gleich noch eine Frage...

    Kann es sein, dass TTS auch aus diesem Grund nicht funktioniert?
    Habe über das Backend Plugin gestartet. Die Datei wird nicht abgespielt.
    Log:
    Code:
    2017-01-02 19:37:00,649 DEBUG Thread-303 COMMAND PlayTts -- attributes: language: de, fade_in: 0, group_command: 0, volume: 50, force_stream_mode: 0, tts: test55, uid: rincon_949f3e7072dc01400 -- sonos_commands.py:run:1660
    2017-01-02 19:37:00,661 WARNING Thread-303 FORCE_STREAM_MOD_OPTION for play_tts is deprecated and ignored. -- sonos_commands.py:run:1694
    2017-01-02 19:37:00,724 DEBUG Thread-303 Starting new HTTPS connection (1): translate.google.com -- connectionpool.py:_new_conn:809
    2017-01-02 19:37:01,907 DEBUG Thread-303 https://translate.google.com:443 "GET / HTTP/1.1" 200 None -- connectionpool.py:_make_request:400
    2017-01-02 19:37:02,239 DEBUG Thread-303 Starting new HTTPS connection (1): translate.google.com -- connectionpool.py:_new_conn:809
    2017-01-02 19:37:03,311 DEBUG Thread-303 https://translate.google.com:443 "GET /translate_tts?tl=de&tk=320827.175273&textlen=6&client=tw-ob&ie=UTF-8&q=test55&idx=0&total=1 HTTP/1.1" 200 9120 -- connectionpool.py:_make_request:400
    2017-01-02 19:37:03,388 INFO Thread-303 Sending GetMediaInfo [('InstanceID', 0)] to 192.168.1.24 -- services.py:send_command:381
    2017-01-02 19:37:03,405 DEBUG Thread-303 Sending {'SOAPACTION': 'urn:schemas-upnp-org:service:AVTransport:1#GetMediaInfo', 'Content-Type': 'text/xml; charset="utf-8"'}, <?xml version="1.0" ?>
    <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
    <u:GetMediaInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
    <InstanceID>0</InstanceID>
    </u:GetMediaInfo>
    </s:Body>
    </s:Envelope>
    Ne, das Encoding sollte da nicht dazwischen funken. Ich denke das du den Server (für GoogleTTS) nocht nicht richtig eingerichtet hast. Poste mal deine sonos.cfg.

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    Gleich noch eine Frage...

    Kann es sein, dass TTS auch aus diesem Grund nicht funktioniert?
    Habe über das Backend Plugin gestartet. Die Datei wird nicht abgespielt.
    Log:
    Code:
    2017-01-02 19:37:00,649 DEBUG    Thread-303   COMMAND PlayTts -- attributes: language: de, fade_in: 0, group_command: 0, volume: 50, force_stream_mode: 0, tts: test55, uid: rincon_949f3e7072dc01400 -- sonos_commands.py:run:1660
    2017-01-02 19:37:00,661 WARNING  Thread-303   FORCE_STREAM_MOD_OPTION for play_tts is deprecated and ignored. -- sonos_commands.py:run:1694
    2017-01-02 19:37:00,724 DEBUG    Thread-303   Starting new HTTPS connection (1): translate.google.com -- connectionpool.py:_new_conn:809
    2017-01-02 19:37:01,907 DEBUG    Thread-303   https://translate.google.com:443 "GET / HTTP/1.1" 200 None -- connectionpool.py:_make_request:400
    2017-01-02 19:37:02,239 DEBUG    Thread-303   Starting new HTTPS connection (1): translate.google.com -- connectionpool.py:_new_conn:809
    2017-01-02 19:37:03,311 DEBUG    Thread-303   https://translate.google.com:443 "GET /translate_tts?tl=de&tk=320827.175273&textlen=6&client=tw-ob&ie=UTF-8&q=test55&idx=0&total=1 HTTP/1.1" 200 9120 -- connectionpool.py:_make_request:400
    2017-01-02 19:37:03,388 INFO     Thread-303   Sending GetMediaInfo [('InstanceID', 0)] to 192.168.1.24 -- services.py:send_command:381
    2017-01-02 19:37:03,405 DEBUG    Thread-303   Sending {'SOAPACTION': 'urn:schemas-upnp-org:service:AVTransport:1#GetMediaInfo', 'Content-Type': 'text/xml; charset="utf-8"'}, <?xml version="1.0" ?>
    <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
      <s:Body>
        <u:GetMediaInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
          <InstanceID>0</InstanceID>
        </u:GetMediaInfo>
      </s:Body>
    </s:Envelope>

    Einen Kommentar schreiben:


  • pfischi
    antwortet
    Ok, dann setzte ich das System mal in einer virtuellen Maschine auf.

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    Sorry,

    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
    Danke, für deine Geduld!!

    Einen Kommentar schreiben:


  • pfischi
    antwortet
    Zitat von Max2612 Beitrag anzeigen
    OK, hab die Datei in
    Code:
    /usr/local/bin/
    bearbeitet.

    Code:
    #!/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
    # ################################################## ##################
    Setz bitte mal
    Code:
    for s in ("stdin", "stdout", "stderr"):
        setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8"))
    nicht da oben rein, sondern unter den GLOBALS-Kommentar (Einrückung der for-Schleife beachten),. Hatte mich da falsch ausgedrückt. Wenn das nicht funktioniert, kannst du auch die globalen Einstellung des Systems auf UTF8 setzten. Laut Google reicht ein Eintrag in die
    Code:
    /etc/environment
    .
    Da muss folgender Eintrag hinzugefügt werden;
    Code:
    PYTHONIOENCODING=UTF-8
    Danach am besten Neustart und nochmal folgendes ausführen:
    Code:
    python3 -c "import sys;print(sys.stdout.encoding)"
    Als Ausgabe müsste dann folgendes rauskommen:
    Code:
    UTF-8
    Wenn nicht, muss ich mal das Image von Onkelandy aufsetzten.

    Danke fürs Testen,

    Stefan

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    OK, hab die Datei in
    Code:
    /usr/local/bin/
    bearbeitet.
    Code:
    #!/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()
    Leider immer noch der Error.

    Code:
    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 -

    Einen Kommentar schreiben:


  • pfischi
    antwortet
    Hm, müsste da nicht ein
    Code:
    sonos_broker
    sein? Die jedenfalls suchen wir, die Startdatei. Der python-Pfad kann je nah System ein wenig unterschiedlich sein.
    Lass mal 'site-packages' im pfad weg, eventuell ist sie da.

    Im kommenden 1.0er-Release ist das besser gelöst

    Gruss,

    Stefan

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    Hey,

    Danke für den tollen Support!
    In dem von dir genannten Verzeichnis, habe ich nur die "sonos_broker-0.9-py3.5.egg-info".
    Ist das korrekt??

    Einen Kommentar schreiben:


  • pfischi
    antwortet
    Zitat von Max2612 Beitrag anzeigen
    Ja, es ist das fertige Image von Onkelandy


    Die Ausgabe von
    Code:
    python3 -c "import sys;print(sys.stdout.encoding)"
    bringt
    Code:
    ANSI_X3.4-1968
    Danke!
    Da haben wir auch schon den Schuldigen. Die Standartausgabe des Images ist ASCII (was komisch ist) und dadurch werden Umlaute bei einem print-Befehl nicht richtig kodiert. Das wirft einen Fehler. Den folgenden Workaround musst du unter den letzten Import in der sonos-broker Datei (bei dir unter /usr/local/lib/python3.5/site-packages) einfügen:

    Code:
    import sys
    import io
    
    for s in ("stdin", "stdout", "stderr"):
        setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8"))
    Ich werde Onkelandy mal darauf hinweisen, das in dem Image zu fixen. In der nächsten Version vom Broker kommt der Hotfix mit rein.
    Gerne kannst du mir Feedback geben, wenns geklappt hat.

    Gruß,

    Stefan

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    Ja, es ist das fertige Image von Onkelandy


    Die Ausgabe von
    Code:
    python3 -c "import sys;print(sys.stdout.encoding)"
    bringt
    Code:
    ANSI_X3.4-1968
    Danke!

    Einen Kommentar schreiben:


  • pfischi
    antwortet
    Zitat von Max2612 Beitrag anzeigen
    Code:
    locale -a
    ergibt bei mir
    Code:
    smarthome@raspberrypi:/usr/local/bin$ locale -a
    C
    C.UTF-8
    POSIX
    de_DE.utf8
    en_GB.utf8

    Sieht gut aus. Nutzt du das fertige Image von Onkelandy ? Dann kann ich den Fehler eventuell schneller ausfindig machen.

    Die Ausgabe von
    Code:
    python3 -c "import sys;print(sys.stdout.encoding)"
    wäre noch toll.

    Gruss,
    Stefan

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    Code:
    locale -a
    ergibt bei mir
    Code:
    smarthome@raspberrypi:/usr/local/bin$ locale -a
    C
    C.UTF-8
    POSIX
    de_DE.utf8
    en_GB.utf8


    Einen Kommentar schreiben:


  • pfischi
    antwortet
    So, die Bayern 3 Info lief gerade durch die bei dir den Error geschmissen hat:

    Code:
    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>&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;res protocolInfo=&quot;x-rincon-mp3radio:*:*:*&quot;&gt;x-rincon-mp3radio://br-mp3-bayern3-m.akacast.akamaistream.net/7/442/142692/v1/gnl.akacast.akamaistream.net/br_mp3_bayern3_m&lt;/res&gt;&lt;r:streamContent&gt;Studio-Hotline: 0800 / 800 3 800 (gebührenfrei)&lt;/r:streamContent&gt;&lt;dc:title&gt;br_mp3_bayern3_m&lt;/dc:title&gt;&lt;upnp:class&gt;object.item&lt;/upnp:class&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;</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
    Sieht bei mir gut aus. Ich denke es liegt an deinen installieren locales.
    Führe mal bei Gelegenheit
    Code:
    locale -a
    aus und poste den Output.

    Gruss,

    Stefan

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    Ich verwende die v0.9.
    Das bei Hitradio Ö3 keine Infos gesendet werden, hab ich mittlerweile bemerkt. Sorry, mein Fehler!

    Ich werde die nächsten Tage ausgiebig weiter testen...

    Danke
    Gruß, Max

    Einen Kommentar schreiben:


  • pfischi
    antwortet
    Max2612 Nur zum Abgleich: welche Version des Brokers setzt du ein?

    Interesant wäre für mich noch die Ausgabe von

    Code:
    locale -a
    auf der Konsole.
    Zuletzt geändert von pfischi; 01.01.2017, 18:20.

    Einen Kommentar schreiben:

Lädt...
X