Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin ComfoAir (KWL Wohnraumlüftung Zehnder, Paul, Wernig)

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

  • Neues Plugin ComfoAir (KWL Wohnraumlüftung Zehnder, Paul, Wernig)

    Mahlzeit allerseits!

    Nachdem es ja beim Wiregate schon ein schönes Plugin für die Anbindung der Zehnder CA350 bzw. artverwandten Wohnraumlüftungsgeräten über RS232 gibt, habe ich mich mal an ein entsprechendes Smarthome.py Plugin gemacht, da mir der Smarthome.py Ansatz am Besten gefällt.

    Bei mir läuft es so:
    • Wernig G90-380 KWL (Baugleich Zehnder CA 350)
    • RS232 Verbindung zu einem Moxa NPort DE-311
    • Die Moxa spielt TCP Server auf Port 5555, dorthin verbindet sich mein Plugin


    Das Plugin ist noch ganz frisch, ich würde es als "Alpha" einstufen.
    Ich bin zwar Informatiker, aber beruflich nicht in Python unterwegs (ist mein erstes Python Projekt) - ich bin daher dankbar für Fehlermeldungen und Verbesserungsvorschläge.

    Momentan existiert nur die Anbindung über TCP, wenn jemand eine KWL direkt über die RS232 angeschlossen hat, ist eine Anpassung an "direkte serielle Verbindung" sicher kein großes Thema.

    Die Protokollbeschreibung ist von hier: http://www.see-solutions.de/sonstige...g_ComfoAir.pdf

    Konzeptuell hab ich mich an bestehende Plugins wie squeezebox angelehnt, das Plugin soll möglichst allgemein-tauglich sein und über die Items erst richtig konfiguriert werden. Hier mal meine Beispielkonfiguration:

    ./plugins/comfoair/__init__.py
    Code:
    #!/usr/bin/env python
    #########################################################################
    # Copyright 2013 Stefan Kals
    #########################################################################
    #  ComfoAir-Plugin for SmartHome.py.  http://mknx.github.com/smarthome/
    #
    #  This plugin 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.
    #
    #  This plugin 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 this plugin. If not, see <http://www.gnu.org/licenses/>.
    #########################################################################
    
    import logging
    import struct
    import time
    import urllib2
    import lib.my_asynchat
    import re
    import encodings
    import threading
    
    logger = logging.getLogger("ComfoAir")
    
    START_SEQUENCE = chr(0x07) + chr(0xF0)
    END_SEQUENCE = chr(0x07) + chr(0x0F)
    ACK_SEQUENCE = chr(0x07) + chr(0xF3)
    
    class ComfoAir(lib.my_asynchat.AsynChat):
    
        def __init__(self, smarthome, host, port):
            lib.my_asynchat.AsynChat.__init__(self, smarthome, host, port)
            self.terminator = END_SEQUENCE
            self._sh = smarthome
            self.params = {}
            self._init_cmds = []
            self._cyclic_cmds = {}
            self._lock = threading.Lock()
            smarthome.monitor_connection(self)
    
        def parse_item(self, item):
            # Process the read config
            if "comfoair_read" in item.conf:
                cmd = item.conf["comfoair_read"]
                if (cmd == None):
                    return None
    
                # Parse command (e.g. 00cd.9 = send a telegram with command 00cd, interpret the answer (telegram with command + 1 from ComfoAir) and use the data byte number 9 to get a value)
                bytepos = 1
                cmdparts = cmd.split(".")
                if (len(cmdparts) > 1):
                    bytepos = int(cmdparts[1])
                cmd = cmdparts[0]
    
                # Remember the read config to later update this item if the configured response comes in
                logger.debug("ComfoAir: {0} reads by using command \"{1}\" and interpreting answer byte number \"{2}\"".format(item, cmd, bytepos))
                if not cmd in self.params:
                    self.params[cmd] = {"items": [item], "bytepos": [bytepos]}
                else:
                    if not item in self.params[cmd]["items"]:
                        self.params[cmd]["items"].append(item)
                        self.params[cmd]["bytepos"].append(bytepos)
    
                # Allow items to be automatically initiated on startup
                if ("comfoair_init" in item.conf and item.conf["comfoair_init"] == "true"):
                    logger.debug("ComfoAir: {0} is initialized on startup.".format(item))
                    # Only add the item to the initial commands if it is not cyclic. Cyclic commands get called on init because this is the first cycle...
                    if not cmd in self._init_cmds and "comfoair_read_cycle" not in item.conf:
                        self._init_cmds.append(cmd)
    
                # Allow items to be cyclically updated
                if ("comfoair_read_cycle" in item.conf):
                    cycle = int(item.conf["comfoair_read_cycle"])
                    logger.debug("ComfoAir: {0} should read cyclic every {1} seconds.".format(item, cycle))
    
                    if not cmd in self._cyclic_cmds:
                        self._cyclic_cmds[cmd] = {"cycle": cycle, "nexttime": 0}
                    else:
                        # If another item requested this command already with a longer cycle, use the shorter cycle now
                        if self._cyclic_cmds[cmd]["cycle"] > cycle:
                            self._cyclic_cmds[cmd]["cycle"] = cycle
    
            # Process the send config
            if "comfoair_send" in item.conf:
                cmd = item.conf["comfoair_send"]
                if (cmd == None):
                    return None
                logger.debug("ComfoAir: {0} sends by using command \"{1}\"".format(item, cmd))
                return self.update_item
            else:
                return None
    
        def parse_logic(self, logic):
            pass
    
        def update_item(self, item, caller=None, source=None, dest=None):
            if caller != "ComfoAir" and "comfoair_send" in item.conf:
                cmd = item.conf["comfoair_send"]
    
                if item._type == "bool":
                    value = int(item())
                else:
                    value = item()
    
                # Restrict to 0..255 and format hex
                value = value % 256
                cmd = cmd.format("%02x" % value)
                self._send(cmd)
    
                # If a read command should be sent after write
                if "comfoair_read" in item.conf and "comfoair_read_afterwrite" in item.conf:
                    cmd = item.conf["comfoair_read"]
                    readafterwrite = item.conf["comfoair_read_afterwrite"]
                    logger.debug("ComfoAir: Attempting read after write for item {0}, command {1}, delay {2}".format(item, cmd, readafterwrite))
                    if cmd != None and readafterwrite != None:
                        cmdparts = cmd.split(".")
                        aw = float(readafterwrite)
                        if len(cmdparts) > 0:
                            time.sleep(aw)
                            self._send(cmdparts[0])
    
        def _handle_cyclic_cmds(self):
            # Read all cyclic commands
            currenttime = time.time()
            for cmd in self._cyclic_cmds.keys():
                entry = self._cyclic_cmds[cmd]
                # Is the command already due?
                if entry["nexttime"] <= currenttime:
                    logger.debug("ComfoAir: Triggering cyclic read command: {0}".format(cmd))
                    self._send(cmd)
                    entry["nexttime"] = currenttime + entry["cycle"]
    
        def _send(self, cmd):
            # Use a lock to allow only one sender at a time
            self._lock.acquire()
            try:
                # For simple telegrams without given length and data, just add 00 as length
                if len(cmd) < 6:
                    cmd = cmd + "00"
    
                # First calculate the checksum
                checksum = (sum(bytearray(cmd.decode("hex"))) + 173) % 256
    
                # Split the command and "encode" 0x07 data bytes by doubling them
                cmdpart = cmd[:4]
                lenpart = cmd[4:6]
                datapart = cmd[6:].replace("07", "0707")
    
                packet = START_SEQUENCE + (cmdpart + lenpart + datapart).decode("hex") + chr(checksum) + END_SEQUENCE
                logger.debug("ComfoAir: Sending request: {0}".format(packet.encode("hex")))
                self.push(packet)
    
                # This is ugly but give some time to not overfill the ComfoAir buffer
                time.sleep(0.1)
            except Exception, e:
                logger.error("ComfoAir: Exception while sending: {0}".format(e))
            finally:
                self._lock.release()
    
        def _parse_response(self, resp):
            logger.debug("ComfoAir: Received telegram: {0}".format(resp.encode("hex")))
    
            # A telegram looks like this: start sequence (2 bytes), command (2 bytes), data length (1 byte), data, checksum (1 byte), end sequence (2 bytes, already cut away)
            cmd = resp[2:4]
            reqcmd = cmd[0] + chr(ord(cmd[1]) - 1) # The request command of this response is -1
    
            cmd = cmd.encode("hex")
            reqcmd = reqcmd.encode("hex")
    
            # Remove begin and checksum to get the data (end = terminator => already cut away)
            data = resp[4:-1]
    
            # Remove double 0x07 data bytes
            data = data.replace(chr(0x07) + chr(0x07), chr(0x07))
    
            logger.debug("ComfoAir: Received command: {0}, corresponding request command: {1}, data: {2}".format(cmd, reqcmd, data.encode("hex")))
    
            # Find items using this response command
            if reqcmd in self.params:
                for i in range(0, len(self.params[reqcmd]["items"])):
                    item = self.params[reqcmd]["items"][i]
                    bytepos = self.params[reqcmd]["bytepos"][i]
                    value = ord(data[bytepos])
                    logger.debug("ComfoAir: Updating item {0} from byte position {1} with value {2}".format(item, bytepos, value))
                    item(value, "ComfoAir")
    
        def found_terminator(self):
            response = self.buffer
            self.buffer = ""
            # Cut old ACK responses from ComfoAir before the real message
            while response.startswith(ACK_SEQUENCE):
                response = response[2:]
    
            if len(response) > 0:
                self._parse_response(response)
                self.push(ACK_SEQUENCE)
    
        def handle_connect(self):
            self.discard_buffers()
            # Do the init read commands
            if self._init_cmds != []:
                if self.is_connected:
                    logger.debug("ComfoAir: init read")
                    for cmd in self._init_cmds:
                        self._send(cmd)
    
            # Find the shortest cycle
            shortestcycle = -1
            for cmd in self._cyclic_cmds.keys():
                entry = self._cyclic_cmds[cmd]
                if shortestcycle == -1 or entry["cycle"] < shortestcycle:
                    shortestcycle = entry["cycle"]
    
            # Start the worker thread
            if shortestcycle != -1:
                # Balance unnecessary calls and precision
                workercycle = int(shortestcycle / 5)
                self._sh.scheduler.add('ComfoAir-cyclic-reads', self._handle_cyclic_cmds, cycle=workercycle, prio=5, offset=0)
                logger.debug("ComfoAir: shortest cycle time found: {0} sec".format(shortestcycle))
                logger.debug("ComfoAir: added cyclic worker thread ({0} sec cycle)".format(workercycle))
    
        def run(self):
            self.alive = True
    
        def stop(self):
            self.alive = False
            self.handle_close()
    ./etc/plugin_conf
    Code:
    [comfoair]
        class_name = ComfoAir
        class_path = plugins.comfoair
        host = 192.168.123.6
        port = 5555
    ./items/kwl.conf
    Code:
    ['kwl']
    	[['stufe']]
    		visu = true
    		type = num
    		comfoair_send = 009901{}
    		comfoair_read = 00cd.9
    		comfoair_read_afterwrite = 1 # seconds
    		comfoair_init = true
    	[['abluft']]
    		[[['aktuell']]]
    			visu = true
    			type = num
    			comfoair_read = 00cd.7
    			comfoair_init = true
    	[['zuluft']]
    		[[['aktuell']]]
    			visu = true
    			type = num
    			comfoair_read = 00cd.8
    			comfoair_init = true
    	[['filter']]
    		[[['ruecksetzen']]]
    			visu = true
    			type = bool
    			comfoair_send = 00db0400000001{}
    	[['temp']]
    		[[['komfort']]]
    			visu = true
    			type = num
    			eval = value / 2 - 20
    			comfoair_read = 00d1.1
    			comfoair_read_cycle = 60 # seconds
    			comfoair_init = true
    		[[['auszenluft']]]
    			visu = true
    			type = num
    			eval = value / 2 - 20
    			comfoair_read = 00d1.2
    			comfoair_read_cycle = 60 # seconds
    			comfoair_init = true
    		[[['zuluft']]]
    			visu = true
    			type = num
    			eval = value / 2 - 20
    			comfoair_read = 00d1.3
    			comfoair_read_cycle = 60 # seconds
    			comfoair_init = true
    		[[['abluft']]]
    			visu = true
    			type = num
    			eval = value / 2 - 20
    			comfoair_read = 00d1.4
    			comfoair_read_cycle = 60 # seconds
    			comfoair_init = true
    		[[['fortluft']]]
    			visu = true
    			type = num
    			eval = value / 2 - 20
    			comfoair_read = 00d1.5
    			comfoair_read_cycle = 60 # seconds
    			comfoair_init = true
    		[[['heizstab']]]
    			visu = true
    			type = num
    			eval = value / 2 - 20
    			comfoair_read = 00d1.8
    			comfoair_read_cycle = 60 # seconds
    			comfoair_init = true
    	[['bypass']]
    		visu = true
    		type = num
    		comfoair_read = 000d.1
    		comfoair_read_cycle = 600 # seconds
    		comfoair_init = true
    	[['heizstab']]
    		visu = true
    		type = num
    		comfoair_read = 000d.2
    		comfoair_read_cycle = 600 # seconds
    		comfoair_init = true
    		[[['leistung']]]
    			visu = true
    			type = num
    			comfoair_read = 000d.4
    			comfoair_read_cycle = 600 # seconds
    			comfoair_init = true
    Folgende Attribute stehen in der items.conf zur Verfügung:
    • comfoair_send: Sendet dieses Telegramm an die KWL bei Änderung des Items. Angegeben wird der Befehl (2 Bytes = 4 Zeichen Hex), die Datenlänge (1 Byte = 2 Zeichen hex) und die Daten (hex). Beispiel: 009901{} = Befehl 0x00 0x99, Datenlänge 0x01 = 1 Byte, Daten = {} = wird durch Value des Items ersetzt
    • comfoair_read: Dieses Telegramm wird zum Lesen des Wertes benutzt. Nach dem Punkt wird die Byteposition im Antworttelegramm angegeben, aus der der Wert genommen werden soll. Beispiel: 00cd.9 = Befehl 0x00 0xCD wird gesendet; Aus dem Antworttelegramm wird das Datenbyte Nr. 9 als Wert für das Item gelesen.
    • comfoair_read_afterwrite: Wenn das Item in der KWL upgedated wurde, soll nach x Sekunden das unter comfoair_read konfigurierte Lesetelegramm benutzt werden, um das Item upzudaten.
    • comfoair_read_cycle: Das Item soll alle x Sekunden zyklisch von der KWL gelesen werden.
    • comfoair_init: Wenn auf "true" gesetzt, wird das Item beim Start von smarthome.py mit dem konfigurierten Lesetelegramm initialisiert.


    Wenn das Plugin wen interessiert, kann ich mich noch weiter in technische Diskussionen vertiefen - bin noch nicht ganz zufrieden mit der Implementierung, auch wenn sie jetzt mal so weit funktioniert.

    @mknx: Wie sieht es mit der Python 3 Migration aus, was müsste ich dafür machen? Bin zur Zeit noch im alten 2.7 stable unterwegs, da der WAF bei mir oberste Priorität hat.

    LG Stefan

  • himself
    antwortet
    Guten Abend zusammen,

    ich versuche gerade das Plugin etwas zu erweitern um ein paar zusätzliche Informationen aus meiner Comfoair herauszuholen. Konkret stehe ich vor folgendem Problem: Fehlermeldungen, Ich verstehe nicht wie ich die Fehlermeldungen in Items übertragen kann.
    Die commands.py habe ich um folgenden Teil erweitert
    Code:
            'ReadErrorGroupAlow':           { 'Command': 0x00D900, 'CommandBytes': 3, 'Type': 'Read', 'ResponsePosition': 1, 'ValueBytes': 1 },
            'ReadErrorGroupAhigh':          { 'Command': 0x00D900, 'CommandBytes': 3, 'Type': 'Read', 'ResponsePosition': 14, 'ValueBytes': 1 },
            'ReadErrorGroupEA':             { 'Command': 0x00D900, 'CommandBytes': 3, 'Type': 'Read', 'ResponsePosition': 10, 'ValueBytes': 1 },
            'ReadErrorGroupFilter':         { 'Command': 0x00D900, 'CommandBytes': 3, 'Type': 'Read', 'ResponsePosition': 9, 'ValueBytes': 1 },
            'ReadErrorGroupElast':          { 'Command': 0x00D900, 'CommandBytes': 3, 'Type': 'Read', 'ResponsePosition': 4, 'ValueBytes': 1 },
            'ReadErrorGroupE':              { 'Command': 0x00D900, 'CommandBytes': 3, 'Type': 'Read', 'ResponsePosition': 2, 'ValueBytes': 1 }
    Laut Schnittstellenbeschreibung soll die Antwort folgendermassen aussehen:

    Kommando 0x00 0xD9

    Code:
    Antwort: 0x00 0xDA
    Daten: Byte[1]                 Aktueller Fehler A:
                                             0x01 = A1
                                                :
                                             0x80 = A8
                Byte[2]                  Aktueller Fehler E:
                                             0x01 = E1
    meine items.yaml sieht folgendermassen aus:
    Code:
    ventilation:
        rs232:
            error:
                Alow:
                    name: Fehlermeldungen A1-A8
                    type: bool
                    comfoair_read: ReadErrorGroupAlow
                    comfoair_read_cycle: 60          #Sekunden
                    comfoair_init: 'true'
                    sqlite: 'yes'
                Ahigh:
                    name: Fehlermeldungen A9-A15 + A0
                    type: bool
                    comfoair_read: ReadErrorGroupAhigh
                    comfoair_read_cycle: 60          #Sekunden
                    comfoair_init: 'true'
                    sqlite: 'yes'
    leider werden die items nicht befüllt.
    Leider kann ich das Problem nicht eingrenzen, da ich nicht weiss wo ich die direkte Antwort der KWL abfragen könnte.
    Kurz noch zu meinem Setup: Bei mir werkelt eine ComfoAir 550 vor sich hin, die ich über eine MOXA in mein LAN gebracht habe. Das Protokoll der 350 scheint aber zu passen, da die normalen Einstellungen funktionieren.

    vielen Dank!

    Alfons

    Einen Kommentar schreiben:


  • Boomer55
    antwortet
    Hallo Franz.

    Volltreffer!!! Das war's.
    Vielen Dank für die Unterstützung.

    Gruß,
    Markus

    Einen Kommentar schreiben:


  • franzmm
    antwortet
    Hallo Markus,

    das Problem ist vermutlich, dass der port versehentlich in eine Gleitkommazahl umgewandelt wird.
    Versuch mal in der Datei plugins/comfoair/plugin.yaml den Typ vom Port von "num" in "int" zu ändern, also:

    plugin.yaml:

    Code:
    ....
    
    parameters:
        ....
        port:
            type: int
    Gruß
    Franz

    Einen Kommentar schreiben:


  • Boomer55
    antwortet
    Hallo zusammen.

    Erst mal, ich bin mit dem aktuellen Master-Zweig (SmartHomeNG 1.4.2, ComfoAir-Plugin 1.3.0) unterwegs.

    Nun zu meinem Problem:
    Seit einiger Zeit kämpfe ich mich nun schon mit dem ComfoAir-Plugin ab und komme einfach nicht weiter. Ich habe die Beschreibungen durchgeackert, aber komme einfach nicht dahinter was die Fehlermeldung auslöst. Die Items werden natürlich auch nicht aktualisiert. Egal, was ich in der plugin.yaml auch mache, irgendwie kommt beim Port immer "5555.0" raus, was vermutlich zur Fehlermeldung (kein Integer) führt.

    Der Log-Eintrag mit den Fehlern:
    Code:
    1. 2018-01-21 10:22:36 ERROR Main Plugin 'comfoair' from section 'comfoair' exception: invalid literal for int() with base 10: '5555.0'
    2. Traceback (most recent call last):
    3. File "/usr/local/smarthome/lib/plugin.py", line 111, in __init__
    4. plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta)
    5. File "/usr/local/smarthome/lib/plugin.py", line 413, in __init__
    6. exec("self.plugin.__init__(smarthome{0}{1})".format("," if len(arglist) else "", argstring))
    7. File "<string>", line 1, in <module>
    8. File "/usr/local/smarthome/plugins/comfoair/__init__.py", line 46, in __init__
    9. self._port = int(port)
    10. ValueError: invalid literal for int() with base 10: '5555.0'
    Meine "plugin.yaml":
    Code:
    comfoair:
        class_name: ComfoAir
        class_path: plugins.comfoair
        kwltype: comfoair350
        host: 192.168.0.14
        port: 5555
        #serialport: /dev/ttyUSB0  # Enable this if you want to use a serial connection
    Vielleicht hat jemand noch eine Idee, was ich falsch mache oder probieren könnte?

    Vielen Dank und Gruß,
    Markus

    Einen Kommentar schreiben:


  • mosjka1
    antwortet
    Hallo zusammen,

    bin dieser Anleitung nach vorgegangen: https://github.com/smarthomeNG/smart...omfoair-Plugin

    Die Seite wir vom Autogenerator nicht erstellt, kann jemand über den log ansehen und evtl. den Fehler finden? Habe mit Autogenerator noch keine Erfahrung.


    Code:
    2017-01-26  10:44:23 DEBUG    Main         Starting smartvisu Plugin
    2017-01-26  10:44:23 DEBUG    Main         Starting cli Plugin
    2017-01-26  10:44:23 DEBUG    Main         Starting sql Plugin
    2017-01-26  10:44:23 WARNING  smartvisu    Installing widgets into smartVISU
    2017-01-26  10:44:23 INFO     smartvisu    install_widgets: Installing from '/usr/local/smarthome' to '/var/www/html/smartVISU'
    2017-01-26  10:44:23 INFO     smartvisu    install_widgets: Creating  directory for widgets
    2017-01-26  10:44:23 INFO     smartvisu    install_widgets: Removing old dynamic widget files
    2017-01-26  10:44:23 DEBUG    smartvisu    root_contents: ['/**\n', '* -----------------------------------------------------------------------------\n', '* @package     smartVISU\n', '* @author      Martin Gleiß\n', '* @copyright   2012 - 2015\n', '* @license     GPL [http://www.gnu.de]\n', '* -----------------------------------------------------------------------------\n', '*/\n', '<!DOCTYPE html>\n', '\n', '<html>\n', '<head>\n', '\t<title>{{ config_title }}</title>\n', '\n', '\t<meta charset="utf-8" />\n', '\t<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1, maximum-scale=1.3, minimum-scale=1" />\n', '\t<meta name="apple-mobile-web-app-capable" content="yes" />\n', '\t<meta name="apple-mobile-web-app-status-bar-style" content="black" />\n', '\t<meta http-equiv="expires" content="0" />\n', '\n', '\t<link rel="icon" href="favicon.png" />\n', '\t<link rel="icon" href="favicon.ico" type="image/x-icon" />\n', '\t<link rel="apple-touch-icon" href="favicon.png" />\n', '\n', '\t<link rel="stylesheet" href="vendor/jquery.mobile/jquery.mobile.structure-1.3.2.min.css" />\n', '\t<script type="text/javascript" src="vendor/jquery/jquery-2.0.3.min.js"></script>\n', '\n', "\t{% if config_transition != 'fade' %}\n", '\t\t<script type="text/javascript">\n', '\t\t\t$(document).on("mobileinit", function () {\n', "\t\t\t\t$.mobile.defaultPageTransition = '{{ config_transition }}';\n", '\t\t\t});\n', '\t\t</script>\n', '\t{% endif %}\n', '\n', '\t<script type="text/javascript" src="vendor/jquery.mobile/jquery.mobile-1.3.2.min.js"></script>\n', '\t<script type="text/javascript" src="lib/base/jquery.mobile.slider.{{ config_js }}"></script>\n', '\n', '\t<script type="text/javascript" src="vendor/plot.highcharts/highcharts.js"></script>\n', '\t<script type="text/javascript" src="designs/{{ config_design }}.{{ config_js }}"></script>\n', '\t<script type="text/javascript" src="widgets/widget.{{ config_js }}"></script>\n', '\n', '\t{% if config_animation %}\n', '\t\t<script type="text/javascript" src="widgets/animation.{{ config_js }}"></script>{% endif %}\n', '\n', '\t<script type="text/javascript" src="lib/base/base.{{ config_js }}"></script>\n', '\t<script type="text/javascript" src="lib/base/base.php"></script>\n', '\t<script type="text/javascript" src="driver/io_{{ config_driver }}.{{ config_js }}"></script>\n', '\n', '\t<link rel="stylesheet" type="text/css" href="designs/{{ config_design }}.min.css" />\n', '\t<link rel="stylesheet" type="text/css" href="pages/base/base.css" />\n', '\n', "\t{% if isfile('pages/'~config_pages~'/visu.js') %}\n", '\t\t<script type="text/javascript" src="pages/{{ config_pages }}/visu.js"></script>{% endif %}\n', '\n', "\t{% if isfile('pages/'~config_pages~'/visu.css') %}\n", '\t\t<link rel="stylesheet" type="text/css" href="pages/{{ config_pages }}/visu.css" />{% endif %}\n', '\n', '\t{% block head %}{% endblock %}\n', '\n', '\t{% import "lib.html" as lib %}\n', '\t{% import "basic.html" as basic %}\n', '\t{% import "device.html" as device %}\n', '\t{% import "plot.html" as plot %}\n', '</head>\n', '\n', '\n', '<body>\n', '\n', '<script type="text/javascript">\n', "\tio.init('{{ config_driver_address }}', '{{ config_driver_port }}');\n", '{% if config_driver_autoreconnect %}\n', '\tactivateAutoReconnect();\n', '{% endif %}\n', '\n', '\t// Do some actions before page is shown\n', "\t$(document).on('pagebeforeshow', function () {\n", '\t\tfx.init();\n', '\t\trepeater.init();\n', '\t\twidget.prepare();\n', '\t\t// repeater.list();\n', '\t});\n', '\n', '\t// Run the io and all widgets\n', "\t$(document).on('pageshow', function () {\n", '\t\tio.run({{ config_driver_realtime }});\n', "\t\t// console.log('[io] run');       \t\n", '\t\tnotify.display();\n', '\t\t// widget.list();\n', '\t});\n', '\n', "\t$.mobile.page.prototype.options.domCache = {{ (config_cache_dom ? 'true' : 'false') }};\n", '</script>\n', '\n', '{% block body %}{% endblock %}\n', '\n', '</body>\n', '</html>\n']
    2017-01-26  10:44:23 DEBUG    smartvisu    copy_widgets: Could not find source directory sv_widgets in plugins/backend
    2017-01-26  10:44:23 DEBUG    smartvisu    copy_widgets: Could not find source directory sv_widgets in plugins/knx
    2017-01-26  10:44:23 DEBUG    smartvisu    copy_widgets: Could not find source directory sv_widgets in plugins/visu_websocket
    2017-01-26  10:44:23 DEBUG    smartvisu    copy_widgets: Could not find source directory sv_widgets in plugins/visu_smartvisu
    2017-01-26  10:44:23 DEBUG    smartvisu    copy_widgets: Could not find source directory sv_widgets in plugins/cli
    2017-01-26  10:44:23 DEBUG    smartvisu    copy_widgets: Could not find source directory sv_widgets in plugins/sqlite_visu2_8
    2017-01-26  10:44:23 DEBUG    smartvisu    copy_widgets: Could not find source directory sv_widgets in plugins/comfoair
    2017-01-26  10:44:23 INFO     smartvisu    Adding import statements to root.html
    2017-01-26  10:44:23 WARNING  smartvisu    Generating pages for smartVISU
    2017-01-26  10:44:23 INFO     smartvisu    copy_templates: Copying template 'navi.html' from plugin to smartVISU
    2017-01-26  10:44:23 INFO     BackendServer [26/Jan/2017:10:44:23] ENGINE Serving on http://192.168.178.125:8383
    2017-01-26  10:44:23 INFO     BackendServer [26/Jan/2017:10:44:23] ENGINE Bus STARTED
    2017-01-26  10:44:23 DEBUG    BackendServer BackendServer: engine started
    2017-01-26  10:44:23 DEBUG    Connections  KNX: connected to 127.0.0.1:6720
    2017-01-26  10:44:23 DEBUG    Connections  KNX[default]: enable group monitor
    2017-01-26  10:44:23 DEBUG    Connections  KNX[default]: init read

    Einen Kommentar schreiben:


  • heckmannju
    antwortet
    Hi,
    muss ich heute abend mal bei mir reinschauen. Ob ich das da bei mir auch finde.
    Was für eine Software Version ist den das?
    VG
    Jürgen

    Einen Kommentar schreiben:


  • nno
    antwortet
    Zitat von heckmannju Beitrag anzeigen

    Sieht man bei dir Temperaturen in deinem TFT? Kannst du mal screenshots posten?
    Ja klar, die Temperatur findet man bei mir unter Menu > Information > Aktueller Gerätestatus:

    IMG_5008.JPGIMG_5009.JPGIMG_5010.JPGIMG_5011.JPG

    Einen Kommentar schreiben:


  • heckmannju
    antwortet
    Zitat von nno Beitrag anzeigen

    Hmm ... sehr schade, hatte die Hoffnung, es über den RS485 Bus doch zum Laufen zu bekommen. Werde dann wohl die 0...10V Variante über die Klemmleisten unter der Abdeckung der RS485 CAT5 Buchse wählen um zumindest die Lüftungsstufe steuern zu können. Leider bekommt man darüber aber keine Rückmeldung falls diese am TFT Display verändert wurde und vor allem auch nicht die Temperaturen die man sonst ja im TFT sieht.
    Sieht man bei dir Temperaturen in deinem TFT? Kannst du mal screenshots posten?

    Einen Kommentar schreiben:


  • pavol
    antwortet
    Hallo nno, ich bastele an einer "primitiven" Lösung mir Relais. Ich schalte den "arduino-slave" aktiv ein, wenn ich ein Wert ändern möchte. Ich werde ein neuer Thread in DIY erstellen, wenn ich die erste positive Ergebnisse haben werde. Vielleicht kannst du es auch für dich anwenden.

    Die Hoffnung stirbt zuletzt.

    LG Pavol

    Einen Kommentar schreiben:


  • nno
    antwortet
    Zitat von deival Beitrag anzeigen
    ich sah damals keinen Sinn mehr weiter zu machen. In meinen Augen kann man die Novus nicht über den internen RS485 Bus steuern.
    Hmm ... sehr schade, hatte die Hoffnung, es über den RS485 Bus doch zum Laufen zu bekommen. Werde dann wohl die 0...10V Variante über die Klemmleisten unter der Abdeckung der RS485 CAT5 Buchse wählen um zumindest die Lüftungsstufe steuern zu können. Leider bekommt man darüber aber keine Rückmeldung falls diese am TFT Display verändert wurde und vor allem auch nicht die Temperaturen die man sonst ja im TFT sieht.

    Einen Kommentar schreiben:


  • deival
    antwortet
    Hallo nno,

    ich sah damals keinen Sinn mehr weiter zu machen. In meinen Augen kann man die Novus nicht über den internen RS485 Bus steuern. Es handelt sich denke ich um ein Master-Slave Protokoll bei dem "nur der Master fragen stellt", sozusagen "wer nicht gefragt wird bekommt auch keine Antwort" ;-) Man kann nur die Daten auf dem Bus mitloggen aber mehr als man über das Touch-Display zu sehen bekommt ist da nicht, keine Temperaturdaten o.ä. siehe Excel-File irgendwo im Thread...Das Protokoll um das überhaupt mitloggen zu können erfordert einen AVR Microcontroller, da nur dieser nativ dieses 9 Datenbit Protokoll unterstützt....

    Tutu mir leid, dass ich Dir nicht allzu viel Hoffnung machen kann.

    Gruß

    deival

    Einen Kommentar schreiben:


  • nno
    antwortet
    Hallo zusammen,

    leider ist es zur Paul Novus hier seit ein paar Monaten ruhiger geworden. Ich sehe auch ein, dass die Diskussion evtl. wo anders hingehört, aber im DIY Forum habe ich keine Fortsetzung finden können. Wenn jemand weiß wo die Diskussion weitergeht bitte Link posten. Danke!!!

    johnson, coderchris, pavol, deival: Wäre sehr an euren aktuellen Erkenntnissen interessiert. Habt ihr die Steuerung über KNX am Laufen? Habe selbst seit kurzem eine Paul Novus 450 und würde die Steuerung gerne auf den KNX Bus bekommen.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Hallo Markus,

    vielen Dank für die Erweiterung der Doku.

    Einen Kommentar schreiben:


  • Boomer55
    antwortet
    Hallo zusammen.

    Falls es für jemanden interessant ist, ich habe eine deutsche Anleitung zum Comfoair-Plugin im Wiki zu SmarthomeNG erstellt.
    Ergänzungen oder auch Änderungen erwünscht... ;-)

    Beste Grüße,
    Markus

    Einen Kommentar schreiben:

Lädt...
X