Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Entwicklung Plugin mit mehreren IP Verbindungen

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

    - √ - Entwicklung Plugin mit mehreren IP Verbindungen

    Hallo,

    Ich lese hier schon seit 2 Jahren, dies ist aber mein erstes Post. Darum will ich mich kurz vorstellen. Ich lebe in Luxemburg und habe letztes Jahr ein Haus komplett renoviert. Dabei habe ich alles auf KNX umgebaut. Seit letzter Woche experimentiere ich auch mit 1-Wire zur Temperaturmessung der Heizungsrohre e.t.c.

    Ich habe SH/ SmartVisu vor ungefähr 2 Wochen auf einem RPI installiert (2.7 Image) und bin begeistert vun der Einfachheit des Systems. Ich nutze neben dem Minimum noch folgende Plugins: KNX, 1-Wire, Asterisk und PROWL. Ausserdem nutze ich noch LinuxMCE.

    Jetzt aber zu meiner eigentlichen Frage :-) :

    Ich hab angefangen ein Plugin zu entwickeln für DENON Verstärker. Ich selbst habe ein Denon AVR-1912. Ich will aber das Plugin so flexibel machen dass man eventuell mehrer Verstärker im Haus ansprechen kann.

    Obwohl ich mehrere Plugins duchgelesen habe bleibt eine grundsätzliche Frage. Ich hab nämlich beides gesehen. Was entspricht eher der Logik / Prinzip des SH Systems ?

    1. In plugins.conf mehrere Einträge zu erstellen, eins pro Gerät ?
    Code:
    [denon1]
        class_name = Denon
        class_path = plugins.denon
        host = xxx.xxx.xxx.xxx
    [denon2]
        class_name = Denon
        class_path = plugins.denon
        host = xxx.xxx.xxx.xxx
    2. Einen einzigen Eintrag im plugins.conf ohne host, und dann ungefähr sowas in der items.conf

    Code:
    [EG]
        [[Stube]]
            [[[Denon1]]]
            ip=192.168.80.138
            [[[[Power]]]]
                type = bool
                visu_acl = rw
                denon_send = power
            [[[Denon1]]]
            ip=192.168.80.138
            [[[[Power]]]]
                type = bool
                visu_acl = rw
                denon_send = power
    Im ersten Fall würde das Plugin mehrere male gestartet werden, was mir nicht sehr sauber erscheint. Beim zweiten Fall wüsste ich nicht wie ich mit der lib.connection mehrere Verbindungen verwalten kann ....

    Ein kleiner Wegweiser wäre cool :-)

    MfG,

    Serge

    #2
    Hallo Serge,

    ich besitze seit dem Wochenende auch einen Denon ... wäre gut wenn man sich da austauschen kann. Wäre also hilfreich wenn Du den Code vielleicht schon mal zusenden könntest ? Das wäre so ziemlich meine nächste Baustelle gewesen.

    Ich würde versuchen in der plugin.conf eine Liste der IPs zu machen und dann im Plugin die Liste der IPs auswerten. Das item wird dan über denon_ip=xxx.xxx.xxx.xxx oder eben ein parent-item ausgewertet.

    plugin.conf:
    Code:
    [denon]
        class_name = Denon
        class_path = plugins.denon
        host = 192.168.2.101 | 192.168.2.102 | 192.168.2.103
    item.conf in 2 Möglichkeiten:
    Code:
    [EG]
        [[Stube]]
            [[[Denon1]]]
                [[[[Power]]]]
                    type = bool
                    visu_acl = rw
                    denon_send = power
                    denon_ip = 192.168.2.101
            [[[Denon2]]]
            ip=192.168.2.1012
                [[[[Power]]]]
                    type = bool
                    visu_acl = rw
                    denon_send = power
    Weiterhin wäre es sinnvoll das Plugin mit einem großen dict/Command-Set auszustatten in dem man bestimmte Strings der Befehle bequem auf bool oder num mappen kann und in denon_send mit Platzhaltern arbeiten kann (vgl. Squeezebox).

    Also ohne jetzt die Syntax genau im Kopf zu haben sowas:
    Code:
    dict=(
    ("PW":("ON":1,"STANDBY":0)),
    )
    Aber vielleicht ist das auch zu kompliziert gedacht. Näher damit beschäftigt hab ich mich noch nicht.
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #3
      Hallo,

      Mal so auf die schnelle eine 1. Antwort :-)

      Ich würde versuchen in der plugin.conf eine Liste der IPs zu machen und dann im Plugin die Liste der IPs auswerten. Das item wird dan über denon_ip=xxx.xxx.xxx.xxx oder eben ein parent-item ausgewertet.
      Das mit den ip's im item oder im parent wollte ich wahrscheinlich auch so machen. Aber warum brauche ich dann noch die ip's in der plugins.conf ? Ich kann sie ja beim parse_item rausfilteren und in einer Liste speichern ?

      Weiterhin wäre es sinnvoll das Plugin mit einem großen dict/Command-Set auszustatten in dem man bestimmte Strings der Befehle bequem auf bool oder num mappen kann und in denon_send mit Platzhaltern arbeiten kann (vgl. Squeezebox).
      Das mit dem dict / command set versteht sich von alleine, alles andere ist dem User nicht zuzumuten. Er müsste ansonsten die Befehle kennen. Ich glaube aber der squeezebox plugin hat nur ein Platzhalter für die MAC adresse. Das Rest des squeezebox_send kommando's wird so 1:1 glaube ich übertragen. Das Beispiel war nicht so glücklich gewählt, ausser ich irre mich ;-)

      Ich schick die was sobald ich was habe. Momentan ist es nicht viel mehr als das skleton was einen Befehl rausfiltert :-)

      Ich hab zwar ein paar Programmiererfahrungen, allerdings bisher nicht mit Python. Mein Problem mit mehreren connections objects ist noch nicht gelöst. Denn die Verbindungen sollten bestehen bleiben solange SH läufft ...

      Villeicht kann mknx sich zum letzten Punkt äusseren ? :-)

      Kommentar


        #4
        Zitat von Foxi352 Beitrag anzeigen
        Das mit den ip's im item oder im parent wollte ich wahrscheinlich auch so machen. Aber warum brauche ich dann noch die ip's in der plugins.conf ? Ich kann sie ja beim parse_item rausfilteren und in einer Liste speichern ?
        Kann man auch so machen, dann machen Sie in der plugin.conf aber gar keinen Sinn. Wichtig ist bloss dass die Verbindung eben erst nach parse_item augebaut wird. Aber je mehr ich darüber nachdenke glaube ich dass man das wohl doch in der plugin.conf mehrmals angeben muss, also denon1, denon2 usw.. Das wären ja Threads die permanent laufen.

        Zitat von Foxi352 Beitrag anzeigen
        Das Rest des squeezebox_send kommando's wird so 1:1 glaube ich übertragen. Das Beispiel war nicht so glücklich gewählt, ausser ich irre mich ;-)
        )
        Da irrst Du . Sieh dir mal die Doku dazu an:
        Squeezebox ? SmartHome.py 1.0 documentation
        Hier ein Beispiel:
        Code:
          [[Playlist_Index]]
            type = num
            visu = yes
            squeezebox_send = <playerid> playlist index {}
            squeezebox_recv = <playerid> playlist index
        Wenn man Playlist_Index auf 2 setzt dann wird "xx:xx:xx:xx:xx:xx playlist index 2" an die Squeezebox gesendet. Vor allem bei Favoriten, Playlisten, Zonen usw. ist das nützlich.
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #5
          Zitat von JuMi2006 Beitrag anzeigen
          Kann man auch so machen, dann machen Sie in der plugin.conf aber gar keinen Sinn.
          Eben. Genau das wollte ich damit sagen.

          Zitat von JuMi2006 Beitrag anzeigen
          Das wären ja Threads die permanent laufen.
          Richtig. Deshalb meine Bedenken. 3 x plugin sind 3 threads. Aber villeicht kann man das gleiche in einem thread, d.h. mit einem gestarteten Plugin machen FALLS man mit der lib.connection mehrere connections managen kann ...

          Zitat von JuMi2006 Beitrag anzeigen
          Da irrst Du . Sieh dir mal die Doku dazu an:
          Da bin ich mir nicht so sicher. Ich glaube wie gesagt nur die <playerid> wird ersetzt, und zwar hier:
          Code:
              def _resolv_full_cmd(self, item, attr):
                  # check if PlayerID wildcard is used
                  if '<playerid>' in item.conf[attr]:
                      # try to get from parent object
                      parent_item = item.return_parent()
                      if (parent_item is not None) and ('squeezebox_playerid' in parent_item.conf) and self._check_mac(parent_item.conf['squeezebox_playerid']):
                          item.conf[attr] = item.conf[attr].replace(
                              '<playerid>', parent_item.conf['squeezebox_playerid'])
                      else:
                          logger.warning(
                              "squeezebox: could not resolve playerid for {0} from parent item {1}".format(item, parent_item))
                          return None
                  return item.conf[attr]
          Der Rest von der Zeile, also z.B. "button volup" wird 1:1 gesendet denn dass sind die offiziellen Squeezebox CLI Kommandos. Natürlich wird {} noch durch das Bool oder den Wert ersetzt.

          Ist aber an sich auch egal, hat ja nichts mir unserem Denon zu tun ...

          Werd mal anfangen mit einfach einem DENON und der host= in der plugins.conf. Falls das mal fertig ist kann man es ja immer noch umändern.

          Bis bald

          Kommentar


            #6
            Im Code habe ich es auch nicht gefunden ... aber sieh mal hier:
            https://knx-user-forum.de/324651-post34.html

            Kannst Du mir dennoch Dein Sekeleton schicken ?
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #7
              Hallo Serge,

              herzlich Willkommen in der Entwickler-Gemeinde.
              Lade Deinen Code doch schon mal in Dein Github Repository. Je eher, desto besser.
              Schau Dir bei Gelegenheit auch mal https://github.com/mknx/smarthome/bl.../dev/README.md an.

              Man kann beliebig viele Instanzen eines Plugins starten, das macht keinen großen Unterschied zu der unten genannten Variante. Solange das Plugin die run-Methode verlässt, reserviert sie auch keinen eigenen Thread. Nur wenn in der run-Methode eine Endlos-Schleife drin ist, wird ein separater Thread allokiert. Das ist z.B. bei Plugins notwendig die mit einer seriellen Schnittstelle kommunizieren.

              Das lib.connection Modul zentralisiert und vereinfacht den Netzwerk-Zugriff und fasst ihn in dem Haupt-Thread zusammen.

              Für die zweite Lösungsmöglichkeit kann ich Dir das mpd-Plugin empfehlen, dort kann man in einem Plugin-Instanz beliebig viele Connections bewerkstelligen.
              Streng genommen, 'forkt' das Plugin separate Instanzen für die einzelnen Verbindungen. Aber sieh Dir den Code einfach mal an, der ist relativ übersichtlich.

              Bis bald

              Marcus

              Kommentar


                #8
                Hallo allerseits,

                ich habe am Wochenende ebenfalls ein Denon-Plugin gebaut. Anbei findet ihr den Code. Das ganze basiert auf dem Russound-Plugin. Das kann gerne weiter entwickelt werden. Rückmeldungen gehen noch nicht.
                Allerdings weiß ich noch nicht in wie weit man das braucht. Der Denon (ich habe einen 3313) schließt ja immer wieder die Verbindung und sendet nur auf aktive Anfrage.
                Ich nutze aktuell Einschalten, Quellenwahl und Lautstärke. Denke Rückmeldungen werden eher in einer Visu gebraucht. Ich nutze das ganze eher in Szenen und Logiken.

                Gruß,
                David
                Angehängte Dateien

                Kommentar


                  #9
                  @DK178: Danke, werd mir das mal anschauen. Allerdings beendet mein 1912 die Verbindung nicht. Und ich erhalte andauernd Statusmeldungen. Auch wenn ich Power, Volume, Source e.t.c. per Fernsteuerung ändere bekomme ich Rückmeldung. Eine Auswertung ist also ein Muss in diesem Fall :-)

                  @JuMi2006: Werd dir das morgen schicken

                  @mknx: Werd mir das mit dem Git mal anschauen. Bisher habe ich nur mit SVN gearbeitet, und das ist gelinde gesagt wesentlich einfacher :-) Verstärker ansteuern ist kein Problem mehr inzwischen. Aber mit den Rückmeldungen tue ich mich schwer... Habe mehrere Plugin Sources durchgekaut, werd aber nicht Klug daraus.

                  Ich habe in der Visu ein basic.switch das ich bei Rückmeldung ansteuern will. item ist EG.Stube.Denon.Power

                  Ich bekomme jetzt per found_terminator ein PWON vom Verstärker gesendet. Wie setze ich das oben genannte Item denn jetzt auf 1, True oder was auch immer damit die VISU das anzeigt ?

                  Hiiiiiilfe :-)

                  Kommentar


                    #10
                    code auf github -> Hilfe :-)

                    Kommentar


                      #11
                      Dafür ja das dict in dem man die Befehle zerlegt und mappt. Das haben wir gerade beim EnOcean Plugin so gemacht und ein neues Gerät war mit 3 Zeilen Code eingefügt, hier könnte man das genauso machen...hab mich allerdings aus Zeitmangel noch nicht intensiv damit beschäftigt. Ich muss mich noch über meinen neuen Subwoofer (Harman Kardon HKTS 220) ärgern.

                      @Marcus/Robert:
                      Steht "{}" in der item.conf generell für value? Wenn nicht, wo machst Du das im Code von Squeezebox dass Du da den Wert des items übergibst?
                      Umgezogen? Ja! ... Fertig? Nein!
                      Baustelle 2.0 !

                      Kommentar


                        #12
                        Zitat von JuMi2006 Beitrag anzeigen
                        @Marcus/Robert:
                        Steht "{}" in der item.conf generell für value? Wenn nicht, wo machst Du das im Code von Squeezebox dass Du da den Wert des items übergibst?
                        Nein, das ist nicht generell so.

                        Bis bald

                        Marcus

                        Kommentar


                          #13
                          Hallo Serge,

                          du hast recht. Hatte sowas mal im Forum gelesen und deshalb nicht weiter gemacht. Habe gerade mal getetestet und meiner blubbert auch munter drauf los.

                          Gruß,
                          David

                          Kommentar


                            #14
                            Zitat von mknx Beitrag anzeigen
                            code auf github -> Hilfe :-)
                            *Seuftz* .... Ok dann werd ich mit dem Denon für heute aufhören und die nächsten Stunden damit verbringen mit in dieses &%(/ç git einzuarbeiten :-(

                            Bis hierhin hab ich schon mal rausgefunden: https://github.com/Foxi352/plugin.denon

                            git config --global user.name und git config --global user.email sind auf meinem rpi gesetzt.

                            Jetzt muss ich nur noch rausfinden wie ich die Datei raufladen kann .... Ich verseh nicht dass GIT soviel komplizierter als SVN muss *sigh* ...

                            Kommentar


                              #15
                              das versteht niemand so genau

                              Gruss
                              Join smartVISU on facebook. Web: smartvisu.de.
                              Dir gefällt smartVISU? Bitte spenden für die Weiterentwicklung.

                              Kommentar

                              Lädt...
                              X