Ankündigung

Einklappen
Keine Ankündigung bisher.

Lesen vom Bus mit Pyknyx

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

    Lesen vom Bus mit Pyknyx

    Moin alle zusammen,

    ich habe vor eine Weile für mein Abschussprojekt ein Program in C++ geschrieben, das HTTP-Requests in KNX Telegramme übersetzt (mit Kberry und Raspberry Pi).
    Allerdings kann das Program nur senden aber nicht vom Bus lesen.
    Genau das wollte ich nun implementieren aber diesmal in Python und nich vom scratch, denn seit ich die Schule fertig gemacht habe beschäftige ich mich mit Pyhon beruflich.

    Mein Ziel is erstmal, mindestens der letzte Status von jede Gruppeaddresse zu lesen und speichern um es später bei Bedarf weiter zu verarbeiten.
    Ich habe hier gelesen, das PyKNyX sich gut dafür eignet aber mit dem Readme von PyKNyX kann ich nicht viel anfangen.
    Hat jemanden einen Tipp um es am Laufen zu kriegen?
    So einen kleinen Anstoß?

    Vielen Dank und eine schöne Woche an alle.

    LG,

    Simón

    #2
    Bis jetzt habe ich folgendes gemacht
    Code:
    - git clone [URL]https://github.com/knxd/PyKNyX[/URL]
    - python3 setup.py build
    - sudo python3 setup.py install
    dannach:
    Code:
    python3 pyknyx/examples/1_timer/admin.py
    und das bekommen:
    Code:
    Traceback (most recent call last):
    File "pyknyx/examples/1_timer/admin.py", line 18, in <module>
    main()
    File "pyknyx/examples/1_timer/admin.py", line 14, in main
    AdminUtility().execute()
    File "/usr/local/lib/python3.8/dist-packages/PyKNyX_knxd-2.0.0.dev1-py3.8.egg/pyknyx/tools/adminUtility.py", line 205, in execute
    args.func(args)
    AttributeError: 'Namespace' object has no attribute 'func'
    Soll ich sonst was installieren?
    Wie kann ich eine Verbindung zum Bus herstellen?

    Danke.

    Simón
    Zuletzt geändert von Golpe; 12.04.2021, 08:17.

    Kommentar


      #3
      Hallo,

      siehe hier:
      https://stackoverflow.com/questions/...attribute-func

      Kurz: Bug in python3. Du musst dem Skript einen Parameter übergeben, oder die Exception behandeln.

      pyknyx scheint nicht weit verbreitet zu sein. Wenn du einen eingetretenen Pfad gehen willst, schau dir mal smarthome-ng an. Ob du es nun direkt verwendest, oder dich aus dem Code bedienst ist natürlich Geschmackssache.

      Gruß,
      Hendrik

      Kommentar


        #4
        Danke erstmal.
        Ich werfe mal einen Blick in den Link...

        Gruß,

        Simón

        P.S. henfri sollte man viell. den Bug hier melden?: https://github.com/knxd/PyKNyX/issues , sodass man es von vorn rein weißt, wenn man etwas damit anfangen will?
        Zuletzt geändert von Golpe; 12.04.2021, 10:46.

        Kommentar


          #5
          Am Besten sogar mit Pull-Request ;-)

          Kommentar


            #6
            henfri , so, ich habe diese workaround von deinen Link implementiert und es gibt kein Error mehr. Versuche ein push zu machen zu die Pyknyx repo aber 'acces is denied'.
            Naja, jedenfalls nun versuche ich eine gruppenaddresse zu lesen aber bekomme ich einen Fehler (nun mit python2):

            Code:
            ~/PyKNyX$ python pyknyx/scripts/pyknyx-group.py read 1/2/10
            Traceback (most recent call last):
            File "pyknyx/scripts/pyknyx-group.py", line 423, in <module>
            main()
            File "pyknyx/scripts/pyknyx-group.py", line 393, in main
            logger.setLevel(args.loggerLevel)
            File "/usr/lib/python2.7/logging/__init__.py", line 1150, in setLevel
            self.level = _checkLevel(level)
            File "/usr/lib/python2.7/logging/__init__.py", line 182, in _checkLevel
            raise ValueError("Unknown level: %r" % level)
            ValueError: Unknown level: 'info'
            Igdeine Idee? Ich wollte erstmal nur sehen, dass ich mit dem Bus kommunizieren kann...

            Gruß
            Zuletzt geändert von Golpe; 12.04.2021, 12:50.

            Kommentar


              #7
              Hallo,

              Zitat von Golpe Beitrag anzeigen
              henfri , so, ich habe diese workaround von deinen Link implementiert und es gibt kein Error mehr. Versuche ein push zu machen zu die Pyknyx repo aber 'acces is denied'.
              Du musst natürlich einen Fork machen (ich würde einfach die betreffende Datei auf Github editieren, dann geschieht das automatisch).
              In dem Fork hast du Schreibrechte (ist ja deiner) und dann kannst du einen PR machen.
              Naja, jedenfalls nun versuche ich eine gruppenaddresse zu lesen aber bekomme ich einen Fehler (nun mit python2):

              Code:
              /PyKNyX$python pyknyx/scripts/pyknyx-group.py read 1/2/10
              Traceback (most recent call last):
              File "pyknyx/scripts/pyknyx-group.py", line 423, in <module>
              main()
              File "pyknyx/scripts/pyknyx-group.py", line 393, in main
              logger.setLevel(args.loggerLevel)
              File "/usr/lib/python2.7/logging/__init__.py", line 1150, in setLevel
              self.level = _checkLevel(level)
              File "/usr/lib/python2.7/logging/__init__.py", line 182, in _checkLevel
              raise ValueError("Unknown level: %r" % level)
              ValueError: Unknown level: 'info'
              Igdeine Idee?
              Ich weiß nicht, ob pyknyx in Python 2 überhaubt funktionieren sollte. Vielleicht ist "info" case-Sensitiv und muss groß geschrieben werden?

              Edit: scheint so, hättest du aber auch finden können:
              https://github.com/python/cpython/bl...init__.py#L193
              https://github.com/python/cpython/bl...init__.py#L108

              So würde ich es probieren (ein Fork ;-)
              https://github.com/knxd/PyKNyX/compa...henfri:patch-1

              Gruß,
              Hendrik
              Zuletzt geändert von henfri; 12.04.2021, 13:02.

              Kommentar


                #8
                Danke hendrik ,
                habe ich auch so implementiert.
                Nun stecke ich seit 3 Stunden hier fest
                Code:
                ~/knx_project/PyKNyX$ python3 pyknyx/scripts/pyknyx-group.py monitorTraceback (most recent call last):
                File "pyknyx/scripts/pyknyx-group.py", line 423, in <module>
                main()
                File "pyknyx/scripts/pyknyx-group.py", line 419, in main
                args.func(**options)
                File "pyknyx/scripts/pyknyx-group.py", line 281, in monitor
                stack = Stack(individualAddress=src)
                TypeError: __init__() missing 1 required positional argument: 'ets'
                ob ich der "subcommand" monitor oder read benutzte, kommt der gleiche fehler.
                Wenn ich 'nur' lesen möchte, wer soll den argument 'ets' versorgen?, was ist überhaupt das Argument ets? (so wie ich es verstehe individual_address wird zu 0.0.0 gesetzt).

                Ich sehe auch noch nicht durch wer und wo gesagt wird welche Schnittstelle benutzt werden soll (im Homeoffice habe ich ein Gira ip router und auf der arbeit im Büro benutzte eine usb SS von ABB), bzw. wie das programm mit dem Bus kommuniziert.

                Bin ein bisschen verzweifelt...

                Gibt es igwie ein Beispiel, wie man einfach das Licht ein und ausschalten kann oder igdein. GA auslesen kann?


                Gruß
                Simón

                Kommentar


                  #9
                  Schau dir mal zB "tests/full/switch.py" an.

                  So grundsätzlich:
                  • du deklarierst eine Unterklasse von "FunctionalBlock", in der steht was ein Gerät des Typs kann den du implementieren willst
                  • das tatsächliche Gerät ist eine Unterklasse von "Device", da stehen die Gruppenadressen drin
                  Ja das ist alles nicht so wirklich simpel, hat aber den Vorteil dass du ziemlich viel in Objekten parken kannst und dich um die tatsächliche Kommunikation nach dem Setup nicht mehr kümmern musst. Alternative: xknx.
                  DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

                  Kommentar


                    #10
                    und ja die Beispielprogramme sind nicht so wirklich brauchbar, sorry, dagegen werde ich demnächst was tun.
                    DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

                    Kommentar


                      #11
                      Danke Smurf .
                      Xknx hatte ich schon vor eine Weile gesehen aber das funktioniert aber nur mit KNX/IP oder liege ich falsch?
                      Mein Projekt kommuniziert aber seriell (raspi + kberry), ich wollte auch bei seriell bleiben.

                      Im Endeffekt, möchte ich über die kberry die Werte aus dem Bus lesen (über ttyAMA0) und in der Raspi speichern, um sie später weiterzuverarbeiten.

                      In die andere richtung (schreiben) mein C programm auf der Raspi bastelt Telegramme aus einem Http request und sendet sie über die ttyAMA0 (kberry angeschlossen) zu den knx bus
                      Zuletzt geändert von Golpe; 12.04.2021, 18:34.

                      Kommentar


                        #12
                        Seit wann redet denn pyknyx direkt mit einem kberry? da braucht es einen knxd dazwischen. Überraschung: mit xknx auch.
                        DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

                        Kommentar


                          #13
                          Ahhhh, na deswegen wende ich mich doch an euch und Frage ob ich außer pyknyx noch was dazu installieren soll.
                          Also brauche ich doch knxd....
                          Muss denn erstmal gucken wie knxd funktioniert und was pyknx 'on top' anbietet.

                          Danke schön.

                          P.S. Smurf bzgl. die Überraschung: meinst du damit, dass mit xknx man auch serielle kommunikation herstellen kann (mit knxd zwischen kberry und xknx)?
                          Zuletzt geändert von Golpe; 12.04.2021, 20:22.

                          Kommentar


                            #14
                            Welche serielle Kommunikation meinst du? KNX besteht aus Datenpaketen mit Quell- und Zieladresse und einem Inhalt der aus wenigen Bits und Bytes besteht. (Das ganze Drumherum lassen wir mal weg, weil für das Licht-Einschalten irrelevant.) Ob die jetzt seriell zu einem kBerry oder via IP-Multicast oder einen Unixsocket oder seriell zu einem TPUART oder seriell mit 9600 Baud und 30 Volt über einen KNX-Draht übertragen werden, ist unterschuiedliches Drumherum aber für die Programmierung wurschtegal, man braucht halt Programme und/oder Geräte, die die angesprochenen Drumherumformate miteinander verheiraten.

                            pyknyx und xknx verstehen nur Multicast und IP-Tunnel. Dein Lichtschalter versteht nur 30 Volt. KNX ist beides. Du musst halt das Dazwischendrin so auswählen dass es zu deiner vorhandenen Hardware passt (und/oder welche dazukaufen) und A in B übersetzen kann.

                            Die Idee hinter pyknyx und Co ist nicht, KNX zu reden, sondern die Daten auf dem KNX-Bus (Nachrichten mit vielen Adressen und Datenformaten) zu etwas zu übersetzen, mit dem ein Programmierer arbeiten kann: set("home.bus.wohnzimmer.licht.decke.power", True) – ohne sich um den ganzen Summsel drumherum kümmern zu müssen.
                            DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

                            Kommentar


                              #15
                              Zur besser Verständnis füge ich meine Projekt Anforderungen ein und einem Übesicht davon, was ich erreicht habe.
                              Hardware soll es so bleiben wie es ist (raspi + kberry).

                              Kürze Erklärung dazu:
                              1. User sendet die url
                              Code:
                              http://ip.addresse.des.raspberrys:1234/knx/gruppen/addresse-wert
                              von igwo. her (Webbrowser, ip telefon, ip camera, xml-menü, Fernbedienung, was auch immer)
                              2. Mein C++ http-server(port :1234) hört auf diese Muster, guckt, ob diese GA in der KNX Anlage vorhanden ist und welche Datentyp sie hat.
                              3. Wenn die GA vorhanden ist, bastelt mein C++ Programm ein L_Data.req Telegramm mit dem ganzen Drumherum (cEMI eingebetet in FT1.2) dem Datentyp entsprechend, schaltet die kberry auf Link Layer modus und feuert den berechnete Telegramm an den Bus (z.B. Licht an).
                              4. Licht schaltet (
                              Code:
                              wert = an
                              oder
                              Code:
                              wert = aus
                              ) oder dimmt (
                              Code:
                              wert = plus
                              oder
                              Code:
                              wert = minus
                              ).

                              Das ist der Zwischenstand. Mein 'Gateway' kann aber nur in eine Richtung arbeiten (schreiben. Schalten oder dimmen relativ).

                              Nun möchte ich auch lauschen und die Stati der GAs z.B. in eine Datei speichern, und zwar über die UART zwischen raspi und kBerry.
                              Damit können die IP-Geräte (oder Programme, z.B. Visualisierung), den Status fetchen.
                              Bei Änderungen in den Stati in diese Datei, will ich auch später eine Nachricht an den IP-Geräte oder Programme senden, die auf diese Adressen hören (Protokoll zu benutzen steht noch offen. Hauptsache so universell wie möglich).

                              Lauschen kann ich in der Raspi mit
                              Code:
                              sudo socat -x /dev/ttyAMA0,raw,echo=0,crnl PTY,link=/dev/ttyV1,raw,echo=0,crnl
                              aber bekomme ich nur die row Werte vom KNX Frame wie:
                              Code:
                              > 2021/04/13 20:22:19.214401 length=8 from=0 to=7
                              68 0c 0c 68 d3 29 00 bc
                              > 2021/04/13 20:22:19.218939 length=8 from=8 to=15
                              e0 11 04 08 01 01 00 81
                              > 2021/04/13 20:22:19.221758 length=2 from=16 to=17
                              38 16
                              > 2021/04/13 20:22:19.277292 length=8 from=18 to=25
                              68 0c 0c 68 d3 29 00 bc
                              > 2021/04/13 20:22:19.281931 length=8 from=26 to=33
                              e0 11 04 08 01 01 00 81
                              > 2021/04/13 20:22:19.284753 length=2 from=34 to=35
                              38 16
                              > 2021/04/13 20:22:19.340301 length=8 from=36 to=43
                              68 0c 0c 68 d3 29 00 bc
                              > 2021/04/13 20:22:19.344929 length=8 from=44 to=51
                              e0 11 04 08 01 01 00 81
                              > 2021/04/13 20:22:19.347755 length=2 from=52 to=53
                              38 16
                              > 2021/04/13 20:22:19.403330 length=8 from=54 to=61
                              68 0c 0c 68 d3 29 00 bc
                              > 2021/04/13 20:22:19.407934 length=8 from=62 to=69
                              e0 11 04 08 01 01 00 81
                              > 2021/04/13 20:22:19.410745 length=2 from=70 to=71
                              38 16
                              > 2021/04/13 20:22:28.394875 length=8 from=72 to=79
                              68 0c 0c 68 f3 29 00 bc
                              > 2021/04/13 20:22:28.399513 length=8 from=80 to=87
                              e0 11 04 08 01 01 00 81
                              > 2021/04/13 20:22:28.402327 length=2 from=88 to=89
                              58 16
                              > 2021/04/13 20:22:28.457890 length=8 from=90 to=97
                              68 0c 0c 68 f3 29 00 bc
                              > 2021/04/13 20:22:28.462500 length=8 from=98 to=105
                              e0 11 04 08 01 01 00 81
                              > 2021/04/13 20:22:28.465317 length=2 from=106 to=107
                              58 16
                              > 2021/04/13 20:22:28.520837 length=8 from=108 to=115
                              68 0c 0c 68 f3 29 00 bc
                              > 2021/04/13 20:22:28.525443 length=8 from=116 to=123
                              e0 11 04 08 01 01 00 81
                              > 2021/04/13 20:22:28.528268 length=2 from=124 to=125
                              58 16
                              > 2021/04/13 20:22:28.583842 length=8 from=126 to=133
                              68 0c 0c 68 f3 29 00 bc
                              > 2021/04/13 20:22:28.588466 length=8 from=134 to=141
                              e0 11 04 08 01 01 00 81
                              > 2021/04/13 20:22:28.591263 length=2 from=142 to=143
                              58 16
                              Da ich diesmal etwas 'fertiges' benutzen wollte und ich mich nicht wieder mit dem KNX Standard herumschlagen muss, um Gruppenaddresse und Payload von der o.g. Konsoleausgabe auszulesen, suche ich nach etwas, das von der UART des raspberrys den Verkehr lauschen kann und mir das Gelesene etwas formatiert ausgibt.

                              Smurf Wenn ich aber dein letzte Post richtig verstanden habe, weder Pyknyx, noch xknx kann mir helfen, weil sie nur Multicast verstehen, nicht seriell.
                              Das einzige was mir helfen kann ist der Monitor vom knxd, oder?

                              LG,
                              Simón.

                              P.S. die neue Features des Gerätes wollte ich in Python schreiben, wenn möglich, sodass ich Python für die Arbeit übe und schnell neue Features basteln kann, denn C++ habe ich seit der Technikerschule nicht mehr. Wobei C++ wieder aufzunehmen stört mir aber auch nicht.
                              Angehängte Dateien
                              Zuletzt geändert von Golpe; 13.04.2021, 20:13.

                              Kommentar

                              Lädt...
                              X