Ankündigung

Einklappen
Keine Ankündigung bisher.

Smartmeter Plugin - Tester gesucht

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

    #46
    @fanta2k:
    Wozu das newline da gut sein soll frage ich mich zwar, aber gut dass es funktionert. Ist das irgendwo dokumentiert?

    @Robert:
    Vielleicht schaffe ich es in den nächsten Tagen das mal anzugehen, wobei ich sagen muss dass mein persönlicher Leidensdruck relativ gering ist .
    Willst Du das nicht mal ins develop schieben? Da könnte auch erstmal noch einiges an debug-Ausgaben rein um den Fehlerort im Plugin besser zu finden.

    Mich würde es schon reizen eine universal funktionierende Lösung anzubieten.
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #47
      Hi Mirko!

      Das ist wie abgesprochen unter "dlms" bereits im develop. Geht mir mit dem Leidensdruck genauso. Trotzdem wäre es wohl für die sh.py-Gemeinschaft schön, wenn man das so allgemein wie möglich formuliert. Zur Not eben mit ein paar (optionalen) Parametern mehr. Würde mich freuen wenn du es mal für deinen Zähler antestest und wir die notwendigen Änderungen dann irgendwie im Ping-Pong-Kreuztest-Verfahren einbauen.

      Grüße
      Robert

      Kommentar


        #48
        Zitat von JuMi2006 Beitrag anzeigen
        @fanta2k:
        Wozu das newline da gut sein soll frage ich mich zwar, aber gut dass es funktionert. Ist das irgendwo dokumentiert?

        ja das frage ich mich auch O_O

        gefunden hab ich den tipp hier: [vz-dev] Auslesen mit USB Kopf, Identifierer und Schnittstellenparameter

        wenn ich über hterm versuche, reicht ein /?! mit CR-LF send on enter.

        im monitor sieht es dann so aus:


        /?!<\r><\n>/EMH4\@--ITZ-G0038E<\r><\n><2>F.F(00000000)<\r><\n>0.0.0(003189 56)<\r><\n>0.1.0(00)<\r><\n>0.2.0(60900000)<\r><\n >0.2.2(06002200)<\r><\n>0.9.1(0113159)<\r><\n>0.9. 2(0131122)<\r><\n>1.8.0(001666.2*kWh)<\r><\n>1.8.1 (000940.8*kWh)<\r><\n>1.8.2(000725.4*kWh)<\r><\n>1 .25(00.63*kW)<\r><\n>32.25(235.5*V)<\r><\n>52.25(2 36.8*V)<\r><\n>72.25(238.5*V)<\r><\n>C.1.0(0421704 3)<\r><\n>C.7.1(0006)<\r><\n>C.7.2(0006)<\r><\n>C. 7.3(0006)<\r><\n>!<\r><\n><3><\b>

        Kommentar


          #49
          Hallo Mario,
          Die Baudraten-Umschaltung müsste demnach bei dir auch nicht funktionieren? Hab es mit dem Perl-Script schonmal geschafft die Baudrate umzustellen, beim Perl-Script erkennt er die Baudrate bloß nicht richtig. Bin da noch bei und meld mich die Tage nochmal.

          MfG Frank

          Kommentar


            #50
            ne baudrate umschalten klappt auch bei mir nicht.

            eins muss ich auch noch gucken, aktuell landen die werte als str in den variablen, ein berechnen klappt daher nicht gleich.

            Kommentar


              #51
              hab noch zeile 150 auf

              Code:
              item(float(data[1]), 'DLMS', 'OBIS {}'.format(data[0]))
              geändert.

              Kommentar


                #52
                Zitat von Robert Beitrag anzeigen
                Würde mich freuen wenn du es mal für deinen Zähler antestest und wir die notwendigen Änderungen dann irgendwie im Ping-Pong-Kreuztest-Verfahren einbauen.

                Grüße
                Robert
                Hallo Robert,

                ich hab jetzt nochmal 3 Stunden davor gesessen, komme aber auf keinen grünen Zweig. Ich tippe mal auf ein timing-Problem. Ich habe 2 Zähler die sich wie folgt verhalten:

                WP:
                Der erwartet ganz normal die Anfrage und lässt einem dann ein wenig Zeit um ein ACK mit Baudrate zu senden. Kommt das nicht plappert der einfach mit 300baud seine Daten raus (dauert 106 Sekunden).

                HZ:
                Der erwartet natürlich auch eine Anfrage und lässt einem dann Zeit für ACK und Baudrate. Kommt kein ACK passiert auch nichts. Der sendet die Daten erst nach dem ACK und Baudrate aus.

                Als nächstes werde ich mal einen etwas russischeren Ansatz testen und das ähnlich dem Perl script machen, aber ohne socat.

                Was noch fehlt ist ein timing nach der Zähler-ID. Kommt dort das ACK zu früh oder zu spät dann wird es im Zweifel ignoriert. Da kann man vielleicht ne Schleife einbauen was aber wegen der unterschiedlichen Geschwindigkeiten schwierig wird. Das ACK muss mit 300baud kommen und dann gehts mit XXXXbaud weiter. Grundsätzlich macht Python3 die Baudratenumstellung aber richtig, zumindest wenn ich nebenbei stty monitore.
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #53
                  Smartmeter Plugin - Tester gesucht

                  Ich denke auch das es ein Timing-Problem ist. Mein Zähler (EMH ITZ) braucht auch nicht zwingend ein ACK.


                  Sent from my iPhone using Tapatalk

                  Kommentar


                    #54
                    bei mir läufts mit der fixen einstellung auf 300 nun stabil.

                    Kommentar


                      #55
                      Zitat von JuMi2006 Beitrag anzeigen
                      Hallo Robert,

                      ich hab jetzt nochmal 3 Stunden davor gesessen, komme aber auf keinen grünen Zweig. Ich tippe mal auf ein timing-Problem. [...]
                      Was noch fehlt ist ein timing nach der Zähler-ID. Kommt dort das ACK zu früh oder zu spät dann wird es im Zweifel ignoriert. Da kann man vielleicht ne Schleife einbauen was aber wegen der unterschiedlichen Geschwindigkeiten schwierig wird. Das ACK muss mit 300baud kommen und dann gehts mit XXXXbaud weiter. Grundsätzlich macht Python3 die Baudratenumstellung aber richtig, zumindest wenn ich nebenbei stty monitore.
                      Kunststück - habe die Baudratenumstellung auch ja auf drei verschiedene Arten implementiert - das tuts schon.

                      Timing - ein sleep(<optionaler Parameter>) lässt sich ja noch Nachpflegen. Hast du denn mal testweise ein sleep(0.5) eingefügt?

                      Genauso evtl. ein Parameter, der das Ack generell abschaltet - wenngleich das ja nun die ganze Geschichte auf 300 baud fixiert.

                      Was gut wäre, wären konkrete Fehlerbeschreibungen wie "empfange die Zählerkennung nicht" oder "auf das Ack hin erfolg keine Antwort" oder "Antwort erfolgt trotz Umschaltung mit 300 Baud".

                      Kommentar


                        #56
                        Ich hab hier mal ein proof of concept:

                        Es müsste lediglich der Port angepasst werden. Das ist ein reines Python Script, also kein Plugin Code, ausführen mit "python3 scriptname.py":

                        Code:
                        #!/usr/bin/env python3
                        
                        import time
                        import serial
                        import re
                        import os
                        
                        serialport = '/dev/ehz-hz'
                        init_seq = bytes('/?!\r\n', 'ascii')
                        request = bytearray('\x06000\r\n', 'ascii')
                        
                        serial = serial.Serial(serialport, 300, bytesize=serial.SEVENBITS, parity=serial.PARITY_EVEN, timeout=5, interCharTimeout=2)
                        serial.flushInput()
                        serial.write(init_seq)
                        print("send init:\n> {}".format((init_seq.decode('iso-8859-9')))[:-2])
                        response = bytes()
                        newlines = 0
                        try:
                            while newlines < 1:
                                response += serial.read()
                                length = len(response)
                                #count newlines
                                if (0x0a or 0x0d) in response:
                                    newlines += 1
                                    ehz_id = response
                                    print ("got id:\n< {}".format((ehz_id.decode('iso-8859-9'))[:-2]))
                        except Exception as e:
                            print ("No ID")
                        
                        if (len(response) >= 5):
                            if (ehz_id[4] - 0x30) in range(6):
                                new_ascii_baudrate = 300 * (1 << (response[4] - 0x30))
                                print ("baudrate ascii :{}".format(new_ascii_baudrate))
                                request[2] = ehz_id[4]
                            print ("Start Loop:")
                              
                            try:
                                wait = 1.0
                                time.sleep(wait)
                                print("send ACK:\n> {}".format((request.decode('iso-8859-9'))[:-2]))
                                new = 'false'
                                while new == 'false':
                                    response2 = bytes()
                                    time.sleep(0.5)
                                    serial.baudrate = 300
                                    print ("switch to 300 baud")
                                    serial.write(request)
                                    time.sleep(0.5)
                                    print ("send hex:{}".format(request))
                                    #print (os.popen('stty -F /dev/ehz-hz').read())
                                    serial.baudrate = new_ascii_baudrate
                                    serial.timeout = 1
                                    print ("switch to {} baud".format(new_ascii_baudrate))
                                    #print (os.popen('stty -F /dev/ehz-hz').read())
                                    response2 += serial.read()
                                    #print (response2.decode('iso-8859-9'))
                                    if len(response2) > 0:
                                        if 0x02 in response2:
                                            print ("got STX")
                                        end = 'false'
                                        while end == 'false':
                                            response2 += serial.read()
                                            #print ("RESPONSE:{0}".format(response2.decode('iso-8859-9')))
                                            if (0x03 in response2) and (0x21 in response2):
                                                print ("got ETX")
                                                end = 'true'
                                                print ("FINISH:\n{0}".format(response2.decode('iso-8859-9')))
                                                new = 'true'
                            except Exception as e:
                                print("ERROR: {0}".format(e))
                        P.S.: Ich sehe dort einen vermeindlichen Fehler und es funktioniert trotzdem, hab jetzt aber keine Zeit das zu untersuchen, muss einkaufen fahren. Sonst hungere ich das WE .

                        EDIT: Fehler beseitigt, tut was es soll.

                        @Robert: Wie weiter? Wer machts? Nicht dass wir hier doppelt Zeit verschenken - ich würde es auch zum Finale bringen.
                        Umgezogen? Ja! ... Fertig? Nein!
                        Baustelle 2.0 !

                        Kommentar


                          #57
                          Zitat von JuMi2006 Beitrag anzeigen
                          @Robert: Wie weiter? Wer machts? Nicht dass wir hier doppelt Zeit verschenken - ich würde es auch zum Finale bringen.
                          Ich sehe bis auf die "sleep" keinen gravierenden Unterschied!? Diverse Automatismen wie Baudrate "errechnen"/Ack basteln, Abbruchbedingungen der Leseschleifen und Umschaltung der Baudrate sind ja gleich.

                          Was mir fehlt damit es bei mir überhaupt funktionieren kann ist die Unterdrückung des Echos (siehe Plugin). Checksumme wäre natürlich, sofern vom eHZ unterstützt, auch sinnvoll. Ein Aufbrechen der Init/Ack/Init/Ack/Init/Ack in Init/Ack/Ack/Ack-Sequenz funktioniert bei meinem eHZ leider auch nicht, falls du das noch vor hattest.

                          Daher: Bevor wir im develop hin- und herschieben wäre es sinnvoll, wenn du - ob auch Basis des existierenden (damit z.B. parse_item bleiben kann) Plugins oder was "Neuem" - hier einen Vorschlag machst den ich und andere dann testen können. Wenn das dann bei mehreren funzt ersetzen wir das aktuelle Plugin.

                          Beim Blick auf den Code denke ich aber, dass es eigentlich mit ein paar "sleep" getan ist? "inter_char_timeout" können wir ja wenn nötig auch reinbauen. Kannst du nicht einfach mal die sleeps einbauen und testen? Wo hakt es denn da noch? Die Checksummen-Prüfung habe ich bereits optional gemacht - siehe aktueller develop, "use_checksum = False" dem Plugin übergeben.

                          Grüße
                          Robert

                          P.S.: Statt der Strings 'false' und 'true' nimm doch generell eher generisch Bool True / False...

                          Kommentar


                            #58
                            bei meinem EMH ITZ kommt damit der fehler:


                            admin@smarthome:/usr/smarthome$ python3 test.py
                            send init:
                            > /?!
                            got id:
                            < /?!
                            Start Loop:
                            send ACK:
                            > 000
                            switch to 300 baud
                            send hex:bytearray(b'\x06000\r\n')
                            ERROR: name 'new_ascii_baudrate' is not defined
                            admin@smarthome:/usr/smarthome$

                            Kommentar


                              #59
                              Zitat von fanta2k Beitrag anzeigen
                              bei meinem EMH ITZ kommt damit der fehler:
                              Ich WETTE! darauf, dass auch du die Echo-Unterdrückung brauchst. Wenn alles nachgepflegt ist sind wir wieder beim existierenden Plugin... (plus hoffentlich den benötigten "sleep").

                              Blick in Mirkos Code sagt: Antwort ist über 5, aber eben das Echo - daher geht nächste Abfrage nicht und die Variable wird nicht erzeugt.

                              Kommentar


                                #60
                                Zitat von Robert Beitrag anzeigen
                                Ich sehe bis auf die "sleep" keinen gravierenden Unterschied!? Diverse Automatismen wie Baudrate "errechnen"/Ack basteln, Abbruchbedingungen der Leseschleifen und Umschaltung der Baudrate sind ja gleich.
                                Ja natürlich, muss man ja nicht neu erfinden. Der generelle Unterschied ist aber der Loop bis zum STX vom Zähler.

                                Zitat von Robert Beitrag anzeigen
                                Was mir fehlt damit es bei mir überhaupt funktionieren kann ist die Unterdrückung des Echos (siehe Plugin). Checksumme wäre natürlich, sofern vom eHZ unterstützt, auch sinnvoll. Ein Aufbrechen der Init/Ack/Init/Ack/Init/Ack in Init/Ack/Ack/Ack-Sequenz funktioniert bei meinem eHZ leider auch nicht, falls du das noch vor hattest.
                                Das Aufbrechen der Schleife funktioniert hier bei beiden Zählern wunderbar. Was gibt Dein Zähler denn alles als echo? Habe ich noch nie gesehen.

                                Zitat von Robert Beitrag anzeigen
                                Daher: Bevor wir im develop hin- und herschieben wäre es sinnvoll, wenn du - ob auch Basis des existierenden (damit z.B. parse_item bleiben kann) Plugins oder was "Neuem" - hier einen Vorschlag machst den ich und andere dann testen können. Wenn das dann bei mehreren funzt ersetzen wir das aktuelle Plugin.
                                Das würde ich erst machen wenn ein funktionierendes Script zum portieren steht. Daher ja mein Post. Ausprobieren ... geht/geht nicht. Debuggen kann es dann eh nur jemand der nen Zähler hat der nicht funktioniert. Aus der Ferne macht sowas keinen Sinn.

                                Zitat von Robert Beitrag anzeigen
                                Beim Blick auf den Code denke ich aber, dass es eigentlich mit ein paar "sleep" getan ist?
                                Leider nicht, da Deine Bedingungen doch schon ziemlich speziell sind und sich nicht mit meinen Loops vertragen. Daher denke ich sollte es eine vernünftige Basis geben. Diese gleich als Plugin zu entwickeln macht das testen nur unheimlich nervig und damit die Entwicklung langsamer.
                                Umgezogen? Ja! ... Fertig? Nein!
                                Baustelle 2.0 !

                                Kommentar

                                Lädt...
                                X