Ankündigung

Einklappen
Keine Ankündigung bisher.

Plugin Denon ohne Telnet Interface / mit UPNP Support

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

    #16
    Mal ne ganz doofe Frage: wie bindet man das ein?
    Würde gern per knx nen 1100 ein und ausschalten...

    Danke, sm

    Kommentar


      #17
      Hallo,

      stand gar nicht in der Realem drin, habe ich jetzt ergänzt. Im wesentlichen ist es der Ersatz der __init__.py aus der standardinstallation mit der aus dem Github:

      Base for the installation should be the actual smarthome.py installation master or development. There is already a DENON plugin provided through this installations. This is a different (older) one. If you would like to switch to the plugin, which is provided in this Github repo, please replace the content of the plugin folder

      ../plugins/denon/*
      with the content provided in this repo. This includes mainly the file init.py

      Und natürlich die Parametrierung wie im Realem beschrieben!

      Michel

      Kommentar


        #18
        Hallo Michel,

        vielleicht kannst du mir noch ein wenig mehr auf die Sprünge helfen.

        Ich hatte eine Installation ohne /denon/ in dem plugins directory. Habe eins angelegt und die __init__.py rein kopiert.

        In der plugins.conf folgendes eingestellt:

        #[denon]
        # class_name = Denon
        # class_path = plugins.denon
        # denon_ip = 192.168.2.106
        # denon_port = 80
        # cycle = 10

        (natürlich nicht auskommentiert)

        items angelegt: (ich will nur per KNX Taster ein/ausschalten)
        [denon]
        denon_zone = 1
        [[power]]
        type = bool
        denon_send = Power
        denon_listen = Power

        und in eine funtionierende Logik die zeile
        sh.denon.power(0) eingefügt.

        Leider funktionier es nicht, smarthome.py scheint abzustürzen...

        Im github steht das man
        "Needs httplib, etree, upnp.py in plugin directory"
        haben sollte...was bedeutet das genau?

        Danke...Sven

        Kommentar


          #19
          Hallo Sven,

          der Eintrag im Readme ist alt, ich muß das updaten. Du brauchst nur das __init__.py file im denon plugin Verzeichnis.

          Kannst Du das Log-File (smarthome.log) einmal posten ?

          Sorry wegen der Readme Verwirrung

          Michel

          Kommentar


            #20
            Hier der Log:
            Code:
            Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
            permitted by applicable law.
            Last login: Sat Feb 28 13:17:18 2015 from masterbrain.local
            admin@smarthome:/usr/smarthome$ reboot
            reboot: must be superuser.
            admin@smarthome:/usr/smarthome$ smarthome.py --stop
            admin@smarthome:/usr/smarthome$ smarthome.py -d
            2015-03-01 21:19:16,627 INFO     Main         Start SmartHome.py 1.0-5-g5300605                                                                                                  -- smarthome.py:__init__:231
            2015-03-01 21:19:16,633 DEBUG    Main         Python 3.2.3 -- smarthome.py:__ini                                                                                                 t__:232
            2015-03-01 21:19:16,639 INFO     Main         Init Scheduler -- scheduler.py:__i                                                                                                 nit__:86
            2015-03-01 21:19:16,646 INFO     Main         Init Plugins -- smarthome.py:start                                                                                                 :274
            2015-03-01 21:19:16,651 DEBUG    Scheduler    creating 5 workers -- scheduler.py                                                                                                 :run:93
            2015-03-01 21:19:16,672 DEBUG    Main         Plugin: knx -- plugin.py:__init__:                                                                                                 43
            2015-03-01 21:19:16,700 DEBUG    Main         Plugin: visu -- plugin.py:__init__                                                                                                 :43
            2015-03-01 21:19:16,793 DEBUG    Main         Plugin: cli -- plugin.py:__init__:                                                                                                 43
            2015-03-01 21:19:16,806 DEBUG    Main         Plugin: sql -- plugin.py:__init__:                                                                                                 43
            2015-03-01 21:19:16,838 DEBUG    Main         SQLite 3.7.13 -- __init__.py:__ini                                                                                                 t__:62
            2015-03-01 21:19:17,869 DEBUG    Main         SQLite: database integrity ok -- _                                                                                                 _init__.py:__init__:78
            2015-03-01 21:19:17,896 DEBUG    Main         SQLite pack next time: 2015-03-02                                                                                                  03:02:00+01:00 -- scheduler.py:_next_time:289
            2015-03-01 21:19:17,903 DEBUG    Main         Plugin: denon -- plugin.py:__init_                                                                                                 _:43
            Traceback (most recent call last):
              File "/usr/smarthome/lib/plugin.py", line 53, in __init__
                plugin_thread = Plugin(smarthome, plugin, classname, classpath, args)
              File "/usr/smarthome/lib/plugin.py", line 79, in __init__
                exec("import {0}".format(classpath))
              File "<string>", line 1, in <module>
              File "/usr/smarthome/plugins/denon/__init__.py", line 28, in <module>
            2015-03-01 21:19:18,303 ERROR    Main         Unhandled exception: 'utf-8' codec                                                                                                  can't decode byte 0xfc in position 124: invalid start byte
            <class 'UnicodeDecodeError'>
              File "/usr/smarthome/bin/smarthome.py", line 606, in <module>
                sh.start()
              File "/usr/smarthome/bin/smarthome.py", line 275, in start
                self._plugins = lib.plugin.Plugins(self, configfile=self._plugin_conf)
              File "/usr/smarthome/lib/plugin.py", line 57, in __init__
                logger.exception("Plugin {0} exception: {1}".format(plugin, e))
              File "/usr/lib/python3.2/logging/__init__.py", line 1273, in exception
                self.error(msg, *args, **kwargs)
              File "/usr/lib/python3.2/logging/__init__.py", line 1266, in error
                self._log(ERROR, msg, args, **kwargs)
              File "/usr/lib/python3.2/logging/__init__.py", line 1372, in _log
                self.handle(record)
              File "/usr/lib/python3.2/logging/__init__.py", line 1382, in handle
                self.callHandlers(record)
              File "/usr/lib/python3.2/logging/__init__.py", line 1444, in callHandlers
                hdlr.handle(record)
              File "/usr/lib/python3.2/logging/__init__.py", line 835, in handle
                self.emit(record)
              File "/usr/lib/python3.2/logging/__init__.py", line 947, in emit
                self.handleError(record)
              File "/usr/lib/python3.2/logging/__init__.py", line 888, in handleError
                None, sys.stderr)
              File "/usr/lib/python3.2/traceback.py", line 161, in print_exception
                print_tb(tb, limit, file)
              File "/usr/lib/python3.2/traceback.py", line 68, in print_tb
                line = linecache.getline(filename, lineno, f.f_globals)
              File "/usr/lib/python3.2/linecache.py", line 15, in getline
                lines = getlines(filename, module_globals)
              File "/usr/lib/python3.2/linecache.py", line 41, in getlines
                return updatecache(filename, module_globals)
              File "/usr/lib/python3.2/linecache.py", line 132, in updatecache
                lines = fp.readlines()
              File "/usr/lib/python3.2/codecs.py", line 300, in decode
                (result, consumed) = self._buffer_decode(data, self.errors, final)
             -- smarthome.py:_excepthook:494
            
            C2015-03-01 21:19:54,791 INFO     Main         Number of Threads: 7 -- smarthome.py:stop:348
            2015-03-01 21:19:55,766 INFO     Main         SmartHome.py stopped -- smarthome.py:stop:372
            Exception SystemExit: SystemExit(None,) in <module 'threading' from '/usr/lib/python3.2/threading.py'> ignored

            Kommentar


              #21
              Hallo Sven,

              sehr komisch. In Zeile 28 von __init__.py ist noch wirklich nichts im Plugin passiert. Da ist noch nicht mal die Klasse definiert worden. Dort steht nur der import des debuggers
              Code:
              import pydevd
              Kann ein Grund sein, habe ich aber noch nie so gesehen. Aus meiner Sicht 2 Dinge:
              - Wenn Du die Datei aus dem Github per Zip File geholt hast (also nicht mehr mit der Datei gemacht), dann machen einmal den update mit der v0.51. Dort habe ich den debugger herausgenommen.
              - Für den Fall, dass die Dir die Datei auf Github angesehen, dort in einen Texteditor kopiert und auf Deinem System gespeichert hast, dann ist etwas schief gegangen. Dort brauchst Du einen Texteditor, der UTF-8 codiert abspeichern kann. Sonst Fehler.

              Michel

              Kommentar


                #22
                manch sender lassen sich nicht stream

                Hallo Zusammen,

                habe einen denon 1100w, klappt soweit so gut, hab aber noch zwei Fragen.

                Kann man das Plugin erweitern, das man auch sieht was in der Zone2 gerade aktuell gespielt wird, bei der mainzone ist das ja schon drin.

                Die andere Frage, warum kann ich solche URLs http://listen.housetime.fm/listen-dsl.pls oder sämtliche von di.fm, werden nicht abgespielt.

                grüsse und danke
                spars

                Kommentar


                  #23
                  Zitat von Orion Beitrag anzeigen
                  - Für den Fall, dass die Dir die Datei auf Github angesehen, dort in einen Texteditor kopiert und auf Deinem System gespeichert hast, dann ist etwas schief gegangen. Dort brauchst Du einen Texteditor, der UTF-8 codiert abspeichern kann. Sonst Fehler.
                  Genau das habe ich gemacht. Kann sein das es ein Fehler mit dem Editor war. Werde das am Freitag mal testen, in der Woche möchte ich in der Installation nichts testen:-)

                  Sparsematrix: Kannst du mir mal einen Auszug aus deiner items.conf schicken? Habe ich sonst etwas falsch gemacht (Ausser der UTF8 Geschichte?)

                  Kommentar


                    #24
                    Hallo sparse,

                    nein leider bekommt man über das Interface nur die Infozeile des Receivers übertragen. Damit ist es nur die der Hauptquelle. Wegen der Streams: ich bin erst am Anfang zu verstehen, was mit UPNP geht. Die Implementierung ist die Minimalstversion, damit das überhaupt geht. Einen vollen UPNP Stack ist viel zu Umfangreich. Ich probiere im Moment noch aus. Ist ja auch erst v 0.5, da wird sich sicherlich noch etwas bis 1.0 tun.

                    Grüße Michel

                    Kommentar


                      #25
                      Hallo Orion,

                      Wäre toll wenn du vielleicht im nächsten release einer der adressen von di.fm testen könntest.

                      Gruss
                      Spars

                      Zitat von Orion Beitrag anzeigen
                      Hallo sparse,

                      nein leider bekommt man über das Interface nur die Infozeile des Receivers übertragen. Damit ist es nur die der Hauptquelle. Wegen der Streams: ich bin erst am Anfang zu verstehen, was mit UPNP geht. Die Implementierung ist die Minimalstversion, damit das überhaupt geht. Einen vollen UPNP Stack ist viel zu Umfangreich. Ich probiere im Moment noch aus. Ist ja auch erst v 0.5, da wird sich sicherlich noch etwas bis 1.0 tun.

                      Grüße Michel

                      Kommentar


                        #26
                        Hallo Spars,

                        kannst Du mir mal 3-4 URI (so wie Du sie verwenden posten ?)

                        Michel

                        Kommentar


                          #27
                          Hallo Michael,

                          ich hab da ein Verständnisproblem zw. update_send_items und update_command_items.

                          Ich hab jetzt erstmal folgendes für InputFuncSelect gemacht:

                          Code:
                              def update_send_item(self, item, caller=None, source=None, dest=None):
                              # Receive commands, process them and forward them to receiver
                                  if caller != 'DENON':
                                      # hier werden die kommandos für bool verwendet, die einen status zurückbringen
                                      command = item.conf['denon_send']
                                      zone = item.conf['denon_zone']
                                      value = item()
                                      if command == 'Power':
                                          if item():
                                              self._request(self._denonIp, self._denonPort, 'GET', '/goform/formiPhoneAppPower.xml?' + zone + '+PowerON')
                                          else:
                                              self._request(self._denonIp, self._denonPort, 'GET', '/goform/formiPhoneAppPower.xml?' + zone + '+PowerStandby')
                                      elif command == 'Mute':
                                          if item():
                                              self._request(self._denonIp, self._denonPort, 'GET', '/goform/formiPhoneAppMute.xml?' + zone + '+MuteON')
                                          else:
                                              self._request(self._denonIp, self._denonPort, 'GET', '/goform/formiPhoneAppMute.xml?' + zone + '+MuteOFF')
                                      elif command == 'MasterVolume':
                                          value = self._limit_range_int(value,0,99)
                                          self._request(self._denonIp, self._denonPort, 'GET', '/goform/formiPhoneAppVolume.xml?' + zone + '+{0}'.format(int(value-80)))
                                      elif command == 'SetAudioURI':
                                          self._upnp_set_uri(value)
                                          self._upnp_play()
                          [COLOR="Red"]            elif command == 'InputFuncSelect':
                                          self._request(self._denonIp, self._denonPort, 'GET', '/goform/formiPhoneAppDirect.xml?' + 'SI' + value)[/COLOR]
                          Eigentlich hätte ich gedacht dass man das mit update_command_items an dieser Stelle macht, aber das geht nicht. Ich hab da eine Idee was den Unterschied zw. send und command ausmacht, bin mir aber nicht sicher.

                          Damit läuft jedenfalls die Quellenwahl.

                          Als zweites noch eine kleine Verbesserung beim _get_device_info. Das blockiert teilweise das saubere runterfahren von sh.py. Gerade beim testen echt nervig immer wieder einige Sekunden warten zu müssen.

                          Code:
                              def _get_deviceinfo(self):
                                  [COLOR="red"]while self.alive:[/COLOR]
                                      self._requestLock.acquire()
                                      responseEtree = self._request(self._denonIp, self._denonPort, 'GET', self._XMLDeviceInfoURI['0'])
                                      self._requestLock.release()
                                      # im falle eines fehlers wird None zurückgeliefert
                                      if responseEtree is not None:
                                          # durchinterieren über alle einträge für das listen
                                          # es ist nur die erste ebene !
                                          for node in responseEtree:
                                              returnItemIndex = '0' + node.tag
                                              for denonListen in self._listenItems:
                                                  if denonListen == returnItemIndex:
                                                      value = node.text
                                                      self._listenItems[denonListen](value,'DENON')
                          Auf github hab ich hier grad mal verzichtet .

                          Grüße Mirko
                          Umgezogen? Ja! ... Fertig? Nein!
                          Baustelle 2.0 !

                          Kommentar


                            #28
                            Vergiss letzteres einfach, war ne doofe Idee.
                            Umgezogen? Ja! ... Fertig? Nein!
                            Baustelle 2.0 !

                            Kommentar


                              #29
                              Hallo Mirko,

                              Das mit dem warten mach wirklich keinen Sinn, da die Routine nur einmal aufgerufen wird. Bitte mal in das Readme schauen, ich hatte ein Problem, dass innerhalb
                              Ausdrücke in eckigen Klammern verschluckt wurden. Damit war die Anleitung und die Beispiele in den item nicht richtig dargestellt. Beim mir funktioniert die quellenauswahl.

                              Michel

                              Kommentar


                                #30
                                Da haben sich Deine Updates überschnitten, was ist denn etzt die richtige Syntax für die AppDirectXML - Befehle ?
                                Quellenwahl ist ja eigentlich SI+QUELLE.

                                Jetzt warten wir aber immer noch auf das sleep mit der Länge von cycle (bei mir 60 Sekunden).

                                Wie wäre es hiermit:
                                Code:
                                    def run(self):
                                        self.alive = True
                                        # einmalig zum start die Device info abholen
                                        self._get_deviceinfo()
                                        # ich hole regelmässig im polling den wert der zonen
                                        while self.alive:
                                            # allerdings nur für die konfigurierten zonen
                                            for zone in self._configuredZones:
                                                self._update_status(zone)
                                                self._sh.scheduler.add('denon, self._update_status(zone), prio=5, cycle=self._cycle, offset=2)
                                Umgezogen? Ja! ... Fertig? Nein!
                                Baustelle 2.0 !

                                Kommentar

                                Lädt...
                                X