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

    Hi
    vor geistiger umnachtung habe ich im Log übersehen (ja - ich schäme mich) das auch vorher schon kommunikation stattgefunden hat.
    Also "alter" Code:
    Code:
    2012-06-09 15:28:06.395,ComfoAir,reciv: 07f0000f00bc070f
    2012-06-09 15:28:06.395,ComfoAir,Betriebsstunden abrufen
    2012-06-09 15:28:06.395,ComfoAir,reciv: 07f0000f00bc070f
    2012-06-09 15:33:07.637,ComfoAir,Temperatur abrufen
    2012-06-09 15:33:07.847,ComfoAir,reciv: 3b07f0000f00bc070f
    2012-06-09 15:33:07.847,ComfoAir,Ventilator Status abrufen
    2012-06-09 15:33:07.847,ComfoAir,reciv: 3b07f0000f00bc070f
    2012-06-09 15:33:07.847,ComfoAir,Bypass Zustand abrufen
    2012-06-09 15:33:07.847,ComfoAir,reciv: 3b07f0000f00bc070f
    2012-06-09 15:33:07.847,ComfoAir,Betriebsstunden abrufen
    2012-06-09 15:33:07.847,ComfoAir,reciv: 3b07f0000f00bc070f
    2012-06-09 15:38:10.930,ComfoAir,Temperatur abrufen
    2012-06-09 15:38:10.947,ComfoAir,reciv: 07f0000f00bc070f
    2012-06-09 15:38:10.947,ComfoAir,Ventilator Status abrufen
    2012-06-09 15:38:10.947,ComfoAir,reciv: 07f0000f00bc070f
    2012-06-09 15:38:10.947,ComfoAir,Bypass Zustand abrufen
    2012-06-09 15:38:10.947,ComfoAir,reciv: 07f0000f00bc070f
    2012-06-09 15:38:10.947,ComfoAir,Betriebsstunden abrufen
    2012-06-09 15:38:10.947,ComfoAir,reciv: 07f0000f00bc070f
    2012-06-09 15:43:11.915,ComfoAir,Temperatur abrufen
    2012-06-09 15:43:12.128,ComfoAir,reciv: 3b07f0000f00bc070f
    2012-06-09 15:43:12.128,ComfoAir,Ventilator Status abrufen
    2012-06-09 15:43:12.128,ComfoAir,reciv: 3b07f0000f00bc070f
    2012-06-09 15:43:12.128,ComfoAir,Bypass Zustand abrufen
    2012-06-09 15:43:12.128,ComfoAir,reciv: 3b07f0000f00bc070f
    2012-06-09 15:43:12.128,ComfoAir,Betriebsstunden abrufen
    2012-06-09 15:43:12.128,ComfoAir,reciv: 3b07f0000f00bc070f
    2012-06-09 15:48:22.389,ComfoAir,Temperatur abrufen
    2012-06-09 15:48:22.662,ComfoAir,Ventilator Status abrufen
    2012-06-09 15:48:22.919,ComfoAir,Bypass Zustand abrufen
    2012-06-09 15:48:23.174,ComfoAir,Betriebsstunden abrufen
    2012-06-09 15:53:33.557,ComfoAir,Temperatur abrufen
    2012-06-09 15:53:33.797,ComfoAir,Ventilator Status abrufen
    2012-06-09 15:53:34.034,ComfoAir,Bypass Zustand abrufen
    2012-06-09 15:53:34.288,ComfoAir,Betriebsstunden abrufen
    2012-06-09 15:58:44.781,ComfoAir,Temperatur abrufen
    2012-06-09 15:58:45.030,ComfoAir,Ventilator Status abrufen
    2012-06-09 15:58:45.305,ComfoAir,Bypass Zustand abrufen
    2012-06-09 15:58:45.628,ComfoAir,Betriebsstunden abrufen
    2012-06-09 15:58:45.844,ComfoAir,reciv: 07f0000f00bc070f07f0000b00b8070f07f0000d00ba070f07
    2012-06-09 16:03:55.954,ComfoAir,Temperatur abrufen
    2012-06-09 16:03:56.202,ComfoAir,Ventilator Status abrufen
    mit dem neuen Code sieht es leider nicht besser aus:
    Code:
    2012-06-10 22:34:17.824,ComfoAir,Temperatur abrufen
    2012-06-10 22:34:17.851,ComfoAir,reciv: ACK
    2012-06-10 22:34:17.867,ComfoAir,reciv: 28282899070f
    2012-06-10 22:34:17.867,ComfoAir,Ventilator Status abrufen
    2012-06-10 22:34:17.867,ComfoAir,reciv: 28282899070f
    2012-06-10 22:34:17.867,ComfoAir,Bypass Zustand abrufen
    2012-06-10 22:34:17.867,ComfoAir,reciv: 28282899070f
    2012-06-10 22:34:17.867,ComfoAir,Betriebsstunden abrufen
    2012-06-10 22:34:17.867,ComfoAir,reciv: 28282899070f
    2012-06-10 22:38:26.477,ComfoAir,Temperatur abrufen
    2012-06-10 22:38:26.602,ComfoAir,reciv: 07f307f0003c0a
    2012-06-10 22:38:26.602,ComfoAir,reciv: ACK
    2012-06-10 22:38:26.618,ComfoAir,reciv: 8216fd4f6f5b000077e2fa070f
    2012-06-10 22:38:26.618,ComfoAir,Ventilator Status abrufen
    2012-06-10 22:38:26.618,ComfoAir,reciv: 8216fd4f6f5b000077e2fa070f
    2012-06-10 22:38:26.618,ComfoAir,Bypass Zustand abrufen
    2012-06-10 22:38:26.618,ComfoAir,reciv: 8216fd4f6f5b000077e2fa070f
    2012-06-10 22:38:26.619,ComfoAir,Betriebsstunden abrufen
    2012-06-10 22:38:26.619,ComfoAir,reciv: 8216fd4f6f5b000077e2fa070f
    2012-06-10 22:43:27.002,ComfoAir,Temperatur abrufen
    Kannst du damit was anfangen?

    Gruß
    Thorsten

    Kommentar


      Das sieht aber garnicht gut aus.

      Die Frage ist, ob das mit der Eigenheit von 07F3 zutun hat.

      Bei der CA350 muss ich nach jedem Empfang das ACK also 07F3 senden. Bei dir löst das scheinbar wildes senden von Zuständen aus.

      Was, wenn du die Zeile 186 mal mit # kommentierst (deaktivierst)?

      Was meinen die Debugzeilen dann?

      PS: Hast du das Bedienteil noch dran? Das könnte auch Probleme Verursachen. Bitte bei Gelegenheit mal abklemmen.
      Gruss Patrik alias swiss

      Kommentar


        Hi
        Code:
        2012-06-10 22:53:33.781,ComfoAir,Temperatur abrufen
        2012-06-10 22:53:33.782,ComfoAir,reciv: f307f0003c0a8216fd6d5b5b000077e204070f07f307f000d2
        2012-06-10 22:53:33.782,ComfoAir,reciv: ACK
        2012-06-10 22:53:33.782,ComfoAir,reciv: 09404c5058560f28282899070f07f307f0003c0a8216fd6d5b
        2012-06-10 22:53:33.782,ComfoAir,reciv: ACK
        2012-06-10 22:53:33.782,ComfoAir,reciv: 5b000077e204070f07f307f000e00700000064000001f9070f
        2012-06-10 22:53:33.782,ComfoAir,reciv: ACK
        2012-06-10 22:53:33.782,ComfoAir,reciv: 07f307f000e20602000000000198070f07f307f0003c0a8216
        2012-06-10 22:53:33.782,ComfoAir,reciv: ACK
        2012-06-10 22:53:33.782,ComfoAir,reciv: fd6d5b5b000077e204070f07f307f000ec07070717000a0000
        2012-06-10 22:53:33.782,ComfoAir,reciv: ACK
        2012-06-10 22:53:33.782,ComfoAir,reciv: 12da070f07f3070f
        2012-06-10 22:53:33.782,ComfoAir,reciv: ACK
        2012-06-10 22:53:33.808,ComfoAir,reciv: 07f307f000d209404c5158560f28
        2012-06-10 22:53:33.808,ComfoAir,reciv: ACK
        2012-06-10 22:53:33.840,ComfoAir,reciv: 00ec07070717000a000012da070f
        2012-06-10 22:53:33.840,ComfoAir,Ventilator Status abrufen
        2012-06-10 22:53:33.841,ComfoAir,reciv: 00ec07070717000a000012da070f
        2012-06-10 22:53:33.841,ComfoAir,Bypass Zustand abrufen
        2012-06-10 22:53:33.841,ComfoAir,reciv: 00ec07070717000a000012da070f
        2012-06-10 22:53:33.841,ComfoAir,Betriebsstunden abrufen
        2012-06-10 22:53:33.841,ComfoAir,reciv: 00ec07070717000a000012da070f
        ich habe mir ab #144 folgende Zeilen eingefügt:
        #Thorsten
        plugin_log($plugname,'reciv: ' . $reciv);

        Damit wollte ich nur sicherstellen das ich alles geloggt bekomme. Ich denke das die lesefähigkeit nicht verändert.

        Die Zeile 186 (bzw. jezt 188) habe ich deaktiviert:
        #$seriel->write($ack); #ACK senden
        Gruß
        Thorsten

        Kommentar


          Das sieht mir fast danach aus, als ob die EASE da noch angeschlossen wäre und dauernd dazwischen funkt.

          Wenn JA... Kannst du die bei Gelegenheit zum testen mal abklemmen?
          Gruss Patrik alias swiss

          Kommentar


            Ein debugin info in Zeile 114 ist nicht unbedingt sinnvoll, da hier Byte weise eingelesen und zusammen gesetzt wird. Es wird also für jedes empfangene Byte ein Eintrag gemacht, was das Protokoll unübersichtlich macht.

            Ich habe aber noch ene Besonderheit gesehen...

            Versuche mal dass:

            Code:
            # 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;    
                    }
                }
            }
            Bei dir kommen scheinbar willkürlich ACK conditions. Diese Auswertung habe ich mal deaktiviert, um ein vollständiges Datenpaket zu erhalten
            Gruss Patrik alias swiss

            Kommentar


              Hi
              das mit dem Debug habe ich festgestellt - aber: kannst du nicht ein Debug einbauen wo der Empfangene Teil (wenn er nicht zutrifft) angezeigt wird?
              Ich vermute da geht irgendwo was verloren.
              Also ein "else" plugin_log($plugname,'reciv: ' . $reciv);

              Mit deinem neuen Plugin geht erstmal auch nichts. Ich habe das CC-Ease abgeklemmt.
              Von dem "alten" Log habe ich aber gesehen das es einmal doch ging: hier mal ein auszug (die ganzen Leerzeilen habe ich entfernt)
              Hier mal das Log:
              http://gehrig.info/share/wiregate_plugin.log.upload
              wenn du nach "T1:" suchst, findest du die stelle wo es geklappt hat...

              Gruß
              Thorsten

              Kommentar


                Hi
                jetzt hast du mich mit dem "return;" ein wenig ausgetrickst... ich hatte das Plugin deaktiviert :-(
                Die letzte version läuft!
                Abgesehen davon das die T1 nicht stimmt...
                Code:
                2012-06-11 07:49:39.808,ComfoAir,Temperatur abrufen
                2012-06-11 07:49:39.851,ComfoAir,reciv: 07f307f000d209404b4f58560f28282897070f
                2012-06-11 07:49:39.852,ComfoAir,reciv: T1: -15.5°C, T2:12°C, T3: 17.5°C, T4: 19.5°C
                2012-06-11 07:49:45.894,ComfoAir,Temperatur abrufen
                2012-06-11 07:49:45.928,ComfoAir,reciv: 07f307f000d209404b4f58560f28282897070f
                2012-06-11 07:49:45.929,ComfoAir,reciv: T1: -15.5°C, T2:12°C, T3: 17.5°C, T4: 19.5°C
                2012-06-11 07:49:51.472,ComfoAir,Temperatur abrufen
                2012-06-11 07:49:51.511,ComfoAir,reciv: 07f307f000d209404b5058560f28282898070f
                2012-06-11 07:49:51.511,ComfoAir,reciv: T1: -15.5°C, T2:12°C, T3: 17.5°C, T4: 20°C
                2012-06-11 07:49:57.547,ComfoAir,Temperatur abrufen
                2012-06-11 07:49:57.589,ComfoAir,reciv: 07f307f000d209404b5058560f28282898070f
                2012-06-11 07:49:57.590,ComfoAir,reciv: T1: -15.5°C, T2:12°C, T3: 17.5°C, T4: 20°C
                2012-06-11 07:50:03.130,ComfoAir,Temperatur abrufen
                2012-06-11 07:50:03.172,ComfoAir,reciv: 07f307f000d209404b4f58560f28282897070f
                2012-06-11 07:50:03.172,ComfoAir,reciv: T1: -15.5°C, T2:12°C, T3: 17.5°C, T4: 19.5°C
                2012-06-11 07:50:09.208,ComfoAir,Temperatur abrufen
                2012-06-11 07:50:09.250,ComfoAir,reciv: 07f307f000d209404b5058560f28282898070f
                2012-06-11 07:50:09.251,ComfoAir,reciv: T1: -15.5°C, T2:12°C, T3: 17.5°C, T4: 20°C
                (nicht wundern - plugin-intervall ist auf 5 sekunden runtergesetzt - ist eine dedizierte Test-Wiregate-Maschiene)

                Gruß
                Thorsten

                Kommentar


                  Hallo,

                  da ist ja erheblich viel Funkverkehr über das lange WE durch die Lappen gegangen-leider wrde ich auch über Eure posts per mail infomiert?!?!

                  Zur Afklärung:
                  Ich habe auch die 550 Luxe version und ja, wenn man an den RJ45 Stecker auf der Erweiterungsplatine ein serielles Kabel anschließt-knallt es (bei mir zumindest) die Schmelzsicherung durch.
                  Meines wissens ist die Verwendung für diese Buchse nch nicht geklärt.

                  Nach das letzte Plugin (Ich glaub V0.5) läuft nun eine weile. Die rrd laufen in der CV. Es sind unregelmäßige Lücken vorhanden-deutet auf Datenabruch hin. Aber das ist momentan irelevant..

                  Zur Kommunikation benutzte ich nix gebasteltes. SUB-D RS232 zu USB-Wandler von DIGITUS, 2m USB-Kabel, WG ohne USB-Extender.
                  Das EASE ist angeschlossen.

                  Grüße,
                  Lio

                  Kommentar


                    Zitat von lio123 Beitrag anzeigen
                    Ich habe auch die 550 Luxe version und ja, wenn man an den RJ45 Stecker auf der Erweiterungsplatine ein serielles Kabel anschließt-knallt es (bei mir zumindest) die Schmelzsicherung durch.
                    Dann vermute ich, dass Dein Kabel irgendwo die 12V Versorgungsspannung der Ease (von Pin 1) anlegt wo sie nix verloren haben....
                    Ich hab mir eines gebaut, das nur TX, RX und GND verbindet, damit geht es (aber das mir die Ease dann noch dazwischen funkt ist mir auch erst nach dem Versuch gekommen).

                    Kommentar


                      Hallo Thorsten

                      Oo. Ja das Return hab ich für mich reingesetzt, da ich offline teste. -> Hab ich vergessen zu entfernen Sorry

                      Die Temperaturen dürften eigentlich überhabut nicht stimmen. Das hat damit zutun, dass bei dir noch 2 Byte zuviel sind... Eigentlich sollte die erste If Abfrage das 07f3 entfernen. Wiso es dass bei dir nicht tut ist mir ein Rätsel. Hast du da etwas deaktiviert? Ich baue da mal noch eine Zeile ein, die dass verhinden sollte.

                      Und einen reciv für nichterkannte Datenpakete bau ich auch noch gleich mit ein
                      Gruss Patrik alias swiss

                      Kommentar


                        Also... Könnte das mal jemand so testen? Und bitte auch mal kurz die Temperaturen validieren. Danke

                        Code:
                        # Plugin zur Ansteuerung einer Zender ComfoAir
                        # Version 0.7 11.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 $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 roh: ' . $reciv);
                            
                                    $reciv =~ s/07f3//g; #falls noch ein 07f3 enthalten ist, wir dieses 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);
                        }
                        Gruss Patrik alias swiss

                        Kommentar


                          konnte leider nicht testen-aber eins bemerken:super doku!

                          Lio

                          Kommentar


                            Danke Ist nicht wirklich ausführlich aber man bekommt einen Eindruck davon, wo was passiert. Macht auch für andere das erweitern und debugen einfacher

                            Wenn du das bei Gelegenheit mal testen könntest. -> Mir wäre am liebsten eine Lösung die für ComfoAir 350 und 550 funktioniert.

                            Dann noch das Socketproblem lösen und ich bin glücklich
                            Gruss Patrik alias swiss

                            Kommentar


                              Ähnlich bei mir ... muss grade Estrichfühler löten, die haben Priorität - am Freitag kommt der Estrich rein.

                              Kommentar


                                Läuft gerade bei mir - im 10 Sekunden intervall:

                                Code:
                                2012-06-11 23:41:58.515,ComfoAir,reciv roh: 09404c5057550f28282897070f
                                2012-06-11 23:41:58.515,ComfoAir,reciv neu: 09404c5057550f28282897070f
                                2012-06-11 23:41:58.515,ComfoAir,reciv debug_all: 09404c5057550f28282897070f
                                2012-06-11 23:42:08.568,ComfoAir,Temperatur abrufen
                                2012-06-11 23:42:08.595,ComfoAir,reciv: ACK
                                2012-06-11 23:42:08.610,ComfoAir,reciv roh: 00d209404c5057550f28282897070f
                                2012-06-11 23:42:08.610,ComfoAir,reciv neu: 00d209404c5057550f28282897070f
                                2012-06-11 23:42:08.610,ComfoAir,reciv debug_all: 00d209404c5057550f28282897070f
                                2012-06-11 23:42:18.652,ComfoAir,Temperatur abrufen
                                2012-06-11 23:42:18.672,ComfoAir,reciv: ACK
                                2012-06-11 23:42:18.704,ComfoAir,reciv roh: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:42:18.704,ComfoAir,reciv neu: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:42:18.704,ComfoAir,reciv: T1: 18°C, T2:20°C, T3: 23.5°C, T4: 22.5°C
                                2012-06-11 23:42:18.704,ComfoAir,reciv debug_all: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:42:29.248,ComfoAir,Temperatur abrufen
                                2012-06-11 23:42:29.262,ComfoAir,reciv: ACK
                                2012-06-11 23:42:29.293,ComfoAir,reciv roh: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:42:29.294,ComfoAir,reciv neu: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:42:29.294,ComfoAir,reciv: T1: 18°C, T2:20°C, T3: 23.5°C, T4: 22.5°C
                                2012-06-11 23:42:29.294,ComfoAir,reciv debug_all: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:42:40.337,ComfoAir,Temperatur abrufen
                                2012-06-11 23:42:40.364,ComfoAir,reciv: ACK
                                2012-06-11 23:42:40.379,ComfoAir,reciv roh: 282897070f
                                2012-06-11 23:42:40.379,ComfoAir,reciv neu: 282897070f
                                2012-06-11 23:42:40.379,ComfoAir,reciv debug_all: 282897070f
                                2012-06-11 23:42:51.419,ComfoAir,Temperatur abrufen
                                2012-06-11 23:42:51.449,ComfoAir,reciv: ACK
                                2012-06-11 23:42:51.465,ComfoAir,reciv roh: 550f28282897070f
                                2012-06-11 23:42:51.465,ComfoAir,reciv neu: 550f28282897070f
                                2012-06-11 23:42:51.465,ComfoAir,reciv debug_all: 550f28282897070f
                                2012-06-11 23:43:03.009,ComfoAir,Temperatur abrufen
                                2012-06-11 23:43:03.032,ComfoAir,reciv: ACK
                                2012-06-11 23:43:03.048,ComfoAir,reciv roh: 550f28282897070f
                                2012-06-11 23:43:03.048,ComfoAir,reciv neu: 550f28282897070f
                                2012-06-11 23:43:03.048,ComfoAir,reciv debug_all: 550f28282897070f
                                2012-06-11 23:43:13.089,ComfoAir,Temperatur abrufen
                                2012-06-11 23:43:13.110,ComfoAir,reciv: ACK
                                2012-06-11 23:43:13.126,ComfoAir,reciv roh: 404c5057550f28282897070f
                                2012-06-11 23:43:13.126,ComfoAir,reciv neu: 404c5057550f28282897070f
                                2012-06-11 23:43:13.126,ComfoAir,reciv debug_all: 404c5057550f28282897070f
                                2012-06-11 23:43:24.663,ComfoAir,Temperatur abrufen
                                2012-06-11 23:43:24.695,ComfoAir,reciv: ACK
                                2012-06-11 23:43:24.724,ComfoAir,reciv roh: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:43:24.724,ComfoAir,reciv neu: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:43:24.724,ComfoAir,reciv: T1: 18°C, T2:20°C, T3: 23.5°C, T4: 22.5°C
                                2012-06-11 23:43:24.724,ComfoAir,reciv debug_all: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:43:35.262,ComfoAir,Temperatur abrufen
                                2012-06-11 23:43:35.283,ComfoAir,reciv: ACK
                                2012-06-11 23:43:35.297,ComfoAir,reciv roh: 404c5057550f28282897070f
                                2012-06-11 23:43:35.297,ComfoAir,reciv neu: 404c5057550f28282897070f
                                2012-06-11 23:43:35.297,ComfoAir,reciv debug_all: 404c5057550f28282897070f
                                2012-06-11 23:43:45.834,ComfoAir,Temperatur abrufen
                                2012-06-11 23:43:45.855,ComfoAir,reciv: ACK
                                2012-06-11 23:43:45.871,ComfoAir,reciv roh: 404c5057550f28282897070f
                                2012-06-11 23:43:45.871,ComfoAir,reciv neu: 404c5057550f28282897070f
                                2012-06-11 23:43:45.872,ComfoAir,reciv debug_all: 404c5057550f28282897070f
                                2012-06-11 23:43:56.911,ComfoAir,Temperatur abrufen
                                2012-06-11 23:43:56.943,ComfoAir,reciv: ACK
                                2012-06-11 23:43:56.958,ComfoAir,reciv roh: 97070f
                                2012-06-11 23:43:56.958,ComfoAir,reciv neu: 97070f
                                2012-06-11 23:43:56.958,ComfoAir,reciv debug_all: 97070f
                                2012-06-11 23:44:07.000,ComfoAir,Temperatur abrufen
                                2012-06-11 23:44:07.023,ComfoAir,reciv: ACK
                                2012-06-11 23:44:07.036,ComfoAir,reciv roh: 09404c5057550f28282897070f
                                2012-06-11 23:44:07.036,ComfoAir,reciv neu: 09404c5057550f28282897070f
                                2012-06-11 23:44:07.036,ComfoAir,reciv debug_all: 09404c5057550f28282897070f
                                2012-06-11 23:44:17.077,ComfoAir,Temperatur abrufen
                                2012-06-11 23:44:17.100,ComfoAir,reciv: ACK
                                2012-06-11 23:44:17.114,ComfoAir,reciv roh: 4c5057550f28282897070f
                                2012-06-11 23:44:17.114,ComfoAir,reciv neu: 4c5057550f28282897070f
                                2012-06-11 23:44:17.114,ComfoAir,reciv debug_all: 4c5057550f28282897070f
                                2012-06-11 23:44:27.160,ComfoAir,Temperatur abrufen
                                2012-06-11 23:44:27.193,ComfoAir,reciv: ACK
                                2012-06-11 23:44:27.209,ComfoAir,reciv roh: 2897070f
                                2012-06-11 23:44:27.209,ComfoAir,reciv neu: 2897070f
                                2012-06-11 23:44:27.209,ComfoAir,reciv debug_all: 2897070f
                                2012-06-11 23:44:37.250,ComfoAir,Temperatur abrufen
                                2012-06-11 23:44:37.280,ComfoAir,reciv: ACK
                                2012-06-11 23:44:37.286,ComfoAir,reciv roh: d209404c5057550f28282897070f
                                2012-06-11 23:44:37.286,ComfoAir,reciv neu: d209404c5057550f28282897070f
                                2012-06-11 23:44:37.286,ComfoAir,reciv debug_all: d209404c5057550f28282897070f
                                2012-06-11 23:44:47.328,ComfoAir,Temperatur abrufen
                                2012-06-11 23:44:47.352,ComfoAir,reciv: ACK
                                2012-06-11 23:44:47.380,ComfoAir,reciv roh: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:44:47.380,ComfoAir,reciv neu: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:44:47.381,ComfoAir,reciv: T1: 18°C, T2:20°C, T3: 23.5°C, T4: 22.5°C
                                2012-06-11 23:44:47.381,ComfoAir,reciv debug_all: 07f000d209404c5057550f28282897070f
                                2012-06-11 23:44:57.422,ComfoAir,Temperatur abrufen
                                2012-06-11 23:44:57.456,ComfoAir,reciv: ACK
                                2012-06-11 23:44:57.459,ComfoAir,reciv roh: 5057550f28282897070f
                                2012-06-11 23:44:57.459,ComfoAir,reciv neu: 5057550f28282897070f
                                2012-06-11 23:44:57.459,ComfoAir,reciv debug_all: 5057550f28282897070f
                                2012-06-11 23:45:08.508,ComfoAir,Temperatur abrufen
                                2012-06-11 23:45:08.531,ComfoAir,reciv: ACK
                                2012-06-11 23:45:08.545,ComfoAir,reciv roh: 09404c5057550f28282897070f
                                2012-06-11 23:45:08.545,ComfoAir,reciv neu: 09404c5057550f28282897070f
                                2012-06-11 23:45:08.545,ComfoAir,reciv debug_all: 09404c5057550f28282897070f
                                Manchmal kommen die Werte - manchmal nicht...
                                CC-Ease ist abgeklemmt...

                                Sieht irgendwie aus als wenn "zuviel" Anfang weggeschnitten wird?!

                                Gruß
                                Thorsten

                                Kommentar

                                Lädt...
                                X