hardware:channels:meters:power:edl-ehz:iskra_mt372
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| hardware:channels:meters:power:edl-ehz:iskra_mt372 [2016/10/17 20:01] – Kanaldaten jau | hardware:channels:meters:power:edl-ehz:iskra_mt372 [2017/04/03 08:54] (aktuell) – gelöscht udo1 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== ISKRAemeco MT 372 ====== | ||
| - | Genauer Typ: MT372-D1A51-B11L11-M2K0agZ | ||
| - | Das " | ||
| - | ===== Hardware ===== | ||
| - | Der Zähler kann mittels [[hardware: | ||
| - | |||
| - | ===== Kommunikation ===== | ||
| - | Der Zähler scheint nur mit 300bd zu arbeiten. Trotz der Antwort: | ||
| - | < | ||
| - | die nach Norm besagt, dass man den Zähler auf 9600bd umschalten kann.\\ | ||
| - | |||
| - | ===== Beispiel vzlogger.conf ===== | ||
| - | Im Frontend wird ein Kanal ' | ||
| - | <code base|vzlogger.conf> | ||
| - | { | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | }, | ||
| - | " | ||
| - | { | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | { | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | ], | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | ] | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ===== Test mit HTerm ===== | ||
| - | Zum Testen wurde HTerm verwendet, da test1107 nach dem der Zähler mit seiner Typenbezeichnung geantwortet hatte, in ein Timeout lief (Tout).\\ | ||
| - | Einzustellen sind:\\ | ||
| - | Port: bei Windows: | ||
| - | Baud: 300\\ | ||
| - | Data: 7\\ | ||
| - | Stop: 1\\ | ||
| - | Parity: Even\\ | ||
| - | Bei „input control“: Send on Enter auf „CR-LF“\\ | ||
| - | Auf „Connect“ klicken, dann im Eingabefeld “/?!“ (ohne Anführungszeichen) eingeben und Enter drücken. Wenn im Feld „received data“ was erscheint, funktioniert die Kommunikation prinzipiell. \\ | ||
| - | |||
| - | Möchte man dem Zähler seinen Standarddatensatz entlocken muss mit hterm nach "/? | ||
| - | < | ||
| - | gesendet werden. Das ist schwierig zu realisieren.\\ | ||
| - | Stattdessen einfach ein paar (hex 00) zwischen Inistialisierung und <ACK> stecken und alles in einer Zeichefolge aus hterm senden. Ab sechs NUL aufwärts klappt es. | ||
| - | |||
| - | ===== Beispieldaten ===== | ||
| - | Gesendet: | ||
| - | < | ||
| - | Antwort des Zählers im hterm: | ||
| - | < | ||
| - | / | ||
| - | /? | ||
| - | < | ||
| - | 0.0.0(58231541)< | ||
| - | C.1.1(00000000)< | ||
| - | C.1.0(58231541)< | ||
| - | 0.9.1(175102)< | ||
| - | 0.9.2(120619)< | ||
| - | 1.8.0(00132.149*kWh)< | ||
| - | 1.8.1(00132.149*kWh)< | ||
| - | 1.8.2(00000.000*kWh)< | ||
| - | 1.8.3(00000.000*kWh)< | ||
| - | 1.8.4(00000.000*kWh)< | ||
| - | !< | ||
| - | < | ||
| - | </ | ||
| - | |||
| - | ===== Auslesen per Python-Script ===== | ||
| - | < | ||
| - | from __future__ import print_function | ||
| - | import serial | ||
| - | import time | ||
| - | |||
| - | def send(port, bytes, tr): | ||
| - | """ | ||
| - | port - the open serial port | ||
| - | bytes - the string to be send | ||
| - | tr - the responce time | ||
| - | """ | ||
| - | # | ||
| - | port.write(bytes) | ||
| - | time.sleep(tr) | ||
| - | echo = port.read(len(bytes)) | ||
| - | if (echo != bytes): | ||
| - | print(" | ||
| - | # | ||
| - | |||
| - | def read_datablock(): | ||
| - | ACK = ' | ||
| - | STX = ' | ||
| - | ETX = ' | ||
| - | tr = 0.3 | ||
| - | """ | ||
| - | try: | ||
| - | IskraMT171=serial.Serial(port='/ | ||
| - | # 1 -> | ||
| - | time.sleep(tr) | ||
| - | Request_message='/? | ||
| - | send(IskraMT171, | ||
| - | # 2 <- | ||
| - | time.sleep(tr) | ||
| - | Identification_message=IskraMT171.readline() # IEC 62056-21: | ||
| - | if (Identification_message[0] != '/' | ||
| - | print(" | ||
| - | IskraMT171.close() | ||
| - | return "" | ||
| - | if (len(Identification_message) < 7): | ||
| - | print(" | ||
| - | IskraMT171.close() | ||
| - | return "" | ||
| - | if (Identification_message[4].islower()): | ||
| - | tr = 0.02 | ||
| - | manufacturers_ID = Identification_message[1: | ||
| - | if (Identification_message[5] == ' | ||
| - | identification = Identification_message[7: | ||
| - | else: | ||
| - | identification = Identification_message[5: | ||
| - | speed = Identification_message[4] | ||
| - | # | ||
| - | if (speed == " | ||
| - | elif (speed == " | ||
| - | elif (speed == " | ||
| - | elif (speed == " | ||
| - | #elif (speed == " | ||
| - | elif (speed == " | ||
| - | else: | ||
| - | new_baud_rate = 300 | ||
| - | speed = " | ||
| - | # | ||
| - | # 3 -> | ||
| - | Acknowledgement_message=ACK + ' | ||
| - | send(IskraMT171, | ||
| - | IskraMT171.baudrate=new_baud_rate | ||
| - | time.sleep(tr) | ||
| - | # 4 <- | ||
| - | datablock = "" | ||
| - | if (IskraMT171.read() == STX): | ||
| - | x = IskraMT171.read() | ||
| - | BCC = 0 | ||
| - | while (x != ' | ||
| - | BCC = BCC ^ ord(x) | ||
| - | datablock = datablock + x | ||
| - | x = IskraMT171.read() | ||
| - | while (x != ETX): | ||
| - | BCC = BCC ^ ord(x) # ETX itself is part of block check | ||
| - | x = IskraMT171.read() | ||
| - | BCC = BCC ^ ord(x) | ||
| - | x = IskraMT171.read() # x is now the Block Check Character | ||
| - | # last character is read, could close connection here | ||
| - | if (BCC != ord(x)): # received correctly? | ||
| - | datablock = "" | ||
| - | print(" | ||
| - | else: | ||
| - | print(" | ||
| - | IskraMT171.close() | ||
| - | return datablock | ||
| - | except: | ||
| - | print(" | ||
| - | if (IskraMT171.isOpen()): | ||
| - | IskraMT171.close() | ||
| - | return "" | ||
| - | |||
| - | def meter_data(datablock, | ||
| - | """ | ||
| - | if header != 0 a list with data type and units is returned """ | ||
| - | line = [] | ||
| - | ## initialise line | ||
| - | for l in range(len(map)): | ||
| - | if (header == 1): | ||
| - | line.append(map[l][1]) | ||
| - | elif (map[l][0] == " | ||
| - | line.append(time.strftime(" | ||
| - | else: | ||
| - | line.append("" | ||
| - | datasets = datablock.split(' | ||
| - | for dataset in datasets: | ||
| - | if (dataset != "" | ||
| - | x = dataset.split(' | ||
| - | address = x[0] | ||
| - | x = x[1][: | ||
| - | value = x[0] | ||
| - | try: | ||
| - | unit = ' | ||
| - | except: | ||
| - | unit = "" | ||
| - | for l in range(len(map)): | ||
| - | if (map[l][0] == address): | ||
| - | if (header == 0): | ||
| - | line[l] = value | ||
| - | else: | ||
| - | line[l] = map[l][1] + unit | ||
| - | break; | ||
| - | return line | ||
| - | |||
| - | def output(filename, | ||
| - | f = open(filename, | ||
| - | print(line, file=f) | ||
| - | f.close() | ||
| - | |||
| - | map = [ | ||
| - | # The structure of the meter_data() output can be set with this variable | ||
| - | # first string on each line is the cosim adress of the data you want to safe or " | ||
| - | # the second string on each line is a description of the type of data belonging to the cosim address | ||
| - | # the order of the lines sets the order of the meter_data() output | ||
| - | # example | ||
| - | # header: [' | ||
| - | # data: [' | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | [" | ||
| - | ] | ||
| - | |||
| - | example_datablock = """ | ||
| - | 0.0.0(12345678) | ||
| - | C.1.0(12345678) | ||
| - | C.1.1(90123456) | ||
| - | 0.9.1(114138) | ||
| - | 0.9.2(140420) | ||
| - | 1.8.0(25915.768*kWh) | ||
| - | 1.8.1(15798.415*kWh) | ||
| - | 1.8.2(10117.353*kWh) | ||
| - | 1.8.3(00000.000*kWh) | ||
| - | 1.8.4(00000.000*kWh) | ||
| - | F.97.0(00000000) | ||
| - | C.241.0(016) | ||
| - | C.244.0(00000000) | ||
| - | 0.2.0((ER11)) | ||
| - | """ | ||
| - | |||
| - | # | ||
| - | # | ||
| - | |||
| - | |||
| - | file = " | ||
| - | previous_data = "" | ||
| - | data = read_datablock() | ||
| - | |||
| - | output(file, | ||
| - | while (1): | ||
| - | if (data == "" | ||
| - | print(time.strftime(" | ||
| - | elif (previous_data != data): | ||
| - | output(file, | ||
| - | previous_data = data | ||
| - | time.sleep(3) # minimum waiting time is 3 seconds, less and the meter doesn' | ||
| - | data = read_datablock() | ||
| - | </ | ||
hardware/channels/meters/power/edl-ehz/iskra_mt372.1476727294.txt.gz · Zuletzt geändert: von jau