Ankündigung

Einklappen
Keine Ankündigung bisher.

Werte von EIB lesen mit eibd

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

    #16
    Wie ich auf den EIS-Typ schließe? Gar nicht... Ich habe nur Temperatur-, Prozent- und boolsche Werte hier im Haus. Damit ist die Länge bei mir völlig ausreichend zur Identifikation. Anhand der Gruppenadresse kann ich in der Visu notfalls immer noch auf den EIS-Typ schließen.

    Wie gesagt: Das ist Proof-of-concept. Besser ist es, den vbusmonitor2 zu modifizieren und die Telegramme sauber und in ihrer Gesamtheit zu dekodieren. Daher auch der Hinweis vor dem Script auf die hier bereits gepostete PHP-Klasse.

    Wenn man Telegramme schreibt, sieht das schon anders aus.

    Im schlimmsten Fall stehen jetzt beim Lesen in der Datenbank unbrauchbare Werte.

    Gruß,

    Maik

    Kommentar


      #17
      Hi zusammen,
      nur als kleiner Hinweis...

      Zitat von mccab99 Beitrag anzeigen
      ....Besser ist es, den vbusmonitor2 zu modifizieren und die Telegramme sauber und in ihrer Gesamtheit zu dekodieren...
      Da gibts nix zu decodieren.
      Im Telegramm ist der EIS-Typ (bzw.jetzt DPT) nicht hinterlegt, es gibt keinen Hinweis auf die Interpretation der Werte, außer halt die Länge.
      Die aber auch nur eingeschränkt:
      z.B. haben Schaltfunktion (1-Bit), Zwangssteuerung (2-Bit) und Dimmbefehle (4-Bit) alle die gleiche Länge.


      Zitat von mccab99 Beitrag anzeigen
      Anhand der Gruppenadresse kann ich in der Visu notfalls immer noch auf den EIS-Typ schließen....
      ... kannst Du nicht nur, sondern musst Du auch, wenn Typen gleicher Länge vorhanden sind.

      Gruß Jörg

      Kommentar


        #18
        Das würde ja heißen:

        1. Die ETS kennt den richtigen DPT(?)-Typ auch "nur" aufgrund ihrer Geräte-Datenbank

        2. Es fehlt im Telegramm eine gar nicht so unwesentliche Information völlig (Gibt es dafür einen Grund?)

        3. Ich muss - genau wie schon oben von einem Vorposter angemerkt - den DPT-Typ hart in meine DB einkodieren - genau auf diese Handarbeit hatte ich so gar keine Lust...

        4. Das müsste ich beim Homeserver etwa auch machen? Eine Gerätetabelle mit Datentyp anlegen? Und mir dann noch eine Visu dafür selbst ausdenken (hübsch finde ich die mitgelieferten Grafiken nicht so)? Oder liest der Homeserver ETS-Daten ein?

        Oder gibt es da noch eine andere Form der Zeitersparnis? Für 1900kEuro kann ich schon eine ganze Weile für 80,- Euro/Std. arbeiten...

        Fazit:
        Man muss tatsächlich ein Feld für den DPT-Typ in die Datenbank eintragen, den erst checken, um dann per Function zu dekodieren und in die DB zu schreiben - am besten persistent, dann wird ein passender Schuh daraus. Ich poste einmal ein Ergebnis, wenn es da ist...

        Gruß,

        Maik

        Kommentar


          #19
          zu 1. yep!

          zu 2. klar, weil's ein 'normales' EIB-Gerät nicht braucht
          jedes Gerät weiß, wie es seine Komm-Objekte zu behandeln hat

          zu 3. nö, aus ETS exportieren, dann in Deine DB einlesen, genaue Import-Prozedur musst Du wissen...

          zu 4. ich , Homeserverfreie Zone


          zu Fazit: der Kandidat hat 100 Punkte....


          Gruß Jörg

          Kommentar


            #20
            ok dann mal ein paar infos von mir, wie ich es (BIS JETZT - hab erst seit 1.8.07 EIB) gemacht habe

            Code:
            CREATE TABLE IF NOT EXISTS `GA` (
              `ID` int(10) unsigned NOT NULL auto_increment,
              `Name` varchar(100) NOT NULL,
              `FK_Etagen_ID` int(10) unsigned NOT NULL,
              `FK_Raum_ID` int(10) unsigned NOT NULL,
              `FK_EIS_ID` int(10) unsigned NOT NULL,
              `FK_Typ_ID` int(10) unsigned NOT NULL,
              `s_dest` varchar(15) NOT NULL,
              `s_source` varchar(15) NOT NULL,
              `c_dest` varchar(15) NOT NULL,
              `Status` varchar(50) NOT NULL,
              PRIMARY KEY  (`ID`)
            ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
            Räume / Etagen / EIS Typen / Typen (Licht / Heizung) stehen in anderen Tabellen.
            in der DB hinterlege ich mein Objekte
            s_Dest: Status Ziel Adresse
            s_source: Status Quelle Adresse ( kann leer sein )
            c_dest ist die Adresse an die Änderungen für das Objekt geschickt werden

            Beim Loggen kann ich so in der DB nachsehen ob ich eine Status Änderung für ein bekanntes Objekt empfangen habe und ich kann auch über die Visu Änderungen an die entsprechende Adresse schicken.

            S_Source hab ich eingeführt, damit alle RTR ihr Temperatur an eine Gruppen Adresse schicken können.
            Dann wird in der DB unterschieden woher die Infos kam (S_Source)


            Code:
            SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
            
            -- 
            -- Tabellenstruktur für Tabelle `EIS`
            -- 
            
            CREATE TABLE IF NOT EXISTS `EIS` (
              `ID` int(10) unsigned NOT NULL auto_increment,
              `Name` varchar(100) NOT NULL,
              `EIS` tinyint(3) unsigned NOT NULL,
              `Länge` tinyint(3) unsigned NOT NULL COMMENT 'Bits',
              PRIMARY KEY  (`ID`)
            ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;
            
            -- 
            -- Daten für Tabelle `EIS`
            -- 
            
            INSERT INTO `EIS` (`ID`, `Name`, `EIS`, `Länge`) VALUES 
            (1, 'Schalten', 1, 1),
            (2, 'Dimmen', 2, 4),
            (3, 'Zeit', 3, 24),
            (4, 'Datum', 4, 16),
            (5, 'Gleitkomma', 5, 16),
            (6, 'Skalieren: Relativwert 0-255', 6, 8),
            (7, 'Skalieren: Relativwert %', 6, 8),
            (8, 'Skalieren: Relativwert 0-360 Grad', 6, 8),
            (9, 'Jalousie', 7, 1),
            (10, 'Zwangssteuerung', 8, 2),
            (11, 'IEEE-Gleitkomma ( floating point )', 9, 32),
            (12, '16-Bit Zählerwerte (-32768...+32767)', 10, 16),
            (13, '16-Bit Zählerwerte (0...65535)', 10, 16),
            (14, 'Für 32-Bit Zählerwerte (- 2147483648 .. 2147483647)', 11, 32),
            (15, 'Für 32-Bit Zählerwerte (0 ..  494967295)', 11, 32),
            (16, 'Zugriffscode: Zugangskontrolle', 12, 32),
            (17, 'Zeichen: Ein ASCII Zeichen', 13, 8),
            (18, 'Für 8-Bit Zählerwerte (-128 .. 127)', 14, 8),
            (19, 'Für 8-Bit Zählerwerte (0..255)', 14, 8),
            (20, 'Zeichenkette: Zeichenkette (Max. 14 Zeichen)', 15, 112);
            und hier eine Klasse für php (wobei die noch Version 0.1 ist)

            Code:
            class EIB_Telegramm
            {
                var $telegramm;
                function EIB_Telegramm ()
                {
                }
                function set_Telegramm($data)
                {
                    if (!is_array($data))
                    {
                        if ($data == "") return false;
                        $this->telegramm = split(" ",$data);
                        if ($this->telegramm[0]=="LPDU:")
                            $this->telegramm = array_slice($this->telegramm,1,((hexdec($this->telegramm[6]) & 15)+8));
                        else
                            $this->telegramm = array_slice($this->telegramm,0,((hexdec($this->telegramm[5]) & 15)+7));
                        $max=count($this->telegramm);
                        for ($i = 0; $i<=$max-1; $i++)
                        {
                            $this->telegramm[$i] = hexdec($this->telegramm[$i]);
                        }
                    }
                    else
                    {
                        $this->telegramm = $data;
                    }
                    return true;
                }
                function get_telegramm()
                {
                    $tmp = "";
                    foreach ($this->telegramm as $byte) {
                        if ($tmp != "") $tmp.= " ";
                        $tmp .= dechex($byte);
                    }
                    return $tmp;
                }
                function get_source ()
                {
                    return ($this->telegramm[1] >> 4).".".($this->telegramm[1] & 15 ).".". $this->telegramm[2];
                }
                function get_target ()
                {
                    if (($this->telegramm[5] & 128) == 128) {
                        return (($this->telegramm[3] & 120) >> 3)."/".($this->telegramm[3] & 7 )."/". $this->telegramm[4];
                    } else {
                        return ($this->telegramm[3] >> 4).".".($this->telegramm[3] & 15 ).".". $this->telegramm[4];
                    }
                }
                function get_hobs ()
                {
                    return (($this->telegramm[5] & 112) >> 4);
                }
                function is_repeat ()
                {
                    if ((($this->telegramm[0] & 32) >> 5) == 0) return 1;
                    return 0;
                }
                function get_byte ($byte)
                {
                    return $this->telegramm[$byte];
                }
                function get_bit ($byte,$bit)
                {
                    return (($this->telegramm[$byte] >> ($bit-1)) & 1) ;
                }
                function get_type ()
                {
                    if ((isset($this->telegramm[6])) and  isset($this->telegramm[7]))
                    {
                        if ((($this->telegramm[7] & 192) == 0) and (($this->telegramm[6] & 3) == 0))
                        {
                            return "A_GroupValue_Read";
                        }
                        if ((($this->telegramm[7] & 192)== 64) and (($this->telegramm[6] & 3) == 0))
                        {
                            return "A_GroupValue_Response";
                        }
                        if ((($this->telegramm[7] & 192)== 128) and (($this->telegramm[6] & 3) == 0))
                        {
                            return "A_GroupValue_Write";
                        }
                        return "UNKOWN: ".decbin(($this->telegramm[6] & 3))." ".decbin($this->telegramm[7]);
                    }
                    else
                    {
            //          echo  "UNKOWN: ".print_r($this->telegramm,true). "\n";
                        return "UNKOWN";
                    }
                }
                function get_data($eis = 0)
                {
                    $data = array();
                    if ((($this->telegramm[5] & 15)+1) == 2)   {
                        // Small 1 bit
                        $data[0] = ($this->telegramm[7] & 63);
                    } else {
                        for ($i = 8 ; $i <= ($this->telegramm[5] & 15)+6 ; $i++) {
                            $data[$i-8] = $this->telegramm[$i];
                        }
                    }
                    switch ($eis)
                    {
                        case 1:
                            return $data[0];
                            break;
                        case 3:
                            $time['wday'] = ($data[0] >> 5);
                            $time['hour'] = ($data[0] & 31);
                            $time['min'] = ($data[1] );
                            $time['sec'] = ($data[2] );
                            $data= $time ;
                            break;
                        case 5:
                            $tmp="";
                            foreach ($data as $byte) {
                                $tmp .= str_pad(dechex($byte),2,0,STR_PAD_LEFT);
                            }
                            $eis5 = hexdec($tmp);
                            $wert = ($eis5 & 0x07ff);
                            if (($eis5 & 0x08000) != 0)
                            {
                                $wert = $wert | 0xfffff800;
                                $wert = $wert *-1;
                            }
                            $wert = $wert << (($eis5 & 0x07800) >> 11);
                            if (($eis5 & 0x08000) != 0)
                            {
                                $wert = $wert * -1;
                            }
                            return $wert/100;
                            break;
                        case 6:
                            $tmp="";
                            foreach ($data as $byte) {
                              $tmp .= str_pad(dechex($byte),2,0,STR_PAD_LEFT);
                            }
                            $eis6 = hexdec($tmp);
                            return round($eis6*255/100);
                            break;
                        case 99:
                            $tmp="";
                            foreach ($data as $byte) {
                                if ($tmp != "") $tmp.= " ";
                                $tmp .= str_pad(dechex($byte),2,0,STR_PAD_LEFT);
                            }
                            return $tmp;
                            break;
                    }
            
                    return $data;
                }
            
                function get_prio ()
                {
                    return (($this->telegramm[0] & 12) >> 2);
                }
            
            }
            Aufruf Beispiel

            Wobei die Klasse mit vbusmonitor1 und 2 gehen sollte
            Allerdings muss der Patch rein.

            Code:
            ...
            $handle = popen ($BIN_DIR.'vbusmonitor2 ip:localhost','r');
            if ($handle) {
                $eib = new EIB_Telegramm();
                while (!feof($handle)) {
                    if ($eib->set_Telegramm(fread($handle,2096)) )
                    {
            ...
            Verbesserungsvorschläge gerne an mich senden.

            Kommentar


              #21
              Hallo alle Zusammen,

              wir haben seit gut einem Jahr EIB bei uns in der Wohnung und ich habe das ganze per ETS3 programmiert. Jetzt finde ich die Idee natürlich toll mein EIB über meinen Linux Rechner aufzupeppen. Die vergangene Nacht habe ich damit verbracht überhaupt erst mal alle Informationen zusammenzutragen. Gar nicht so einfach, weil viele Wege irgendwo versumpfen bzw. nicht mit meiner USB Schnittstelle spielen wollen. Nun läuft der EIBD über die USB Schnittstelle und ich kann meine Geräte an und aus schalten, Rollos rauf und runter fahren lassen. Einfach optimal.

              Bei meiner Suche bin ich auch auf Euren Forumseintrag gestoßen und kämpfe mit ein paar Problemchen. Ich habe mein BCUSDK aus den Quellen compiliert und auch die Änderungen in der Datei "vbusmonitor1.c" und "vbusmonitor2.c" vorgenommen - sprich das fflush(stdout) eingefügt. Jetzt zu meinen Problemen:

              - Mit welchen Parametern startet ihr euren eibd?
              - Wenn ich "busmonitor1" ausführe, bekomme ich den ganzen Busverkehr mit. Wenn ich aus der Kommandozeile "vbusmonitor1" ausführe kommt nix. Wodurch unterscheiden sich eigentlich diese beiden Befehle?
              - Mein PHP Programm bleibt bei der Zeile "$handle = popen($command,'r');" hängen und läuft erst gar nicht weiter. $command verweist wie bei euren Programmen auf den "vbusmonitor1 ip:localhost" Befehl. Gibt es da noch was zu beachten?
              - Ach ja, und einen habe ich noch Wenn man auf der Konsole mit "busmonitor1" permanent ließt, dann kann man nicht gleichzeitig mit einer anderen Konsole was senden, oder?

              Danke schon mal im Voraus.

              Gruß
              Micha.


              Nachtrag: vbusmonitor funktioniert bei mir nur, wenn ich busmonitor gestartet habe. Das hat schon mal jemand im Forum geschrieben, ich habe aber keine Lösung für das Problem gefunden. Den EIBD habe ich mit "eibd -i usb: -S -D" gestartet.

              Kommentar


                #22
                Hi,

                ich verstehe das ganze noch nicht ganz!
                Ist es so, das ich brauche:

                - BCUSDK
                - EIBD
                - MYSQL
                - PHP

                für die ganze Lösung?

                Und wie genau muß ich das ganze unter Linux installieren / configurieren wenn der Bus-Zugriff über die N148/21 erfolgt?
                Danke

                Gruß
                Christian

                Mein EIB-Projekte:
                EIB-Interface -> Siemens N148/21 IP-Schnittstelle
                EIBD -> FritzBox 7170 WLAN Router
                linKNX -> Synology DS101j NAS
                Visu -> eigene PHP-Seiten

                Kommentar


                  #23
                  Hallo Micha
                  Schau hier mal wie eibd aufgerufen wird mit USB-Schnittstelle.
                  http://www.vdr-portal.de/board/searc...06bca53d70f2cf
                  Dort wird erst mit findknxusb der USB-Port gesucht, der dann beim Aufruf mit angegeben wird.
                  Ich gehe mit einem USBtoRS23-Adapter auf die serielle EIB-Schnittstelle (Ft1.2).
                  Ich rufe eibd so auf.
                  /usr/bin/eibd -D -T -S -d -i --pid-file=/var/run/eibd.pid ft12:/dev/ttyUSB0
                  Bevor vbusmonitor1 in der Konsole nicht läuft geht es auch nicht mit PHP(CLI).
                  Gruß Netfritz
                  KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                  WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                  PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                  Kommentar


                    #24
                    Zitat von mymicha Beitrag anzeigen

                    - Wenn ich "busmonitor1" ausführe, bekomme ich den ganzen Busverkehr mit. Wenn ich aus der Kommandozeile "vbusmonitor1" ausführe kommt nix. Wodurch unterscheiden sich eigentlich diese beiden Befehle?
                    - Ach ja, und einen habe ich noch Wenn man auf der Konsole mit "busmonitor1" permanent ließt, dann kann man nicht gleichzeitig mit einer anderen Konsole was senden, oder?

                    Nachtrag: vbusmonitor funktioniert bei mir nur, wenn ich busmonitor gestartet habe. Das hat schon mal jemand im Forum geschrieben, ich habe aber keine Lösung für das Problem gefunden. Den EIBD habe ich mit "eibd -i usb: -S -D" gestartet.
                    Konstellation: eibd mit FT1.2 (serielle Schnittstelle) und Debian etch.
                    Aufruf: eibd -D -i ft12:/dev/ttyS0

                    Das Absetzen von Kommandos auf den Bus funktioniert ohne Probleme!
                    Nur mit dem Verhalten beim Lesen vom Bus komme ich wie mymicha nicht klar.

                    Ich wäre euch sehr dankbar, wenn jemand diese grundsätzlichen Fragen, die auch mymicha schon gestellt hat, beantworten könnte (sollte ja für die eibd-Gurus kein Problem sein ):

                    1. Ich habe das gleiche Problem, dass der vbusmonitor1 nur Werte auf stdout ausgibt, wenn ich zuvor den busmonitor1 gestartet habe. Ist das bei allen so oder machen wir was falsch??

                    2. Wozu brauche ich den vbusmonitor1? Ich kann auch Befehle auf den Bus schicken, wenn nur der busmonitor1 läuft.

                    Danke schon mal an alle, die uns Anfängern mit eibd helfen!

                    Gruß
                    Tux

                    Kommentar


                      #25
                      Aus sdkdoc-0.0.2-1.pdf, Seite 95: "Because using the bus monitor mode prevents the sending of frames, a best effort bus
                      monitor, called vBusmonitor, was introduced."

                      Dieses "sending of frames" bedeutet ja nicht nur Gruppenkommunikation sondern auch point-to-point-Kommunikation. Wahrscheinlich ist das damit gemeint. Im Bus-Monitor-Modus ist zwar noch Gruppenkommunikation möglich aber keine direkte Kommunikation. Das ist bei euch vielleicht nicht störend, wenn ihr aber gleichzeitig mit der ETS über den eibd ein Gerät programmieren wollt, dann wird das wahrscheinlich nicht funktionieren. So genau weiß ich das allerdings auch nicht.

                      Und auf der nächsten Seite: "If eibd runs in bus monitor mode, a vBusmonitor client will get the normal bus monitor
                      services. Otherwise all telegrams which eibd receives will be delivered."

                      D.h. wenn ihr den Bus-Monitor-Modus startet, dann empfängt das Backend allen Traffic. Wenn ihr den Bus-Monitor deaktiviert, dann könnt ihr mit vbusmonitor nur noch das empfangen, was das backend empfängt.

                      Lösung wäre demzufolge: sdkdoc-0.0.2-1.pdf Seite 98: "To actually receive telegrams on a group address, it must be in the BCU address table, or the address table length needs to be set to 0 before eibd is started (using the bcuaddrtab command)."

                      Mike

                      Kommentar


                        #26
                        Danke Mike, für die spontane Antwort.
                        Mit den Erläuterungen zu der Doku verstehe ich das jetzt schon viel mehr.

                        Zitat von mike Beitrag anzeigen
                        Und auf der nächsten Seite: "If eibd runs in bus monitor mode, a vBusmonitor client will get the normal bus monitor
                        services. Otherwise all telegrams which eibd receives will be delivered."

                        D.h. wenn ihr den Bus-Monitor-Modus startet, dann empfängt das Backend allen Traffic. Wenn ihr den Bus-Monitor deaktiviert, dann könnt ihr mit vbusmonitor nur noch das empfangen, was das backend empfängt.

                        Lösung wäre demzufolge: sdkdoc-0.0.2-1.pdf Seite 98: "To actually receive telegrams on a group address, it must be in the BCU address table, or the address table length needs to be set to 0 before eibd is started (using the bcuaddrtab command)."
                        Dazu stellt sich mir noch die Frage, welche der beiden Möglichkeiten bei dir zum Einsatz kommt.
                        Hast du den busmonitor1 laufen, während du den vbusmonitor1 nutzt oder hast du die BCU adress table entsprechend angepasst, bzw. deren Länge auf 0 gesetzt?

                        Gruß
                        Tux

                        Kommentar


                          #27
                          Ich habe die Adress-Tabelle auf 0 gesetzt. Das ist auf jeden Fall die beste Variante. Der Busankoppler wird ja sowieso nur für die Kommunikation benutzt.

                          Mike

                          Kommentar


                            #28
                            Zitat von cni Beitrag anzeigen
                            Hi,

                            ich verstehe das ganze noch nicht ganz!
                            Ist es so, das ich brauche:

                            - BCUSDK
                            - EIBD
                            - MYSQL
                            - PHP

                            für die ganze Lösung?

                            Und wie genau muß ich das ganze unter Linux installieren / configurieren wenn der Bus-Zugriff über die N148/21 erfolgt?
                            Kann mir da keiner was zu sagen?
                            Danke

                            Gruß
                            Christian

                            Mein EIB-Projekte:
                            EIB-Interface -> Siemens N148/21 IP-Schnittstelle
                            EIBD -> FritzBox 7170 WLAN Router
                            linKNX -> Synology DS101j NAS
                            Visu -> eigene PHP-Seiten

                            Kommentar


                              #29
                              Hallo
                              Um mit eibd auf den EIB-Bus zuzugreifen können mußt Du die
                              BCUSDK am besten auf einen Linux-Ubuntu Rechner installieren.
                              In der BCUSDK ist die EIBD enthalten.
                              Eine Anleitung zu Installation findest Du hier.
                              http://eibwiki.agrodur.com/index.php?title=Eibd
                              PHP braust Du wenn Du das wie hier programmieren willst.
                              mySQL brauchst Du um Deine Daten abzulegen.
                              Wie die eibd mit der N148/21 aufgerufen wird kann ich Dir auch
                              noch nicht sagen,habe mein N148/21 erst gestern bekommen.
                              Gruß NetFritz
                              KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                              WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                              PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                              Kommentar


                                #30
                                Gibt es die BCUSDK auch für einen ARM Prozessor?
                                Würde den EIBD gerne auf meinem NAS oder der Fritz!Box laufen lassen!
                                Danke

                                Gruß
                                Christian

                                Mein EIB-Projekte:
                                EIB-Interface -> Siemens N148/21 IP-Schnittstelle
                                EIBD -> FritzBox 7170 WLAN Router
                                linKNX -> Synology DS101j NAS
                                Visu -> eigene PHP-Seiten

                                Kommentar

                                Lädt...
                                X