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
    Filterwechsel mache ich nach "Anzahl Betriebstage" und nicht nach Stunden. Die Filterwechselaneige der KWL ist eh nur ein Schätzeisen - da kann ich auch selber Schätzen (KWL mache ich alle 180 Tage, EWT Filter und Abluftfilter alle 120 Tage, durch den EWT Filter und die Abluftfilter verschmutzen meine KWL Filter eigentlich garnicht).

    @Lio: hast du auch einen Analogaktor dran? Darüber mache ich auch mein eigenes Stoßlüftungsprogramm (1 Std. auf 90%)

    Generell wäre eine Auswertung der Störmeldung interessant - da ich aber in nun 2 Jahren noch keine Störung hatte: keine wirkliche Priorität...

    Was eigentlich Interessant wäre: direkte Ansteuerung der Drehzahlen (und bypassklappe) - im Wartungsmodus geht das, scheint nur nicht Dokumentiert zu sein...

    Gruß
    Thorsten

    Kommentar


      Hmmm...

      Ja die RRD's sollten in der Auswahlliste auftauchen. Hast du mehrere Versionen dieses Plugin's paralell laufen? In deinem letzten PluginLog habe ich meldungen aus mindestens 3 Versionen gesehen. Das sollte nicht sein. Bitte immer nur die aktuelle Version laufen lassen.

      Hast du die namen der RRD's verändert? Wenn JA -> wie heissen die jetzt?

      Ich gehe der Sache mal nach...

      Noch eine Frage zu den Betriebsstunden. In welchem DPT sollen die Infas am besten übertragen werden?

      @Torsten: Reicht dir jeweils die Ausgabe in %? DPT 5.001?
      Gruss Patrik alias swiss

      Kommentar


        Patrik, die rrd sind nun vorhanden-alles klar soweit-TOP!

        Kommentar


          Naja Ventilatorstufe setzen in % ginge mit einem Trick aber dass wird dan sehr mühsam. Da stellt sich die frage ob man das unbedingt braucht und wenn ja ob man das nicht einfach auf dem Analogaktor lässt.

          An den übrigen Dingen bin ich gerade dran

          @Lio: Super

          Was brauchst du für Betriebsstunden? Da sind mehrere Zähler unter 0xDD vorhanden?
          Gruss Patrik alias swiss

          Kommentar


            Hi
            DPT5.001 ist okay.
            Zu deinem Trick: meinst du die Lüftungsleistung für eine Stufe (z.B. Stufe 1) auf den wunschwert zu Konfigurieren? Das wird nicht (so einfach) gehen ... Da sind nicht alle Werte erlaubt. Stufe 1 darf z.B. Minimal 16% haben - da 15% die Abwesenheitsstufe ist (soweit ich das im Kopf habe)

            Wenn allrad diskret ginge könnte man sich mehrfach-Aktoren sparen... Aber das wird wohl nicht hinhauen.

            Gruß
            Thorsten

            Kommentar


              Thorsten, der Analogaktor ist noch verpackt, aufgrund fehlenden Infrastruktur einer Logikengine, z.b. Homeserver oder mangels Programmierkentnisse PERL.
              Ausserdem bin ich mit der Zehnder-Zeitsteuerung soweit zufrieden. Deshalb die Wichtigsten automatisierungsthemen Stoßlüften und Aus via Schaltaktor.

              Patrik, das sin im Kommando 0xDD die Bytes 16+17 (Filterstunden)
              Alternativ könnte man auch aus dem Störmeldungskommando 0xD9 das Byte9 nehmen.
              Ihr beide-das ganze dient mir nur als Visu auf der CV- das Ease hat mein Heizi-Nixnutz neben die KWL in den Keller gehängt. Und klar-es ist relativ!

              Grüße,
              Lio

              Kommentar


                @lio: Ich habe mal 0xDD implementiert aber es wird noch nichts ausgegeben, weil ich noch nicht heraus gefunden habe welcher DPT dafür geeignet ist. Der Wert ist mit 3 Byte sehr gross und kann damit mit den meisten DPT's nicht übertragen werden. Die Paar die noch bleiben sind so selten dass sie von fast keinem Endgerät empfangen werden können -> CV ist da ne Ausname aber auch da sind nicht alle DPT's dies normalerweisen NIE braucht implementiert. Da müsste ich erst mal anchfragen was geht und was nicht

                @Thorsten:

                Ja das meinte ich. Von der Limitation stand nix in der Doku. Gut zu wissen


                Sooo... Also mal ein Update zum testen:

                WICHTI!... Ich habe es jetzt PluginIntern so gelöst, dass nur die Zustände abgerufen werden die unter Einstellungen eine GA bekommen. Da ich keine Erfahrungswerte mit der Performanc habe, sollte man sich bei jedem aktivieren einer Option bewusst sein, dass es das gesammte PluginSystem stark ausbremsen kann!!

                Code:
                # Plugin zur Ansteuerung einer Zender ComfoAir
                # Version 0.5 05.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!
                #
                #
                
                ####################
                ###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 empfangenwird, 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 = "000F00";
                    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 Zustand Ventilator 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 < 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);
                            
                            if($reciv =~ /07f0001004/i){ #Wenn die Temperaturen empfangen wurden
                                my $t1 = substr($reciv,10,2);
                                my $t2 = substr($reciv,12,2);
                                my $t3 = substr($reciv,14,2);
                                my $t4 = substr($reciv,16,2);
                #                plugin_log($plugname,'reciv: T1: ' . $t1 . ' T2:' . $t2 . ' T3: ' . $t3 . ' T4: ' . $t4);
                                
                                $t1 =  (hex($t1)/2)-20;
                                $t2 =  (hex($t2)/2)-20;
                                $t3 =  (hex($t3)/2)-20;
                                $t4 =  (hex($t4)/2)-20;
                                
                                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 die der Status für den Ventilator 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 die 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 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;    
                        }
                    }
                }
                Was noch nicht implementiert ist:

                -Betriebsstunden, da noch kein passender DPT gefunden
                -Eingänge abrufen -> Da muss ich auch mal schaun welcher DPT... Welche Zustände werden da gebraucht?
                -Komforttemperatur setzen... Welcher DPT haben da die KNX Telegramme??
                Gruss Patrik alias swiss

                Kommentar


                  Zitat von swiss Beitrag anzeigen
                  Das Problem ist die Ausführungszeit. Solange wir keine Lösung für das socket problem finden habe ich das grosse Problem, dass das daten empfangen im Plugin abgearbeitet werden muss.
                  Hilf mir mal, manchmal kommt man bei den Threads nicht so hinterher, was war da das Problem?
                  Sollte sich ja evtl. lösen lassen, ich hatte mir beim socat-Entwickler vor geraumer Zeit auch mal einen Variablen Timeout statt EOL gewünscht, muss mal sehen ob das schon umgesetzt ist..

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

                  Kommentar


                    Hallo makki

                    Ja das grosse Problem ist, dass man nicht 2 Zeichen als EOL angeben kann. Dass führt dazu, dass die Datenübertragung vom Socket nicht als "beendet" angesehen wird. Der socket bleibt also weit über die eigentlichte Datenübertragung hinaus auf Empfang und stellt die Daten nicht in $fh zur Verfügung. In dieser Zeit kann auch nix gesendet weren.

                    Hier wäre entweder ein EOL1 und EOL2 gut, die beide zutreffen müssen um die Datenübertragung als beendet zu erkennen, oder ein variabler Timeout der die daten einfach nach x Sekunden ausspuckt.

                    Da ich die gesammten Rohdaten unverfälscht brauche wäre raw warschheinlich nicht verkehrt. Es hackt einfach beim erkenen einer abgeschlossenen Übertragung.
                    Gruss Patrik alias swiss

                    Kommentar


                      Zitat von swiss Beitrag anzeigen
                      ..und stellt die Daten nicht in $fh zur Verfügung.
                      Ok, das sollte sich lösen lassen. Das genaue "wie" erfordert aber zwingend direkten Zugriff und ausprobieren!
                      Der socat kann wahnsinnig viel, ist aber auch leicht - ich nenne es mal - "unterdokumentiert"
                      -t oder -T könnte in die richtige Richtung gehen.

                      In dieser Zeit kann auch nix gesendet werden.
                      Kann eigentlich nicht sein, UDP, async, das ist dem Plugin und dem socat erstmal wurscht..

                      Hier wäre entweder ein EOL1 und EOL2 gut, die beide zutreffen müssen um die Datenübertragung als beendet zu erkennen, oder ein variabler Timeout der die daten einfach nach x Sekunden ausspuckt.
                      Vielleicht fräse ich mal durch den source von socat, sollte eigentlich machbar sein.

                      Da ich die gesammten Rohdaten unverfälscht brauche wäre raw warschheinlich nicht verkehrt. Es hackt einfach beim erkenen einer abgeschlossenen Übertragung.
                      Das kommt drauf an! Also wie es sendet, bei meiner WP z.B. würde das nicht funktionieren mit dem Timout weil die sendet wann sie lustig ist auch halbe packerl, sondern nur mit dem EOL(ETX)
                      Aber lösbar ist es..

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

                      Kommentar


                        Mir ist gerade noch ein weiteres Problem aufgefallen...

                        Wenn ich daten sende, bekomme ich von der KWL ein ACK dass aus 2 Zeichen besteht.

                        Wenn ich aber Daten empfange, bin ich an der Reihe das ACK zu senden. Das bedeutet, dass beim senden das EOL eigentlich das 07F3 = ACK ist und beim empfangen 070F=EOL.

                        Kann eigentlich nicht sein, UDP, async, das ist dem Plugin und dem socat erstmal wurscht..
                        Doch kann es... Das liegt aber nicht direkt am socket sondern an der seriellen Übertragung. Das Protokoll erlaubt nur Halbduplex. Also jede Übertragung muss abgeschlossen werden, bevor eine Antwort erfolgen kann. Genau da liegt der Kanckpunkt. Ohne korrekte EOL erkennung bleibt der Socket auf Empfang und darf desshalb nicht senden.

                        Vielleicht fräse ich mal durch den source von socat, sollte eigentlich machbar sein.
                        Das wäre cool. Dann müsste man aber eine Lösung für das oben genannte Problem mit den ungleich EOL für senden und empfangen finden ...So ein mist.
                        Gruss Patrik alias swiss

                        Kommentar


                          Zitat von makki Beitrag anzeigen
                          Ok, das sollte sich lösen lassen. Das genaue "wie" erfordert aber zwingend direkten Zugriff und ausprobieren!
                          open sesame

                          Ist alles angeschlossen und funktioniert mit der letzen Version 0.4.
                          Viele Vorgängerversionen sind noch 'drauf. Kannst mit den KWL-Plugin gern machen was Du willst. (Ausser nach 19:00 Stoßlüften)

                          Grüße,
                          Lio

                          Kommentar


                            Zitat von swiss Beitrag anzeigen
                            Doch kann es... Das liegt aber nicht direkt am socket sondern an der seriellen Übertragung. Das Protokoll erlaubt nur Halbduplex. Also jede Übertragung muss abgeschlossen werden, bevor eine Antwort erfolgen kann. Genau da liegt der Kanckpunkt. Ohne korrekte EOL erkennung bleibt der Socket auf Empfang und darf desshalb nicht senden.
                            Verstehe.. Also der socket bleibt nicht auf Empfang aber die Lüftung will den Ack sehen.. Hmm..
                            Ehrlich, es läuft vermutlich auf einen (sehr kleinen, übersichtlichen!) daemon hinaus, ob in Perl, C oder shellscript dürfte egal sein, der genau das handelt und ggfs. die Daten weiterschubst - es geht viel mit Plugins, dafür sind sie ursprünglich auch gemacht - aber eben nicht alles (zumindest in sinnvoll)

                            Zitat von lio123 Beitrag anzeigen
                            Ist alles angeschlossen und funktioniert mit der letzen Version 0.4.
                            Ganz ehrlich, da sind zuviele offene Baustellen; ich helfe gerne mit Tipps wenn ich kann aber eine neue Aufreissen ist derzeit nicht drin..
                            Wenn man sich da so wie Patrik reinkniet, sind sowas von schnell 4h rum.

                            Makki

                            P.S.: Nicht böse gemeint, aber so ab 23:00 Uhr leg ich dann die Prio auch mal auf das, was mich persönlich, privat drückt
                            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                            -> Bitte KEINE PNs!

                            Kommentar


                              Ich habe fast befürchtet, dass es doch noch auf einen daemon hinaus laufen wird

                              Die kommunikation ist aber auch doof aufgebaut. Wenn man sich mal die kommunikation ansieht haben wir hier wirklich das Problem der ungleichen EOL Zeichen:

                              00F0000F000F070F -> Temperatur bei ComfoAir anfragen -> EOL 070F... betrift aber nur den ComfoAir und der macht das richtig
                              07F3 ACK von der KWL -> EOL 07F3
                              07F0001004.....070F -> Antwort von der KWL -> EOL 070F
                              07F3 ACK vom WG
                              usw...

                              Das bedeutet dass das EOL immer abwechslungsweise 070F und 07F3 ist Ich habe in der socat Doku etwas von EOL1 und EOL2 gelesen aber dass geht glaube ich nur mit TCP-Connect!?

                              Dass ganze effizient in einem Perl-Daemon abzubilden... Da wäre dann mein Latain am Ende. Vor allem wie dann das signalisieren von neuen Daten an das eigentliche Plugin funktionieren soll
                              Gruss Patrik alias swiss

                              Kommentar


                                Ich habe mir mal noch kurz die Optionen -t und -T angesehen. in diesem Fall könnte -T nützlich sein. Aber -T wird als Option unter socket 1 nicht angenommen. Wie müsste diese Option richtig übergeben werden?
                                Gruss Patrik alias swiss

                                Kommentar

                                Lädt...
                                X