Ankündigung

Einklappen
Keine Ankündigung bisher.

Steuerung der KWL Cofoair mit diesem Protokol möglich?

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Hallo Patrik,

    das wäre Byte 0x01. Wobei ich aber vermute, dass es nur so lange hi ist, wie der Aktor hi ist. :-(
    Naja, wir werden sehen...

    Danke und Grüße,
    Lio

    Kommentar


      Hi Lio,
      kommando 03 byte 01?
      Das zeigt doch den Stufenschalter L1?
      Da steht nichts von Stosslüftung?

      Macht es nicht mehr sinn die Leistung der Lüfter abzurufen?

      Gruß
      Thorsten

      Kommentar


        Dass wäre schon jetzt möglich (ZUL und ABL in %)

        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?
        Gruss Patrik alias swiss

        Kommentar


          oh ja sorry, Byte2 0x01 Badezimmerschalter

          und ja, könnte sinn machen und das ganze per logik im Plugin lösen:
          if x > y then z else a

          oder so ähnlich

          Kommentar


            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
            Gruss Patrik alias swiss

            Kommentar


              Zitat von swiss Beitrag anzeigen
              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.

              Kommentar


                nur Byte2

                und der rest full ACK

                Kommentar


                  Ich habe gerade an einer Stelle ein hartnäckiges Problem...

                  Ich will die Komforttemperatur setzen.

                  Das Datenpacket sollte so aussehen:

                  07 F0 00 D3 01 4C CD 07 0F

                  Die Checksumme:

                  00 + D3 + 01 + 4C + AD = 1CD = CD -> Nur die letzten beiden Stellen verwenden.

                  Dafür verwende ich folgenden Abschnitt:

                  Code:
                      $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");
                      plugin_log($plugname,'data+cheksumme : ' . $data . $checksum);
                  Nun zeigt mir die Ausgabe im PluginLog einen Zeilenumbruch??

                  Code:
                  2012-06-14 23:09:35.431,ComfoAir,Komforttemp: 18
                  2012-06-14 23:09:35.431,ComfoAir,Komforttemp hex: 4c 
                  2012-06-14 23:09:35.431,ComfoAir,transmit temp: 00D3014c  
                  2012-06-14 23:09:35.431,ComfoAir,data+cheksumme : 00D3014c
                  1c
                  2012-06-14 23:09:35.431,ComfoAir,chex2 : 0x7 0xf0 0x0 0xd3 0x1 0x4c 0xa1 0xc0 0x70 0xf0
                  Das 1c ist auf einer eigenen Zeile im Log???

                  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
                  Gruss Patrik alias swiss

                  Kommentar


                    Hallo Patrik,

                    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.

                    Grüße,
                    Lio
                    Angehängte Dateien

                    Kommentar


                      Hallo lio

                      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
                      Gruss Patrik alias swiss

                      Kommentar


                        Hi
                        Fehler gefunden!
                        Der Baustein zur Checksummenberechnung (siehe oben) stimmt.
                        Der Fehler war beim umrechnen der Kompfortemperatur auf den Hex-Wert.

                        Ach was bin ich Happy. Dieser Baustein ist GOLD wert

                        Gruß
                        Thorsten

                        Kommentar


                          Super Jetzt freu ich mich aber. Und ich dachte schon, die Cheksummenberechnung ist fehlerhaft. DANKE!

                          Ist sonnst noch etwas, dass fehlt oder gewünscht wird?

                          Hier mal der aktuelle Stand:

                          Senden...
                          - Abwesend, Sufe1, Stufe2, Stufe3
                          - Komforttemperatur

                          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);
                              }
                          }
                          Gruss Patrik alias swiss

                          Kommentar


                            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 ;-)

                            Gruß
                            Thorsten

                            Kommentar


                              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....

                              Gruß
                              Thorsten

                              Kommentar


                                Für mich wäre noch interessant: Status Bodentauscher (oder gibt's den schon und ich habe es übersehen?)
                                Endlich umgezogen. Fertig? Noch lange nicht... ;-)

                                Kommentar

                                Lädt...
                                X