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?
Es könnte sein, dass die SubD tatsächlich nur für Update ist... Oder bekommst du mit dem PC und Programm so eine Verbindung? Wenn ja... Kannst du die Kommunikation mitschneiden?
Hi
ich krieg alle Werte (über die SubD) - einwandfrei. Nur das CC-Ease schaltet sich nach einer Zeit ab.
Und zum Mitschneiden: die Frage hatte ich auch schon gestellt... wie kann man so eine Kommunikation mitschneiden?? (irgendwelche Tips/Sniffersoftware?)
hier mal ein erster "schnellschuss".
Die Software fragt halt ALLES ab - daher erstmal ein riesen.-datenwust.
Hab gerade keine Zeit - die Frau zeigt mir die Uhr...
Obwhol ich eine ComfoAir550 habe - scheint also die Firmware vielleicht doch gleich zu sein....
Und auch interessant: wenn ich auf die überwachung gehe - scheint er einen "Dump" mit allen werten anzufordern - egal ob ich nur einen Wert anzeigen lasse, oder alle. Einmal "07 F3" und die Antwort ist der Dump:
Ach du Schande... Ich hoffe das ist nicht die einzige Möglichkeit, um an die Werte zu kommen. Wie sieht es denn aus, wenn du einen Wert über das ComfoTool änderst? Oder in dem Augenblick, in dem du das Tool startest (Inizialisierung?)?
Was es zu erraten gilt, in welchen Parametern sich die gewünschten Werte befinden. Das Protokoll ist das gleiche aber die einzelnen Komandonummern sind anders. Ich habe z.B. im Dump nirgens 0x00 0x0F gefunden. Darinn sollten die Werte T1-T4 enthalten sein.
Danke für die Info Leider hilft uns dieses Verhalten der ComfoAir nicht gerade weiter weil wir ohne Socket nicht spontan empfangen können. Und ich kann auch nicht einfach die Verbindung offen lassen bis alle Daten empfangen wurde. Sonst haben wir dann Ausführungszeiten die soo lange sind, dass kein anderes Plugin vernünftig paralell laufen würde
Es muss also eine Möglichkeit geben einfach bestimmte Werte abfufragen wie bei der CA350 auch.
Versuche einfach mal folgenden Befehl (ohne laufendes ComfoAirTool) an die KWL zu senden und poste mal die Antwort:
Leider hilft uns dieses Verhalten der ComfoAir nicht gerade weiter weil wir ohne Socket nicht spontan empfangen können. Und ich kann auch nicht einfach die Verbindung offen lassen bis alle Daten empfangen wurde. Sonst haben wir dann Ausführungszeiten die soo lange sind, dass kein anderes Plugin vernünftig paralell laufen würde
Wie meinst du das? Das der Datenblock erstmal nichts bringt (weil wir nicht wissen wo was steht) ist klar. Aber: der Dump kommt erst auf Anforderung (07 F3) und hat vermutlich eine feste Länge oder einen festen "Ende-Code". Spontan ist da nichts...
Es muss also eine Möglichkeit geben einfach bestimmte Werte abfufragen wie bei der CA350 auch.
Klar - das erkennt man doch im post darüber.
Da wird alles mögliche (vom Client) ständig abgefragt.
Was ich machen könnte: ich schaue mir mal die Temperaturen im Client an - und suche dann den Wert im Hex-Code... dann müsste ich ja die Temperaturen finden... mal schauen
das passt auch, oder?!!??!!
(es sind 14 bytes plus 0E für die Länge und 40 als Prüfsumme - 07 0F)
Für 0x69/Firmware abrufen verhält es sich identisch.
Bei 0x97/Sensordaten abrufen kriege ich nicht 17 sondern 20 Antwortbytes... zwei davon (9 und 10) scheinen zu und Abluftventilator zu sein. Byte[3] schein der Analogeingang zu sein.
0xEB EWT / Nachheizung abrufen - passt.
Nun zu einem Wichtigen:
0x00 0xD1 Temperaturen abrufen
Fühler anwesend: 0F (passt: T1 bis T4 sind anwesend)
Temperatur EWT: 28 = 0
Temperatur Nachheizung: 28 = 0
Temperatur Küchenhaube:28 = 0
0xDD Betriebsstunden abrufen sieht auch gut aus (Antwort 20 Bytes)
0x00 0xDF Status Bypassregelung abrufen passt: Byte[4] ist der Klappenstatus (derzeit 0x64=100%)
0x00 0xA1 Konnektorplatine Version abrufen: passt.
Also - mal kurz zusammengefasst - das Protokoll was ich mitgeschnitten habe (auf dem subd) ist passend zu dem was in der Protokollbeschreibung steht.
Kannst du mal nachschauen ob Prüfsumme etc. auch stimmen?
Hi Swiss,
ich habe zum Sniffen den "Free Serial Port Monitor" genommen. Das von dir genannte Programm läuft auf meinem Windows7 nicht :-(
Die Temperaturen hab ich jetzt auch geschnallt:
nach der Formel (Wert in Dec/2)-20= Temperatur in Grad
0x40 = 12 Grad
0x4D = 18 Grad
0x51 = 20,5 Grad
0x58 = 24 Grad
0x56 = 23 Grad
# Plugin zur Ansteuerung einer Zender ComfoAir
# Version 0.6 10.06.2012 ALPHA
# Copyright: swiss (https://knx-user-forum.de/members/swiss.html)
# Die Vorlage für die Datenübertragung via socat stammt von makki (https://knx-user-forum.de/members/makki.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
#Hier werden die Gruppenadressen für die Rückmeldungen vergeben: (Nich vergeben = inaktiv)
my $ga_status_ventilator_zul = ''; #GA DPT5.001 für Status Ventilator Zuluft %
my $ga_status_ventilator_abl = ''; #GA DPT5.001 für Status Ventilator Abluft %
my $ga_status_bypass_prozent = ''; #GA DPT5.001 für Status Bypassklappe %
my $ga_betriebsstunden_filter = ''; #GA DPT???? für die Rückmeldung der Betribsstunden des Filters
#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
#Pfand zur seriellen Schnittstelle oder dem USB-Seriell-Wandler:
my $schnittstelle = '/dev/usbserial-2-3';
######################
##ENDE Einstellungen##
######################
#Ab hier nichts mehr ändern.
#Hauptverarbeitung
use Device::SerialPort;
my $return_value2;
my $daten;
my $reciv;
my $ack = pack("H*","07F3");
# Zyklischer Aufruf nach restart, empfang GA oder nach einstellung rrd (typisch 300sek).
$plugin_info{$plugname.'_cycle'} = $wg_config{''}{'rrd_interval'};
#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);
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);
}
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;
$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);
}
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,length($checksum)-3,2); #Verwede nur die letzten beiden stellen
my $command = pack("H*","07F0" . $data . $checksum . "070F");
$seriel->write($command); #Befehl an den ComfoAir senden
$|=1;
my $exit=0;
while($exit < 20000)
{
my ($cin, $sin) = $seriel->read(25);
if($cin > 0){
$sin = unpack "H*", $sin;
$reciv .= $sin;
$exit=0;
}else{
$exit++
}
if($reciv =~ /07f3/i){
# plugin_log($plugname,'reciv: ACK');
$reciv = '';
}
if($reciv =~ /070f/i){
# plugin_log($plugname,'reciv: ' . $reciv);
if($reciv =~ /07f000D209/i){ #Wenn die Temperaturen empfangen wurden
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);
knx_write($ga_status_ventilator_zul,hex($vent_zul),5.001);
knx_write($ga_status_ventilator_abl,hex($vent_abl),5.001);
}elsif($reciv =~ /07f0000D04/i){ #Wenn der Status für die Bypassklappe empfangen wurden
my $bypass_prozent = substr($reciv,10,2);
knx_write($ga_status_bypass_prozent,hex($bypass_prozent),5.001);
}elsif($reciv =~ /07f000DE14/i){ #Wenn die Rückmeldung der Betriebsstunden empfangen wurden
my $betriebsstunden_filter = substr($reciv,40,4);
knx_write($ga_betriebsstunden_filter,hex($betriebsstunden_filter),5.001);
}
$seriel->write($ack); #ACK senden
last;
}
}
}
EDIT: Oo Ich musste das Plugin nochmal ändern, da ich die Komforttemperatur übersehen habe. Nun werden die richtigen Werte decodiert.
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