Ankündigung

Einklappen
Keine Ankündigung bisher.

Drexel&Weiss Plugin

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

    #31
    Ich habe das Plugin inzwischen "smart" gemacht.. die "alte" Version läuft bei mir seit Monaten wunderbar, die ursprüngliche Variante ging leider gar nicht.. Möchte jemand das Ganze noch testen? Dann würde ich es als Pull Request in den Develop Branch schieben lassen..


    Code:
    #!/usr/bin/env python3
    # vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
    #
    # Copyright 2014 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/>.
    #
    # encoding=utf8  
    
    import logging
    from lib.model.smartplugin import SmartPlugin
    import threading
    import serial
    import os.path
    import time
    import string
    import re
    
    class DuW(SmartPlugin):
        PLUGIN_VERSION = "1.2.0"
        ALLOW_MULTIINSTANCE = False
    
        def __init__(self, smarthome, tty, LU_ID=130, WP_ID=140, Busmonitor=0, device=0, retrylimit=30):
            self._sh = smarthome
            self._LU_ID = LU_ID
            self._WP_ID = WP_ID
            self._cmd = False
            self.LUregl = {}
            self.WPregl = {}
            self.LUcmdl = {}
            self.WPcmdl = {}
            self.devl = {}
            self._is_connected = False
            self._device = int(device)
            self._retrylimit = int(retrylimit)
            self._lock = threading.Lock()
            self.busmonitor = Busmonitor
            self._pollservice = False
    
            self.devl[1] = {'device': 'aerosilent primus', 'cmdpath':
                            smarthome.base_dir + '/plugins/drexelundweiss/aerosilent_primus.txt'}
            self.devl[2] = {'device': 'aerosilent topo', 'cmdpath':
                            smarthome.base_dir + '/plugins/drexelundweiss/aerosilent_topo.txt'}
            self.devl[3] = {'device': 'aerosilent micro', 'cmdpath':
                            smarthome.base_dir + '/plugins/drexelundweiss/aerosilent_micro.txt'}
            self.devl[4] = {'device': 'aerosmart s', 'cmdpath':
                            smarthome.base_dir + '/plugins/drexelundweiss/aerosmart_s.txt'}
            self.devl[5] = {'device': 'aerosmart m', 'cmdpath':
                            smarthome.base_dir + '/plugins/drexelundweiss/aerosmart_m.txt'}
            self.devl[6] = {'device': 'aerosmart l', 'cmdpath':
                            smarthome.base_dir + '/plugins/drexelundweiss/aerosmart_l.txt'}
            self.devl[7] = {'device': 'aerosmart xls', 'cmdpath':
                            smarthome.base_dir + '/plugins/drexelundweiss/aerosmart_xls.txt'}
            self.devl[8] = {'device': 'aerosilent centro', 'cmdpath':
                            smarthome.base_dir + '/plugins/drexelundweiss/aerosilent_centro.txt'}
            self.devl[9] = {'device': 'termosmart sc', 'cmdpath':
                            smarthome.base_dir + '/plugins/drexelundweiss/termosmart_sc.txt'}
            self.devl[10] = {'device': 'x2', 'cmdpath':
                             smarthome.base_dir + '/plugins/drexelundweiss/x2.txt'}
            self.devl[11] = {'device': 'aerosmart mono', 'cmdpath':
                             smarthome.base_dir + '/plugins/drexelundweiss/aerosmart_mono.txt'}
            self.devl[13] = {'device': 'aerosilent bianco', 'cmdpath':
                             smarthome.base_dir + '/plugins/drexelundweiss/aerosilent_bianco.txt'}
            self.devl[14] = {'device': 'x2 plus', 'cmdpath':
                             smarthome.base_dir + '/plugins/drexelundweiss/x2_plus.txt'}
            self.devl[15] = {'device': 'aerosilent business', 'cmdpath':
                             smarthome.base_dir + '/plugins/drexelundweiss/aerosilent_business.txt'}
            self.devl[17] = {'device': 'aerosilent stratos', 'cmdpath':
                             smarthome.base_dir + '/plugins/drexelundweiss/aerosilent_stratos.txt'}
    
            try:
                self._port = serial.Serial(tty, 115200, timeout=5)
            except:
                self.logger.error("DuW: could not open {}.".format(tty))
                return
            else:
                self._is_connected = True
    
            self._get_device_type()
            if self._cmd:
                self._load_cmd()
    
        def _convertresponse(self,antwort,teil):
            antwort = antwort.decode()
            #self.logger.debug("DuW: Antwort: {}".format(antwort))
            allow = string.digits + ' '
            antwort = re.sub('[^%s]' % allow, '', antwort)
            liste = antwort.splitlines()
            try:
                antwort = liste[0].split()
            except:
                antwort = str("-1")
            if type(antwort) is list and len(antwort) >= 2:
                #self.logger.debug("DuW: Ergebnis ist Liste: {0}".format(antwort))
                if teil == 'id':
                    antwort = str(antwort[0])
                elif teil == 'register':
                    try:
                        antwort = str(antwort[1])
                    except:
                        antwort = '-1'
                elif teil == 'data':
                    try:
                        antwort = str(antwort[2])
                    except:
                        antwort = '-1'
            else:
                #self.logger.debug("DuW: Antwort ist Einzelwert: {0}".format(antwort))
                antwort = str(antwort)
            allow = string.digits
            antwort = re.sub('[^%s]' % allow, '', antwort)
            self.logger.debug("DuW: Response: {1} = {0}".format(antwort, teil))
            return int(antwort)
    
        def _get_device_type(self):
            self.alive = True
            if self._is_connected:
                (data, done) = self._read_register('LU\n', 5000, 1, 0)
                if done:
                    if data in self.devl:
                        self.logger.info("DuW: device: {}".format(self.devl[data]['device']))
                        if os.path.isfile(self.devl[data]['cmdpath']):
                            self._cmd = self.devl[data]['cmdpath']
                            self.logger.debug("DuW: Self Command:{}".format(self._cmd))
                        else:
                            self.logger.error("DuW: no command file found at {}".format(self.devl[data]['cmdpath']))
                            self._cmd = False
    
                    else:
                        self.logger.error("DuW: device not supported: {}".format(data))
                        self._cmd = False
                else:
                    self.logger.error("DuW: Error reading device type! Trying to activate configured device")
                    if os.path.isfile(self.devl[self._device]['cmdpath']):
                        self._cmd = self.devl[self._device]['cmdpath']
                        self.logger.info("DuW: device: {0}".format(self.devl[self._device]['device']))
            else:
                self._cmd = False
                self.logger.error("DuW: no connection")
            self.alive = False
    
        def _send_DW(self, data, pcb):
            if not self._is_connected:
                return False
    
            if (pcb == 'LU\n'):
                device_ID = self._LU_ID
            elif(pcb == 'WP\n'):
                device_ID = self._WP_ID
            else:
                self.logger.error("DuW: wrong pcb description")
                return
    
            if not self._lock.acquire(timeout=2):
                return
            try:
                #self._port.write((str(device_ID) + " " + data + "\r\n").encode())
                self._port.write("{0} {1}\r\n".format(device_ID,data).encode())
            except Exception as e:
                self.logger.exception("DuW: Problem sending {0}".format(e))
            finally:
                self._lock.release()
    
        def _get_register_info(self, register, pcb):
    
            if (pcb == 'LU\n'):
                if register in self.LUcmdl:
                    return self.LUcmdl[register]['reginfo']
                else:
                    return False
            elif(pcb == 'WP\n'):
                if register in self.WPcmdl:
                    return self.WPcmdl[register]['reginfo']
                else:
                    return False
            else:
                self.logger.error("DuW: wrong pcb description")
                return
    
        def _load_cmd(self):
            self.logger.debug("DuW: Opening command file")
            f = open(self._cmd, "r")
            self.logger.debug("DuW: Opened command file")
            try:
                for line in f:
                    if not self._lock.acquire(timeout=2):
                        return
                    try:
                        row = line.split(";")
                        # skip first row
                        if (row[1] == "<Description>"):
                            pass
                        else:
                            if row[7] == 'LU\n':
                                self.LUcmdl[int(row[0])] = {'reginfo': row}
                            elif row[7] == 'WP\n':
                                self.WPcmdl[int(row[0])] = {'reginfo': row}
                            else:
                                self.logger.debug("DuW: Error in Commandfile: " + line)
                    except Exception as e:
                        self.logger.exception("DuW: problems loading commands: {0}".format(e))
                    finally:
                        self._lock.release()
            finally:
                f.close()
    
        def run(self):
            if not self._cmd:
                self.alive = False
                try:
                    if self._is_connected:
                        self._port.close()
                except Exception as e:
                    self.logger.exception(e)
                return
    
            self.alive = True
    
            # LU registers init
            for register in self.LUregl:
                reginfo = self.LUregl[register]['reginfo']
                divisor = int(reginfo[4])
                komma = int(reginfo[5])
                for item in self.LUregl[register]['items']:
                    (data, done) = self._read_register(
                        reginfo[7], register, int(reginfo[4]), int(reginfo[5]))
                    if done:
                        item(data, 'DuW', 'init process')
                    else:
                        self.logger.debug("DuW: Init LU register failed: {}".format(register))
    
            # WP register init
            for register in self.WPregl:
                reginfo = self.WPregl[register]['reginfo']
                divisor = int(reginfo[4])
                komma = int(reginfo[5])
                for item in self.WPregl[register]['items']:
                    (data, done) = self._read_register(
                        reginfo[7], register, int(reginfo[4]), int(reginfo[5]))
                    if done:
                        item(data, 'DuW', 'init process')
                    else:
                        self.logger.debug("DuW: Init WP register failed: {0}".format(register))
    
            # poll DuW interface
            dw_id = 0
            dw_register = 0
            dw_data = 0
            response = bytes()
            self._pollservice = True
            self._port.flushInput()
            try:
                while self.alive:
                    if self._port.inWaiting():
                        if not self._lock.acquire(timeout=2):
                            return
                        try:
                            response += self._port.read()
                            if (len(response) != 0):
                                if (response[-1] == 0x20 and dw_id == 0):
                                    dw_id = self._convertresponse(response,'id')
                                    response = bytes()
    
                                elif (response[-1] == 0x20 and dw_id != 0 and dw_register == 0):
                                    dw_register = self._convertresponse(response,'register')
                                    response = bytes()
    
                                elif (response[-1] == 0x0a):
                                    dw_data = self._convertresponse(response,'data')
    
                                    if (self.busmonitor):
                                        if dw_id == self._LU_ID:
                                            if dw_register in self.LUcmdl:
                                                reginfo = self.LUcmdl[
                                                    dw_register]['reginfo']
                                                divisor = int(reginfo[4])
                                                komma = int(reginfo[5])
                                                self.logger.debug("DuW Busmonitor LU register: {0} {1}: {2}".format(dw_register,reginfo[1],((dw_data / divisor) / (10 ** komma))))
                                            else:
                                                self.logger.debug("DuW Busmonitor: unknown LU register: {0} {1}".format(dw_register,dw_data))
                                        elif dw_id == self._WP_ID:
                                            if dw_register in self.WPcmdl:
                                                reginfo = self.WPcmdl[dw_register][
                                                    'reginfo']
                                                divisor = int(reginfo[4])
                                                komma = int(reginfo[5])
                                                self.logger.debug("DuW Busmonitor WP register: {0} {1}: {2}".format(dw_register,reginfo[1],((dw_data / divisor) / (10 ** komma))))
                                            else:
                                                self.logger.debug("DuW Busmonitor: unknown WP register: {0} {1}".format(dw_register,dw_data))
                                        else:
                                            self.logger.debug(
                                                "DuW Busmonitor: unknown device ID: {}".format(dw_id))
    
                                    if dw_id == self._LU_ID:
                                        if dw_register in self.LUregl:
                                            reginfo = self.LUregl[
                                                dw_register]['reginfo']
                                            divisor = int(reginfo[4])
                                            komma = int(reginfo[5])
                                            for item in self.LUregl[dw_register]['items']:
                                                item(
                                                    ((dw_data / divisor)
                                                     / (10 ** komma)),
                                                    'DuW', 'Poll')
                                        else:
                                            self.logger.debug("DuW: Ignore LU register {}".format(dw_register))
                                    elif dw_id == self._WP_ID:
                                        if dw_register in self.WPregl:
                                            reginfo = self.WPregl[
                                                dw_register]['reginfo']
                                            divisor = int(reginfo[4])
                                            komma = int(reginfo[5])
                                            for item in self.WPregl[dw_register]['items']:
                                                item(
                                                    ((dw_data / divisor)
                                                     / (10 ** komma)),
                                                    'DuW', 'Poll')
                                        else:
                                            self.logger.debug("DuW: Ignore WP register {}" .format(dw_register))
                                    else:
                                        self.logger.debug("DuW: unknown device ID: {}".format(dw_id))
    
                                    dw_id = 0
                                    dw_register = 0
                                    dw_data = 0
                                    response = bytes()
                            else:
                                response = bytes()
                                dw_id = 0
                                dw_register = 0
                                dw_data = 0
                                self.logger.debug("DuW: Read timeout")
                        except Exception as e:
                            self.logger.exception("DuW: Polling error {0}".format(e))
                        finally:
                            self._lock.release()
                    time.sleep(0.1)
                # exit poll service
                self._pollservice = False
            except Exception as e:
                self.logger.exception("DuW: not alive error, {0}".format(e))
    
        def stop(self):
            self.alive = False
            # wait until pollservice closed
            while self._pollservice == True:
                pass
            try:
                if self._is_connected:
                    self._port.close()
            except Exception as e:
                self.logger.exception("DuW: Stop Exception, {}".format(e))
    
        def write_DW(self, pcb, register, value):
            self._send_DW("{0:d} {1:d}".format(int(register), int(value)), pcb)
    
        def req_DW(self, pcb, register):
            self._send_DW("{0:d}".format(int(register)), pcb)
    
        def _read_register(self, pcb, register, divisor, komma):
            if (pcb == 'LU\n'):
                device_ID = self._LU_ID
            elif(pcb == 'WP\n'):
                device_ID = self._WP_ID
            else:
                self.logger.error("DuW: wrong pcb description")
    
            self._port.flushInput()
            self.req_DW(pcb, str(register + 1))
            response = bytes()
            dw_id = 0
            dw_register = 0
            dw_data = 0
            retries = 0
            if not self._lock.acquire(timeout=2):
                return
            try:
                while self.alive:
                    response += self._port.read()
                    allow = string.digits
                    test = re.sub('[^%s]' % allow, '', str(response.decode()))
                    if len(test) != 0:
                        if (response[-1] == 0x20 and dw_id == 0):
                            dw_id = self._convertresponse(response,'id')
                            response = bytes()
    
                        elif response[-1] == 0x20 and dw_id != 0 and dw_register == 0:
                            dw_register = self._convertresponse(response,'register')
                            response = bytes()
    
                        elif response[-1] == 0x0a:
                            dw_data = self._convertresponse(response,'data')
                            break
                            response = bytes()
                    else:
                        retries += 1
                        self.logger.info("DuW: read timeout: {0}. Retries: {1}".format(response, retries))
                        if retries >= self._retrylimit:
                           break
                    time.sleep(0.1)
            except Exception as e:
                self.logger.warning("DuW: Read error: {0}".format(e))
            finally:
                self._lock.release()
    
            if(dw_id == device_ID and (dw_register - 1) == register):
                self.logger.debug("DuW:  Read {1} on Register: {0}".format(register,dw_data))
                try:
                    return (((dw_data / divisor) / (10 ** komma)), 1)
                except:
                    self.logger.debug("Division durch Null Problem")
                    return (((dw_data / 1) / (10 ** 1)), 1)
            else:
                self.logger.error("DuW: read errror Device ID: {0}, register {1}".format(dw_id,dw_register - 1))
                return (0, 0)
    
        def parse_item(self, item):
            if not self._cmd:
                return None
            if self.has_iattr(item.conf, 'DuW_LU_register'):
                register = int(self.get_iattr_value(item.conf, 'DuW_LU_register'))
                reginfo = self._get_register_info(register, 'LU\n')
                if reginfo:
                    if not register in self.LUregl:
                        self.LUregl[register] = {'reginfo':
                                                 reginfo, 'items': [item]}
                    else:
                        if not item in self.LUregl[register]['items']:
                            self.LUregl[register]['items'].append(item)
    
                    return self.update_item
                else:
                    self.logger.warning("DuW: LU register: {} not supported by configured device!".format(register))
                    return None
            if self.has_iattr(item.conf, 'DuW_WP_register'):
                register = int(self.get_iattr_value(item.conf, 'DuW_WP_register'))
                reginfo = self._get_register_info(register, 'WP\n')
                if reginfo:
                    if not register in self.WPregl:
                        self.WPregl[register] = {'reginfo':
                                                 reginfo, 'items': [item]}
                    else:
                        if not item in self.WPregl[register]['items']:
                            self.WPregl[register]['items'].append(item)
    
                    return self.update_item
                else:
                    self.logger.warning("DuW: WP register: {} not supported by configured device!".format(register))
                    return None
    
        def update_item(self, item, caller=None, source=None, dest=None):
            if caller != 'DuW':
                if self.has_iattr(item.conf, 'DuW_LU_register'):
                    register = int(self.get_iattr_value(item.conf, 'DuW_LU_register'))
                    if register in self.LUregl:
                        reginfo = self.LUregl[register]['reginfo']
                        data = item() * int(reginfo[4]) * (10 ** int(reginfo[5]))
                        if (data < int(reginfo[2]) or data > int(reginfo[3])):
                            self.logger.error("DuW: value of LU register: {} out of range, changes ignored!".format(register))
                            pass
                        else:
                            if reginfo[6] == 'R/W':
                                self.logger.debug("DuW: update LU register: {0} {1} with {2}".format(register,reginfo[1],data))
                                self.write_DW(reginfo[7], register, data)
                            else:
                                self.logger.warning("DuW: tried to update read only LU register: {}".format(register))
                if self.has_iattr(item.conf, 'DuW_WP_register'):
                    register = int(self.get_iattr_value(item.conf, 'DuW_WP_register'))
                    if register in self.WPregl:
                        reginfo = self.WPregl[register]['reginfo']
                        data = item() * int(reginfo[4]) * (10 ** int(reginfo[5]))
                        if (data < int(reginfo[2]) or data > int(reginfo[3])):
                            self.logger.error("DuW: value of WP register {} out of range, changes ignored!".format(register))
                            pass
                        else:
                            if reginfo[6] == 'R/W':
                                self.logger.debug("DuW: update WP register: {0} {1} with {2}".format(register,reginfo[1],data))
                                self.write_DW(reginfo[7], register, data)
                            else:
                                self.logger.warning("DuW: tried to update read only WP register: {}".format(register))

    Kommentar


      #32
      Ich würde es testen - hab ja schon deine vorige Version im Einsatz. Auf was soll ich genau achten?

      Kommentar


        #33
        Im Prinzip mal aufs Logging.. ob du Warnungen oder Fehler bekommst. Ob eine Verbindung stattfindet und wann genau. Und ob es generell funzt
        Wäre cool, wenn du dann mal ein Logfile hier posten könntest.
        Am besten im logging.yaml unter loggers DEBUG für plugin.drexelundweiss aktivieren. Das müsste jetzt ja Dank Smart Plugin funzen, hoff ich.

        Kommentar


          #34
          Also auf den ersten Blick funktioniert es ganz wunderbar. Meine Stratos wird beim starten erkannt. Änderungen in SmartVISU werden von der Stratos empfangen und umgesetzt. Auch die Änderungen am Raumcontroller werden in smartHOME empfangen und in smartVISU angezeigt. Super Sache, danke für die Aktualisierung. Ich lass es mal weiter laufen und beobachte.

          Kommentar


            #35
            Oki, fein, bei mir läuft eigtl. auch immer alles glatt.. mal sehen, wie ich das ins develop bekomme

            Kommentar


              #36
              hi Bernator , dürfen wir dich unter https://github.com/smarthomeNG/smarthome/wiki/Plugins als supporter des plugins eintragen? Onkelandy hat es inzwischen in ein smartplugin konvertiert.

              Kommentar


                #37
                Sorry für die späte Rückmeldung....bin zeitlich sehr startk eingeschränkt und werde daher aktuell erstmal nicht wirklich was machen, wenns aber Fragen gibt bin ich gerne bereit Auskunft zu geben....

                Kommentar


                  #38
                  Hallo!
                  ich hab grade smarthomeNG mit dem Plugin für meine aerosmart m zum laufen gebracht. Es werden beim Start auch alle items abgerufen und ich kann zB auch die Soll-Raumtemperartur ändern. Leider schaffe ich es aber nicht, dass die items auch laufend aktualisiert werden. Ich hätte gerne, dass die Werte zB jede Minute neu abgefragt werden. Kann mir da jemand helfen?

                  Kommentar


                    #39
                    Hi friep ! Du meinst, wenn du was am Panel änderst, wird diese Änderung nicht sofort im Plugin abgebildet? Ja, das geht mir auch so.. Ist eigtl. komisch, weil das Plugin ja eigtl. durchgehend auf Änderungen lauschen sollte. Müsste man sich nochmals im Detail ansehen.
                    Habe aktuell auch grad das Problem, dass die Antwort immer 2, 3 Befehl nachhinkt und somit keine vernünftige Initialisierung möglich ist. Keine Ahnung, woran das gerade liegt. Hier wäre ein Re-Send der Anfrage natürlich kein Fehler.

                    Für das wiederholte Abrufen der Werte müsste man einen Scheduler einbauen.

                    Melde mich, sobald da was läuft.

                    Kommentar


                      #40
                      Hallo Jungs!

                      Habe seit einiger zeit massive Probleme mit den Antworten der duw Anlage. Irgendwie funkt immer das Register 1348 bzw 1347 dazwischen. Passiert das sonst noch wem?
                      Wenn ich ein ganz simples Programm erstell, das im Loop immer die gleiche Anfrage stellt und dann das Ergebnis ausliest, funktioniert alles beinahe fehlerfrei. Essentiell scheint ein time.sleep(0.1) zwischen Schreiben und Lesen zu sein.

                      Wenn ich beim (etwas umgebauten Plugin) den gleichen Code verwende, kommt nicht nachvollziehbares Zeugs..
                      Code:
                      2017-02-07  00:24:52 DEBUG    DuW          ID: 140, Register: 1348, Data: 0
                      2017-02-07  00:24:52 DEBUG    DuW          DuW:  Read 0. Register: 1347 Should be: 818. Device ID: 140. Should be: 140
                      2017-02-07  00:24:52 ERROR    DuW          DuW: read errror Device ID: 140, register 1347
                      2017-02-07  00:24:52 DEBUG    DuW          DuW: Init WP register failed: 818
                      2017-02-07  00:24:53 DEBUG    DuW          Result: [140, 5436, 130]
                      2017-02-07  00:24:53 DEBUG    DuW          ID: 140, Register: 5436, Data: 130
                      2017-02-07  00:24:53 DEBUG    DuW          DuW:  Read 130. Register: 5435 Should be: 5492. Device ID: 140. Should be: 140
                      2017-02-07  00:24:53 ERROR    DuW          DuW: read errror Device ID: 140, register 5435
                      2017-02-07  00:24:53 DEBUG    DuW          DuW: Init WP register failed: 5492
                      2017-02-07  00:24:53 DEBUG    DuW          Result: [140, 7000, 0]
                      2017-02-07  00:24:53 DEBUG    DuW          ID: 140, Register: 7000, Data: 0
                      2017-02-07  00:24:53 DEBUG    DuW          DuW:  Read 0. Register: 6999 Should be: 830. Device ID: 140. Should be: 140
                      2017-02-07  00:24:53 ERROR    DuW          DuW: read errror Device ID: 140, register 6999
                      2017-02-07  00:24:53 DEBUG    DuW          DuW: Init WP register failed: 830
                      2017-02-07  00:24:54 DEBUG    DuW          Result: [140, 7500, 0]
                      2017-02-07  00:24:54 DEBUG    DuW          ID: 140, Register: 7500, Data: 0
                      2017-02-07  00:24:54 DEBUG    DuW          DuW:  Read 0. Register: 7499 Should be: 1142. Device ID: 140. Should be: 140
                      2017-02-07  00:24:54 ERROR    DuW          DuW: read errror Device ID: 140, register 7499
                      2017-02-07  00:24:54 DEBUG    DuW          DuW: Init WP register failed: 1142
                      Irgendwelche Ideen?

                      Kommentar


                        #41
                        Hallo, kann man das Modell Exos (https://www.drexel-weiss.at/produkte...rosilent-exos/) hinzufügen?

                        anbei wäre die passende Datei:

                        Code:
                        <Register>;<Description>;<min>;<max>;<divisor>;<comma>;<access>;<pcb>
                        5328;Absenkung der Lüfterstufe 1;30;70;1;0;R/W;LU
                        1066;Aktive Lüfterstufe;0;4;1;0;R;LU
                        1444;Anforderung Brand;0;1;1;0;R/W;LU
                        1292;Anforderung der Ventilatoren durch Wärmepumpe;0;1;1;0;R;LU
                        1336;Anforderung der Ventilatoren durch Zonenregelung;0;1;1;0;R;LU
                        1338;Anforderung Disbalance (Boilerüberwärmung);0;1;1;0;R;LU
                        1356;Anforderung LST3 Feuchte;0;1;1;0;R;LU
                        1450;Anforderung Nachtkühlung;0;1;1;0;R;LU
                        1218;Anforderung: Beschattung;0;1;1;0;R;LU
                        1216;Anforderung: Bypassklappe;0;1;1;0;R;LU
                        1462;Anforderung: Extern-Heizstufe 2;0;1;1;0;R;LU
                        228;Anforderung: LST3_EXT;0;1;1;0;R;LU
                        1032; Anforderung: Raum-Heizstufe ;0;1;1;0;R;LU
                        1034;Anforderung: Raum-Heizstufe 2;0;1;1;0;R;LU
                        1198;Anforderung: Sole für Außenlufterwärmung;0;1;1;0;R;LU
                        1322;Anforderung: Sommerautomatik;0;1;1;0;R;LU
                        1422;Anforderung: Sperre Venti bei Abtauen;0;1;1;0;R;LU
                        202;Außenluft;-28000;100000;100;1;R;LU
                        5304;Außenluftfühler vorhanden?;0;1;1;0;R;LU
                        286;Außentemp.;-28000;100000;100;1;R;LU
                        1412;Außentemperatur (gedämpft);-50000000;50000000;100000;1;R;LU
                        5668;Außentemperatur Nachtauskühlung;5000;20000;100;1;R/W;LU
                        5632;Außentemperatur vorhanden;0;1;1;0;R;LU
                        5336;Beschattungsfunktion;0;1;1;0;R;LU
                        5002;Betriebsar;0;7;1;0;R/W;LU
                        1300;Betriebsart Sommerautomatik;0;2;1;0;R;LU
                        902;Betriebsstunden: Abluftventilator;0;600000000;60;0;R;LU
                        964;Betriebsstunden: Beschattung;0;600000000;60;0;R;LU
                        932;Betriebsstunden: Bypassklappe;0;600000000;60;0;R;LU
                        928;Betriebsstunden: Feinstaubfilter;0;600000000;60;0;R;LU
                        940;Betriebsstunden: Frostschutzeinrichtung;0;600000000;60;0;R;LU
                        926;Betriebsstunden: Grobstaubfilter;0;600000000;60;0;R;LU
                        912;Betriebsstunden: Heizstufe 1;0;600000000;60;0;R;LU
                        914;Betriebsstunden: Heizstufe 2;0;600000000;60;0;R;LU
                        962;Betriebsstunden: Lüfterstufe 0;0;600000000;60;0;R;LU
                        904;Betriebsstunden: Lüfterstufe 1;0;600000000;60;0;R;LU
                        906;Betriebsstunden: Lüfterstufe 2;0;600000000;60;0;R;LU
                        908;Betriebsstunden: Lüfterstufe 3;0;600000000;60;0;R;LU
                        944;Betriebsstunden: Reduzierte Lüfterstufe;0;600000000;60;0;R;LU
                        970;Betriebsstunden: Sole-Kreis Außenluft;0;600000000;60;0;R;LU
                        900;Betriebsstunden: Zuluftventilator;0;600000000;60;0;R;LU
                        838;Brandmeldealarm;0;1;1;0;R;LU
                        5068;Brandmeldeanlage vorhanden?;0;1;1;0;R;LU
                        230;CO2;100;1950;1;0;R;LU
                        1048;CO2-Messung;0;1;1;0;R/W;LU
                        5054;CO2-Sensor vorhanden?;0;1;1;0;R;LU
                        5210;Datum;0;99999999;1;0;R/W;LU
                        5020;Drehzahl Abluftventilator;0;10000;100;0;R/W;LU
                        1094;Drehzahl Abluftventilator;0;10000;100;0;R;LU
                        1092;Drehzahl Zuluftventilator;0;10000;100;0;R;LU
                        5018;Drehzahl Zuluftventilator;0;10000;100;0;R/W;LU
                        1232;Druckdifferenz Abluft;0;5000;1;1;R;LU
                        1230;Druckdifferenz Zuluft;0;5000;1;1;R;LU
                        5330;Erhöhung der Lüfterstufe 3;30;100;1;0;R/W;LU
                        5034;Feinstaubfilter vorhanden?;0;1;1;0;R;LU
                        1042;Feinstaubfilter wechseln!;0;127;1;0;R;LU
                        7004;Feinstaubfilter wechseln!;0;1;1;0;R;LU
                        5032;Feinstaubfilter: Standzeit;131400;1051200;60;0;R;LU
                        5384;Funktion "Sommerautomatik";0;1;1;0;R;LU
                        5492;Funktion HEIZUNG+;0;1;1;0;R/W;LU
                        5000;Gerätetyp;1;92;1;0;R;LU
                        946;Gesamt beförderte Kubikmeter;0;600000000;1;0;R;LU
                        960;Gesamt beförderte Luftmenge seit Filterwechsel;0;600000000;1;0;R;LU
                        5360;Grenztemperatur für Vereisungsschutz;-40000;-8000;1000;0;R/W;LU
                        5154;Grobstaubfilter vorhanden?;0;1;0;0;R;LU
                        7002;Grobstaubfilter wechseln!;0;1;1;0;R;LU
                        1040;Grobstaubfilter wechseln!;0;127;1;0;R;LU
                        5164;Grobstaubfilter: Betriebsart Filterüberwachung;1;3;1;0;R;LU
                        5166;Grobstaubfilter: Maximales Fördervolumen;100000;1500000;1;0;R;LU
                        5030;Grobstaubfilter: Standzeit;131400;1051200;60;0;R;LU
                        1178;Hardwaretype;1;6;1;0;R;LU
                        5672;Hysterese Nachtauskühlung Außenluft;2000;5000;100;1;R/W;LU
                        5676;Hysterese Nachtauskühlung Differenz Raum außen;1000;5000;100;1;R/W;LU
                        5670;Hysterese Nachtauskühlung Raum;2000;5000;100;1;R/W;LU
                        7000;Information;0;2147483647;1;0;R;LU
                        1186;Ist-Drehzahl Abluftventilator;0;5000;1;0;R;LU
                        1184;Ist-Drehzahl Zuluftventilator;0;5000;1;0;R;LU
                        1240;Ist-Volumenstrom Abluft;0;1000;1;0;R;LU
                        1238;Ist-Volumenstrom Zuluft;0;1000;1;0;R;LU
                        238;Kontakt: Brandmeldealarm;0;1;1;0;R;LU
                        5192;Kühlung vorhanden?;0;1;1;0;R;LU
                        5270;Maximal zulässige Drehzahl Abluftventilator;1500;6000;1;0;R/W;LU
                        5268;Maximal zulässige Drehzahl Zuluftventilator;1500;6000;1;0;R/W;LU
                        5530;Minimale Drehzahl Abluftventilator;0;10000;100;0;R/W;LU
                        5528;Minimale Drehzahl Zuluftventilator;0;10000;100;0;R/W;LU
                        5674;Nachtauskühlung Differenz Raum zu Außenluft;2000;10000;100;1;R/W;LU
                        5678;Nachtauskühlung vorhanden;0;1;1;0;R;LU
                        5168;Pelletofen vorhanden?;0;1;1;0;R;LU
                        5282;Pelletofen: Anlaufverzögerung;1;60;1;0;R;LU
                        5284;Pelletofen: Mindestlaufzeit;1;60;1;0;R;LU
                        200;Raum;-28000;100000;100;1;R/W;LU
                        282;Raumfeuchte;500;100000;100;1;R/W;LU
                        5558;Raumfeuchte Vorhanden;0;1;1;0;R;LU
                        5016;Raum-Soll;14000;26000;100;1;R/W;LU
                        5666;Raumsollwert Nachtauskühlung;18000;28000;100;1;R/W;LU
                        5338;Raumtemperatur: Beschattung;20000;26000;100;1;R/W;LU
                        252;Relaiskontakt: EXT (LU);0;1;1;0;R;LU
                        226;Revisionstüre;0;1;1;0;R;LU
                        1084;Soll-Volumenstrom Abluft;0;1000;1;0;R;LU
                        5060;Soll-Volumenstrom Lüfterstufe 2;40;600;1;0;R/W;LU
                        1082;Soll-Volumenstrom Zuluft;0;1000;1;0;R;LU
                        5496;Sollwert-Erhöhung Funktion HEIZUNG+;300;2000;100;1;R/W;LU
                        5390;Sommerautomatik Schaltpunkt 1 Zuluftbetrieb;0;2400;1;0;R/W;LU
                        5392;Sommerautomatik Schaltpunkt 2 Normalbetrieb;0;2400;1;0;R/W;LU
                        5394;Sommerautomatik Schaltpunkt 3 Abluftbetrieb;0;2400;1;0;R/W;LU
                        5396;Sommerautomatik Schaltpunkt 4 Normalbetrieb;0;2400;1;0;R/W;LU
                        826;Störung: Abluftventilator;0;1;1;0;R;LU
                        832;Störung: CO2-Sensor;0;1;1;0;R;LU
                        7544;Störung: Fühler Außentemperatur;0;1;1;0;R;LU
                        7564;Störung: Fühler Außentemperatur Timeout;0;1;1;0;R;LU
                        806;Störung: Temperaturfühler Außenluft;0;1;1;0;R;LU
                        804;Störung: Temperaturfühler Raum;0;1;1;0;R;LU
                        7504;Störung: Temperaturfühler Sole Außenluft;0;1;1;0;R;LU
                        840;Störung: Wert nicht zulässig;0;3;1;0;R;LU
                        824;Störung: Zuluftventilator;0;1;1;0;R;LU
                        800;Summenstörung;0;2147483647;1;0;R;LU
                        7500;Summenstörung 2;0;2147483647;1;0;R;LU
                        7566;Summenstörung 3;0;2147483647;1;0;R;LU
                        1156;SW-Version;0;1000000;1;0;R;LU
                        1174;Tag;1;7;1;0;R;LU
                        5340;Temperatur Außenluft: Beschattung;12000;22000;100;1;R/W;LU
                        5452;Temperatur Außenluft: Bypass Kühlung Aus (Bypass öffnen);20000;35000;1000;0;R/W;LU
                        5450;Temperatur Außenluft: Bypass Kühlung Ein (Bypass schliessen);20000;35000;1000;0;R/W;LU
                        5084;Temperatur Außenluft: Bypass öffnen;10000;20000;1000;0;R/W;LU
                        5086;Temperatur Außenluft: Bypass schließen;10000;20000;1000;0;R/W;LU
                        5206;Temperatur Außenluft: Frostschutz;-5000;0;100;1;R/W;LU
                        5090;Temperatur Außenluft: Frostschutz aus;-10000;5000;1000;0;R/W;LU
                        5088;Temperatur Außenluft: Frostschutz ein;-10000;5000;1000;0;R/W;LU
                        5200;Temperatur Außenluft: Kühlung aus;16000;22000;1000;0;R/W;LU
                        5198;Temperatur Außenluft: Kühlung ein;17000;23000;1000;0;R/W;LU
                        5422;Temperatur Außenluft: Reduktion Luftmenge 10%;-20000;0;100;1;R/W;LU
                        5424;Temperatur Außenluft: Reduktion Luftmenge 20%;-30000;-10000;100;1;R/W;LU
                        5386;Temperatur Außenluft: Sommerautomatik aktivieren;10000;19000;1000;0;R/W;LU
                        5388;Temperatur Außenluft: Sommerautomatik deaktivieren;20000;30000;1000;0;R/W;LU
                        206;Temperatur: Sole nach Außenluftvorwärmung;-28000;100000;100;1;R;LU
                        7508;Time-Out: Solltemperatur Raum;0;1;1;0;R;LU
                        7506;Time-Out: Temperaturfühler Raum;0;1;1;0;R;LU
                        5212;Uhrzeit;0;235959;1;0;R/W;LU
                        5442;Uhrzeit und Datum verschicken;0;1;1;0;R;LU
                        1294;Vereisungsschutz;0;1;1;0;R;LU
                        5026;Volumenstrombalance Zuluft - Abluft;-50;30;1;0;R/W;LU
                        1044;Wärmepumpe;0;1;1;0;R;LU
                        1358;Zeitprogramm Lüftung;0;3;1;0;R/W;LU
                        1360;Zeitprogramm Lüftung + CO2;0;4;1;0;R/W;LU
                        1448;Zeitprogramm Nachtkühlung;0;1;1;0;R/W;LU
                        5494;Zeitspanne Funktion HEIZUNG+;1800;14400;60;0;R/W;LU
                        5038;Zeitspanne Funktion PARTY;600;14400;60;0;R/W;LU
                        (von einer anderen Datei die Vorlage geholt und mit den richtigen Registern, welche mir Drexel und Weiß geschickt hat gefüttert)

                        die Modellnummer müsste die 25 sein.

                        Danke

                        Kommentar


                          #42
                          Kannst du's bitte mal testen?
                          https://github.com/onkelandy/plugins...drexelundweiss

                          Kommentar


                            #43
                            danke fürs schnell reinschreiben, ich werds testen wenn ich wieder die möglichkeit habe ... habs geschafft dass ich auf den develop zweig wechsle (smarthomeNG und plugins) und mir dabei anscheinend irgendwas zerschossen habe und jetzt keinen zugriff mehr auf die Lüftung habe (unter anderem) ... ich werde am wochenende das komplettimage aufspielen und nochmal schaun

                            Kommentar


                              #44
                              Ich würd der Einfachheit halber dann einfach den aktuellen drexelundweiss Ordner umbenennen und den oben verlinkten Plugin-Ordner kopieren.

                              Kommentar


                                #45
                                läuft - habe an der Lüftung was umgestellt gehabt, deswegen kein kontakt ...

                                die registerliste kann man noch wie folgt erweitern (funktioniert, obwohl nicht dokumentiert)

                                Code:
                                5274;CO2-Zielwert Luefterstufe0;400;600;1;0;R/W;LU
                                5276;CO2-Zielwert Luefterstufe1;601;799;1;0;R/W;LU
                                5278;CO2-Zielwert Luefterstufe2;800;999;1;0;R/W;LU
                                5280;CO2-Zielwert Luefterstufe3;1000;1500;1;0;R/W;LU
                                Edit: Verbindung ist (ohne Änderung) abgebrochen - kein Kontakt mehr möglich, werde die Lüftung demnächst noch einmal resetten ...
                                Zuletzt geändert von artner; 12.12.2018, 23:26.

                                Kommentar

                                Lädt...
                                X