Ankündigung

Einklappen
Keine Ankündigung bisher.

Auslesen eines EHZ-Zählers

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

    Den Code wollte ich dir schon per PM schicken. Aber ich glaube die hast du geblockt.

    Der Zähler ist genau der gleiche. Aber mit dem aktuellen Baustein wertest du diesen ja aus wenn er direkt an dem Edomi Server angeschlossen ist.
    Bei mir wird (im Moment bis ich den Lesekopf am Nuc ans laufen bekomme) der Lesekopf von einem Pi ausgelesen und per UDP an Edomi geschickt.

    So übergebe ich jetzt nur noch den String an den Baustein und benutze deine Filter funktion um den String auszuwerten.
    Ich setze den Code heute Mittag dann einfach hier rein. Vielleicht kann man den Baustein dann ja anpassen.

    Wird dann wahrscheinlicher geschmeidiger aussehen als mein Copy and Paste und hoffen das es läuft

    Kommentar


      Zitat von Michael85 Beitrag anzeigen
      Ich setze den Code heute Mittag dann einfach hier rein.
      Habe dir meine E-Mail per PN geschickt.

      Kommentar


        Zitat von Michael85 Beitrag anzeigen
        Hallo,

        vielen Dank für den Tipp mit dem Treiber.

        Bei mir kommt folgendes Ergebnis bei den Eingaben: Code:

        [root@edomi ~]# lsmod | grep cp210x [root@edomi ~]# sudo rmmod cp210x ERROR: Module cp210x does not exist in /proc/modules [root@edomi ~]# sudo modprobe cp210x [root@edomi ~]# lsmod | grep cp210x cp210x 14525 0 usbserial 38445 1 cp210x [root@edomi ~]# insmod /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/usb/serial/cp210x.ko insmod: error inserting '/lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/usb/serial/cp210x.ko': -1 File exists
        So läuft es leider noch nicht.
        Robby Hast du noch eine Tipp warum dieses nicht durchläuft?

        Kommentar


          Zitat von Michael85 Beitrag anzeigen
          Könnte jemand von euch mal einen Blick drüber werfen?
          Ich würde es vermutlich ungefähr so machen: (keine UDP Verbindung, sondern EDOMI Remote API)

          PHP-Code:

          <?php

          // Parameter
          $edomi_ip '192.168.1.34';
          $remote_user 'remote';
          $remote_pass 'remote';
          $koid 1234;
          $wait_time 30// 30Sekunden

          // Schnittstelle vorbereiten
          exec('stty -F /dev/ttyUSB0 9600 -parodd cs7 -cstopb parenb -ixoff -crtscts -hupcl -ixon -opost -onlcr -isig -icanon -iexten -echo -echoe -echoctl -echoke');

          // main loop
          if ($handle = @fopen("/dev/ttyUSB0""r")) {
             while (
          true) {
                
          $buffer fgets($handle4096);
                if (
          $buffer !== false) {
                   echo 
          $buffer."\n";
                   
          $len strlen($buffer);
                   
          file_get_contents('http://'.$edomi_ip.'/remote?login='.$remote_user.'&pass='.$remote_pass'&koid='.$koid.'&kovalue='.$buffer);
                }
                echo 
          "Sleeping for 30 seconds...\n";
                
          sleep($wait_time);
             }
          }

          ?>

          Kommentar


            Moin, danke dir. Ich werde heute Mittag mal testen.

            Ist dieses Leistungschonender fürs System? Oder warum kein UDP?
            Nur so interessen halber...

            Kommentar


              Zitat von Michael85 Beitrag anzeigen
              Ist dieses Leistungschonender fürs System? Oder warum kein UDP?
              Ja und vor allem ist es zuverlässiger, da es verbindungslos ist, d.h. es muss nicht dauerhaft ein UDP Listener auf EDOMI laufen und auch bei Netzwerkproblemen muss man sich nicht um den Wiederaufbau der UDP Verbindung kümmern. Auf EDOMI Seite musst du also gar nichts machen, sondern verwendest die Remote API, welche von Haus aus mit dabei ist. Mit dieser Lösung könntest du auch die preg_match() Auswertungen aus dem Original LBS in das PHP Skript integrieren und die Einzelwerte direkt per Remote API in iKOs schreiben. Dazu müssen nur die logic_setOutput() Anweisungen durch Remote-API Calls ersetzt werden.

              Kommentar


                Wenn alles im Skript auf dem RPI ablaufen soll, sollte es ungefähr so aussehen.
                Ich kann das leider nicht testen, daher ohne Gewähr.
                Wichtig ist die KO-IDs anzupassen und diese für die Remote API in EDOMI freizugeben.
                Die Reihenfolge der KO-IDs entspricht den Ausgängen des ursprünglichen LBS.

                PHP-Code:

                <?php

                // ################################################## ####

                // Parameter (anpassen auf lokale Gegebenheiten)
                $edomi_ip '192.168.1.34';
                $remote_user 'remote';
                $remote_pass 'remote';
                $koids = array(
                   
                1000// koId Zählerstand kwh
                   
                1001// koId Zählerstand kwh genau
                   
                1002// ...
                   
                1003,
                   
                1004,
                   
                1005,
                   
                1006,
                   
                1007,
                   
                1008,
                   
                1009// ...
                  
                1010 // Status
                );
                $wait_time 30// 30Sekunden

                // ################################################## ####


                // Schnittstelle vorbereiten
                exec('stty -F /dev/ttyUSB0 9600 -parodd cs7 -cstopb parenb -ixoff -crtscts -hupcl -ixon -opost -onlcr -isig -icanon -iexten -echo -echoe -echoctl -echoke');

                // main loop
                if ($handle = @fopen("/dev/ttyUSB0""r")) {
                   while (
                true) {
                      
                $buffer fgets($handle4096);
                      if (
                $buffer !== false) {
                         echo 
                $buffer."\n";
                         
                $len strlen($buffer);
                         
                evaluate($edomi_ip$remote_user$remote_pass$koids$buffer);
                      }
                      echo 
                "Sleeping for 30 seconds...\n";
                      
                sleep($wait_time);
                   }
                }

                function 
                evaluate($ip$user$password$koids$buffer)
                {
                   if (
                preg_match('/1\-0\:1\.8\.0\*255/'$buffer))
                   {
                      
                // Wenn Zeile mit Zählerstand
                      
                if (preg_match('/([0-9]*\.[0-9]*)\*kWh/'$buffer$matches)) {
                         
                $zaehlerstand doubleval($matches[1]);
                         
                edomi_remote$ip$user$password$koids[0], intval($zaehlerstand));
                         
                edomi_remote$ip$user$password$koids[1], $zaehlerstand);        }
                   } elseif (
                preg_match('/1\-0\:21\.7\.0\*255/'$buffer))    {
                      
                // Wenn Zeile mit L1
                      
                if (preg_match('/([0-9]*\.[0-9]*)\*W/'$buffer$matches)) {
                         
                $zaehlerstand doubleval($matches[1]);
                         
                edomi_remote$ip$user$password$koids[2], intval($zaehlerstand));
                         
                edomi_remote$ip$user$password$koids[3], $zaehlerstand);
                      }
                   } elseif (
                preg_match('/1\-0\:41\.7\.0\*255/'$buffer))
                   {
                      
                // Wenn Zeile mit L2
                      
                if (preg_match('/([0-9]*\.[0-9]*)\*W/'$buffer$matches)) {
                         
                $zaehlerstand doubleval($matches[1]);
                         
                edomi_remote$ip$user$password$koids[4], intval($zaehlerstand));
                         
                edomi_remote$ip$user$password$koids[5], $zaehlerstand);
                      }
                   } elseif (
                preg_match('/1\-0\:61\.7\.0\*255/'$buffer))
                   {
                      
                // Wenn Zeile mit L3
                      
                if (preg_match('/([0-9]*\.[0-9]*)\*W/'$buffer$matches)) {
                         
                $zaehlerstand doubleval($matches[1]);
                         
                edomi_remote$ip$user$password$koids[6], intval($zaehlerstand));
                         
                edomi_remote$ip$user$password$koids[7], $zaehlerstand);
                      }
                   } elseif (
                preg_match('/1\-0\:1\.7\.0\*255/'$buffer))
                   {
                      
                // Wenn Zeile mit L1+L2+L3
                      
                if (preg_match('/([0-9]*\.[0-9]*)\*W/'$buffer$matches)) {
                          
                $zaehlerstand doubleval($matches[1]);
                          
                edomi_remote$ip$user$password$koids[8], intval($zaehlerstand));
                          
                edomi_remote$ip$user$password$koids[9], $zaehlerstand);
                      }
                   } elseif (
                preg_match('/1\-0\:96\.5\.5\*255/'$buffer))
                   {
                       
                // Wenn Zeile mit Status
                       
                if (preg_match('/\(([0-9]*)\)/'$buffer$matches)) {
                          
                $zaehlerstand doubleval($matches[1]);
                          
                edomi_remote$ip$user$password$koids[10], intval($zaehlerstand));
                       }
                   }
                }

                function 
                edomi_remote($ip$user$password$koid$kovalue)
                {
                   
                file_get_contents('http://'.$ip.'/remote?login='.$user.'&pass='.$password.'&koid='.$koid.'&kovalue='.$kovalue);
                }

                ?>
                Zuletzt geändert von jonofe; 15.04.2020, 17:11.

                Kommentar


                  Hallo Andre,

                  ich habe das jetzt eingespielt. Im Code sind 2 kleine Fehler und der Ausgabe drin.

                  Code:
                  file_get_contents('http://'.$ip.'/remote/?login='.$user.'&pass='.$password.'&koid='.$koids.'&kovalue='.$kovalue);
                  So müsste es aussehen.

                  Ich wusste bis jetzt auch noch nicht das man iKo von Außen setzen kann. Aber man lernt ja nie aus.

                  Das Problem ist nun aber das vom Zähler der Code wohl nicht an einem Stück ausgegeben wird. So liest er immer eine Zeile und wartet dann die 30sek.

                  Ich habe die Pause jetzt erstmal raus genommen.

                  Bis hierhin aber vielen Dank für den Code.

                  Kommentar


                    Zitat von Michael85 Beitrag anzeigen
                    file_get_contents('http://'.$ip.'/remote/?login='.$user.'&pass='.$password.'&koid='.$koids. '&kovalue='.$kovalue);
                    Das $koids ist falsch. Es muss $koid sein, da dies der Parameter der Funktion ist.
                    Ob der '/' hinter remote wirklich sein muss, kann ich gerade nicht sagen.

                    Zitat von Michael85 Beitrag anzeigen
                    Ich habe die Pause jetzt erstmal raus genommen.
                    Ich würde hier ein usleep(100000); reinmachen, so wie im Original LBS auch. Ansonsten hast du sicherlich ne hohe CPU Last.

                    Kommentar


                      Zitat von jonofe Beitrag anzeigen
                      Das $koids ist falsch. Es muss $koid sein, da dies der Parameter der Funktion ist.
                      Ob der '/' hinter remote wirklich sein muss, kann ich gerade nicht sagen.
                      in deinem Skript stand auch überall $Koids auch unten in der Ausgabe. Da ich erst dachte dieses ist der Fehler hatte ich das schon geändert.
                      Ohne '/' hat er sich nicht in Edomi angemeldet.

                      Das usleep schiebe ich dann noch einmal rein.

                      Aller besten dank für deine Hilfe. Ich bin jedes mal schwer begeistert.

                      Kommentar


                        Das $koids ist ein Array der 11 KO-IDs. Während in der Funktion edomi_remote() ja immer nur eine koid übergeben wird, daher die Einzahl $koid.

                        Zitat von jonofe Beitrag anzeigen
                        $koids= array(
                        1000, // koId Zählerstand kwh
                        1001, // koId Zählerstand kwh genau
                        1002, // ...
                        1003,
                        1004,
                        1005,
                        1006,
                        1007,
                        1008,
                        1009, // ...
                        1010 // Status
                        );
                        Zitat von jonofe Beitrag anzeigen
                        function edomi_remote($ip, $user, $password, $koid, $kovalue)

                        Kommentar


                          Das hatte ich verstanden. Auch mit dem Array. Bei dir war aber in der Ausgabe Zeile Original dieses drin:

                          Code:
                          file_get_contents('http://'.$ip.'/remote?login='.$user.'&pass='.$password.'&koid='.[MARKIEREN][B]$ koid.[/B][/MARKIEREN]'&kovalue='.$kovalue);
                          Es musste aber so aussehen das der '/' rein muss und das Leerzeichen raus und das s rein :

                          Code:
                          file_get_contents('http://'.$ip.'/remote[MARKIEREN][B]/[/B][/MARKIEREN]?login='.$user.'&pass='.$password.'&koid='.[MARKIEREN][B]$koids.'[/B][/MARKIEREN] &kovalue='.$kovalue);
                          Wollte ich noch einmal hervorheben. Ich denke den Code werden jetzt mehrere Leute übernehmen. Und bevor die lange den Fehler suchen..

                          Kommentar


                            Sorry, nein, in edomi_remote() ist kein $koids bekannt. Dort gibt es nur $koid. Und ich habe gerade getestet, der Slash ist auch nicht notwendig. Mache es mit meinem Fingerprint-Sensor genauso ohne Slash nach dem remote.
                            Das Leerzeichen gibt es im Code eigentlich gar nicht, das wird nur teilweise hier durch die Forensoftware generiert.
                            Wir sprechen von dem Code in #112, oder?

                            EDIT: Das Leerzeichen habe ich nochmals explizit entfernt in #112. So sollte es eigentlich nun funktionieren.
                            Wenn nicht, einfach mal Starten und die Fehlerausgabe hier posten.
                            Zuletzt geändert von jonofe; 15.04.2020, 17:12.

                            Kommentar


                              Ich wollte gerade schreiben das ich es getestet habe und du recht hattest

                              Habe noch mal deinen Original Code genommen und es war wirklich nur das Leerzeichen und halt das sleep durch usleep(100000) ersetzt.

                              Kommentar


                                Freut mich, dass es nun funktioniert.

                                Kommentar

                                Lädt...
                                X