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

    Für Makki,der Socket-Man, ist das fast schon ein MUSS!

    Klar lesen der Tempi und rein in die rrd würde mir persönlich erstmal reichen.

    Kommentar


      Ich sehe mal, wie ich dass machen muss. Jetzt wird es noch eine Scheibe schwieriger, da ich ja jetzt Antworttelegramme simulieren muss um zu sehen was das WG damit macht. Aber das wird schon noch.
      Gruss Patrik alias swiss

      Kommentar


        Gratuliere!
        Bist du am Franken-Stammtisch anzutreffen?
        2 Bier gehen auf mich!

        Bin zwar im Urlaub - aber freue mich trotzdem. Ein Grund mehr heimzufliegen (wenn der Urlaub rum ist)

        Gruß
        T.

        Kommentar


          Hallo Thorsten

          Danke

          Mal sehe ob ich auch zum Stammtisch kommen kann. Werde mich da auch mal noch mit Bodo kurzschliessen. Dann könnten wir mit einem Auto kommen. Würde mich sehr freuen.

          Geniesse die Ferien
          Gruss Patrik alias swiss

          Kommentar


            Also...

            Tasten wir uns langsam an die Temperaturen ran.

            Bitte dieses Plugin einfach mal ein paar Minuten laufen lassen. Nach ein paar Minuten sollte im Plugin_log mehrfach der Eintrag:

            Code:
            2012-06-02 22:50:31.240,KWL.pl,transmit:0x7 0xf0 0x0 0xf 0x0 0xbc 0x7 0xf
            2012-06-02 22:50:34.914,KWL.pl,reciv: ACK
            2012-06-02 22:50:34.914,KWL.pl,reciv: ...........07f3
            2012-06-02 22:50:34.917,KWL.pl,..................07f3,3.9s,
            auftauchen.

            Code:
            # Plugin zur Ansteuerung einer Zender ComfoAir
            # Version 0.1 02.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!
            #
            #
            use Device::SerialPort;
            
            ####################
            ###Einstellungen:###
            ####################
            
            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 $usb = '/dev/usbserial-2-3';
            
            
            ######################
            ##ENDE Einstellungen##
            ######################
            my $return_value2;
            my $daten;
            my $reciv;
            
            $plugin_info{$plugname.'_cycle'} = 30; 
            # Zyklischer Aufruf nach restart und alle 300 sek.
            
            my $seriel = Device::SerialPort->new($usb) || die "Kann $usb nicht öffnen! ($!)\n";
            $seriel->baudrate(9600);
            $seriel->parity("none");
            $seriel->databits(8);
            $seriel->stopbits(1);
            
            
            if ($msg{'apci'} eq "A_GroupValue_Write"){
                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 $return_value2;
            } else { # zyklischer Aufruf
            
                $daten = "000F00";
                plugin_log($plugname,'Temperatur abrufen');
                $return_value2 = command_senden($daten);
            
                # 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;
            }
            
            # 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");
                
                my $commandhex = $command;
                $commandhex =~ s/(.)/sprintf("0x%x ",ord($1))/eg;
                
                $plugin_info{$plugname.'_debug_transmit'} = $commandhex;
                plugin_log($plugname,'transmit:' . $commandhex);
                $seriel->write($command);
            
                
                $|=1;
                my $exit=0;
                while($exit < 100000)
                {
                    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');
                        last;
                            
                    }
                }
                plugin_log($plugname,'reciv: ' . $reciv);
                $plugin_info{$plugname.'_debug_reciv'} = $reciv;
            }
            EDIT: Nicht vergessen den USB Pfad anzupassen!
            Gruss Patrik alias swiss

            Kommentar


              so etwa?
              Angehängte Dateien

              Kommentar


                Ja das sieht schon sehr gut aus

                Jetzt muss ich mal die Temperaturen rausrechenen und dann geht es an's erraten welche Temperatur was sein könnte

                Ich sehe gerade, dass die Daten zum teil abgeschnitten wurden. da muss ich wohl den Eingangspuffe vergrössern. Wede morgen mal ein Update dazu machen, damit die daten besser in ihre einzelnen Telegramme unterteilt werden Dann kommt wieder etwas Kopf arbeit.
                Gruss Patrik alias swiss

                Kommentar


                  Stellt sich die Frage des Unterschiedes der Befehle 0x0f und 0xd1
                  aber erstmal nebensache!

                  Hauptsache es läuft erstmal

                  Kommentar


                    Wenn ich dass richtig aus dem Protokoll gelesen habe, beinhaltet d1 mehr Werte. Allerdings glaube ich dass die Temperaturen T1 - T4 für Aussenluft, Zuluft, Abluft und Fortluft stehen. Die Reihenfolge müssen wir aber noch erraten
                    Gruss Patrik alias swiss

                    Kommentar


                      ich tippe mal...
                      Angehängte Dateien

                      Kommentar


                        Zitat von swiss Beitrag anzeigen
                        @makki: Kann man beim Socket auch einen Timeout einrichten, dass den Empfang nach z.B. 2 Sekunden abbricht und die Daten zum verarbeiten einfach Roh ausspuckt?
                        Schwierig..

                        Zitat von swiss Beitrag anzeigen
                        Langsam frage ich mich, ob ich mit use Device::SerialPort; in diesem speziellen Fall nicht besser dran wäre.
                        Es gibt immer viele Wege nach Rom, Device::SerialPort ist aber erfahrungsgemäss eine der schmerzhaftesten.. Das funktioniert schon, 1-5x im Labor..

                        Zitat von swiss Beitrag anzeigen
                        Also muss irgend wie der Socket zurecht gebogen werden oder makki hat die zündende Idee wie man Device::SerialPort auch so einrichten kann, dass das Plugin beim eintreffen eines Datenpacket's aufgerufen wird.
                        Das socket_subscribe ist bewusst universell gemacht, das ist relativ egal, woher die Daten kommen, TCP, UDP oder direkt serieller Port..

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

                        Kommentar


                          Hallo Tobias

                          Sehr gut. Mal sehen ob das mit den Temperaturen hin kommt.

                          Hmmm... Irgend etwas scheint mit der Formel:

                          gesendeter Wert = (Temperatur+20)*2 nicht zu stimmen. Wenn ich die Formel umstelle müsste es ja zum decodieren Temperatur = (Wert/2)-20 sein? Wenn ich dass aber auf die Daten anwende die du im Log aufgezeichnet hast erhalte ich sehr seltsame Werte die nicht richtig sein können.

                          Code:
                          0x38 -> 56  -> -1
                          0x8D -> 141 -> 50,5
                          0xEE -> 238 -> 99
                          0xAB -> 171 -> 65,5
                          @makki:

                          Ich hätte überhabut nichts gegen den Socket. Im Gegenteil er nimmt mir einiges an Arbeit ab. Nur habe ich dass Problem, dass ich bis jetzt den Socket noch nicht davon überzeugen konnte die Verbindung auch ohne Endzeichen zu beenden und die Daten unverfälscht auszuspucken.

                          Wenn es da eine Lösung gäbe... Ich wäre sofort dabei
                          Gruss Patrik alias swiss

                          Kommentar


                            Ich habe mal das Datenhandling etwas verbessert. Nun sollten eigentlich die Telegramme korrekt getrennt werden.

                            Code:
                            # Plugin zur Ansteuerung einer Zender ComfoAir
                            # Version 0.2 03.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!
                            #
                            #
                            use Device::SerialPort;
                            
                            ####################
                            ###Einstellungen:###
                            ####################
                            
                            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 $usb = '/dev/usbserial-2-3';
                            
                            
                            ######################
                            ##ENDE Einstellungen##
                            ######################
                            my $return_value2;
                            my $daten;
                            my $reciv;
                            my @line;
                            
                            $plugin_info{$plugname.'_cycle'} = 30; 
                            # Zyklischer Aufruf nach restart und alle 300 sek.
                            
                            my $seriel = Device::SerialPort->new($usb) || die "Kann $usb nicht öffnen! ($!)\n";
                            $seriel->baudrate(9600);
                            $seriel->parity("none");
                            $seriel->databits(8);
                            $seriel->stopbits(1);
                            
                            
                            if ($msg{'apci'} eq "A_GroupValue_Write"){
                                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 $return_value2;
                            } 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 = "000F00";
                                plugin_log($plugname,'Temperatur abrufen');
                                $return_value2 = command_senden($daten);
                            }
                            
                            # 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");
                                
                                my $commandhex = $command;
                                $commandhex =~ s/(.)/sprintf("0x%x ",ord($1))/eg;
                                
                                $plugin_info{$plugname.'_debug_transmit'} = $commandhex;
                                plugin_log($plugname,'transmit:' . $commandhex);
                                $seriel->write($command);
                            
                                
                                $|=1;
                                my $exit=0;
                                while($exit < 30000)
                                {
                                    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);
                                        last;    
                                    }
                                }
                                #$reciv = pack("H*",$reciv);
                                #$reciv =~ s/(.)/sprintf("0x%x ",ord($1))/eg;
                                plugin_log($plugname,'reciv: ' . $reciv);
                                $plugin_info{$plugname.'_debug_reciv'} = $reciv;
                            }
                            Gruss Patrik alias swiss

                            Kommentar


                              Code:
                              2012-06-03 11:52:31.350,KWL oS Sonntag,Temperatur abrufen 2012-06-03 11:52:31.351,KWL oS Sonntag,transmit:0x7 0xf0 0x0 0xf 0x0 0xbc 0x7 0xf  2012-06-03 11:52:31.363,KWL oS Sonntag,reciv: ACK 2012-06-03 11:52:31.376,KWL oS Sonntag,reciv: 07f00010044f5157550d070f 2012-06-03 11:52:31.376,KWL oS Sonntag,reciv: 07f00010044f5157550d070f 2012-06-03 11:52:31.379,KWL oS Sonntag,07f00010044f5157550d070f,0s,  2012-06-03 11:53:02.109,KWL oS Sonntag,Temperatur abrufen 2012-06-03 11:53:02.110,KWL oS Sonntag,transmit:0x7 0xf0 0x0 0xf 0x0 0xbc 0x7 0xf  2012-06-03 11:53:02.110,KWL oS Sonntag,reciv: 005f070f 2012-06-03 11:53:02.111,KWL oS Sonntag,reciv: 005f070f 2012-06-03 11:53:02.113,KWL oS Sonntag,005f070f,0s,

                              Kommentar


                                Danke

                                So ergeben die Daten gleich viel mehr Sinn

                                Code:
                                0x4f -> 79 -> 19,5°C  Aussenluft
                                0x51 -> 81 -> 20,5°C  Zuluft
                                0x57 -> 87 -> 23,5°C  Abluft
                                0x55 -> 85 -> 22,5°C  Fortluft
                                Kannst du das bestätigen?
                                Gruss Patrik alias swiss

                                Kommentar

                                Lädt...
                                X