Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:meters:power:edl-ehz:iskraemeco_mt171

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
hardware:channels:meters:power:edl-ehz:iskraemeco_mt171 [2013/02/09 16:20] – [D0 - EN 62056-21] udo1hardware:channels:meters:power:edl-ehz:iskraemeco_mt171 [2022/04/21 21:50] (aktuell) – daemon, logfile & port jau
Zeile 1: Zeile 1:
-====== IskraEmeco MT171 ====== +====== Iskraemeco MT171 ====== 
-Der [[http://www.iskraemeco.si/emecoweb/ger/products/mt171.html|IskraEmeco MT171]] kann auch nach EN 62056-21 über die IR-Schnittstelle ausgelesen werden.\\+{{ :hardware:channels:meters:power:iskra:iskra0.jpg?100}} 
 +Der Iskraemeco MT171 kann nach EN 62056-21 über die IR-Schnittstelle ausgelesen werden.\\
 ===== Hardware ===== ===== Hardware =====
-====D0 - EN 62056-21==== +==== D0 - EN 62056-21 ==== 
-Man benötigt den [[hardware:controllers:ir-schreib-lesekopf|IR-Schreib-Lese-Kopf]], da der Zähler erst angesprochen werden muss, bevor er sendet.\\ +Kann mit einem [[hardware:controllers:ir-schreib-lesekopf|IR-Schreib-Lese-Kopf]] bei [[hardware:controllers:ir-schreib-lesekopf#Grundlagen|300bd 7E1]] ausgelesen werden.\\ 
 +Unter der markierten(=>) Öffnung befindet sich der Empfänger. Darüber muß der Lesekopf mit dem Anschlusskabel nach unten positioniert werden.\\
  
-{{ :hardware:channels:meters:power:iskra:iskra0.jpg?100}} +==== S0 ==== 
-Hier ist die typische IR-Schnittstelle zu sehen.\\ +=== extern === 
-Unter der markierten(=>) Öffnung befindet sich der Empfänger.\\ +Die S0-Schnittstelle (blinkende rote LED auf der Frontseite) wurde bisher nicht getestet.\\ 
-Darüber muß also die IR-LED des Opto-Kopfes positioniert werden.\\ +Bei Zweirichtungszähler wahrscheinlich nicht sinnvoll einsetzbar
-\\ +=== intern === 
 +Ss soll zwei interne S0 Schnittstellen geben. Bisher ist nicht bekannt, ob hier dann zwischen Einspeisung und Bezug unterschieden wird.\\ 
 +Diese Schnittstellen liegen hinter der Verplombung und sind nicht zugänglich.
  
-====S0===+===== Kommunikation ===== 
-===extern zugänglich=== +Die Schnittstelle wird aktiviertindem man sendet: 
-Die S0-Schnittstelle (blinkende rote LED auf der Frontseite) wurde bisher nicht getestet.\\ +<code> 
-Da hier vermutlich automatisch eine Summenbildung zwischen bezogener Energie und eingespeister Energie stattfindetfinde ich das erstmal weniger interessant. +/?!\r\n (hex 2F 3F 21 0D 0A) 
-===intern=== +</code> 
-es soll zwei interne S0 Schnittstellen geben. Bisher ist mir nicht bekannt, ob hier dann zwischen Einspeisung und Bezug unterschieden wird.\\ +Der Zähler antwortet z.B. mit
-Diese Schnittstellen liegen hinter der Verplombung und sind mir nicht zugänglich. +
-===== Software ===== +
-Das Auslesen der Daten über die IR-Schnittstelle wird wie [[Elster_as1440|hier]] beschrieben eingeleitet.\\ +
-Der Zähler antwortet mit+
 <code> <code>
 /ISk5MT171-0222 /ISk5MT171-0222
 </code> </code>
-Der am Ende zurückgelieferte Datensatz+Um direkt weiter kommunizieren zu können, muss die Antwort des Zählers bestätigt werden mit: 
 +<code> 
 +<ACK>000<CR><LF> (hex 06 30 30 30 0D 0A) 
 +</code> 
 +Als Datensatz kommt:
 <code> <code>
 0-0:C.1.0*255(4744xxxx) 0-0:C.1.0*255(4744xxxx)
Zeile 34: Zeile 38:
 ! !
 </code> </code>
-Leider keine Momentanwerte oder zusätzliche Infos.\\ 
-Ob und wie man an zusätzliche Messwerte gelangt, ist mir bisher nicht bekannt.\\ 
-<note>wird fortgesetzt</note> 
  
-See here python code that reads the meter data about every 5 seconds and writes a line to file is the meter data has changed. It uses py-serial+Die Baudrate läßt sich auch auf 9600 Baud umstellen wenn man innerhalb von 2s nachdem der Zähler seine Identifikation geschickt hat, ein Acknowledge Paket (ACK050CRLF) schickt
-<code>from __future__ import print_function  +<code>(hex 06 30 35 30 0D 0A)</code> 
-import serial +Worauf der Zähler beginnt seine [[hardware:channels:meters:power:edl-ehz:iskraemeco_mt174#beispieldaten|Daten]] mit 9600 Baud auszugeben.\\
-import time+
  
-def send(port, bytes, tr): +===== Beispiel vzlogger.conf ===== 
-  """ sends an command to serial and reads and checks the echo +Im Frontend wird ein Kanal 'El.Energie (Zählerstände)' angelegt. Als Auflösung wird '1' eingetragen. Der Style sollte 'steps' seinEin Haken bei 'Öffentlich' und bei 'Cookie' machen. Weiter sollte der 'Initialverbrauch' (aktueller Zählerstandeingetragen werdenDie UUIDs werden automatisch erzeugt und können durch klicken auf das (irechts neben dem Kanal sichtbar gemacht werdenWenn alles funktioniertkann 'verbosity' in der vzlogger.conf auf 0 gesetzt werden.
-      port  - the open serial port +
-      bytes - the string to be send +
-      tr    - the responce time +
-  """ +
-  #print("start send"  +
-  port.write(bytes) +
-  time.sleep(tr) +
-  echo = port.read(len(bytes)) +
-  if (echo != bytes): +
-    print("echo is not same as send:"bytes, " vs ", echo) +
-  #print("end send")+
  
-def read_datablock(): +<code base vzlogger.conf> 
-  ACK = '\x06' +{ 
-  STX = '\x02' +  "retry": 0, 
-  ETX = '\x03' +  "verbosity": 15, 
-  tr = 0.2 +  "log""/var/log/vzlogger/vzlogger.log", 
-  """ does all that's needed to get meter data from the meter device """  +  "local": { 
-  try: +    "enabled": false, 
-    IskraMT171=serial.Serial(port='/dev/ttyUSB0', baudrate=300, bytesize=7, parity='E', stopbits=1, timeout=1.5); # open port at specified speed +    "port": 8081, 
-    # 1 -> +    "index": true, 
-    time.sleep(tr) +    "timeout": 0, 
-    Request_message='/?!\r\n' # IEC 62056-21:2002(E) 6.3.1 +    "buffer": 0 
-    send(IskraMT171, Request_message, tr) +  }, 
-    # 2 <- +  "meters": [ 
-    time.sleep(tr) +    { 
-    Identification_message=IskraMT171.readline() # IEC 62056-21:2002(E) 6.3.2 +      "enabled": true, 
-    if (Identification_message[0] != '/'): +      "allowskip": false
-      print("no Identification message"+      "interval": -1, 
-      IskraMT171.close() +      "aggtime": -1, 
-      return "" +      "aggfixedinterval": false, 
-    if (len(Identification_message) < 7): +      "channels": [ 
-      print("Identification message to short"+        { 
-      IskraMT171.close() +          "uuid": "hier die UUID des im Frontend angelegten Kanals (El. Energie (Zählerstand) ) einfügen", 
-      return "" +          "identifier": "1.8.0", 
-    if (Identification_message[4].islower()): +          "api": "volkszaehler", 
-      tr = 0.02 +          "middleware""http://localhost/middleware.php", 
-    manufacturers_ID = Identification_message[1:4] +          "aggmode": "none", 
-    if (Identification_message[5] == '\\'): +          "duplicates": 0 
-      identification = Identification_message[7:-2] +        } 
-    else: +      ], 
-      identification = Identification_message[5:-2] +      "protocol": "d0", 
-    speed = Identification_message[4] +      "device": "/dev/ttyUSB0", 
-    #print("speed = ", speed) +      "pullseq": "2F3F210D0A", 
-    if (speed == "1")new_baud_rate = 600 +      "ackseq": "063035300d0a", 
-    elif (speed == "2")new_baud_rate = 1200 +      "baudrate": 300
-    elif (speed == "3")new_baud_rate = 2400 +      "baudrate_read": 9600
-    elif (speed == "4")new_baud_rate = 4800 +      "parity": "7e1", 
-    elif (speed == "5")new_baud_rate = 9600 +      "wait_sync""off", 
-    elif (speed == "6"): new_baud_rate = 19200 +      "read_timeout": 10, 
-    else: +      "baudrate_change_delay": 0 
-      new_baud_rate = 300 +    } 
-      speed = "0+  ] 
-    #print(manufacturers_ID" ", identification, " speed=", speed) +}
-    # 3 -> +
-    Acknowledgement_message=ACK + '0' + speed + '0\r\n' # IEC 62056-21:2002(E) 6.3.3 +
-    send(IskraMT171, Acknowledgement_message, tr) +
-    IskraMT171.baudrate=new_baud_rate +
-    time.sleep(tr) +
-    # 4 <- +
-    datablock = "" +
-    if (IskraMT171.read() == STX): +
-      x = IskraMT171.read() +
-      BCC = +
-      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("Result not OK, try again") +
-    else: +
-      print("No STX found, not handled."+
-    IskraMT171.close() +
-    return datablock +
-  except+
-    print("Some error reading data"+
-    if (IskraMT171.isOpen()): +
-      IskraMT171.close() +
-    return "" +
- +
-def meter_data(datablockmap, header): +
-  """ takes a datablock as received from the meter and returns a list with requested meter data as set in map +
-      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] == "time")+
-      line.append(time.strftime("%Y-%m-%d %H:%M:%S")) +
-    else+
-      line.append(""+
-  datasets = datablock.split('\n'+
-  for dataset in datasets: +
-    if (dataset != ""): +
-      x = dataset.split('('+
-      address = x[0] +
-      x = x[1][:-2].split(' ') # the standard seems to have a '*' instead of ' ' here +
-      value = x[0] +
-      try: +
-        unit = '['+x[1]+']' +
-      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, line)+
-  f = open(filename, "a") +
-  print(linefile=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 "timeto insert the time +
-  # 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['meter ID', 'datum & tijd', 'verbruik totaal[kWh]', 'verbruik tarief1[kWh]', 'verbruik tarief2[kWh]', 'terug totaal[kWh]', 'terug tarief1[kWh]', 'terug tarief2[kWh]'+
-  # data: ['12345678', '2013-02-08 10:08:41', '0054321', '0000000', '0054321', '0000000', '0000000', '0000000'+
-  ["1-0:0.0.0*255", "meter ID"]+
-  ["time""datum & tijd"]+
-  ["1-0:1.8.0*255", "verbruik totaal"], +
-  ["1-0:1.8.1*255""verbruik tarief1"]+
-  ["1-0:1.8.2*255""verbruik tarief2"]+
-  ["1-0:2.8.0*255""terug totaal"]+
-  ["1-0:2.8.1*255", "terug tarief1"]+
-  ["1-0:2.8.2*255""terug tarief2"] +
-+
- +
-example_datablock = """0-0:C.1.0*255(12345678) +
-1-0:0.0.0*255(12345678) +
-1-0:0.2.0*255(V1.0) +
-1-0:1.8.0*255(0054321 kWh) +
-1-0:1.8.1*255(0000000 kWh) +
-1-0:1.8.2*255(0054321 kWh) +
-1-0:2.8.0*255(0000000 kWh) +
-1-0:2.8.1*255(0000000 kWh) +
-1-0:2.8.2*255(0000000 kWh) +
-FF(00000000) +
-""+
- +
-#print(meter_data(example_datablock map, 1)) +
-#print(meter_data(example_datablock , map, 0)) +
- +
-file = "meterdata.txt" +
-previous_data = "" +
-data = read_datablock() +
- +
-output(filemeter_data(data , map, 1)) # header +
-while (1): +
-  if (data == "")+
-    print(time.strftime("%Y-%m-%d %H:%M:%S"), "No data received"+
-  elif (previous_data != data): +
-    output(file, meter_data(data , map, 0)) +
-    previous_data = data +
-  time.sleep(3) # minimum waiting time is 3 seconds, less and the meter doesn't return data  +
-  data = read_datablock()+
 </code> </code>
-Example output is: 
  
- 
-<code>['meter ID', 'datum & tijd', 'verbruik totaal[kWh]', 'verbruik tarief1[kWh]', 'verbruik tarief2[kWh]', 'terug totaal[kWh]', 'terug tarief1[kWh]', 'terug tarief2[kWh]'] 
-['12345678', '2013-02-09 12:49:14', '0011540', '0000000', '0011540', '0000000', '0000000', '0000000'] 
-['12345678', '2013-02-09 13:00:45', '0011541', '0000000', '0011541', '0000000', '0000000', '0000000'] 
-['12345678', '2013-02-09 13:18:06', '0011542', '0000000', '0011542', '0000000', '0000000', '0000000'] 
-['12345678', '2013-02-09 13:40:14', '0011543', '0000000', '0011543', '0000000', '0000000', '0000000'] 
-['12345678', '2013-02-09 13:57:53', '0011544', '0000000', '0011544', '0000000', '0000000', '0000000'] 
-['12345678', '2013-02-09 14:15:16', '0011545', '0000000', '0011545', '0000000', '0000000', '0000000'] 
-['12345678', '2013-02-09 14:53:29', '0011546', '0000000', '0011546', '0000000', '0000000', '0000000'] 
-</code> 
-Only change <code>map</code> in order to change header names, to add or remove what data is saved or to change the order.  
 ===== Quellen ===== ===== Quellen =====
-[1] [[http://www.iskraemeco.si/emecoweb/ger/products/mt171.html]]\\ +[1] [[http://www.iskraemeco.si/emecoweb/ger/products/mt171.html|MT171]]\\
-[2] [[http://wiki.volkszaehler.org/hardware/channels/meters/power/elster]]\\+
hardware/channels/meters/power/edl-ehz/iskraemeco_mt171.1360423248.txt.gz · Zuletzt geändert: 2018/09/18 19:39 (Externe Bearbeitung)