Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Steuerung der KWL Cofoair mit diesem Protokol möglich?
Habe aber zum testen mal kurz die Auswertung integriert.
Nun da scheinbar Thorsten wieder am Start steht, kann ich mich wieder der Aufgabe widmen -> Komforttemperatur setzen. Kann ich da nochmal Zyklisch eine Temp auf 14/7/4 bekommen?
Also brauchst du NUR Byte2 0x01 oder zusätzlich zu Byte1 0x01?
Solche Modifikationen mit Logik nach dem Motto: wenn x>y dann z usw...
Da müsste man nochmal darüber sprechen. Ich habe grundsätzlich nix dagegen aber dass sind meistens sehr persöhnliche Anforderungen die nur auf wehnige Nutzer zutreffen.
Ich bastel hier ein GATEWAY-Plugin dass die Kommunikation zwischen ComfoAir und Wiregate sicherstellt. Logiken nach Gusto kann jeder selber integrieren. -> Dann haben alle etwas davon
Dass bedeutet nicht, dass ich für solche Sonderwünsche nicht helfend einspringe, aber in meinen Augen gehört dass nicht unbedingt in's Main Plugin, dass dann auch im SVN und unter Codeschnipsel eingestellt wird
Ich bastel hier ein GATEWAY-Plugin dass die Kommunikation zwischen ComfoAir und Wiregate sicherstellt. Logiken nach Gusto kann jeder selber integrieren. -> Dann haben alle etwas davon
Ich bin hier zwar nur Mitleser, aber trotzdem Full ACK!
So habe ich es auch mit dem Plugin zur Web-Service Schnittstelle meines Pelletskessel gemacht.
- Daten auslesen und auf GA bzw. in RRD schreiben
- Daten auf GA entgegennehmen und an Schnittstellenpartner weitergeben
Die Optimierung läuft dann in einem eigenen Plugin nur über die GA.
P.S. Ich habe bei mit die Comfoair vorbereitet, habe aber für das Lüftungsgerät noch kein Geld. Bin schon mal auf euer fertiges Plugin gespannt.
Und im decodierten Gesammtdatenpaket sieht das Telegramm plötzlich so aus:
07 F0 00 D3 01 4C A1 C0 70 F0
Problem 1: Hier wird als Checksumme 1C herausgetrennt -> sollte CD sein
Problem 2: Da schmuggelt sich ein A hinein, dass da nicht hingehöhrt Ohne dass A wären die Daten nämlich 07 F0 00 D3 4C 1C 07 F0
Ich komme gerade nciht weiter Alle anderen Checksummen funktionieren aber bei Tempsetzen plötzlich nichtmehr
hier das Ergbnis nach Deiner Mail V0.8.
Wenn Du Logs brauchst, bitte noch mal melden.
Man erkennt unschwer, dass die Badezimmerschalterabfrage nur eine Abfrage des Kontaktes, aber nicht der Status der Anlage ist-schade.
Werde deshalb >mein Problemm< veruschen so zu lösen, dass ich die Zeit der Stosslüftung über den Aktor steuere-muss da mal testen wie sich dabei die Anlage verhält.
Ich sehe gerade, dass deine RRD's löcher haben. Ich musste um die Stabilitätzu verdessern eine Validierung einbauen. Dass Problem sollte im nächsten Update behoben sein.
Dass mit dem abfragen des Badezimmerschalters nicht geholfen ist, ist schade. Vieleicht findet sich ja noch eine Lösung um dass smart zu lösen
lesen...
- Ventilator Zuluft und Abluft in %
- Zustand Bypass in %
- Betriebssunden Filter (Als 14Byte Text -> DPT16.000)
- Zustand Lüftungsschalter Bad als 1 Bit zustand
Hier mal der aktuelle Stand der Entwicklung:
Code:
# Plugin zur Ansteuerung einer Zender ComfoAir
# Version 0.9 15.06.2012 ALPHA
# Copyright: swiss (https://knx-user-forum.de/members/swiss.html)
# Aufbau möglichst so, dass man unterhalb der Einstellungen nichts verändern muss!
#
#
#return;
####################
###Einstellungen:###
####################
#Zuordnung Steuerfunktionen zu den Gruppenadressen:
my $ga_stufeabwesend = '14/7/0'; #1bit Trigger für Stufe "Abwesend". 1=Aktivieren
my $ga_stufe1 = '14/7/1'; #1bit Trigger für Stufe1. 1=Aktivieren
my $ga_stufe2 = '14/7/2'; #1bit Trigger für Stufe2. 1=Aktivieren
my $ga_stufe3 = '14/7/3'; #1bit Trigger für Stufe3. 1=Aktivieren
my $ga_komforttemp = '14/7/4'; #GA zum setzen der Komforttemperatur
#Hier werden die Gruppenadressen für die Rückmeldungen vergeben: (Nich vergeben = inaktiv)
my $ga_status_ventilator_zul = '14/0/0'; #GA DPT5.001 für Status Ventilator Zuluft %
my $ga_status_ventilator_abl = '14/0/1'; #GA DPT5.001 für Status Ventilator Abluft %
my $ga_status_bypass_prozent = '14/0/2'; #GA DPT5.001 für Status Bypassklappe %
my $ga_betriebsstunden_filter = '14/0/3'; #GA DPT16.000 für die Rückmeldung der Betribsstunden des Filters
my $ga_zustand_badschalter = '14/0/4'; #GA DPT1.001 für die Rückmeldung des Zustandes des Badezimmerschalters
#Zuordnung der Namen für die RRD's:
my $Name_rrd_AUL = 'KWL_Aussenluft'; #Name RRD Aussenluft
my $Name_rrd_ZUL = 'KWL_Zuluft'; #Name RRD Zuluft
my $Name_rrd_ABL = 'KWL_Abluft'; #Name RRD Abluft
my $Name_rrd_FOL = 'KWL_Fortluft'; #Name RRD Fortluft
#Pfad zur seriellen Schnittstelle oder dem USB-Seriell-Wandler:
my $schnittstelle = '/dev/ttyUSB-1-1';
######################
##ENDE Einstellungen##
######################
#Ab hier nichts mehr ändern.
#Hauptverarbeitung
use Device::SerialPort;
my $return_value2;
my $daten;
my $reciv;
my $reciv_all;
my $ack = pack("H*","07F3");
# Zyklischer Aufruf nach restart, empfang GA oder nach einstellung rrd (typisch 300sek).
$plugin_info{$plugname.'_cycle'} = 20;
#Einrichten der Seriellen Schnittstelle für die Kommunikation mit dem ComfoAir
my $seriel = Device::SerialPort->new($schnittstelle) || die "Kann $schnittstelle nicht öffnen! ($!)\n";
$seriel->baudrate(9600);
$seriel->parity("none");
$seriel->databits(8);
$seriel->stopbits(1);
plugin_log($plugname,'');
if ($msg{'apci'} eq "A_GroupValue_Write"){ #Wenn ein Telegramm vom KNX empfangen wird, ab hier auswerten
if ($msg{'dst'} eq $ga_stufeabwesend && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00990101";
plugin_log($plugname,'Stufe abwesend');
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_stufe1 && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00990102";
plugin_log($plugname,'Stufe 1');
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_stufe2 && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00990103";
plugin_log($plugname,'Stufe 2');
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_stufe3 && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00990104";
plugin_log($plugname,'Stufe 3');
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_komforttemp) {
my $komforttemp = knx_read($msg{'dst'},0,9.001);
plugin_log($plugname,'Komforttemp : ' . $komforttemp . '°C');
my $temphex = ($komforttemp + 20)*2; #Rechne die Temperatur für die ComfoAir um
$temphex = sprintf "%x" , $temphex; # Mache aus Integer HEX
$daten = "00D301" . $temphex;
$return_value2 = command_senden($daten);
}
return;
} else { # zyklischer Aufruf
# Plugin an Gruppenadresse "anmelden", hierdurch wird das Plugin im folgenden bei jedem eintreffen eines Telegramms auf die GA aufgerufen und der obere Teil dieser if-Schleife durchlaufen
$plugin_subscribe{$ga_stufeabwesend}{$plugname} = 1;
$plugin_subscribe{$ga_stufe1}{$plugname} = 1;
$plugin_subscribe{$ga_stufe2}{$plugname} = 1;
$plugin_subscribe{$ga_stufe3}{$plugname} = 1;
$plugin_subscribe{$ga_komforttemp}{$plugname} = 1;
$daten = "00D100";
plugin_log($plugname,'Temperatur abrufen');
$return_value2 = command_senden($daten);
if($ga_status_ventilator_zul && $ga_status_ventilator_abl){ #Nur wenn beide GA's vergeben sind, dann die Zustände der Ventilatoren abfragen
$daten = "000B00";
plugin_log($plugname,'Ventilator Status abrufen');
$return_value2 = command_senden($daten);
}
if($ga_status_bypass_prozent){ #Nur wenn die GA vergeben ist, dann Zustand Bypassklappe abfragen
$daten = "000D00";
plugin_log($plugname,'Bypass Zustand abrufen');
$return_value2 = command_senden($daten);
}
if($ga_betriebsstunden_filter){ #Nur wenn die GA vergeben ist, die Betriebsstunden abfragen
$daten = "00DD00";
plugin_log($plugname,'Betriebsstunden abrufen');
$return_value2 = command_senden($daten);
}
if($ga_zustand_badschalter){ #Nur wenn die GA vergeben ist, die Binäreingänge abfragen
$daten = "000300";
plugin_log($plugname,'Binäreingänge abrufen');
$return_value2 = command_senden($daten);
}
return;
}
# Ab hier wird das Datenpaket inklusive Checksumme zusammengestellt und an die ComfoAir übertragen
sub command_senden{
my $checksum = 0;
my $data = $_[0];
my $datasum = $data . "AD"; #+173 für die Checksummenberechnung
my @hex = map { hex($_) } ($datasum =~ /(..)/g);
my $x07warschon = 0;
foreach (@hex) {
$checksum += ($_) unless $x07warschon; # unless ist dasselbe wie if not/!
if ($_ == 0x07) { $x07warschon = 1; }
}
$checksum = sprintf "%x\n" , $checksum; #Mache aus Integer wieder HEX
$checksum = substr($checksum,-3,2); #Verwede nur die letzten beiden Stellen
my $command = pack("H*","07F0" . $data . $checksum . "070F");
my $commandhex = $command;
$commandhex =~ s/(.)/sprintf("0x%x ",ord($1))/eg;
# plugin_log($plugname,'transmit : ' . $commandhex); #Zeigt im Pluginlog das fertige Datenpaket, dass übertragen wird
$seriel->write($command); #Befehl an die ComfoAir senden
$reciv = '';
$|=1;
my $exit=0;
while($exit < 25000)
{
my ($cin, $sin) = $seriel->read(45);
if($cin > 0){
$sin = unpack "H*", $sin;
$reciv .= $sin;
$exit=0;
}else{
$exit++
}
if($reciv =~ /070f/i){
$seriel->write($ack); #ACK senden
last;
}
}
my $test = substr($reciv,0,4);
if($test eq '07f3'){
$reciv = substr($reciv,4); #falls noch ein 07f3 enthalten ist, wir dieses hier entfernt.
# plugin_log($plugname,'reciv neu : ' . $reciv);
}
my $laenge = length($reciv); #Länge des Antworttelegramms ermitteln
if($reciv =~ /07f000D209/i and $laenge == 34){ #Wenn die Temperaturen empfangen wurden und die Länge passt
my $t1 = substr($reciv,12,2);
my $t2 = substr($reciv,14,2);
my $t3 = substr($reciv,16,2);
my $t4 = substr($reciv,18,2);
#Hier werden die Temperaturen "decodiert" damit sie einen Sinn ergeben
$t1 = (hex($t1)/2)-20;
$t2 = (hex($t2)/2)-20;
$t3 = (hex($t3)/2)-20;
$t4 = (hex($t4)/2)-20;
#Ab hier werden die RRD's mit den aktuellen Temperaturen aktualisiert:
update_rrd($Name_rrd_AUL,"",$t1);
update_rrd($Name_rrd_ZUL,"",$t2);
update_rrd($Name_rrd_ABL,"",$t3);
update_rrd($Name_rrd_FOL,"",$t4);
plugin_log($plugname,'reciv: T1: ' . $t1 . '°C, T2:' . $t2 . '°C, T3: ' . $t3 . '°C, T4: ' . $t4 . '°C');
}elsif($reciv =~ /07f0000C06/i){ #Wenn der Status für die Ventilatoren empfangen wurden
my $vent_zul = substr($reciv,10,2);
my $vent_abl = substr($reciv,12,2);
plugin_log($plugname,'ZUL: ' . hex($vent_zul) . '% ABL: ' . hex($vent_abl) . '%');
knx_write($ga_status_ventilator_zul,hex($vent_zul),5.001);
knx_write($ga_status_ventilator_abl,hex($vent_abl),5.001);
}elsif($reciv =~ /07f0000e04/i){ #Wenn der Status für die Bypassklappe empfangen wurden
my $bypass_prozent = substr($reciv,10,2);
plugin_log($plugname,'Bypass: ' . hex($bypass_prozent) . '%');
knx_write($ga_status_bypass_prozent,hex($bypass_prozent),5.001);
}elsif($reciv =~ /07f000DE14/i and $laenge == 56){ #Wenn die Rückmeldung der Betriebsstunden empfangen wurden
my $betriebsstunden_filter = substr($reciv,40,4);
plugin_log($plugname,'Betriebsstunden: ' . hex($betriebsstunden_filter) . 'h');
knx_write($ga_betriebsstunden_filter,hex($betriebsstunden_filter) . 'h',16.000);
}elsif($reciv =~ /07f0000402/i){ #Wenn die Rückmeldung der Binäreingänge empfangen wurden
my $zustand_badschalter = substr($reciv,12,1);
plugin_log($plugname,'Zustand Badezimmerschalter: ' . $zustand_badschalter);
knx_write($ga_zustand_badschalter,$zustand_badschalter,1.001);
}
}
Hi,
da freuen wir uns halt einfach alle :-)
Andere kaufen für 300 € ein KNX-KWL-Gateway, die meisten Hersteller verkaufen überhaupt kein Gateway mehr - und wir nutzen das Wiregate!
@Makki: damit ist ein WG alleine schon Bezahlt, oder?
So - wenn wir schon gerade beim Wunschkonzert sind - ich habe mal Parameter für Parameter durchgekaut. Für mich ist maximal noch interssant:
0x00 0xDB Rücksetzen / Selbsttest
Byte[1] - Störungen zurücksetzen (1 = reset / 0 = -)
Byte[4] - Betriebsstunden Filter zurücksetzen (1 = reset / 0 = -)
und vielleicht noch
0x00 0xD9 Störungen abrufen
Byte[1] - Aktueller Fehler A: Fehler A1-A8
Byte[2] - Aktueller Fehler E: Fehler E1-E8
Byte[9] - 0x00 = Filter OK / 0x01 = Filter voll
Byte[10] - Aktueller Fehler EA
Byte[14] - Aktueller Fehler A (high): = Fehler A9 bis A15
Für Fehler A,E und EA gilt:
Bezeichnung
A0 NTC-Fühler Tge ist defekt.(= Temperatur der Bodentauscher)
A1 NTC-Fühler T1 ist defekt. (= Temperatur der Aussenluft)
A2 NTC-Fühler T2 ist defekt. (= Temperatur der Zuluft)
A3 NTC-Fühler T3 ist defekt. (= Temperatur der Abluft)
A4 NTC-Fühler T4 ist defekt. (= Temperatur der Fortluft)
A5 Störung des Bypassmotor.
A6 Störung des Frostschutzelementmotor.
A7 Frostschutzelement erhitzt nicht ausreichend.
A8 Frostschutzelement wird zu heiss.
A10 NTC-Fühler Tch ist defekt. (= Temperatur der Dunstabzugshaube)
A11 NTC-Fühler Tah ist defekt. (= Temperatur der Nacherhitzer)
E1 Abluftventilator läuft nicht .
E2 Zufuhrventilator läuft nicht .
E3 Temperaturfühler Dunstabzugshaube zu hoch
E4 Wärmerückgewinnung (WTW) ausgeschaltet
EA1 Enthalpiefühler misst zu hohe Feuchtigkeit.
EA2 Keine Kommunikation mit dem Enthalpiefühler.
Am liebsten wäre mir die Fehlerausgabe als KNX-Text - sonst muss man ja doch immer im Handbuch wühlen ;-)
Zur info für andere Bastelwillige: ich habe das Plugin auf 60 Sekunden gestellt und geziehlt (mehrfach) keine sinnvollen Antworten mehr bekommen.
Scheinbar hat die CC-Ease genau dieses Intervall.
Ein abklemmen der CC-Ease hat die Situation wieder normalisiert....
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar