Ankündigung

Einklappen
Keine Ankündigung bisher.

Anbindung eHZ Iskra MT681

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

    [Featurewunsch] Anbindung eHZ Iskra MT681

    Hallo zusammen,

    ich habe smarthome.py auf meinem Raspberry Pi installiert und versuche einen elektronischen Haushaltszähler Iskra MT681 mit dem easymeter plugin einzubinden. Der Zähler-Lesekopf von volkszähler-Udo ist an der seriellen Schnittstelle /dev/ttyAMA0 angeschlossen. Im plugin habe ich die Anzahl der Datenbits auf EIGHTBITS gesetzt.

    Nachfolgend das Logfile von smarthome, sowie die easymeter.conf und ein hex Mitschnitt der Zählerdaten. Außer der
    Startsequenz 1B 1B 1B 1B 01 01 01 01 und der
    Endsequenz 1B 1B 1B 1B 1A <xx> <yy> <zz>
    <xx> : Anzahl der Füllbytes
    <yy> <zz> : CRC über die Datei
    kann ich in den Zählerdaten nur bedingt etwas interpretieren. Die Hex Daten wurden mit 9600 8N1 aufgenommen, was für diesen Zähler richtig sein sollte.

    Kann mir jemand helfen? Wie muss ich ggfls. das easymeter plugin anpassen?

    Hier die easymeter.conf
    Code:
    [output]
        easymeter_code = 1-0:21.7.0*255
        device = /dev/ttyAMA0
        type = num
    Hier das Logfile:
    Code:
    Init SmartHome.py 1.0-32-gfd0043e+
    2014-03-03 12:41:20 INFO     Main         Start SmartHome.py 1.0-32-gfd0043e+
    2014-03-03 12:41:20 INFO     Main         Init Scheduler
    2014-03-03 12:41:20 INFO     Main         Init Plugins
    2014-03-03 12:41:21 INFO     Main         Init Items
    2014-03-03 12:41:21 INFO     Main         Start Plugins
    2014-03-03 12:41:21 INFO     Main         Start Logics
    2014-03-03 12:41:22 ERROR    Connections  KNX: could not connect to 127.0.0.1:6720 (TCP): [Errno 111] Verbindungsaufbau abgelehnt
    2014-03-03 12:41:36 ERROR    easymeter    Method easymeter exception: 'utf-8' codec can't decode byte 0xc3 in position 5: invalid continuation byte
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 344, in _task
        obj()
      File "/usr/local/smarthome/plugins/easymeter/__init__.py", line 75, in update_status
        line = ser.readline().decode("utf-8")
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 5: invalid continuation byte
    2014-03-03 12:41:47 ERROR    easymeter    Method easymeter exception: 'utf-8' codec can't decode byte 0xf0 in position 1: invalid continuation byte
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 344, in _task
        obj()
      File "/usr/local/smarthome/plugins/easymeter/__init__.py", line 75, in update_status
        line = ser.readline().decode("utf-8")
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf0 in position 1: invalid continuation byte
    2014-03-03 12:41:56 ERROR    easymeter    Method easymeter exception: 'utf-8' codec can't decode byte 0xa5 in position 13: invalid start byte
    und hier noch die hex-Daten vom Zähler
    Code:
    1b1b1b1b010101017605016e26cb620062007263010176010105007a0ced0b090149534b0003c33bf1010163f650007605016e26cc620062007263070177010b090149534b0003c33bf1070100620affff7262016500b764707d77078181c78203ff010101010449534b0177070100000009ff010101010b090149534b0003c33bf10177070100010800ff650001018201621e52ff590000000000fde5e60177070100010801ff0101621e52ff590000000000fde5e60177070100010802ff0101621e52ff5900000000000000000177070100020800ff650001018201621e52ff5900000000003a5e1a0177070100020801ff0101621e52ff5900000000003a5e1a0177070100020802ff0101621e52ff5900000000000000000177070100100700ff0101621b520055000003360177070100240700ff0101621b520055ffffffb50177070100380700ff0101621b520055000002dc01770701004c0700ff0101621b520055000000a60177078181c78205ff010101018302a5d99f47eac61e8157383753043ffaa260d408b564edbccd8dccf7a22e1b93ddb05398d88a33f773b2463672169dd801010163cd40007605016e26cd62006200726302017101638b44001b1b1b1b1a00e506
    
    1b1b1b1b010101017605016e26ce620062007263010176010105007a0cee0b090149534b0003c33bf1010163f770007605016e26cf620062007263070177010b090149534b0003c33bf1070100620affff7262016500b764717d77078181c78203ff010101010449534b0177070100000009ff010101010b090149534b0003c33bf10177070100010800ff650001018201621e52ff590000000000fde5e90177070100010801ff0101621e52ff590000000000fde5e90177070100010802ff0101621e52ff5900000000000000000177070100020800ff650001018201621e52ff5900000000003a5e1a0177070100020801ff0101621e52ff5900000000003a5e1a0177070100020802ff0101621e52ff5900000000000000000177070100100700ff0101621b5200550000032d0177070100240700ff0101621b520055ffffffb40177070100380700ff0101621b520055000002dc01770701004c0700ff0101621b5200550000009e0177078181c78205ff010101018302a5d99f47eac61e8157383753043ffaa260d408b564edbccd8dccf7a22e1b93ddb05398d88a33f773b2463672169dd801010163ebc1007605016e26d06200620072630201710163a082001b1b1b1b1a002825
    
    1b1b1b1b010101017605016e26d1620062007263010176010105007a0cef0b090149534b0003c33bf10101635ffc007605016e26d2620062007263070177010b090149534b0003c33bf1070100620affff7262016500b764727d77078181c78203ff010101010449534b0177070100000009ff010101010b090149534b0003c33bf10177070100010800ff650001018201621e52ff590000000000fde5ec0177070100010801ff0101621e52ff590000000000fde5ec0177070100010802ff0101621e52ff5900000000000000000177070100020800ff650001018201621e52ff5900000000003a5e1a0177070100020801ff0101621e52ff5900000000003a5e1a0177070100020802ff0101621e52ff5900000000000000000177070100100700ff0101621b5200550000032f0177070100240700ff0101621b520055ffffffb20177070100380700ff0101621b520055000002da01770701004c0700ff0101621b520055000000a10177078181c78205ff010101018302a5d99f47eac61e8157383753043ffaa260d408b564edbccd8dccf7a22e1b93ddb05398d88a33f773b2463672169dd801010163820f007605016e26d362006200726302017101637c001b1b1b1b1a004dba
    Viele Grüße
    Oliver

    #2
    Hi,

    Hast Du mal ein Telnet auf den USB Port gemacht?

    Habe den Zähler auch, nutze ihn aber mit Udos IR-Kopf an einem X-Port.

    Wenn ich mich mit dem X-Port verbinde kommt das bei raus:

    1-0:0.0.0*255(331300-5019624)
    1-0:1.8.1*255(022310.2922)
    1-0:96.5.5*255(80)
    0-0:96.1.255*255(38475117)
    !
    /ISk5MT671-0001

    Gruß

    Lapheus
    Gruß
    Lapheus

    Kommentar


      #3
      Hi,

      vielleicht hilft Dir meine Beschreibung aus diesem Thread hier.
      Gruß
      Lapheus

      Kommentar


        #4
        Plugin Iskra MT681 - Versorgungsbereich RWE

        Nachfolgend auf Basis des "original" Plugins mein Iskra MT681 Plugin. An der ein oder anderen Stelle sicherlich eleganter zu programmieren, aber es funktioniert zuverlässig.

        Code:
        #!/usr/bin/env python3
        # vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
        #
        # Copyright 2013 KNX-User-Forum e.V.            https://knx-user-forum.de/
        #
        #  This file is part of SmartHome.py.    http://mknx.github.io/smarthome/
        #
        #  SmartHome.py is free software: you can redistribute it and/or modify
        #  it under the terms of the GNU General Public License as published by
        #  the Free Software Foundation, either version 3 of the License, or
        #  (at your option) any later version.
        #
        #  SmartHome.py is distributed in the hope that it will be useful,
        #  but WITHOUT ANY WARRANTY; without even the implied warranty of
        #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        #  GNU General Public License for more details.
        #
        #  You should have received a copy of the GNU General Public License
        #  along with SmartHome.py. If not, see <http://www.gnu.org/licenses/>.
        #
        
        import logging
        import serial
        import re
        import time
        import binascii
        
        
        logger = logging.getLogger('iskra')
        
        
        class iskra():
        
            def __init__(self, smarthome):
                self._sh = smarthome
                self._cycle = 30
                self._timeout = 8
                self._codes = dict()
        
            def run(self):
                self._sh.scheduler.add(
                    'iskra', self.update_status, cycle=self._cycle)
                self.alive = True
        
            def stop(self):
                self.alive = False
        
            # parse items, if item has parameter netio_port
            # add item to local list
            def parse_item(self, item):
                if 'iskra_code' in item.conf:
        
                    if item.conf['device'] not in self._codes:
                        self._codes[item.conf['device']] = dict()
                    self._codes[item.conf['device']][
                        item.conf['iskra_code']] = item
        
                return None
        
        
            def con2int8(self, val):
                if val > 0x7f:
                    val -= 0x100
                return val
        
            def con2int16(self, val):
                if val > 0x7fff:
                    val -= 0x10000
                return val
        
            def con2int32(self, val):
                if val > 0x7fffffff:
                    val  -= 0x100000000
                return val
        
            def con2int64(self, val):
                if val > 0x7fffffffffffffff:
                    val -= 0x10000000000000000
                return val
        
        
            def parse(self, data, i):#data, i):
                num=data[i]
                if num == 0x52:
                    val = self.con2int8(int.from_bytes(data[i+1:i+2], byteorder='big'))
                    i+=2
                elif num ==  0x53:
                    val = self.con2int16(int.from_bytes(data[i+1:i+3], byteorder='big'))
                    i+=3
                elif num ==  0x55:
                    val = self.con2int32(int.from_bytes(data[i+1:i+5], byteorder='big'))
                    i+=5
                elif num ==  0x59:
                    val = self.con2int64(int.from_bytes(data[i+1:i+9], byteorder='big'))
                    i+=9
                elif num ==  0x62:
                    val = int.from_bytes(data[i+1:i+2], byteorder='big')
                    i+=2
                elif num ==  0x63:
                    val = int.from_bytes(data[i+1:i+3], byteorder='big')
                    i+=3
                elif num ==  0x65:
                    val = int.from_bytes(data[i+1:i+5], byteorder='big')
                    i+=5
                elif num ==  0x69:
                    val = int.from_bytes(data[i+1:i+9], byteorder='big')
                    i+=9
                elif num ==  0x01:
                    i+=1
                    val = 'kein Wert'
                else:
                    print ('Error ')
                    print (data[i])
                    j=1
                    val=''
                return (i, val)
        
        
           def update_status(self):
        
                datablock = bytearray()
                end_seq = b'\x1b\x1b\x1b\x1b\x1a'
                start_seq = b'\x1b\x1b\x1b\x1b\x01\x01\x01\x01'
        
                for curr_port in self._codes.keys():
                    ser = serial.Serial(
                    port=curr_port,
                    timeout=3,
                    baudrate=9600,
                    #bytesize=serial.SEVENBITS,
                    #parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE)
        
                    start = time.time()
                    ser.flushInput()
        
                    # wait for start of next datablock
        #            while True:
        #                c=ser.read()
        #                if c!= '':
        #                    datablock.append(int(binascii.hexlify(c), 16))
        #                    if datablock.find(end_seq) != -1:
        #                        break
        
                    # read next datablock
                    datablock = []
                    datablock = ser.read(1500)
                    # close serial connection
                    ser.close()
        
                    i = datablock.find(end_seq)
                    if i != -1:
                        datablock=datablock[i+8:]
        
                    # wenn nach end_seq gesucht wird, letzte 3 zeichen Pruefsumme etc entfernen
                    #datablock = datablock[3:]
                    i = datablock.find(end_seq)
                    if i != -1:
                        datablock = datablock[:i+8]
        
                    for code in self._codes[curr_port].keys():
                        r=re.compile('-|:|\.|\*')
        
                        i = datablock.find(bytearray(map(int,r.split(code))))
                        if i != -1:
                            i+=6
                            i, status = self.parse (datablock, i)
                            i, iskra_time = self.parse (datablock, i)
                            i, unit = self.parse (datablock, i)
                            i, scaler = self.parse (datablock, i)
                            i, value = self.parse (datablock, i)
                            i, value_signature = self.parse (datablock, i)
                            if unit == 0x1E:
                                scaler=scaler-3
                            value = round(value * 10**scaler, 3)
                            self._codes[curr_port][codeXXX](value)  # mknx: added XXX
        
                    cycletime = time.time() - start
                    logger.debug("cycle takes %d seconds", cycletime)

        Kommentar


          #5
          Hi Oliver,

          kannst du die Code Tags korrigieren oder die Datei anhängen? Ohne die Einrückungen kann man leider nicht viel damit anfangen. Danke!
          Mit freundlichen Grüßen
          Niko Will

          Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
          - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

          Kommentar


            #6
            Die Code tags sitzen richtig, aber da im Code leider [code] steht, wird's falsch interpretiert. Kann ich das irgendwie umgehen?

            Kommentar


              #7
              Gute Frage auf die ich leider keine Antwort weiß. Ansonsten mal als File an einen Post anhängen.
              Mit freundlichen Grüßen
              Niko Will

              Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
              - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

              Kommentar


                #8
                Hi,

                ich habe den eigentlichen Code "kaputt" gemacht, in dem ich aus dem code ein codeXXX machte.

                Bis bald

                Marcus

                Kommentar


                  #9
                  Hallo Olli,

                  ich habe auch einen Iskra 681 und nutze das SML Plugin welches im folgenden GIT-Issue angepasst wurde. Bei mir funktioniert das sowohl Seriell als auch mit IPGateway .

                  https://github.com/mknx/smarthome/issues/117

                  Gruß
                  Tobias

                  Kommentar


                    #10
                    Falls jemand Interesse an meiner veränderten Plugin Version für den Iskra MT 681 hat, jetzt auch endlich mal die Datei im Anhang.
                    Angehängte Dateien

                    Kommentar


                      #11
                      Hallo Olli,

                      ich hab hier den gleichen Zähler und den Lesekopf von Udo.
                      Leider bekomme ich keine Daten ausgelesen.
                      Könntest du mir bitte beschreiben oder sagen was ich falsch mache oder mal deine plugin.conf und item Einträge posten.

                      Habe in plugin-Ordner einen Iskra-Ordner angelegt und deine Datei reinkopiert.

                      plugin.conf:

                      Code:
                      [iskra]
                          class_name = iskra
                          class_path = plugins.iskra
                      Item:

                      Code:
                      [Iskra]
                          [[stand]]
                              easymeter_code = 1-0:1.8.0*255
                              device = /dev/ttyUSB0
                              type = num
                      Leider kommt im CLI nix an.
                      Wäre echt super, wenn du helfen könntest. Das DLMS-Plugin bekomm ich nämlich auch nicht zum Laufen.
                      Wie liest du denn den Lesekopf aus, dass da b1b1b1b1b1 usw. kommt?

                      Danke und Grüße

                      Sven

                      EDIT:

                      Erster Erfolg stellt sich ein.
                      Habe in den Items noch easymeter_code gegen iskra_code getauscht. Zählerstand lässt sich nun auslesen. Leider bekomme ich die aktuellen Wirkleistungen nicht angezeigt.

                      Code:
                      [Iskra]
                          [[stand]]
                              iskra_code = 1-0:1.8.0*255
                              device = /dev/ttyUSB0
                              type = num
                          [[leistung]]
                              iskra_code = 1-0:15.7.0*255
                              device = /dev/ttyUSB0
                              type = num
                          [[leistung_L1]]
                              iskra_code = 1-0:21.7.0*255
                              device = /dev/ttyUSB0
                              type = num
                          [[leistung_L2]]
                              iskra_code = 1-0:41.7.0*255
                              device = /dev/ttyUSB0
                              type = num
                          [[leistung_L3]]
                              iskra_code = 1-0:61.7.0*255
                              device = /dev/ttyUSB0
                              type = num
                      Kann das dein Plugin?

                      Danke und Grüße

                      EDIT2:

                      Hallo nochmal! Gut 24h Stunden später bin ich ein bisschen schlauer. Die beiden Werte Wirkenergie total 1.8.0 und Wirkenergie Tarif 1 1.8.1 funktionieren bei mir.
                      Leider bekommen folgenede Items keinen Wert.

                      Code:
                       [[leistung]]
                              iskra_code = 1-0:15.7.0*255
                              device = /dev/ttyUSB0
                              type = num
                          [[leistung_L1]]
                              iskra_code = 1-0:21.7.0*255
                              device = /dev/ttyUSB0
                              type = num
                          [[leistung_L2]]
                              iskra_code = 1-0:41.7.0*255
                              device = /dev/ttyUSB0
                              type = num
                          [[leistung_L3]]
                              iskra_code = 1-0:61.7.0*255
                              device = /dev/ttyUSB0
                              type = num
                      laut volkzähler sollte der ehz das ausspucken. Leider weiß ich nicht, ob das vllt geblockt ist oder ob das plugin das nicht kann. Sitze nun schon den ganzen Abend vor der Datei und versteh leider nur Bahnhof.

                      Wäre schön wenn mir einer sagen könnte, ob ich hier aufgeben kann, weil das plugin das nicht kann oder ich irgendwo nen Murks drin hab.
                      Meine Schnittstelle spuckt folgendes aus. Vllt hilft das auch.

                      Code:
                      0000000 1b 1b 1b 1b 01 01 01 01 76 05 04 71 a7 47 62 00
                      0000020 62 00 72 63 01 01 76 01 01 05 01 7b 37 c1 0b 09
                      0000040 01 49 53 4b 00 03 c2 a0 a0 01 01 63 39 20 00 76
                      0000060 05 04 71 a7 48 62 00 62 00 72 63 07 01 77 01 0b
                      0000100 09 01 49 53 4b 00 03 c2 a0 a0 07 01 00 62 0a ff
                      0000120 ff 72 62 01 65 02 2b 94 67 7a 77 07 81 81 c7 82
                      0000140 03 ff 01 01 01 01 04 49 53 4b 01 77 07 01 00 00
                      0000160 00 09 ff 01 01 01 01 0b 09 01 49 53 4b 00 03 c2
                      0000200 a0 a0 01 77 07 01 00 01 08 00 ff 65 00 00 01 82
                      0000220 01 62 1e 52 ff 59 00 00 00 00 05 7a ec 91 01 77
                      0000240 07 01 00 01 08 01 ff 01 01 62 1e 52 ff 59 00 00
                      0000260 00 00 05 7a ec 91 01 77 07 01 00 01 08 02 ff 01
                      0000300 01 62 1e 52 ff 59 00 00 00 00 00 00 00 00 01 77
                      0000320 07 01 00 10 07 00 ff 01 01 62 1b 52 00 55 00 00
                      0000340 00 ed 01 77 07 01 00 24 07 00 ff 01 01 62 1b 52
                      0000360 00 55 00 00 00 4f 01 77 07 01 00 38 07 00 ff 01
                      0000400 01 62 1b 52 00 55 00 00 00 89 01 77 07 01 00 4c
                      0000420 07 00 ff 01 01 62 1b 52 00 55 00 00 00 15 01 77
                      0000440 07 81 81 c7 82 05 ff 01 01 01 01 83 02 63 40 b3
                      0000460 53 9d 70 e4 6a c9 4b 38 79 94 59 18 40 1c 8c 8b
                      0000500 ee 99 8c d9 4c 24 65 c4 6e 12 b9 6e 66 04 84 2a
                      0000520 d3 b0 20 82 0d e7 d7 aa 6b 97 3b b9 59 01 01 01
                      0000540 63 96 c9 00 76 05 04 71 a7 49 62 00 62 00 72 63
                      0000560 02 01 71 01 63 f8 41 00 1b 1b 1b 1b 1a 00 71 16
                      Hier schaffe ich es immerhin die Anfangs- und Endsequenz zu erkennen. Aber ich habe keinen Schimmer wie das Plugin da den Zählerstand rausliest.
                      Naja, die Hoffnung ist noch nicht ganz weg, dass ich auch die aktuelle Leistung ablesen kann. Ich Display vom ehz steht sie schon und da stehen doch die Chancen gut, dass der die auch ausgibt.

                      Schönes Wochenende und jetzt schon Danke für lesen.

                      Sven

                      Kommentar


                        #12
                        Ich habe es geschafft und würde gerne für alle die das selbe Problem haben das ganze mal noch erklären.

                        Den entscheidenden Schritt habe ich hier( volkszaehler.org - wiki - EMH eHZ-H ) gefunden. Da wird das ganze HEX-Zeugs nämlich erklärt. Mit Hilfe dieser Erklärung lässt sich erkennen, dass alle Codes mit 07 01 00 anfangen.
                        Code:
                        0000000 1b 1b 1b 1b 01 01 01 01 76 05 04 71 a7 47 62 00
                        0000020 62 00 72 63 01 01 76 01 01 05 01 7b 37 c1 0b 09
                        0000040 01 49 53 4b 00 03 c2 a0 a0 01 01 63 39 20 00 76
                        0000060 05 04 71 a7 48 62 00 62 00 72 63 07 01 77 01 0b
                        0000100 09 01 49 53 4b 00 03 c2 a0 a0 07 01 00 62 0a ff
                        0000120 ff 72 62 01 65 02 2b 94 67 7a 77 07 81 81 c7 82
                        0000140 03 ff 01 01 01 01 04 49 53 4b 01 77 07 01 00 00
                        0000160 00 09 ff 01 01 01 01 0b 09 01 49 53 4b 00 03 c2
                        0000200 a0 a0 01 77 [B]07 01 00[/B] 01 08 00 ff 65 00 00 01 82
                        0000220 01 62 1e 52 ff 59 00 00 00 00 05 7a ec 91 01 77
                        0000240 [B]07 01 00[/B] 01 08 01 ff 01 01 62 1e 52 ff 59 00 00
                        0000260 00 00 05 7a ec 91 01 77 [B]07 01 00[/B] 01 08 02 ff 01
                        0000300 01 62 1e 52 ff 59 00 00 00 00 00 00 00 00 01 77
                        0000320 [B]07 01 00[/B] 10 07 00 ff 01 01 62 1b 52 00 55 00 00
                        0000340 00 ed 01 77 [B]07 01 00[/B] 24 07 00 ff 01 01 62 1b 52
                        0000360 00 55 00 00 00 4f 01 77 [B]07 01 00[/B] 38 07 00 ff 01
                        0000400 01 62 1b 52 00 55 00 00 00 89 01 77 [B]07 01 00[/B] 4c
                        0000420 07 00 ff 01 01 62 1b 52 00 55 00 00 00 15 01 77
                        0000440 07 81 81 c7 82 05 ff 01 01 01 01 83 02 63 40 b3
                        0000460 53 9d 70 e4 6a c9 4b 38 79 94 59 18 40 1c 8c 8b
                        0000500 ee 99 8c d9 4c 24 65 c4 6e 12 b9 6e 66 04 84 2a
                        0000520 d3 b0 20 82 0d e7 d7 aa 6b 97 3b b9 59 01 01 01
                        0000540 63 96 c9 00 76 05 04 71 a7 49 62 00 62 00 72 63
                        0000560 02 01 71 01 63 f8 41 00 1b 1b 1b 1b 1a 00 71 16
                        Diese Zahlenfolge habe ich in der HEX-Abfolge aus dem obigen Post gesucht und festgestellt, dass die weiteren Zahlen falsch waren.
                        Als HEX steht da nämlich 10 was dezimal 16 bedeuten muss (24h=36d, 38h=56d und 4ch=76d). Habe nun also die ganzen OBIS-Codes geändert und plötzlich lief es.
                        Code:
                        [[leistung]]
                                iskra_code = 1-0:16.7.0*255
                                device = /dev/ttyUSB0
                                type = num
                            [[leistung_L1]]
                                iskra_code = 1-0:36.7.0*255
                                device = /dev/ttyUSB0
                                type = num
                            [[leistung_L2]]
                                iskra_code = 1-0:56.7.0*255
                                device = /dev/ttyUSB0
                                type = num
                            [[leistung_L3]]
                                iskra_code = 1-0:76.7.0*255
                                device = /dev/ttyUSB0
                                type = num
                        Code:
                        > ls Iskra
                        Items:
                        ======
                        Iskra
                        Iskra.stand = 9194.353
                        Iskra.stand_T1 = 9194.353
                        Iskra.stand_T2 = 0
                        Iskra.leistung = 233
                        Iskra.leistung_L1 = 78
                        Iskra.leistung_L2 = 136
                        Iskra.leistung_L3 = 18
                        Hatte mich zunächst auf die Angaben zum Iskra MT681 bei volkzaehler verlassen. Das war wohl der Fehler.

                        Trotzdem Danke allen fürs lesen!!
                        Bei Fragen stehe ich zur Verfügung.

                        Grüße
                        Sven

                        Kommentar


                          #13
                          keine Werte

                          Hallo Zusammen,

                          ich versuche gerade auch das iskra plugin ans laufen zu bekommen, jedoch bekomme ich keine Werte.

                          Mein ISKRA MT 681, liefert folgende Daten:

                          PHP-Code:
                          1B1B1B1B0101010176050BCE80D962006200726301017601010503EF8049
                          0908050E422D4C563E016200638E1A0076050BCE80DA6200620072630701
                          77010908050E422D4C563E01017577078181C78203FF010101010649534B
                          52410177070100000000FF010101010908050E422D4C563E017707010001
                          0801FF628201621E52FF69000000000653240B0177070100600505FF0101
                          010162800177070100010700FF0101621B520055000000B401010163B218
                          0076050BCE80DB6200620072630201710163B123000000001B1B1B1B1A03
                          42511B1B1B1B0101010176050BCE80DC62006200726301017601010503EF
                          804A0908050E422D4C563E01620063BF110076050BCE80DD620062007263
                          070177010908050E422D4C563E01017577078181C78203FF010101010649
                          534B52410177070100000000FF010101010908050E422D4C 
                          PHP-Code:
                          Zählerstand [kWh]
                          linkes Trennzeichen (Hex):FF 62 82 01 62 1E 52 FF 69
                          rechtes Trennzeichen 
                          (Hex): 01 77 07 00 00 60 01 FF
                          Leistung 
                          [W]
                          linkes Trennzeichen (Hex): FF 01 01 62 1B 52 00 55
                          rechtes Trennzeichen 
                          (Hex): 01 01 01 63 
                          items:
                          PHP-Code:
                          [iskra]
                              [[
                          stand]]
                                  
                          iskra_code 1-0:1.8.1*255
                                  device 
                          = /dev/ttyUSB0
                                  type 
                          num
                              
                          [[leistung]]
                                  
                          iskra_code 1-0:15.7.0*255
                                  device 
                          = /dev/ttyUSB0
                                  type 
                          num 
                          cli:
                          PHP-Code:
                          ls iskra
                          Items
                          :
                          ======
                          iskra
                          iskra
                          .stand 0
                          iskra
                          .leistung 
                          Hat jemand eine Idee, was nicht passt?
                          Angehängte Dateien

                          Kommentar


                            #14
                            Hallo Zusammen,

                            habe es teilweise jetzt hinbekommen, pyserial war nicht installiert.

                            Leider bekomme ich nur einen Wert ausgelesen.

                            PHP-Code:
                            iskra
                            iskra
                            .stand 10618.098
                            iskra
                            .leistung 0

                            [iskra]
                                [[
                            stand]]
                                    
                            iskra_code 1-0:1.8.1*255
                                    device 
                            = /dev/ttyUSB0
                                    type 
                            num
                                
                            [[leistung]]
                                    
                            type num
                                    iskra_code 
                            1-0:15.7.0*255
                                    device 
                            = /dev/ttyUSB0 
                            Laut der SPECS sollte der 1-0:15.7.0*255 die Momentane Leistung anzeigen, mit Bash Mitteln wird es auch angezeigt.

                            Gruß
                            spars

                            Kommentar


                              #15
                              Moin,

                              auf die Gefahr hin, hier Nekrophilie zu betreiben...

                              Ich habe seit einer ganzen Weile das iskra-Plugin von olli zuverlässig laufen. (Gefühlt) seit dem Umstieg auf shng 1.4.2 habe ich häufig segfaults, die ohne das iskra-Plugin nicht auftreten.

                              Bei dem Versuch, mal mit einem abgespeckten sh.py nur das iskra-Plugin zu aktivieren und zu debuggen, bin ich auf einen Punkt gestoßen, der mich irritiert. Ich habe den Quellcode mal bereinigt (Leserlichkeit, unbenutzte Module/Variablen entfernt, anschließend Test -> läuft bislang unverändert).

                              Dabei bin ich über die Zeile (neu, im Blockkommentar auskommentiert) 116 mit dem Inhalt
                              Code:
                              j = 1
                              gestolpert. Ist das ein Relikt, weil j früher mal genutzt wurde? Ist das ein Typo, und es ist eigentlich i gemeint? Müsste i dann auf 1 (= 1) oder um ein erhöht werden (+= 1)?


                              (das code in eckigen Klammern habe ich mit einem X "deaktiviert"...)
                              Code:
                              #  Copyright 2013 KNX-User-Forum e.V.            http://knx-user-forum.de/
                              #
                              #  This file is part of SmartHome.py.    http://mknx.github.io/smarthome/
                              #
                              #  SmartHome.py is free software: you can redistribute it and/or modify
                              #  it under the terms of the GNU General Public License as published by
                              #  the Free Software Foundation, either version 3 of the License, or
                              #  (at your option) any later version.
                              #
                              #  SmartHome.py is distributed in the hope that it will be useful,
                              #  but WITHOUT ANY WARRANTY; without even the implied warranty of
                              #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                              #  GNU General Public License for more details.
                              #
                              #  You should have received a copy of the GNU General Public License
                              #  along with SmartHome.py. If not, see <http://www.gnu.org/licenses/>.
                              #
                              
                              import logging
                              import serial
                              import re
                              import time
                              
                              logger = logging.getLogger('iskra')
                              
                              
                              class iskra():
                              
                                  def __init__(self, smarthome):
                                      self._sh = smarthome
                                      self._cycle = 30
                                      self._timeout = 8
                                      self._codes = dict()
                              
                                  def run(self):
                                      self._sh.scheduler.add(
                                          'iskra', self.update_status, cycle=self._cycle)
                                      self.alive = True
                              
                                  def stop(self):
                                      self.alive = False
                              
                                  # parse items, if item has parameter netio_port
                                  # add item to local list
                                  def parse_item(self, item):
                                      if 'iskra_code' in item.conf:
                              
                                          if item.conf['device'] not in self._codes:
                                              self._codes[item.conf['device']] = dict()
                                          self._codes[item.conf['device']][
                                              item.conf['iskra_code']] = item
                              
                                      return None
                              
                                  def con2int8(self, val):
                                      if val > 0x7f:
                                          val -= 0x100
                                      return val
                              
                                  def con2int16(self, val):
                                      if val > 0x7fff:
                                          val -= 0x10000
                                      return val
                              
                                  def con2int32(self, val):
                                      if val > 0x7fffffff:
                                          val -= 0x100000000
                                      return val
                              
                                  def con2int64(self, val):
                                      if val > 0x7fffffffffffffff:
                                          val -= 0x10000000000000000
                                      return val
                              
                                  def parse(self, data, i):  # data, i):
                                      num = data[i]
                                      logger.debug("parse: {}".format(num))
                                      if num == 0x52:
                                          val = self.con2int8(int.from_bytes(
                                              data[i + 1:i + 2], byteorder='big'))
                                          i += 2
                                      elif num == 0x53:
                                          val = self.con2int16(int.from_bytes(
                                              data[i + 1:i + 3], byteorder='big'))
                                          i += 3
                                      elif num == 0x55:
                                          val = self.con2int32(int.from_bytes(
                                              data[i + 1:i + 5], byteorder='big'))
                                          i += 5
                                      elif num == 0x59:
                                          val = self.con2int64(int.from_bytes(
                                              data[i + 1:i + 9], byteorder='big'))
                                          i += 9
                                      elif num == 0x62:
                                          val = int.from_bytes(data[i + 1:i + 2], byteorder='big')
                                          i += 2
                                      elif num == 0x63:
                                          val = int.from_bytes(data[i + 1:i + 3], byteorder='big')
                                          i += 3
                                      elif num == 0x65:
                                          val = int.from_bytes(data[i + 1:i + 5], byteorder='big')
                                          i += 5
                                      elif num == 0x69:
                                          val = int.from_bytes(data[i + 1:i + 9], byteorder='big')
                                          i += 9
                                      elif num == 0x01:
                                          i += 1
                                          val = 'kein Wert'
                                      else:
                                          print ('Error ')
                                          print (data[i])
                              
                              #
                              #
                              #   wofür? j ist nicht benutzt. Ist i gemeint? -> ggf. i += 1?
                              #           j = 1
                              #
                              #
                              
                                          val = ''
                                      logger.debug("parse: return i: {}, val: {}".format(i, val))
                                      return (i, val)
                              
                                  def update_status(self):
                              
                                      datablock = bytearray()
                                      end_seq = b'\x1b\x1b\x1b\x1b\x1a'
                              
                                      for curr_port in self._codes.keys():
                                          ser = serial.Serial(
                                              port=curr_port,
                                              timeout=3,
                                              baudrate=9600,
                                              # bytesize=serial.SEVENBITS,
                                              # parity=serial.PARITY_NONE,
                                              stopbits=serial.STOPBITS_ONE)
                              
                                          start = time.time()
                                          ser.flushInput()
                              
                                          # read next datablock
                                          datablock = []
                                          datablock = ser.read(1500)
                              
                                          # close serial connection
                                          ser.close()
                              
                                          i = datablock.find(end_seq)
                                          if i != -1:
                                              datablock = datablock[i + 8:]
                              
                                          # wenn nach end_seq gesucht wird,
                                          # letzte 3 zeichen Pruefsumme etc entfernen
                                          # datablock = datablock[3:]
                                          i = datablock.find(end_seq)
                                          if i != -1:
                                              datablock = datablock[:i + 8]
                              
                                          for code in self._codes[curr_port].keys():
                                              r = re.compile('-|:|\.|\*')
                              
                                              i = datablock.find(bytearray(map(int, r.split(code))))
                                              if i != -1:
                                                  i += 6
                                                  i, status = self.parse(datablock, i)
                                                  i, iskra_time = self.parse(datablock, i)
                                                  i, unit = self.parse(datablock, i)
                                                  i, scaler = self.parse(datablock, i)
                                                  i, value = self.parse(datablock, i)
                                                  i, value_signature = self.parse(datablock, i)
                                                  if unit == 0x1E:
                                                      scaler = scaler - 3
                                                  value = round(value * 10**scaler, 3)
                                                  self._codes[curr_port][codeX](value)
                              
                                          cycletime = time.time() - start
                                          logger.debug("cycle takes %d seconds", cycletime)

                              Kommentar

                              Lädt...
                              X