Ankündigung

Einklappen
Keine Ankündigung bisher.

eibd(war bcusdk) Fork -> knxd

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

    Ja, geht. Sinnvollerweise schreibst du dazu ein kleines Programm in der Programmiersprache deiner Wahl. Ich selber bin gerade dabei, das PyKNyX-Paket (Python) soweit aufzubohren, dass man es "einfach" einbinden kann. (Geht jetzt schon ganz gut, ist aber noch zu kompliziert für den Hausgebrauch.)

    Die simple Methode ist, einfach auf dem Bus mitzuhören, ob irgendwas passiert ist, und dann entsprechend zu agieren. So einfach würde ich es mir aber nicht machen: Eigentlich willst du einen Busteilnehmer haben, der (a) einen Zustand hat, den man (b) auslesen können muss, und der (c) diese Zustandsänderung auch kommuniziert (damit dein Sensor sein kleines Licht einschalten kann).

    Ob dieser Teilnehmer jetzt ein KNX-Aktor auf dem Gebäudebus ist oder ein Programm in deinem Rechner, ist für die Systematik des Ganzen egal.
    DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

    Kommentar


      Zitat von rdorsch Beitrag anzeigen
      Kann ich mit knxd Operationen auf dem Host auslösen (z.B. per Callback, Polling oder was auch immer), wenn auf dem KNX Bus eine Schreiboperation auf eine Gruppenadresse passiert?
      Ich verwende für solche Sachen linknx als Logic Engine.

      EIB/KNX, VISU mit knxd + linknx + knxweb, Steuerbefehle via SMS und Email mit postfix + procmail

      Kommentar


        Wenn das Prinzip auf Lauschen auf dem Bus beruht und der ETS nicht bekannt ist, heißt das dann, dass es auf die Linie beschränkt ist in der mein IP-Interface enthalten ist?

        Mir war erstmal wichtig, dass ich ein grundlegendes Verständnis für die untersten Schichten habe, damit ich verstehe was prinzipiell möglich ist und was nicht .... und dass ich sicher sein kann, dass sie auch funktionieren.

        Was ich darüber baue habe ich noch nicht final entschieden, aber OpenHAB und smarthome.py sind gerade die Favoriten. smarthome.py nutzt linknx soweit ich weiss, bei openhab weiss ich das noch nicht.

        Auf PyKNyX bin ich in jedem Fall gespannt, da ich eine python basierte Lösung sympathisch finde und damit evtl. kleine Automatisierungsaufgaben effizient zu erledigen sind.

        Kommentar


          Danke für das Privileg, dass das nur ich machen darf Leider funzt es auch so nicht.. hatte das eh mit 0.12.2 oder 0.12.0 schon probiert. Also mittels configure --disable-systemd, make, make install alles auf der VM installiert und dann die einzelnen Files raus geklaubt und aufs NAS kopiert.
          Dort gibt es nun folgende Meldung:
          Code:
          root@SynologyDS1515:~# /usr/lib/knxd/busmonitor1
          usage: busmonitor1 url: Success
          root@SynologyDS1515:~# /usr/lib/knxd/busmonitor1 ip:127.0.0.1
          ...blabla, da kann ich ganz normal mitlauschen
          root@SynologyDS1515:~# knxd --version
          knxd: error while loading shared libraries: libsystemd.so.0: cannot open shared object file: No such file or directory

          Kommentar


            Onkelandy Dann kopier halt libsystemd.so.0 mit rüber. Tut nicht weh. Ich weiß aber nicht wirklich, wie du das geschafft hast, denn wenn ich --disable-systemd verwende dann linkt der auch nicht damit. Schick mir mal einen Pastebin mit deinem config.log.

            rdorsch sch Eine "Linie" (also Geräteadressen 1.1.X für X von 0 bis 255) verwendet man, weil man elektrisch eh nicht mehr Geräte an den Bus hängen kann und es am einfachsten ist, die durchzunumerieren. Und weil man einen vernünftigen KNX-Router beibringen kann, welche Linien wo sind -- dann schickt er Nachrichten, die an diese Geräte adressiert sind, nur da hin. Wie du den Rest so organisierst, dass du deinen Routern möglichst wenige Adressbereiche beibringen musst, bleibt dir überlassen.

            Wenn du Geräte 1.1.X und 1.2.Y gleichzeitig auf ein Kabel hängst, funktioniert das auch. Macht man zB bei einem mehrstöckigen Haus wenn die initiale Installation klein genug ist, dass man (noch) ohne Router auskommt, aber später bei der Bustrennung nicht umnummerieren will.

            Dem knxd kann man (noch) nicht beibringen, welche Linien wo sind, aber er merkt sich, an welcher Verbindung er welche Adresse zuletzt gesehen hat, und schickt die Pakete dort hin. Ist aber auch relativ unwichtig, weil du eigentlich nur beim Programmieren überhaupt direkt adressierst, der Rest geht über Gruppenadressen.

            Gruppenadressen sind eine komplett andere Nummer. Einem vernünftigen KNX-Router kann man beibringen, welche Adressbereiche für welche Linien interessant sind. Beim knxd geht das noch nicht, der schickt alles überallhin. Ist in Arbeit. Die typische Home-Installation braucht das aber nicht wirklich.

            Physisch gibt es auf dem KNX-Kabel keine Router wie bei IP, wo du Pakete, die irgendwo anders hingehen, direkt an den Router adressieren musst. KNX-Pakete liegen direkt am Bus an; derjenige Router, der sich dafür verantwortlich fühlt (inkl. aktuell jeder knxd), bestätigt die und leitet sie weiter. (Ansonsten werden sie ein paarmal wiederholt.) Bei normalen Daten, die an Gruppenadressen gehen, ist die Zahl der interessierten Geräte eh potenziell unbegrenzt.
            DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

            Kommentar


              Hallo Smurf
              Ich hab jetzt am NAS nochmals alles platt gemacht, vermutlich war da einfach noch eine alte Version da, die dann wegen systemd gezickt hat.

              Das mit dem --disable-systemd funktioniert nun. Ich konnte auch mittels make und checkinstall ein deb-File basteln und dieses dann erfolgreich auf dem NAS installen, nachdem ich ein paar lib-Probleme gelöst hatte.

              Echt sonderbar ist, dass es bei mir häufig funktioniert und dann mit exakt den gleichen Attributen nach einem Neustart nicht mehr. Ich schau mir jetzt nochmals 0.11.18 an.

              Hatte vorhin auch immer das "initialisation of backend 'tcp' failed: Address already in use" Problem, muss ich mir nochmals genau ansehen.
              Zuletzt geändert von Onkelandy; 31.01.2017, 00:01.

              Kommentar


                Zitat von Onkelandy Beitrag anzeigen
                Hatte vorhin auch immer das "initialisation of backend 'tcp' failed: Address already in use" Problem, muss ich mir nochmals genau ansehen.
                Das ist mit Sicherheit entweder der systemd-Socket (in deinem Fall eher unwahrscheinlich …), oder ein noch laufender zweiter knxd.
                DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

                Kommentar


                  Hallo ,

                  ich habe eine Weinzierl 730 IP-Schnittstelle und starte den knxd mit folgenden Parametern.

                  knxd -e 1.1.55 -E 1.1.245:8 -DTRS -c -i --send-delay=120 -B single -b ipt:x.x.x.x

                  Das Ergebnis ist, das die Verbindung zur schnittstelle bei der ETS4 und 5 als ok angezeigt wird. Leider kann ich weder Geräteinfos abfragen noch diese Programmieren.
                  Die ETS sagt dan Adresse kann nicht gefunden werden. Was mache ich falsch?
                  Smarthome.py und Smartvisu funktioniert einwandfrei.

                  Ach so fast vergessen , die Version ist 0.12.13-2


                  Code:
                  knxd: Layer 8 [ 8:mcast:knxd:1.1.245    495.702] TUNNEL_REQ
                  knxd: Layer 9 [ 8:mcast:knxd:1.1.245    495.703] Queue L_Data system from 1.1.245 to 1.1.2 hops: 06 T_DISCONNECT_REQ
                  knxd: Layer 8 [ 8:mcast:knxd:1.1.245    495.703] found addr 1.1.245
                  knxd: Layer 3 [ 3:layer3                495.703] Route L_Data system from 1.1.245 to 1.1.2 hops: 05 T_DISCONNECT_REQ
                  knxd: Layer 8 [ 2:mcast:knxd            495.703] Send_Route L_Data system from 1.1.245 to 1.1.2 hops: 05 T_DISCONNECT_REQ
                  knxd: Layer 2 [ 6:ipt:x.x.x.x     495.703] Send L_Data system from 1.1.55 to 1.1.2 hops: 05 T_DISCONNECT_REQ
                  knxd: Layer 8 [ 8:mcast:knxd:1.1.245    495.704] TUNNEL_ACK
                  
                  knxd: Layer 5 [ 7:?-F:ipt:x.x.x.x 334.760] drop packet from 1.1.55
                  knxd: Layer 5 [ 7:?-F:ipt:x.x.x.x 334.882] drop packet from 1.1.55
                  knxd: Layer 8 [ 8:mcast:knxd:1.1.245    334.972] TUNNEL_ACK
                  knxd: Layer 8 [ 8:mcast:knxd:1.1.245    334.974] TUNNEL_ACK
                  knxd: Layer 8 [ 8:mcast:knxd:1.1.245    334.974] Wrong sequence 92<->93
                  Zuletzt geändert von vossy74; 21.02.2017, 12:59.

                  Kommentar


                    Bitte setze ein komplettes Protokoll (aktuelle Version) in einen Pastebin.
                    DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

                    Kommentar


                      Hallo,

                      Ich bin zwar nicht sicher aber ich denke ich habe Probleme mit KNXD. Siehe Thread im Smarthome.py Bereich. Vielleicht hat jemand eine Idee dazu.

                      Kommentar


                        Hallo,

                        ich habe hier

                        rd@mohot:~$ knxd --version
                        knxd 0.11.18
                        rd@mohot:~$

                        und ich kann zuverlässig auf den Bus schreiben

                        rd@mohot:~$ knxtool groupswrite ip:127.0.0.1 2/1/0 0
                        Send request
                        rd@mohot:~$ knxtool groupswrite ip:127.0.0.1 2/1/0 1
                        Send request
                        rd@mohot:~$

                        Das geht gut, solange die Gruppenadresse vom Typ 1.001 (bool) ist.

                        Ich vermute, ich muss knxtool aber mitteilen, ob meine Gruppenadresse von einem anderen Typ, z.B. 9.008 (float) ist (in diesem Fall CO2-Sensor der Zehnder Lüftungsanlage: http://www.zehnder-systems.de/download/133748/47371.pdf ) (wohersoll knxtool das auch wissen?).

                        Kann mir hier jemand sagen, was ich tun muss oder wo ich schauen muss?

                        Im Code (knxtool.c) kann ich leider nicht viel finden:

                        else if (strcmp (prog, "groupswrite") == 0)
                        {
                        uchar lbuf[3] = { 0x0, 0x80 };

                        if (ac != 4)
                        die ("usage: %s url eibaddr val", prog);
                        con = open_con(ag[1]);
                        dest = readgaddr (ag[2]);
                        lbuf[1] |= readHex (ag[3]) & 0x3f;

                        if (EIBOpenT_Group (con, dest, 1) == -1)
                        die ("Connect failed");

                        len = EIBSendAPDU (con, 2, lbuf);
                        if (len == -1)
                        die ("Request failed");
                        printf ("Send request\n");
                        }



                        Danke und Gruß
                        Rainer

                        Kommentar


                          statt groupSwrite, groupewrite anwenden ?!?

                          Kommentar


                            Wow...Antwort mit Lichtgeschwindigkeit, danke :-)

                            Sieht für mich so aus, als müsste ich die float in hex-Werte von Hand umrechnen:

                            else if (strcmp (prog, "groupwrite") == 0)
                            {
                            uchar lbuf[255] = { 0x0, 0x80 };

                            if (ac < 4)
                            die ("usage: %s url eibaddr val val ...", prog);
                            con = open_con(ag[1]);
                            dest = readgaddr (ag[2]);
                            len = readBlock (lbuf + 2, sizeof (lbuf) - 2, ac - 3, ag + 3);
                            if (len < 0)
                            die ("Invalid hex bytes");

                            if (EIBOpenT_Group (con, dest, 1) == -1)
                            die ("Connect failed");

                            len = EIBSendAPDU (con, 2 + len, lbuf);
                            if (len == -1)
                            die ("Request failed");
                            printf ("Send request\n");

                            }

                            Muss ich das von Hand umrechnen (z.B. 800 ppm bei 9.008) oder gibt es da eine elegantere Methode? Kodiert der 2-Octet Float Value in dem Beispiel 1200 oder 0,0012 ?

                            Danke und Gruß
                            Rainer

                            Kommentar


                              Hexcodierung tut und der ETS5 Gruppenmonitor zeigt die dekodierte Zahl an, damit komme ich zurecht.

                              Leider "ignoriert" die Zehnder die Operation, aber dafür kann knxd vermutich nichts.

                              Kommentar


                                Ja, die Datapoints muss man selber umrechnen, in KNX gibt es (noch; ist für 0.16 in Planung) keinen Code dafür.

                                FHEM macht das so:

                                Code:
                                               my $sign = ($value <0 ? 0x8000 : 0);
                                               my $exp  = 0;
                                               my $mant = 0;
                                
                                               $mant = int($value * 100.0);
                                               while (abs($mant) > 0x7FF)  
                                               {
                                                       $mant /= 2;
                                                       $exp++;
                                               }
                                               $numval = $sign | ($exp << 11) | ($mant & 0x07ff);
                                bzw. zurück
                                Code:
                                               $numval = hex($value);
                                               my $sign = 1;
                                               $sign = -1 if(($numval & 0x8000) > 0);
                                               my $exp = ($numval & 0x7800) >> 11;
                                               my $mant = ($numval & 0x07FF);
                                               $mant = -(~($mant-1) & 0x07FF) if($sign == -1);
                                               $numval = (1 << $exp) * 0.01 * $mant;
                                9.008 kodiert ppm ("parts per million"), also 1200. Werte unter 0.01 kannst du mit dpt9 nicht speichern.
                                DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

                                Kommentar

                                Lädt...
                                X