Ankündigung

Einklappen
Keine Ankündigung bisher.

Support Thread für DLMS Plugin

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

    #31
    Die Spezifikation iec62056-21 schreibt nichts über UTF-8 encoding sondern rein nur über ASCII.
    Zitat von iec62056-21
    5.4 Character format
    Character format according to ISO/IEC 1177:1985.

    (1 start bit, 7 data bits, 1 parity bit, 1 stop bit).
    NOTE Protocol mode E (see 6.4.5) may use byte transparency, 1 start bit, 8 data bits, 1 stop bit (e.g. see Annex E).

    5.5 Character code
    Character code according to ISO/IEC 646:1991, international reference version. For local use,
    a national replacement code can be used.
    Da Du aber ohnehin ein Anzeigeproblem z.B. mit µ hast, würde ich erstmal schauen warum das so ist. Bist Du auf Raspi unterwegs? Welche Python Version nutzt Du?
    Zuletzt geändert von bmx; 05.04.2017, 07:22.

    Kommentar


      #32
      Hi,

      ich glaub auch nicht so recht an unicode die BOMs die ich kenne sehen anders aus. https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 .Ich denke eher der unicode converter wirft diese Zeichen einfach raus.

      VG
      Jürgen

      Kommentar


        #33
        Hallo,
        ich arbeite auf einen RPi3 mit Jessie lite und Python 3.6.1. Daran angeschlossen ist ein USB IR-Schreib-Lesekopf von volkszaehler, sprich Udo.
        Nachdem ich wie gesagt nicht vom Fach bin, benötige ich idealerweise Eure Unterstützung.

        Wie kann ich die Rohdaten der Kommunikation oder zumindest der Antwort des Zählers ermitteln?
        Wie gesagt habe ich nur die Spezifikation eines ähnliches Zählers. Trotzdem füge ich diese hier mal an, denn die Produktnummer ist in der Anleitung enthalten, einzig die blaue Taste (zum Anzeigenwechsel) fehlt bei mir. Mein Zähler ist ein FRP-SM-R1B-05060CAA1-LCD/0.

        Vielen Dank und beste Grüße
        Michael
        Angehängte Dateien

        Kommentar


          #34
          Das hab ich dir doch geschrieben....

          Kommentar


            #35
            Du meinst mit hterm?

            Kommentar


              #36
              Ja hat das nicht funktionierte?

              Kommentar


                #37
                Hallo,
                so nun habe ich vom Hersteller das Datenblatt zum Zähler bekommen Uanhang) und auch mit hterm noch ein paar Versuche gemacht.

                1. Versuch mit hterm: 300baud 7E1
                Code:
                300 71E
                Send ASCII: /?! CR CL
                Receive ASCII: /?!<\r><\n>
                Receive HEX: 2F 3F 21 0D 0A
                Scheinbar keine Kommunikation

                2. Versuch mit hterm: 9600baud 7E1
                Code:
                9600 71E
                Send ASCII: /?! CR CL
                Receive ASCII: <15><15>/ITF5FRP-SMV320090704<\r><\n>
                Receive HEX: 0F 7F 0F 2F 49 54 46 35 46 52 50 2D 53 4D 56 33 32 30 30 39 30 37 30 34 0D 0A
                
                Send HEX: 06 30 35 30 CR CL  (ACK 050 CR CL)
                Receive ASCII: <7>8C<15><2>0.0.0(0000000061009920)<\r><\n>0.0.9(0001420061009920)<\r><\n>0.2.0(V320090704)<\r><\n>1.7.0(0000183*W)<\r><\n>1.8.0(0019122.860*kWh)<\r><\n>96.1.0(12345678)<\r><\n>96.5.5(8C80)<\r><\n>96.7.0(005)<\r><\n>96.7.1(001)<\r><\n>96.7.2(000)<\r><\n>96.7.3(000)<\r><\n>96.8.0(0C59B19A)<\r><\n>97.97.0(00)<\r><\n>96.90.1(010D)<\r><\n>96.90.2(A092)<\r><\n>!<\r><\n><3>\
                Receive HEX: 07 38 43 7F 0F 02 30 2E 30 2E 30 28 30 30 30 30 30 30 30 30 36 31 30 30 39 39 32 30 29 0D 0A 30 2E 30 2E 39 28 30 30 30 31 34 32 30 30 36 31 30 30 39 39 32 30 29 0D 0A 30 2E 32 2E 30 28 56 33 32 30 30 39 30 37 30 34 29 0D 0A 31 2E 37 2E 30 28 30 30 30 30 31 38 33 2A 57 29 0D 0A 31 2E 38 2E 30 28 30 30 31 39 31 32 32 2E 38 36 30 2A 6B 57 68 29 0D 0A 39 36 2E 31 2E 30 28 31 32 33 34 35 36 37 38 29 0D 0A 39 36 2E 35 2E 35 28 38 43 38 30 29 0D 0A 39 36 2E 37 2E 30 28 30 30 35 29 0D 0A 39 36 2E 37 2E 31 28 30 30 31 29 0D 0A 39 36 2E 37 2E 32 28 30 30 30 29 0D 0A 39 36 2E 37 2E 33 28 30 30 30 29 0D 0A 39 36 2E 38 2E 30 28 30 43 35 39 42 31 39 41 29 0D 0A 39 37 2E 39 37 2E 30 28 30 30 29 0D 0A 39 36 2E 39 30 2E 31 28 30 31 30 44 29 0D 0A 39 36 2E 39 30 2E 32 28 41 30 39 32 29 0D 0A 21 0D 0A 03 5C
                Sprich mein Zähler kommuniziert scheinbar nur mit 9600baud. Sagen Euch die Antworten was bzw. <15> und <7>.
                Kann ich trotzdem das Plugin nutzen bzw. was müsste ich ändern?
                Angehängte Dateien

                Kommentar


                  #38
                  Nein, es ist eigentlich der erste Versuch korrekt mit 300 Baud.
                  Es wird /?! gesendet und kommt als Echo zurück. Dann wird lt. Spezifikation auch bei 300 Baud die Identifikation abgefragt. Eigentlich antwortet Dein Zähler auch:
                  / ist der Beginn der Antwort der Identifikation
                  ITF ist ein Herstellerkürzel
                  5 bedeutet entweder Protocol Mode C oder E und ein umschalten auf 9600 Baud für die weitere Kommunikation
                  Daraufhin wird dann ein Acknowledgement an den Zähler gesendet mit der Info der Umschaltung auf die 9600 Baud.

                  Ich denke Da kommt bei Dir bei 2. einfach Käse an: die beiden <15><15> bei ASCII entsprechen nicht den 0F 7F 0F und ich weiß auch nicht, warum die Zeichen bei Dir da auftauchen. Auch im ISO Standard von 2002 sind die nicht aufgeführt.

                  Lt. Deiner Bedienungsanleitung quasselt Dein Zähler einfach im Mode D drauflos ohne das Du ihn irgendwas fragen mußt. Das ist natürlich nicht besonders gut weil das DLMS Plugin so programmiert ist, das die Aktion vom SmartHomeNG ausgeht und nicht vom Zähler.
                  Man könnte da höchstens einen Sonderfall einbauen. Das genannte /eHZ-Pflichtenheft/ habe ich auch nirgendwo gefunden. Das könnte Aufschluß über die komischen weiteren Zeichen geben.

                  Auf Seite 17 ist aber eben auch der Pull Mode C beschrieben der Out-of-the -box funktionieren müßte. Also bitte mal dafür sorgen, das UTF8 bei dir korrekt dargestellt wird und dann kann man weitere Überlegungen anstellen...

                  Kommentar


                    #39
                    War das mit dem Mode Die nicht der rs485 Ausgang? Ich würde schauen das ich den auslesen könnte wenn ich so einen Zähler hätte.

                    Kommentar


                      #40
                      Sisamiwe Gibt es noch weitere Informationen?

                      Kommentar


                        #41
                        bmx

                        Ich habe es aufgegeben, das Plugin anzuwenden. Ich denke, dass der Zähler doch das Protokoll nicht sauber unterstützt. Alle Versuche schlugen fehl. Ich habe mir stattdessen eine Logik mit Auszügen aus dem PlugIn gebaut, die nun zyklisch aufgerufen wird. Das funktioniert soweit gut.

                        Hier meine Logik:
                        Code:
                        #!/usr/bin/python
                        #
                        #
                        
                        import sys
                        import serial
                        import time
                        import re
                        import string
                        
                        logger.info("Logik ITF : by :" + trigger['by'] )
                        
                        def _read_data_block_from_serial(the_serial, end_byte=0x0A):
                            response = bytes()
                            try:
                                while True:
                                    ch = the_serial.read()
                                    if len(ch) == 0:
                                        break
                                    response += ch
                                    if ch == end_byte:
                                        break
                                    if (response[-1] == end_byte):
                                        break
                            except Exception as e:
                        #        self.logger.debug("Warning {0}".format(e))
                                return None
                            return response
                        
                        # configure the serial connections (the parameters differs on the device you are connecting to)
                        ser = serial.Serial('/dev/ehz-lesekopf', 9600, 7, 'E', 1)
                            #Alternativ
                            #ser = serial.Serial(
                            #    port='/dev/ttyUSB0',
                            #    baudrate=9600,
                            #    parity=serial.PARITY_EVEN,
                            #    stopbits=serial.STOPBITS_ONE,
                            #    bytesize=serial.SEVENBITS
                            #)
                        
                        #Prüfen, ob Port geöffnet
                        if ser.isOpen()== False:
                            ser.open()
                        
                        #Senden des Initialisierungs-String "/?!<CR><LF>" und Lesen der Antwort
                        ser.write(b"\x2F\x3F\x21\x0D\x0A")
                        response = _read_data_block_from_serial(ser)
                        #logger.info(response)
                        
                        #Acknowledge und OBIS einlesen
                        ser.write(b'\x06050\r\n')
                        ser.flush()
                        ser.reset_input_buffer()
                        response = _read_data_block_from_serial(ser, 0x03)
                        #logger.info(response)
                        #b'\x020.0.0(0000000061009920)\r\n0.0.9(0001420061009920)\r\n0.2.0(V320090704)\r\n1.7.0(0000213*W)\r\n1.8.0(0019166.180*kWh)\r\n96.1.0(12345678)\r\n96.5.5(8C80)\r\n96.7.0(005)\r\n96.7.1(001)\r\n96.7.2(000)\r\n96.7.3(000)\r\n96.8.0(0C611E1E)\r\n97.97.0(00)\r\n96.90.1(010D)\r\n96.90.2(A092)\r\n!\r\n\x03'
                        
                        # Port schliessen
                        ser.close()
                        
                        #Response verabreiten
                        if len(response) > 5:
                            result = str(response[1:-4], 'ascii')
                            #logger.info(result)
                        else:
                            logger.info("Sorry response did not contain enough data for OBIS decode")
                        
                        for item in sh.find_items('obis_code'):    # findet alle Items die ein Attribut 'obis_code' besitzen und führe Datenextraktion aus dem String aus
                            argument = item.conf['obis_code']
                            index = result.find(argument)
                            #logger.info(index)
                            if index > 0:
                                begin = result.find("(", index)
                                end = result.find("*", index)
                                value = float(result[begin+1:end])
                                logger.info(value)
                                item(value)
                            else:
                                logger.info("Sorry response did not OBIS code")
                                break

                        Kommentar


                          #42
                          bmx FYI musste/habe use_checksum wieder eingeführt: https://github.com/smarthomeNG/plugins/pull/72

                          Kommentar


                            #43
                            Hi,
                            im DLMS Plugin vom neuesten Raspi image

                            bekomme ich folgende Meldung

                            2018-02-10 17:11:34 ERROR Main plugin 'dlms' version differs between Python code (1.2.6) and metadata (1.2.5)

                            Heist ich muss die Plugin.yaml austauschen?

                            Weiter unter ist dann noch so eine Warnung
                            2018-02-10 17:11:56 WARNING DLMS Attribute '1.7.0' is a single argument, not a list

                            Mein item file sieht so aus ist da was falsch oder ein folgefehler vom Error?
                            Code:
                            %YAML 1.1
                            ---
                            Dlms:
                                name: 'Elster AS 1440'
                            
                                ReadOut:
                                    type: str
                                    dlms_obis_readout:
                            
                                ActPowerIn:
                                    type: num
                                    sqlite: 'true'
                                    dlms_obis_code: '1.7.0'
                                    name: Momentane Leistung Bezug kW
                                    unit: 'kW'
                            
                                ActPowerOut:
                                    type: num
                                    sqlite: 'true'
                                    dlms_obis_code: '2.7.0'
                                    name: 'Momentane Leisung Lieferung kW'
                                    unit: 'kW'
                            
                                EnergyIn:
                                    type: num
                                    sqlite: 'true'
                                    dlms_obis_code: '1.8.0'
                                    name: 'Zählerstand Bezug kWh'
                                    unit: 'kWh'
                            
                                EnergyInTToday:
                                    type: num
                                    sqlite: 'true'
                                    dlms_obis_code: '1.9.0'
                                    name: 'Verbrauch seit Rückstellung'
                                    unit: 'kWh'
                            
                                EnergyOut:
                                    type: num
                                    sqlite: 'true'
                                    dlms_obis_code: '2.8.0'
                                    name: 'Zählerstand Lieferung kWh'
                                    unit: 'kWh'
                            
                                EnergyOutToday:
                                    type: num
                                    sqlite: 'true'
                                    dlms_obis_code: '2.9.0'
                                    name: 'Erzeugung Seit Rückstellung'
                                    unit: 'kWh'
                            
                                IdZaehler:
                                    type: str
                                    dlms_obis_code: '0.0.0'
                                    name: 'Identifikation Zähler'
                            
                                LastReadingDate:
                                    type: str
                                    dlms_obis_code: '0.9.2'
                                    name: 'Letzte Ablesung Datum'
                            
                                LastReadingTime:
                                    type: str
                                    dlms_obis_code: '0.9.1'
                                    name: 'Letzte Ablesung Zeit'
                            Das Item selber schein aber trotz der Warnungen zu Funktionieren.

                            Viele Grüsse
                            Jürgen
                            Zuletzt geändert von heckmannju; 10.02.2018, 17:51.

                            Kommentar


                              #44
                              Grundsätzlich gehören alle Dateien aus dem jewejeweil plugin Verzeichnis zusammen und müssen auch zusammen aktualisiert werden

                              Kommentar


                                #45
                                Hi,
                                okay dann ist da wohl irgentwas im Git falsch da ist es auch so das unterschiedliche Versionen zwischen Plugin und Src da sind.

                                Das Problem mit den Warnings habe ich auch gelöst indem ich die Doku des plugins im Git gelesen habe. Da war noch die schwirigkeit das yaml bei listen ganz anders aussieht wie das alte format.

                                Code:
                                Dlms:
                                    name: 'Elster AS 1440'
                                
                                    ReadOut:
                                        type: str
                                        dlms_obis_readout:
                                
                                    ActPowerIn:
                                        type: num
                                        sqlite: 'true'
                                        dlms_obis_code:
                                            - 1.7.0
                                            - 0
                                            - Value
                                            - num
                                        name: Momentane Leistung Bezug kW
                                        unit: 'kW'

                                Kommentar

                                Lädt...
                                X