Comfoair Plugin

Boomer55 edited this page Jul 27, 2016 · 7 revisions

Comfoair Plugin

Das Comfoair Plugin bietet direkten oder indirekten Zugriff auf eine Zehnder Comfoair 350 oder 500 über einen RS232-IP-Adapter oder über die RS232-Schnittstelle am PC.

Grundvoraussetzungen

Für den Betrieb wird benötigt:

  • PC (Intel NUC, Raspberry Pi, etc.) auf dem SmarthomeNG Release 1.1 oder höher installiert ist und läuft
  • Zehnder Comfoair 350 oder 500
  • ein RS232-Crossover-Kabel
  • Bei direkter Anbindung eine RS232-Schnittstelle am PC
  • bei indirekter Anbindung ein RS232-IP-Adapter + LAN-Kabel

Wichtig: Es darf immer nur entweder der Zugriff über die Zehnder-Steuerung (ComfoSense etc.) oder das Plugin erfolgen. Nie beides zusammen. Falls beide Steuerungsarten abwechselnd gewünscht sind, kann natürlich auch mit einer zwischengeschalteten RS232-Switchbox manuell umgeschaltet werden.

Für das Plugin benötigte Python-Methoden:

  • Serial
  • logging
  • socket
  • time
  • serial
  • re
  • threading
  • commands (Eigene Methode für dieses Plugin)

Wichtig: Bei Problemen unbedingt erst mal im Logfile von SmartHomeNG kontrollieren, ob eine Methode beim Start des Plugins nicht gefunden wurde und diese dann gegebenenfalls nachinstallieren.

Plugin Konfigurationsparameter

Je nachdem ob eine direkte (über RS232-Schnittstelle) oder indirekte (über RS232-IP-Adapter) Verbindung aufgebaut werden soll müssen die entsprechenden Zeilen auskommentiert werden. Das Plugin kann über eine entsprechende Konfiguration in der Datei /usr/local/smarthome/etc/plugins.conf akitviert werden. Das Beispiel zeigt die indirekte Anbindung unter Verwendung einer RS232-IP-Schnittstelle.

 [comfoair]
    class_name = ComfoAir
    class_path = plugins.comfoair
    kwltype = comfoair350       # Je nach Typ "comfoair350" oder "comfoair500" eintragen
    host = 192.168.*.*          # Hier wird die IP-Adresse der RS232-IP-Schnittstelle angegeben
    port = 5555                 # Hier den Port der RS232-IP-Schnittstelle angeben
    #serialport = /dev/ttyUSB0  # Bei direkter RS232-Verbindung hier die Schnittstellenparameter angeben

Kommandos

comfoair_send

Dieses Kommando führt eine entsprechende Sende-Anweisung an die Comfoair aus. Diese wird mit dem entsprechenden Wert des Items ergänzt. In der commands.py sind die konfigurierten und möglichen Anweisungen hinterlegt.

Beispiel: comfoair_send = WriteVentilationLevel

comfoair_read

Dieses Kommando fordert über eine entsprechende Lese-Anweisung an die Comfoair Daten an.

Beispiel: comfoair_read = ReadVentilationLevel

comfoair_read_afterwrite

Mit diesem Kommando wird eine Zeitspanne in Sekunden festgelegt. Wenn ein Wert angegeben wird, kann damit nach einem "comfoair_send" das Einlesen (Rückmeldung) mithilfe "comfoair_read" verzögert werden. Das Kommando hat keinen Standardwert. Wenn kein Wert festgelegt wird, erfolgt keine Lese-Anweisung.

Beispiel: comfoair_read_afterwrite = 1 # seconds

comfoair_read_cycle

Mit diesem Kommando kann ein Lesezyklus in Sekunden festgelegt werden.

Beispiel: comfoair_read_cycle = 3600 # 3600 Sekunden (1 Stunde)

comfoair_init

Wird dieses Kommando mit dem Wert "true" angegeben, wird bei jedem Start des Plugins automatisch das entsprechende Item durch die entsprechende Lese-Anweisung aktualisiert.

