Ankündigung

Einklappen
Keine Ankündigung bisher.

Anbindung Smartmeter per Arduino und IR Auge

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

    Anbindung Smartmeter per Arduino und IR Auge

    Hallo zusammen,

    habe meine bisherige Lösung (klick mich) durch die hier (klick mich) angekündigte Lösung ersetzt.

    Mein Zähler Iskra MT671 sendet ca. alle drei Sekunden folgende Daten:

    Code:
    /*
    /ISk5MT671-0001
    
    1-0:0.0.0*255(331300-5019624)
    1-0:1.8.1*255(036349.0433)
    1-0:96.5.5*255(80)
    0-0:96.1.255*255(38475117)
    !
    */
    Dabei ist "1-0:1.8.1*255" der aktuelle Zählerwert.

    Umgesetzt mit einem Arduino Nano, einem IR-Schreib-Lesekopf (TTL-Interface) von Volkszähler.org und einer Siemens BCU.
    Die BCU wird an den Seriellen Port angeschlossen, für den IR-Kopf wird ein Softwareserial eingerichtet.
    Etwas kniffelig war die Anbindung des IR Kopfes, der sendet mit 7 Bit, Parität Even und einem StopBit. Das wiederum läßt die Softwareserial Bibliothek nicht zu. Das Problem hatten schon andere und wurde wie hier (klick mich) beschrieben ziemlich einfach gelöst.
    Die Daten werden vom Zähler eingelesen und dann der Wert aus den Klammern auf den Bus gesendet, wenn der Zählerwert sich geändert hat.

    Scipt im Anhang (umbenennen auf *.ino), kann man bestimmt besser lösen aber damit funktioniert es zuverlässig.

    Hab aktuell noch einen sehr provisorischen Aufbau, werde jetzt noch ein REG dafür nehmen und Arduino und BCU darin einbauen.
    Angehängte Dateien
    Zuletzt geändert von Lapheus; 19.04.2016, 07:03. Grund: Links sichtbarer gemacht, "klick mich"
    Gruß
    Lapheus

    #2
    Hi
    hier mal mein Code für einen Iskra Emeco MT171.
    Dieser Zähler hat den Nachteil das er zum Senden "überreded" werden muss - siehe: wiki.volkszaehler.org/doku.php/hardware/channels/meters/power/edl-ehz/iskraemeco_mt171#software
    Zum einen muss man Initialsieren mit “/?!\r\n” sendet (hex 2F 3F 21 0D 0A) - zum anderen muss man die Ausgabe bestätigen mit <ACK>0ZY<CR><LF> (hex 06 30 zz yy 0D 0A) - wobei ich Z und Y mit 30 ansetze = "weitersenden mit 300 Baud".
    Die beiden Strings müssen durch die 7E1 Thematik noch umgesetzt werden - die korrekten Strings findet ihr im Source Code.

    Der Code läuft derzeit zuverlässig. Durch die parameter im Kopfbereich kann man Watchdog und sendeintervall einstellen.
    Er sendet nur nach Änderung. Bei keiner Änderung wird im definierten Intervall der letzte Wert gesendet.

    Als nächstes werde ich Versuchen 2 IR Augen an einen Arduino anzukoppeln - ich habe 2 MT171 (regular und Wärmepumpe) - und ich will nicht 2 Busteilnehmer bauen.

    Gruß
    Thorsten
    Angehängte Dateien

    Kommentar


      #3
      Nächste Runde - jetzt habe ich den Code so finalisiert das 2 Infrarotaugen (abwechselnd) Ausgelesen werden.
      Ich brauche das da ich einen Zähler für die Wärmepumpe und einen für den Hausstrom habe.
      Der Code enthält noch ein paar Debug-Zeilen - aber wer den Einsetzten will kommt damit sicherlich klar.
      Der Versuchsaufbau (siehe Bild) kommt demnächst noch in ein 3TE Gehäuse mit 2 RJ11-Steckern für die IR-Augen.

      Bilder folgen nach Umsetzung :-)

      Gruß
      Thorsten
      Angehängte Dateien
      You do not have permission to view this gallery.
      This gallery has 1 photos.

      Kommentar


        #4
        Wie immer.....WAAAHNSINNN!
        Viele Grüße,
        Stefan

        DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

        Kommentar


          #5
          Hi Thorsten,

          danke für die Projektveröffentlichung und den Code- hast mal wieder ein Klasse Projekt angeschoben. Hat bei mir nicht ganz die oberste Priorität, weil hier bisher ein Volkszähler problemlos seinen Dienst tut- aber mittelfristig wäre es schon gut, von einigen dezentralen Lösungen wegzukommen.

          Danke und Grüße,

          Gunnar

          Kommentar


            #6
            @Gunnar/Dreamy: das Lob gebührt auf Lapheus... Ohne ihn würden meine IR Augen noch in der Ecke liegen (wo sie schon knapp 2 Jahre lagen)...

            Kommentar


              #7
              Das passt aber nur auf Deinen Zähler.
              Sinniger wäre es eine Regex Auswertung der OBIS-Werte zu machen und automatische Baudratenumstellung zu machen.

              Weil...
              ... jeder Wert konfigurierbar wäre.
              ... jeder Zähler ein unterschiedliches Timing hat (ACK).
              ... es durchaus 2-3 Minuten (!) dauern kann bis der Zähler bei 300 Baud alles ausgespuckt hat.

              Das soll jetzt kein Gemecker sein. Ich habe mich nur schon mehrfach und intensivst mit der Auslesung von Zählern beschäftigt .

              Gruß Mirko
              Umgezogen? Ja! ... Fertig? Nein!
              Baustelle 2.0 !

              Kommentar


                #8
                Hi Mirko,
                ja - du hast recht .. und ich sehe es nicht als Gemecker :-)
                Aber:
                * Scheibar liefern die Iskra Zähler nur sehr wenig (laut Volkszähler) - und da langen 300 Baud vollkommen... warum sollte ich mir also den Streß antuhen die Baudrate umzustellen (was ich durchaus versucht habe... hat aber nicht auf Anhieb geklappt hat)
                * Selbst wenn das auslesen mehrere Minuten dauert: eigentlich egal... man will den Bus ja nicht alle 5 Sekunden mit einer Datenflut beschäftigen...
                * Wenn der jeweilige Zähler mehr Ausspucken kann - muss man den Code eh erweitern (mehr Variablen, ...)
                und Hauptäschlich:
                * ich löse hier meine Probleme - und stelle es anderen zur Verfügung damit Sie was draus machen können... schließlich sind wir hier im DIY Bereich.
                Wenn jeder der es für seinen Zähler anpasst und hier veröffentlicht bilded sich ja eine kleine Library. Das ganze wird sicherlich kein "Volkszähler-auf-Arduino-an-KNX Mega-Projekt...

                Wenn man das Internet durchsucht gibt es schon einige die sich mit der Aufgabenstellung "Arduino and IR-Auge" beschätigt haben - nur fast nirgends finded man code. Das ist ja jetzt schonmal anders für 2 Iskra Zählertypen :-)

                Gruß
                Thorsten

                Kommentar


                  #9
                  Hallo Leute, klasse Projekt! Kurze Frage, gibt es fertige Optoköpfe (kein Bausatz) welche ihr für den Arduino empfehlen würdet? Preisklasse bis 100€

                  https://www.amazon.de/Stromz%C3%A4hl.../dp/B01B8N0ASY (Leider mit USB. Lann ich A und B vom USB-Kabel auch über SoftwareSerial auslesen? Der Pegel sollte sich ja über die Versorgungsspannung einstellen)

                  LG Martin

                  Kommentar


                    #10
                    Hallo marfis,

                    schreibe Udo von Volkszähler.org mal an ob er nicht auch einen fertigen Optokopf liefert.
                    Gruß
                    Lapheus

                    Kommentar


                      #11
                      Ca. 30€ inkl. Versand bei Udo mit USB Anschluss!

                      Kommentar


                        #12
                        Zitat von marfis Beitrag anzeigen
                        Lann ich A und B vom USB-Kabel auch über SoftwareSerial auslesen? Der Pegel sollte sich ja über die Versorgungsspannung einstellen)
                        USB ist nicht Serial, also nein

                        Kommentar


                          #13
                          Hallo.
                          Ich versuche gerade Edomi den Zählerstand übers Netzwerk zu übermitteln.
                          Das Auslesen funktioniert auch soweit. Aber ich bekomme es nicht hin das der Arduino die Daten sendet.
                          Hier mal mein Sketch:
                          Code:
                          #include <SPI.h>
                          #include <Ethernet.h>
                          #include <SoftwareSerial.h>
                          
                          SoftwareSerial mySerial(4, 5);
                          
                          //Netzwerk Einstellungen
                          byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
                          IPAddress ip(192,168,115,16);
                          IPAddress gateway(192,168,115,2);
                          IPAddress dnServer(192,168,116,2);
                          
                          //IPAddress server(192,168,115,9);
                          EthernetClient client;
                          
                          void setup() {
                            // serial Starten 
                              Serial.begin(19200);
                              mySerial.begin(9600);
                          
                          // Netzwerk Starten
                          Ethernet.begin(mac, ip, dnServer, gateway); 
                            Serial.print("IP address: ");
                            Serial.println(Ethernet.localIP());
                          }
                          /*
                          /ISk5MT671-0001
                          
                          1-0:0.0.0*255(xxxxxxxxxxx)
                          1-0:1.8.1*255(053972.9599)
                          1-0:96.5.5*255(80)
                          0-0:96.1.255*255(39295807)
                          !
                          */
                          
                          char inChar;
                          char myzaehler[75];
                          bool start = false;
                          int stelle = 0;
                          float zaehler = 0;
                          float alterwert = 0;
                          void loop(){
                            if (mySerial.available()){
                              inChar = (char) mySerial.read();
                              inChar &= 0x7F; // oder: inChar = inChar & B01111111;
                              if (inChar == '/') { //Start finden
                                start = true;
                              }
                              else {
                                if (start) {
                                  if ( stelle <= 74){
                                    myzaehler[stelle] = inChar;
                                    stelle++;
                                  }
                                  else {
                                    if ( myzaehler[62] == '(' and myzaehler[74] == ')') { // Prüfen ob Klammern vorhanden -> Datenfehler
                                      stelle = 0;
                                      start = false;
                                      zaehler = (String(myzaehler[63]) + String(myzaehler[64]) + String(myzaehler[65]) + String(myzaehler[66]) + String(myzaehler[67]) + String(myzaehler[68]) + String(myzaehler[69]) + String(myzaehler[70]) + String(myzaehler[71]) + String(myzaehler[72]) + String(myzaehler[73]) ).toFloat();
                                      if ( alterwert != zaehler ) { // Wenn Wert geändert, dann senden
                                        client.print("GET /http://192.168.115.9/remote/?login=remote&pass=xxxxxxxx&koid=687&kovalue=");
                                        Serial.println( zaehler,4 );
                                        client.print ( zaehler,4 );
                                        alterwert = zaehler;
                                      }
                                    }
                                    else {
                                      stelle = 0;
                                      start = 0;            
                                    }
                                  }
                                }
                              }
                            }

                          Kommentar


                            #14
                            Hallo zusammen,

                            mein Energieversorgungsunternehmen hat mir einen neuen Zähler eingebaut der natürlich etwas anders ist als mein alter.
                            Nun bin ich endlich dazu gekommen meine Anbindung zu überarbeiten.

                            Es handelt sich um einen eHZ-IW8E2A5L0EQ2P.

                            Der Zähler spricht SML und ich lese nur an entsprechender Stelle den Wert aus und schicke ihn alle 30 Sekunden auf den KNX-Bus.
                            Leider gibt dieser Zähler auch nur den Zählerstand in Wh aus.

                            Im Anhang der Sketch für einen Arduino Nano.
                            Falls Bedarf für einen Sketch für den Arduino Pro Micro besteht, kann ich den auch liefern.

                            Viel Erfolg.
                            Angehängte Dateien
                            Gruß
                            Lapheus

                            Kommentar


                              #15
                              Hallo Lapheus, ich habe den selben Zähler (zumindest sieht er optisch genau so aus - Nummer hab ich noch nicht verglichen) und ich kann da schon mehr auslesen als nur den Zählerstand.

                              Ich bekomme die Zählerstände von 1.8.0/1.8.1/1.8.2 sowie 2.8.0/2.8.1/2.8.2 ausgelsen. Außerdem noch die aktuelle Leistung (16.7.0) und noch ein paar andere Werte (Herstellerkennung, Seriennummer usw).

                              Ich kann dir leider nicht direkt mit einem Arduino-Code weiterhelfen, ich lese über ein Openhab-Binding aus und hab das zuvor mittels einem kleinen C-Programm erledigt.

                              Aber vielleicht hilft dir der C-Code oder das Openhab-Binding ja weiter? Hier findest du Infos über den C-Programmcode:
                              https://community.openhab.org/t/usin...-openhab/21923

                              Kommentar

                              Lädt...
                              X