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

    Ich denke, ich weiss wo der Fehler liegt. Ich kann mir das aber erst heute abend ansehen. Ich glaube da kommen dummerweise mehrere 070f in der Antwort vor und der neue Code zerlegt den Code radikal. Ich lass mir was einfallen.
    Gruss Patrik alias swiss

    Kommentar


      Wollte nur mal kurz melden: Danke! das macht richtig Spaß (Protokolle Analysieren, ausprobieren, etc). So ein "Bastelspaß" hatte ich schon lange nicht mehr - und die Chancen die KWL so zu steuern hatte ich auch auf sehr niedrig eingeschätzt (im gegensatz zu jetzt).

      Gruß
      Thorsten

      Kommentar


        Hallo Thorsten

        Mir macht es auch riesen Spass Plugins zu entwickeln. Und wenn man dann noch freiwillige Tester hat... Besser kann es gar nicht sein

        Ich habe mal das Plugin etwas angepasst. Hoffentlich klapt es so besser mit dem herausrechnen der Temperaturen

        Code:
        # Plugin zur Ansteuerung einer Zender ComfoAir
        # Version 0.7 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
        
        #Pfad 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 $reciv_all;
        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;
                    $reciv_all .= $sin;
                    $exit=0;
                 }else{
                    $exit++
                }
                if($reciv =~ /07f3/i){
                    plugin_log($plugname,'reciv: ACK');
                    $reciv = '';    
                }
                if($reciv =~ /070f/i){
                    plugin_log($plugname,'reciv roh: ' . $reciv);
                    if(substr($reciv,0,4) eq '07f3'){
                        $reciv = substr($reciv,0,4,""); #falls noch ein 07f3 enthalten ist, wir dieses hier entfernt.
                    }
                    plugin_log($plugname,'reciv neu: ' . $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;    
                }
            }
            plugin_log($plugname,'reciv debug_all: ' . $reciv_all);
        }
        Wenn das läuft, kommt als nächstes die Ventistufen für ZUL und ABL
        Gruss Patrik alias swiss

        Kommentar


          hm
          Code:
          2012-06-12 22:31:51.318,ComfoAir,Temperatur abrufen
          2012-06-12 22:31:51.336,ComfoAir,reciv: ACK
          2012-06-12 22:31:51.352,ComfoAir,reciv roh: d209404c5057550f28282897070f
          2012-06-12 22:31:51.352,ComfoAir,reciv neu: d209404c5057550f28282897070f
          2012-06-12 22:31:51.352,ComfoAir,reciv debug_all: 07f307f000d209404c5057550f28282897070f
          2012-06-12 22:32:01.393,ComfoAir,Temperatur abrufen
          2012-06-12 22:32:01.419,ComfoAir,reciv: ACK
          2012-06-12 22:32:01.429,ComfoAir,reciv roh: 404c5057550f28282897070f
          2012-06-12 22:32:01.429,ComfoAir,reciv neu: 404c5057550f28282897070f
          2012-06-12 22:32:01.429,ComfoAir,reciv debug_all: 07f307f000d209404c5057550f28282897070f
          2012-06-12 22:32:12.968,ComfoAir,Temperatur abrufen
          2012-06-12 22:32:12.995,ComfoAir,reciv: ACK
          2012-06-12 22:32:13.011,ComfoAir,reciv roh: 57550f28282897070f
          2012-06-12 22:32:13.011,ComfoAir,reciv neu: 57550f28282897070f
          2012-06-12 22:32:13.011,ComfoAir,reciv debug_all: 07f307f000d209404c5057550f28282897070f
          2012-06-12 22:32:23.050,ComfoAir,Temperatur abrufen
          2012-06-12 22:32:23.078,ComfoAir,reciv: ACK
          2012-06-12 22:32:23.090,ComfoAir,reciv roh: 5057550f28282897070f
          2012-06-12 22:32:23.090,ComfoAir,reciv neu: 5057550f28282897070f
          2012-06-12 22:32:23.090,ComfoAir,reciv debug_all: 07f307f000d209404c5057550f28282897070f
          2012-06-12 22:32:33.130,ComfoAir,Temperatur abrufen
          2012-06-12 22:32:33.152,ComfoAir,reciv: ACK
          2012-06-12 22:32:33.167,ComfoAir,reciv roh: 404c5057550f28282897070f
          2012-06-12 22:32:33.167,ComfoAir,reciv neu: 404c5057550f28282897070f
          2012-06-12 22:32:33.167,ComfoAir,reciv debug_all: 07f307f000d209404c5057550f28282897070f
          2012-06-12 22:32:43.705,ComfoAir,Temperatur abrufen
          2012-06-12 22:32:43.726,ComfoAir,reciv: ACK
          2012-06-12 22:32:43.741,ComfoAir,reciv roh: 4c5057550f28282897070f
          2012-06-12 22:32:43.741,ComfoAir,reciv neu: 4c5057550f28282897070f
          2012-06-12 22:32:43.741,ComfoAir,reciv debug_all: 07f307f000d209404c5057550f28282897070f

          ah - jetzt doch noch:
          Code:
          2012-06-12 22:34:18.476,ComfoAir,reciv: ACK
          2012-06-12 22:34:18.507,ComfoAir,reciv roh: 07f000d209404c5057550f28282897070f
          2012-06-12 22:34:18.507,ComfoAir,reciv neu: 07f000d209404c5057550f28282897070f
          2012-06-12 22:34:18.508,ComfoAir,reciv: T1: 18°C, T2:20°C, T3: 23.5°C, T4: 22.5°C
          2012-06-12 22:34:18.508,ComfoAir,reciv debug_all: 07f307f000d209404c5057550f28282897070f
          2012-06-12 22:34:30.048,ComfoAir,Temperatur abrufen
          2012-06-12 22:34:30.074,ComfoAir,reciv: ACK

          Kommentar


            Sehr interessant.

            In reciv debug_all wird seit neustem der gesammte Datenstrom eines Zyklus festgehalten. Damit kann man sehen, was das Plugin damit anstellt. Wiso aber das Plugin zum Teil an völlig falschen Stellen den Stream teilt, ist mir bis jetzt noch ein Rätsel Ich suche mal weiter nach einer Lösung.

            PS: Wie ist bei dir die Zykluszeit gesetzt? Ein Zyklus von unter 20 Sekunden könnte da Probleme machen, weil der ComfoAir manchmal noch weiter sendet, wenn die interessanten Daten schon längst empfangen und ausgewertet sind. Wenn dann das Plugin schon wieder irgend etwas dazwischen sendet und auf die Antwort lauscht, kann das zu Problemen führen.
            Gruss Patrik alias swiss

            Kommentar


              Code:
              2012-06-12 22:52:05.798,KWL V0.7,Temperatur abrufen 2012-06-12 22:52:05.799,KWL V0.7,reciv roh: 0a880bdb6d4f06000000e205070f 2012-06-12 22:52:05.799,KWL V0.7,reciv neu: 0a880bdb6d4f06000000e205070f 2012-06-12 22:52:05.799,KWL V0.7,reciv debug_all: 0a880bdb6d4f06000000e205070f 2012-06-12 22:57:06.671,KWL V0.7,Temperatur abrufen 2012-06-12 22:57:06.672,KWL V0.7,reciv roh: 0000000198070f 2012-06-12 22:57:06.672,KWL V0.7,reciv neu: 0000000198070f 2012-06-12 22:57:06.672,KWL V0.7,reciv debug_all: 0000000198070f 2012-06-12 22:58:13.022,KWL V0.7,14/7/0,0s, 2012-06-12 23:03:13.961,KWL V0.7,14/7/0,0s, 2012-06-12 23:08:14.822,KWL V0.7,14/7/0,0s, 2012-06-12 23:13:15.884,KWL V0.7,14/7/0,0s,

              meine Antwort auf V0.7

              Kommentar


                Zitat von swiss Beitrag anzeigen
                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
                Also nur so am Rande, Doch! genau dafür wurden die Plugins eigentlich gemacht (das wir sie seitdem täglich missbrauchen=anderes Thema)
                Also so mit select und plugin_socket_subscribe..

                Makki
                EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                -> Bitte KEINE PNs!

                Kommentar


                  Hallo lio

                  Das sieht aber nicht gut aus... Kann aber an dem fehlenden ACK liegen, dass ich für die 550 erst mal deaktiviert habe. Du müsstest also das # am Anfang derZeile 192 entfernen. Hoffe das klapt

                  Später wenn es dan definitiv ist, dass die 550 falsch auf das ACK reagiert, muss ich wohl eine Option einfügen, bei der man den Typ 350 oder 550 auswählen muss

                  Weist du schon in welchem DPT du die Betriebsstunden gerne hättest? Würde 14-Byte Text (DPT16.000) reichen?

                  @makki: Wie geht das mit Device::SerialPort? Klingt nach einer praktikabelen Lösung
                  Gruss Patrik alias swiss

                  Kommentar


                    welchen "Code"-Butten benutzt Ihr denn, dass Ihr einen Zeilenumbruch hinbekommt?

                    Code:
                    2012-06-13 19:00:52.314,KWL V0.7,14/7/0,0s, 2012-06-13 19:02:20.814,KWL V0.7,Temperatur abrufen 2012-06-13 19:02:20.815,KWL V0.7,reciv roh: f307f0003e04388deeab4d070f 2012-06-13 19:02:20.815,KWL V0.7,reciv neu: f307f0003e04388deeab4d070f 2012-06-13 19:02:20.816,KWL V0.7,reciv debug_all: f307f0003e04388deeab4d070f 2012-06-13 19:07:21.915,KWL V0.7,Temperatur abrufen 2012-06-13 19:07:21.916,KWL V0.7,reciv: ACK 2012-06-13 19:07:21.929,KWL V0.7,reciv: ACK 2012-06-13 19:07:21.947,KWL V0.7,reciv roh: 07f000d209404d4f55530f28282893070f 2012-06-13 19:07:21.947,KWL V0.7,reciv neu: 07f000d209404d4f55530f28282893070f 2012-06-13 19:07:21.951,KWL V0.7,reciv: T1: 18.5°C, T2:19.5°C, T3: 22.5°C, T4: 21.5°C 2012-06-13 19:07:21.952,KWL V0.7,reciv debug_all: 07f307f000e00700000064000001f9070f07f307f000d209404d4f55530f28282893070f 2012-06-13 19:12:22.092,KWL V0.7,Temperatur abrufen 2012-06-13 19:12:22.093,KWL V0.7,reciv roh: 07f0003c0a900eef064f5b000000e212070f 2012-06-13 19:12:22.094,KWL V0.7,reciv neu: 07f0003c0a900eef064f5b000000e212070f 2012-06-13 19:12:22.094,KWL V0.7,reciv debug_all: 07f0003c0a900eef064f5b000000e212070f 2012-06-13 19:17:22.922,KWL V0.7,Temperatur abrufen 2012-06-13 19:17:22.923,KWL V0.7,reciv: ACK 2012-06-13 19:17:22.935,KWL V0.7,reciv: ACK 2012-06-13 19:17:22.954,KWL V0.7,reciv roh: 07f000d209404d4f55530f28282893070f 2012-06-13 19:17:22.954,KWL V0.7,reciv neu: 07f000d209404d4f55530f28282893070f 2012-06-13 19:17:22.956,KWL V0.7,reciv: T1: 18.5°C, T2:19.5°C, T3: 22.5°C, T4: 21.5°C 2012-06-13 19:17:22.956,KWL V0.7,reciv debug_all: 07f307f000e00700000064000001f9070f07f307f000d209404d4f55530f28282893070f
                    DTP16 passt schon?!!

                    Kommentar


                      Zitat von lio123 Beitrag anzeigen
                      welchen "Code"-Butten benutzt Ihr denn, dass Ihr einen Zeilenumbruch hinbekommt?
                      Ich mache einfach [C-ODE] und [/C-ODE] (manuell, den bindestrich wegdenken)

                      Das Log kopiere ich mir per Copy&Paste aus putty heraus... Wo holst du das log her? aus dem WebIF?

                      Gruß
                      T

                      Kommentar


                        Sooo...

                        Die Datenverarbeitun läuft nun extrem viel stabieler (Danke Thorsten). Ich bitte auch Leute einer CA350, dass sie die neue Version noch einmal testen:

                        Code:
                        # Plugin zur Ansteuerung einer Zender ComfoAir
                        # Version 0.8 13.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 = '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 = ''; #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
                        
                        #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'}  = 10; 
                        
                        #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
                            $reciv = '';
                            $reciv_all = '';
                                
                            $|=1;
                            my $exit=0;
                            while($exit < 20000)
                            {
                                my ($cin, $sin) = $seriel->read(45);
                                if($cin > 0){
                                    $sin = unpack "H*", $sin;
                                    $reciv .= $sin;
                                    $reciv_all .= $sin;
                                    $exit=0;
                                 }else{
                                    $exit++
                                }
                        
                            if($reciv =~ /070f/i){           
                                   $seriel->write($ack); #ACK senden
                                    last;
                            }
                            }    
                        #    plugin_log($plugname,'reciv debug_all: ' . $reciv_all);
                        
                                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);
                                }
                        
                            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);
                                        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){ #Wenn die Rückmeldung der Betriebsstunden empfangen wurden
                                        my $betriebsstunden_filter = substr($reciv,40,4);
                                        
                                        knx_write($ga_betriebsstunden_filter,hex($betriebsstunden_filter),16.000);
                                    }
                        }
                        Gruss Patrik alias swiss

                        Kommentar


                          Zitat von swiss Beitrag anzeigen
                          Sooo...

                          Leute einer CA350
                          }[/CODE]

                          wer ist das? Dachte Luigi un Thorsten haben auch die 550??


                          greats

                          Kommentar


                            Nun bin ich verwirrt... Hattest nicht du eine CA350? Wenn du die CA550 hast, sollte es nun bei dir auch tun. Bin aber in der Zwischenzeit schon wieder einen ganzen Schritt weiter. Betriebsstunden, Bypasstellung und Ventilatorstufen für ZUL und ABL laufen schonmal. Ich werde dass nacher mal wieder hier einstellen. Binn gerade noch an dem setzen der Komforttemperatur über KNX dran
                            Gruss Patrik alias swiss

                            Kommentar


                              550 LUXE!


                              ...lass dich nicht stören...

                              Kommentar


                                Hallo lio

                                Wenn ich gerade dabei bin...

                                Welche Byte's vom Parameter 03 -> Eingänge abrufen brauchst du genau? Ich sehe z.B. kein Stosslüften 30min? Was soll ich genau auswerten?
                                Gruss Patrik alias swiss

                                Kommentar

                                Lädt...
                                X