Beispiel: comfoair_init = true

comfoair_trigger

Dieses Kommando kann eine Liste an Lese-Anweisungen enthalten. Wenn sich nun das entsprechende Item ändert, können dadurch die tangierenden Werte gelesen und ebenfalls aktualisiert werden. Zum Beispiel kann man sich bei einer Änderung der Lüfterstufe, die dadurch veränderte Ventilator-Drehzahl aktualisieren lassen.

Beispiel: comfoair_trigger = ReadSupplyAirRPM | ReadExtractAirRPM

comfoair_trigger_afterwrite

Mit diesem Kommando wird eine Zeitspanne in Sekunden festgelegt. Bei einer Änderung des entsprechenden Items werden dadurch die Lese-Anweisungen unter "comfoair_trigger" entsprechend verzögert. Wenn kein Wert angegeben wird, ist beim Kommando als Standardwert 5 Sekunden hinterlegt.

Beispiel: comfoair_trigger_afterwrite = 10 # Sekunden

Protokollbeschreibung

Die Protokollbeschreibung für die ComfoAir 350 & 500 ist unter diesem Link verfügbar.

Beispiel für eine kwl.conf (inkl. Autogenerator)

[kwl]
name = KWL
sv_page = room
sv_img = vent_ventilation_control.svg
    
	[[level]]
        type = num
		visu_acl = rw
        comfoair_send = WriteVentilationLevel
        comfoair_read = ReadCurrentVentilationLevel
        comfoair_read_afterwrite = 1 # Sekunden
        comfoair_trigger = ReadSupplyAirRPM
        comfoair_trigger_afterwrite = 6 # Sekunden
        comfoair_init = true
        sqlite = yes
        sv_widget = {{ basic.button('Stufe0', 'kwl.level', '1', '', '1', 'midi') }} {{ basic.button('Stufe1', 'kwl.level', '2', '', '2', 'midi') }} {{ basic.button('Stufe2', 'kwl.level', '3', '', '3', 'midi') }} {{ basic.button('Stufe3', 'kwl.level', '4', '', '4', 'midi') }}
			
    [[extractair]]
        [[[rpm]]]
            type = num
            comfoair_read = ReadExtractAirRPM
            comfoair_read_cycle = 60 # Sekunden
            comfoair_init = true
			sv_widget = {{ basic.value('Drehzahl1', 'kwl.extractair.rpm', 'Umdrehungen') }}	
			
        [[[level]]]
            type = num
            comfoair_read = ReadExtractAirPercentage
            comfoair_read_cycle = 60 # Sekunden
            comfoair_init = true
			sv_widget = {{ basic.value('StufeAktuell', 'kwl.level', '= Aktuelle Stufe') }}	
		
    [[supplyair]]
        [[[rpm]]]
            type = num
            comfoair_read = ReadSupplyAirRPM
            comfoair_read_cycle = 60 # Sekunden
            comfoair_init = true
			sv_widget = {{ basic.value('Drehzahl2', 'kwl.supplyair.rpm', 'Umdrehungen') }}
			
        [[[level]]]
            type = num
            comfoair_read = ReadSupplyAirPercentage
            comfoair_read_cycle = 60 # Sekunden
            comfoair_init = true
			
    [[filter]]
        [[[reset]]]
            type = bool
            comfoair_send = WriteFilterReset
			
    [[temp]]
        [[[comfort]]]
            type = num
            visu_acl = rw
            comfoair_send = WriteComfortTemperature
            comfoair_read = ReadComfortTemperature
            comfoair_read_cycle = 60 # Sekunden
            comfoair_init = true
			sv_widget = {{ device.rtr('comforttemp', 'Comfort-Temperatur', 'kwl.temp.comfort', 'kwl.temp.comfort', '', '', '', '', '', '1') }}

        [[[freshair]]]
            type = num
            comfoair_read = ReadFreshAirTemperature
            comfoair_read_cycle = 60 # Sekunden
            comfoair_init = true
            sqlite = yes
			sv_widget = {{ basic.value('Frischluft-Aussen', 'kwl.temp.freshair', '°C') }}
			
        [[[supplyair]]]
            type = num
            comfoair_read = ReadSupplyAirTemperature
            comfoair_read_cycle = 60 # Sekunden
            comfoair_init = true
            sqlite = yes
			sv_widget = {{ basic.value('Zuluft-Innen', 'kwl.temp.supplyair', '°C') }}
			
        [[[extractair]]]
            type = num
            comfoair_read = ReadExtractAirTemperature
            comfoair_read_cycle = 60 # Sekunden
            comfoair_init = true
            sqlite = yes
			sv_widget = {{ basic.value('Abluft-Innen', 'kwl.temp.extractair', '°C') }}
			
        [[[exhaustair]]]
            type = num
            comfoair_read = ReadExhaustAirTemperature
            comfoair_read_cycle = 60 # Sekunden
            comfoair_init = true
            sqlite = yes
			sv_widget = {{ basic.value('Absaugluft-Aussen', 'kwl.temp.exhaustair', '°C') }}
			
        [[[preheater]]]
            type = num
            comfoair_read = ReadPreHeatingTemperature
            comfoair_read_cycle = 60 # Sekunden
            comfoair_init = true
			
    [[bypass]]
        type = num
        comfoair_read = ReadBypassPercentage
        comfoair_read_cycle = 600 # Sekunden
        comfoair_init = true
		sv_widget = {{ basic.value('BypassProzent', 'kwl.bypass', '%') }}	
		
    [[preheater]]
        type = num
        comfoair_read = ReadPreHeatingStatus
        comfoair_read_cycle = 600 # Sekunden
        comfoair_init = true
        sv_widget = {{ basic.value('VorheizungProzent', 'kwl.preheater', '%') }}  
        
    [[operatinghours]]
        [[[away]]]
            type = num
            comfoair_read = ReadOperatingHoursAway
            comfoair_read_cycle = 3600 # Sekunden
            comfoair_init = true
			
        [[[low]]]
            type = num
            comfoair_read = ReadOperatingHoursLow
            comfoair_read_cycle = 3600 # Sekunden
            comfoair_init = true
			
        [[[medium]]]
            type = num
            comfoair_read = ReadOperatingHoursMedium
            comfoair_read_cycle = 3600 # Sekunden
            comfoair_init = true
			
        [[[high]]]
            type = num
            comfoair_read = ReadOperatingHoursHigh
            comfoair_read_cycle = 3600 # Sekunden
            comfoair_init = true
			
        [[[antifreeze]]]
            type = num
            comfoair_read = ReadOperatingHoursAntiFreeze
            comfoair_read_cycle = 3600 # Sekunden
            comfoair_init = true
			sv_widget = {{ basic.value('Vereisungsschutz', 'kwl.operatinghours.antifreeze', 'Stunden') }}
			
        [[[preheater]]]
            type = num
            comfoair_read = ReadOperatingHoursPreHeating
            comfoair_read_cycle = 3600 # Sekunden
            comfoair_init = true
			sv_widget = {{ basic.value('Vorheizregister', 'kwl.operatinghours.preheater', 'Stunden') }}
			
        [[[bypass]]]
            type = num
            comfoair_read = ReadOperatingHoursBypass
            comfoair_read_cycle = 3600 # Sekunden
            comfoair_init = true
			sv_widget = {{ basic.value('Bypass', 'kwl.operatinghours.bypass', 'Stunden') }}
			
        [[[filter]]]
            type = num
            comfoair_read = ReadOperatingHoursFilter
            comfoair_read_cycle = 3600 # Sekunden
            comfoair_init = true
			sv_widget = {{ basic.value('Filter', 'kwl.operatinghours.filter', 'Stunden') }}

Abschliessend noch der Link zum entsprechenden Beitrag im knx-user-forum.de

Damit sollten erste Gehversuche möglich sein...

Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.