Ankündigung

Einklappen
Keine Ankündigung bisher.

Werte von EIB lesen mit eibd

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

    Werte von EIB lesen mit eibd

    Hallo,

    Habe auch dank des hervorragenden Tutorials eibd am Laufen. Ich komme von eibcontrol, was ja nich so stabil lief - was ich aber im Griff hatte.

    Ich kann fast alles auf den Bus senden (Temperaturen, Prozentwerte, Zeitsignale) und verwende dafür hauptsächlich PHP - das soll mal später eine Funktions-Klasse werden. Damit lassen sind die Werte/Pakete recht schön anhand der EIB-Referenz basteln.

    Ein Wehmutstropfen bleibt:
    Das Lesen vom EIB gestaltet sich als etwas knifflig. Ein hübsche Lösung wäre es, die Ausgaben von vbusmonitor1 durch ein Script zu pipen, welche die Eingaben an z.B. eine MySQL-DB weiterleitet und bei Auftreten einer neue Adresse einen neuen Datenbankeintrag schreibt bzw. bei bereits bekannten Adressen Einträge aktualisiert. So käme man z.B. auch mit den mitgelieferten Clientprogrammen zu eibd - etwa groupsread - schnell zum benötigten Wert. Da sich MySQL selbst um die Regelung der Zugriffe kümmert, wird vieles einfacher.

    Leider schreibt vbusmonitor1 nicht nach stdout (was eigentlich dämlich ist - leider kann ich kein C, um das zu ändern...), sodass Verrenkungen mit "script" und fiesen Ausgabeumleitungen notwendig werden. Das geht - ist aber nicht hübsch.

    Wie *lest* ihr Werte vom EIB mit eibd? Gerne auf mit perl. Nicht so gerne mit Java - meine Gurke macht nebenbei auch noch andere Dinge. Java ist dann zu lahm.

    Gruß,

    Maik

    #2
    Ich nutze über eibd Misterhouse. Der hat eine EIB Klasse EIB_Device.pm in Perl da muesstest du alle Infos finden.

    http://misterhouse.svn.sourceforge.n...pm?view=markup

    LG

    Kommentar


      #3
      Die Lösung:
      Die Ausgabe sämtlicher Clientprgramme von eibd erfolgt buffered. Das habe ich - mit Hilfe von Herr Koegler - jetzt dem vbusmonitor1 abgewöhnt.

      vbusmonitor1.c:
      | while (1)
      | {
      | len = EIBGetBusmonitorPacket (con, sizeof (buf), buf);
      | if (len == -1)
      | die ("Read failed");
      | printf ("%s\n", buf);
      | }

      Wird zu;

      vbusmonitor1.c:
      | while (1)
      | {
      | len = EIBGetBusmonitorPacket (con, sizeof (buf), buf);
      | if (len == -1)
      | die ("Read failed");
      | printf ("%s\n", buf);
      | fflush(stdout);
      | }


      Dann neu kompilieren und schon schreibt er hübsch in irgendwelche Pipes.

      Gruß,

      Maik

      Kommentar


        #4
        Hallo mccab99

        Die Idee, die Ausgaben von vBusmonitor1 in eine mySQL-DB zu schreiben hatte ich auch.
        Wegen der gleichen Probleme habe ich dann das nicht mehr verfolgt.

        Hallo RaK

        Die Datei EIB_Items.pm wurde erweitert das jetzt von mh folgende EIS bearbeitet werden.
        EIS 1: Switches
        EIS 2: Dimmers
        EIS 3: Time
        EIS 4: Date
        EIS 5: Values (weather stations etc)
        EIS 6: Scaling (0 - 100%)
        EIS 7: Motor drives
        EIS 15: 14 byte text messages

        http://misterhouse.svn.sourceforge.n...pm?view=markup

        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


          #5
          Hallo,

          Du kannst das neue Binary gerne von mir bekommen - allerdings ist es gegen die glibc von Etch gelinkt und läuft daher z.B. unter Ubuntu nicht.

          Ansonsten ist die Änderung nicht weiter schwierig: Source herunterladen, sicherstellen, dass pthsem bereits auf dem System vorhanden ist, Änderung am Code vornehmen, neu compilieren.

          Misterhouse macht vom Ansatz her das Gleiche, was ich vorhabe. In der Zeit, die ich brauche, um in Misterhouse einzugraben, habe ich schon längst eigene Logiken in PHP realisiert. PHP bietet den Vorteil, dass es im Gegensatz zu Perl viele können. Mit der Doku zum EIB bekommt man eigentlich auch sehr flott alle Telegramme gebaut/decodiert. In der Regel braucht man ja nur Prozentwerrte, Boolsche Werte und Temperaturen.

          Ich pipe die Ausgaben vom modifizierten vbusmonitor1 durch ein PHP-Script, welches einerseits prüft, ob eine Aktion ansteht und andererseits den MySQL-DB-Eintrag vornimmt.

          Die Pipe lasse ich im Hintergrund als Dienst laufen und gut ist. Allerdings kollidiert der vbusmonitor1 mit simultanen Programmierversuchen über EIBnet/IP - muss also vorher heruntergefahren werden.

          Das Schöne: Ich kann die MySQL-Tabelle nachträglich kommentieren, muss aber vorher nicht alle Adressen darin konfigurieren, da sie sich quasi von selbst befüllt: Kommt eine Zieladresse halt nicht vor, so wird halt ein neuer Eintrag angelegt. Theoretisch müsste sich zusätzlich der Telegrammtyp aus dem Originaltelegramm dekodieren lassen.

          Ich überlege sogar, ob ich die Pipe nicht mit tee aufspalte und die Logiken separat abarbeite. Ich habe ein wenig Schiss, was das Timinig angeht. Aber wenn das im Prinzip mit Perl geht...

          Aber genug der großen Worte: Jetzt sind erstmal Taten angesagt...

          Maik

          Kommentar


            #6
            Nach langem Suchen und Probieren hatte ich das mit flush auch rausgefunden.

            Ich nutzt jetzt ein PHP Skript, welches das modifizierte vbusmonitor2 nutzt und dann die Telegramm über eine PHP Class interpretiert und dann ja in eine MYSQL DB schreibt.

            Wobei ich da unterscheide. Ich hab eine Tabelle mit Eib Objekten und wenn das php skript eine passende Meldung bekommt wird der Status des Objektes in der DB aktualisiert und sonst das Telegramm in eine Log Tabelle geschrieben. Gewisse Meldungen (Zeit / Datum) auf dem Bus werde dort direkt ignoiert.

            So hab ich dann auch nen kleines Skript was aus der DB die Temperatur der Räume ausliest und in einem Cacti verträglichen Format ausgibt. Zu malt Cacti mir schöne Temperatur Grafiken.

            ciao
            Travis


            Code:
            #!/usr/bin/php
            <?php
            error_reporting(E_ALL);
            
            $BIN_DIR="/opt/eib/bin/";
            $INCLUDE_DIR="/opt/eib/php/inc/";
            
            require_once ($INCLUDE_DIR."eib_telegramm.php");
            
            
            $link = mysql_connect('localhost','eib','xxxx')
                or die('konnte nicht zur db verbinden: '. mysql_error());
            echo 'db connect ok'."\n";
            mysql_select_db('eib',$link) or die('could not select db');
            
            ########################
            
            $handle = popen ($BIN_DIR.'vbusmonitor2 ip:localhost','r');
            if ($handle) {
                $eib = new EIB_Telegramm();
                while (!feof($handle)) {
                    if ($eib->set_Telegramm(fread($handle,2096)) )
                    {
                        /* Mache was mit den Infos
                                    $eib->get_source()
                                    $eib->get_target()
                                    $eib->get_prio()
                                    $eib->get_type()
                                    $eib->get_data($eis)
                                    $eib->get_telegramm()
            
            */
                    }
                }
            }

            Kommentar


              #7
              Hallo
              Habe die Änderungen an vbusmonitor1 durchgeführt.
              Das compilieren geht bei mir nicht (Linux Anfänger).
              Mit welchen Befehl habt ihr den vbusmonitor compiliert.
              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


                #8
                Mit "make" im Sourceverzeichnis von bcusdk... Dann compiliert er zwar alles neu durch, aber so geht es ohne das Eingraben in irgendwelche Abhängigkeiten. Rechenzeit kost' ja nix.

                Maik

                Kommentar


                  #9
                  Zitat von NetFritz Beitrag anzeigen
                  Hallo mccab99
                  EIS 3: Time
                  EIS 4: Date
                  EIS 5: Values (weather stations etc)


                  Ja, EIS3/4 kommen aus meiner Feder und bei EIS5 habe ich mh so erweitert, dass man auch Werte auf den Bus senden kann. Bisher ging EIS5 nur lesend.

                  Die 14Byte Texte kommen von jemanden anderen hier aus dem Forum (ich habs nicht so mit Namen, sorry!).

                  LG

                  Kommentar


                    #10
                    Hallo

                    Mit make habe ich auch kein erfolg,bekomme folgende Fehlermeldung.

                    root@fritz-desktop:/usr/share/bcusdk/examples# make
                    make: *** Keine Targets angegeben und keine »make«-Steuerdatei gefunden. Schluss.

                    "/usr/share/bcusdk/examples" müsste doch das richtige Sourceverzeichnis von bcusdk sein, dort sind die die Dateien wie vbusmonitor.c und groupswrite.c.

                    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


                      #11
                      Nein. Du musst die kompletten Sourcen herunterladen, dann die Anpassungen vornehmen und danach im Verzeichnis

                      /pfad/zu/bcusdk-0.x.x/

                      Ein "./configure" und ein "make" ausführen. Ohne ein "make install" bleibt dein jetziges System unangetastet. Vorher musst du allerdings noch pthsem-dev installieren, falls du ein Debianderivat nutzt, bzw. ansonsten pthsem noch herunterladen und mit ./configure & make durchkompilieren.

                      Gruß,

                      Maik

                      Kommentar


                        #12
                        Hallo
                        Nach mehren Anläufen habe ich endlich die BCUSDK compiliert,
                        allerdings nicht ohne Fehlermeldung.
                        vbusmonitor1 läuft jetzt.
                        Vielen Dank.
                        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


                          #13
                          Ich bin jetzt soweit, dass er mir boolsche Werte (EIS1), Prozentwerte (Ventilstellung, Dimmwert) und Gleitkommawerte (Temperaturen) in eine MySQL-DB schreibt. Auch einfache Logiken lassen sich in das Script einklinken.

                          Ich kann EIS1-Werte schreiben. Temperaturen und Dimmwerte bekomme ich auch noch hin.

                          Die Gruppenadressen holt er sich direkt vom Bus, d.h. eine neue Gruppenadresse muss nur einmal einen WRITE oder einen RESPONSE senden und wird dann automatisch in die DB aufgenommen.

                          Alles reines PHP.

                          Fazit:
                          Reicht völlig für mein Häuschen.

                          Bei Interesse einfach nochmal melden!

                          Maik

                          Kommentar


                            #14
                            So...

                            Aufgrund zahlreicher Anfragen ein Beispielscript - nicht schön (vgl. Scriptkommentare), aber läuft. Hier ist auch schon eine Lösung auf Basis von vbusmonitor2 mit dazugehöriger PHP-Klasse zur direkten Telegrammdecodierung gepostet worden - das ist viel schicker.
                            Ich bin vom MySQL-Ansatz fast völlig weg, da ich auf sqlite gehe. Dann muss auf meinem OpenBrick (Geode GX 1-Plattform, 15W Leistungsaufnahme mit 2,5 Zoll 40GB Platte) kein fetter MySQL-Server laufen. Die entstehende Datenbank lässt sich dennoch remote recht häufig abfragen und somit die Visu aktualisieren - den der Client decodiert dann...

                            PHP-Code:
                            #!/pfad/zum/php-cli_interpreter -q

                            <?php

                            # Kommando. von dem gelesen werden soll
                            $command="/pfad/zum/modifizierten/vbusmonitor1 ip:127.0.0.1";

                            # MySQL-Daten
                            # Bitte vorher eine Datenbank und eine Tabelle anlegen,
                            # die mindestens ein Feld für die Gruppenadresse (VARCHAR)
                            # und für den Wert (z.B. DOUBLE) der Gruppenadresse enthält 
                            # Ein Index auf die Gruppenadresse wird wohl nicht schaden.

                            $MYSQL_DB="";         # Name der Datenbank
                            $MYSQL_HOST="";     # DNS-Name oder IP des Datenbankhosts
                            $MYSQL_USER="";        # MySQL-Benutzer
                            $MYSQL_PWD="";        # Passwort des MySQL-Nutzers
                            $MYSQL_STAT_TABLE="";    # Name der Tabelle, die die Daten aufnimmt
                            $FIELD_EIB_ADDRESS="";    # Name des Feldes, dass die Gruppenadfresse aufnimmt
                            $FIELD_EIB_VALUE="";    # Name des Feldes, dass den Wert der Gruppenadresse aufnimmt

                            $handle popen($command'r');

                            if (!
                            $handle) {
                                die(
                            "Konnte Busmonitor nicht initialisieren!");
                            }

                            while (!
                            feof($handle)) {

                                
                            # von der Pipe lesen, bis nix mehr kommt
                                # mindestens 2096 Byte oder bis zum Schluss
                                # Was halt eher eintritt...

                                    
                            $read fread($handle2096);

                                
                            # alle Elemente der Eingabe aus der Pipe in ein Array legen
                                # das würde wesentlich fluffiger mit groupsocketread gehen,
                                # da da die Telegramm schon vorgefiltert sind

                                
                            $eib_data=explode(" "$read);

                                
                            # zwischen einzelnen Datentypen unterscheiden und ggf. decodieren
                                # gelesen werden nur Response- und Write-Telegramme

                                
                            switch($eib_data[6]){
                                    
                            # boolscher Wert
                                    
                            case "E1":
                                        
                            $write_db=true;
                                        
                            $address=$eib_data[15];
                                        
                            $value=$eib_data[21];
                                        break;
                                    
                            # Prozentwert
                                    
                            case "E2":
                                        
                            $write_db=true;
                                        
                            $address=$eib_data[16];
                                        
                            $value=intval((hexdec($eib_data[21])/255)*100);            
                                        break;
                                    
                            # Gleitkommawert
                                    
                            case "E3":
                                        
                            $write_db=true;
                                        
                            $address=$eib_data[17];

                                        
                            # Binär lassen sich die Werte direkt aus der EIB-Doku dekodieren
                                        # Das geht hübscher, ich verstehe es nach zwei Jahren bloß dann nicht mehr

                                        
                            $first_byte decbin(hexdec($eib_data[22]));
                                        
                            $second_byte decbin(hexdec($eib_data[23]));                

                                        
                            # dann füllen wir die Bytes mit Nullen auf
                                
                                        
                            while (strlen($first_byte) != 8) {
                                            
                            $first_byte"0".$first_byte;
                                        }

                                        while (
                            strlen($second_byte) != 8) {
                                            
                            $second_byte"0".$second_byte;
                                        }

                                        
                            # Das mit der Byteordner begreife ich nie...

                                        
                            $eib_data $first_byte.$second_byte;
                                        
                            $eib_base_value=bindec(substr($eib_data,5,15));
                                        
                            $eib_exponent=bindec(substr($eib_data,1,4));
                                        
                            $value = (0.01*$eib_base_value)*pow(2,$eib_exponent);
                                        break;
                                    
                            # alles andere schreiben wir (bisher) nicht... "E4" ist z.B. ein Zeittelegramm
                                    
                            default:
                                        
                            $write_db=false;
                                }

                                
                            # Gut, dann schreiben wir jetzt fuer uns relevante Daten in die Datenbank
                                # ein pconnect könnte mehr Speed bringen...

                                
                            if ($write_db) {

                                    
                            $link mysql_connect($MYSQL_HOST$MYSQL_USER$MYSQL_PWD);

                                    if (!
                            $link) {
                                            die(
                            'keine Verbindung zu MySQL möglich: ' mysql_error());
                                    }

                                    
                            mysql_select_db($MYSQL_DB,$link);

                                    
                            # Pruefen, ob bereits ein Gruppeneintrag vorhanden ist
                                    # Wenn nicht, einen neuen Eintrag anlegen
                                    
                                    
                            $sql="SELECT * FROM $MYSQL_STAT_TABLE WHERE $FIELD_EIB_ADDRESS='$address'";

                                    
                            $result=mysql_query($sql);
                                    
                            $rows=mysql_num_rows($result);

                                    if (
                            $rows=="0") {

                                        
                            $sql="INSERT INTO $MYSQL_STAT_TABLE ($FIELD_EIB_ADDRESS$FIELD_EIB_VALUE) VALUES ('$address', '$value')";

                                        
                            $result_insert=mysql_query($sql);
                                        
                                        if (!
                            $result_insert) {
                                            
                                            die(
                            "Konnte Datenbankeintrag nicht schreiben!");

                                        }

                                    
                            # Wenn doch, bestehenden Eintrag updaten

                                    
                            } else {

                                        
                            $sql="UPDATE $MYSQL_STAT_TABLE SET $FIELD_EIB_VALUE='$value' WHERE $FIELD_EIB_ADDRESS='$address'";

                                        
                            $result_update=mysql_query($sql);

                                        if (!
                            $result_update) {
                                            
                                            die(
                            "Konnte Datenbankeintrag nicht updaten!");

                                        }

                                    }

                                    
                            # Wir sind brav und auf dem Bus ist nicht viel los
                                    # Daher nehmen wir keine pconnect und schließen
                                    # immer brav

                                    
                            mysql_close($link);

                                }

                                
                            # ab hier eigene Logiken z.B. mit include integrieren
                                
                            }

                            ?>
                            Gruß,

                            Maik

                            Kommentar


                              #15
                              @mccab99

                              wie schließt Du vom 6. Byte auf den EIS typen?
                              Ich dachte im 6. Byte steht (u.a.) nur die Länge.
                              Nach meinen Infos

                              E1 = Gruppenadresse, Normales Routing(6), Länge = 1 Byte
                              E2 = Gruppenadresse, Normales Routing(6), Länge = 2 Bytes

                              Da manche EIS Typen die gleiche Länge haben, bin ich da vorsichtig.

                              Ich habe im der DB in der der Status für ein Objekt hinterlegt wird auch den EIS Typ hinterlegt, damit das Skript weis wie es die Daten zu dem Objekt konvertieren soll.



                              ciao
                              Travis

                              Kommentar

                              Lädt...
                              X