Ankündigung

Einklappen
Keine Ankündigung bisher.

Sonos Anbindung

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

    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.
    Sonos

    Kommentar


      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

      Kommentar


        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
        Sonos

        Kommentar


          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


          Kommentar


            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

            Sonos

            Kommentar


              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!

              Kommentar


                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
                Sonos

                Kommentar


                  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??

                  Kommentar


                    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
                    Sonos

                    Kommentar


                      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 -

                      Kommentar


                        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
                        Sonos

                        Kommentar


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

                          Kommentar


                            Ok, dann setzte ich das System mal in einer virtuellen Maschine auf.
                            Sonos

                            Kommentar


                              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>

                              Kommentar


                                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.

                                Sonos

                                Kommentar

                                Lädt...
                                X