Ankündigung

Einklappen
Keine Ankündigung bisher.

ComfoAir Steuerung über RS232

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Das hängt etwas davon ab, was du sonnst noch alles auf dem WG parallel laufen lasen willst. Wenn da noch ein paar weitere zeitaufwändige Plugins oder mehrere MPD nebenher laufen sollen, wird es wohl nicht mehr so toll laufen. Aber prinzipiell kann das Plugin problemlos auch 3 mal ausgeführt werden. Ich kenne da jemanden der das so hat
    Gruss Patrik alias swiss

    Kommentar


      Zitat von imojoe Beitrag anzeigen
      Hab das ganze erfolgreich mit einer Moxa 5110 umgesetzt.
      Hi
      kannst du mir mal deine Konfig posten - sowohl vom Plugin als auch vom Moxa?
      Ich hab einen Moxa 5110 hier - aber noch nie in Betrieb gehab... und würde mir gerne das Konfigurations-gefummel ersparen :-)
      Mit dem Strom: hast du da mittlerweile eine Lösung?

      Gruß
      Thorsten

      Konkrete Nachfragen:
      Was ich ich im Moxa unter "Serial Settings" einstellen? (Baurdrate 9600 8N1 Flow Control RTS/CTS,FIFO enable? Port-Alias?)
      Wie muss ich die Serielle Schnittstelle im Plugin konfigurieren? (my $schnittstelle = '/??????'

      Kommentar


        Hi,
        okay - ich hab mittlerweilen diesen Thread gefunden:
        https://knx-user-forum.de/wiregate/1...oxa-nport.html

        Was habe ich konfiguriert: Moxa/Operations mode eingestellt auf: UDP-Mode
        Destination Adress auf Wireagate-IP, Port 16011, Local Listen Port 16012

        Wenn ich es jetzt richtig verstanden habe muss das Plugin auch angepasst werden damit es über den Socket arbeitet.
        Sind diese Änderungen schon irgendwo im Repository, oder ist das "Custom-Code" ?

        Gruß
        Thorsten

        Kommentar


          Das ist in der Version 1.6 die im SVN oder hier unter Codeschnipsel liegt enthalten
          Gruss Patrik alias swiss

          Kommentar


            Hi
            ich habe jetzt den Code aus Post #90 genommen (1.6 beta).
            Dazu folgende Config:
            Code:
            #Pfad zur seriellen Schnittstelle oder dem USB-Seriell-Wandler:
            $schnittstelle = '/dev/ttyUSB-1-1';
            
            #Angaben für die Kommunikation über den UDP-Port einer MOXA [diese Einstellungen reichen aus, d.h. auf dem Wiregate muss unter "Seriell/LAN/Socketverbindungen" KEINE Socketverbindung erstellt werden
            $socknum = "92"; # Eindeutige Nummer des Sockets
            $send_ip = "192.168.0.151"; # SendeIP (UDP)
            $send_port = "16012"; # Sendeport (UDP)    
            $recv_ip = "192.168.0.136"; # EmpfangsIP (UDP)
            $recv_port = "16011"; # Empfangsport (UDP)
            
            # Kommunikationsart
            $Kom_Art = "M"; # "S" = seriell; "M" = Moxa
             
            # Dauer einer Abfrage
            $Zaehler = "250"; #Mit dieser Variable Zaehler wird beeinflusst, wie lange das Plugin auf den Abschluss einer Rückmeldung der KWL wartet; empfohlener Wert für seriell: 2'500; für Moxa: 250
             
            # Debug level 0 = nur die wichtigsten Infos, 1 = Alle Zustaende, 2 = Rohdaten (nur für Fehlersuche)
            $debug=1;
            moxa2.png
            moxa1.png

            Leider bekomme ich im Log:
            Code:
            2013-04-01 10:38:22.516,ComfoAir,conf file [/etc/wiregate/plugin/generic/conf.d/ComfoAir.conf] returned result[1]
            2013-04-01 10:38:22.526,ComfoAir,Temperatur abrufen
            2013-04-01 10:38:22.534,ComfoAir,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
            2013-04-01 10:38:22.535,ComfoAir,Ventilator Status abrufen
            2013-04-01 10:38:22.549,ComfoAir,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
            2013-04-01 10:38:22.549,ComfoAir,Bypass Zustand abrufen
            2013-04-01 10:38:22.559,ComfoAir,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
            2013-04-01 10:38:22.560,ComfoAir,Betriebsstunden abrufen
            2013-04-01 10:38:22.564,ComfoAir,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
            2013-04-01 10:38:22.564,ComfoAir,Störungen abrufen
            2013-04-01 10:38:22.574,ComfoAir,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
            Die IP 192.168.0.151 ist der Moxa, 192.168.0.136 ist das Wiregate.

            Ich stehe gerade auf dem Schlauch... kann mir jemand einen Tipp geben?

            Gruß
            Thorsten

            Kommentar


              Hallo Thorsten

              Das Log besagt, dass überhaubt keine Daten im Plugin ankommen. Könnte es sein, dass es mit der Einstellung "Flow Control" im Moxa zu tun hat? Da sollte warscheinlich Non stehen.
              Gruss Patrik alias swiss

              Kommentar


                Hm - heute auf NONE umgestellt.
                Einiges geht - aber nicht alles. Ich bekomme jede menge Read-errors (checksum errors) - aber zwischendurch auch mal wieder gute Ergebnisse.

                Irgendwelche Tipps woran ich optimieren kann?
                Mit $Zaehler = "250" habe ich schon gespielt - sowohl 150 als auch 500 und 2500 hat nicht wirklich einen unterschied gemacht....

                Gruß
                Thorsten

                Kommentar


                  Hallo Thorsten

                  Hmm... Was meint denn das Log, wenn du in der config mal auf $debug = 3 setzt? Dann müsste man die empfangenen Rohdaten im Log sehen. Vieleicht sieht man dann, was nicht passt.

                  Was meist du mit checksum error? Dass gar nix empfangen wurde oder dass die Checksumme einfach falsch berechnet wurde? Und was läuft noch paralell auf dem WG?
                  Gruss Patrik alias swiss

                  Kommentar


                    Hi
                    Debug=3 erzeugt massenhaft kommunikation - ist das normal?
                    Bei Debug=2 wird nur im "normalen" Zyklus kommuniziert.

                    Hier mein Log: http://gehrig.info/share/wiregate_plugin-3.log

                    Gruß
                    Thorsten

                    Kommentar


                      Nochmal kurz etwas zum Anschluss an das Wiregate, bevor ich was falsches bestelle...

                      auf jeden Fall benötige ich den Seriell/RS232 auf USB-Wandler...
                      und dann entweder ein Nullmodem-Kabel mit Buchse auf Stecker(wenn der Wandler am WG steckt) - was auch schwer erhältilich ist, da Nullmodem normalerweise Buchse auf Buchse ist
                      oder
                      USB-Verlängerung(wenn der Wandler an der ComfoAir steckt)

                      Bitte berichtigt mich falls ich falschl liege...

                      Danke

                      PS: hab eine Zehnder ComfoAir 200 L Luxe, wurde die auch schon mit dem Plugin getestet?
                      PPS: Hab hier(ComfoAir in CometVisu) noch was gepostet das hier einige betreffen könnte
                      cu Yfkt5A
                      DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
                      microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

                      Kommentar


                        Hallo Thorsten

                        Dass du so viele Logeinträge hast, ist normal. Daraus ist die gesammte Kommunikation und Verarbeitung der Daten ersichtlich. Die Pluginlogs zentral ein-/ausschaltbar zu machen war eine der besten Ideen, die ich zur Fehlersuche hatte...

                        Also zu deinem Log...

                        Daraus geht hervor, dass an einer Stelle die Kommunikation mit der KWL komplet zusammenbricht. Ob dies nun an der ComfoAir, dem Moxa/Netzwerk oder dem Soket/WG liegt, kann ich erst mal nicht sagen. Aber es bringt mich auf eine Idee...

                        Das Problem ist, dass die Comfoair auf jeden fall ein Ack nach jedem Datenpaket das sie sendet erwartet. Solange kein Ack kommt, stellt sich die Comfoair tot. Das scheint aus dem Pluginlog auch genau so hervor zu gehen...

                        - ComfoAir sendet Daten die nicht vollständig im Plugin ankommen
                        - Das Plugin wartet auf weitere Daten und vor allem das Endzeichen
                        - Da das Endzeichen nicht auftaucht greift die Sicherheitsschleife und bricht den empang ab...
                        - Beim abbrechen wird kein ACK an die KWL gesendet (ein NACK ist mir leider nicht bekannt)
                        - Da die KWL kein ACK bekommt, wartet sie eine Ewigkeit auf das ACK
                        - Solange die Comfoair ihr ACK nicht bekommen hat, reagiert sie auch auf keine weiteren Anfragen, was im Plugin immer wieder zu leeren Daten und Checksummenfehler führt...

                        Workaround (nicht schön aber sollte helfen): ACK auch beim erreichen des Timeout und unvollständigem Datenpaktet damit beim nächten Abfragen die Changse besteht, wieder valide Werte zu erhalten.

                        Probiere mal folgende modifizierte Version:

                        Code:
                        # Plugin zur Ansteuerung einer Zender ComfoAir
                        # Version 1.6 28.11.2012 BETA
                        # Copyright: swiss (https://knx-user-forum.de/members/swiss.html)
                        # Aufbau moeglichst so, dass man unterhalb der Einstellungen nichts veraendern muss!
                        # - Neu mit der Moeglichkeit zur Anbindung über einen Moxa NPort von Fechter65 (https://knx-user-forum.de/members/fechter65.html)
                        # - Neustrukturierung des Codes von Fechter65 (https://knx-user-forum.de/members/fechter65.html)
                         
                        
                        ####################
                        ###Einstellungen:###
                        ####################
                        
                        #BITTE ab sofort die Einstellungen unter conf.d vornemen. Damit bleiben die Einstellungen auch bei einem Update erhalten.
                         
                        
                        ######################
                        ##ENDE Einstellungen##
                        ######################
                        
                        
                        #Ab hier nichts mehr aendern.
                        #Hauptverarbeitung
                        
                        
                        #Erzeuge Variablen fuer die Zuordnung der Steuerfunktionen zu den Gruppenadressen:
                        my $ga_stufeabwesend = ''; #1bit Trigger fuer Stufe "Abwesend". 1=Aktivieren
                        my $ga_stufe1 = ''; #1bit Trigger fuer Stufe1. 1=Aktivieren
                        my $ga_stufe2 = ''; #1bit Trigger fuer Stufe2. 1=Aktivieren
                        my $ga_stufe3 = ''; #1bit Trigger fuer Stufe3. 1=Aktivieren
                        my $ga_komforttemp = ''; #GA DPT 9.001 zum setzen der Komforttemperatur
                        my $ga_reset_filter = ''; #1bit Trigger fuer das Zuruecksetzen des Betriebsstundenzaehlers des Filters. 1=Reset
                        my $ga_reset_error = ''; #1bit Trigger fuer das zuruecksetzen der KWL nach einem Fehler. 1=Reset
                         
                        
                        #Hier werden die Gruppenadressen fuer die Rueckmeldungen vergeben: (Nich vergeben = inaktiv)
                        my $ga_status_ventilator_zul = ''; #GA DPT5.001 fuer Status Ventilator Zuluft %
                        my $ga_status_ventilator_abl = ''; #GA DPT5.001 fuer Status Ventilator Abluft %
                        my $ga_status_bypass_prozent = ''; #GA DPT5.001 fuer Status Bypassklappe %
                        my $ga_betriebsstunden_filter = ''; #GA DPT16.000 fuer die Rueckmeldung der Betribsstunden des Filters
                        my $ga_zustand_badschalter = ''; #GA DPT1.001 fuer die Rueckmeldung des Zustandes des Badezimmerschalters
                        my $ga_fehler_filter = ''; #GA DPT 1.001 fuer den Zustand des Filters. 0=OK, 1=Filter Voll
                        my $ga_fehlercode = ''; #GA DPT 16.000 fuer die Ausgabe des Fehlercodes als Text
                        my $ga_aktstufe = ''; #Wert für aktuelle Stufe
                         
                        #Hier werden die Gruppenadressen für die Temperaturen vergeben: (Nicht vergeben=inaktiv)
                        my $ga_aul_temp = ''; #GA DPT 9.001 für die Aussenlufttemperatur
                        my $ga_zul_temp = ''; #GA DPT 9.001 für die Zulufttemperatur
                        my $ga_abl_temp = ''; #GA DPT 9.001 für die Ablufttemperatur
                        my $ga_fol_temp = ''; #GA DPT 9.001 für die Fortlufttemperatur
                         
                        #Zuordnung der Namen fuer 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-2-4';
                         
                        
                        #Angaben für die Kommunikation über den UDP-Port einer MOXA [diese Einstellungen reichen aus, d.h. auf dem Wiregate muss unter "Seriell/LAN/Socketverbindungen" KEINE Socketverbindung erstellt werden
                        my $socknum = ""; # Eindeutige Nummer des Sockets
                        my $send_ip = ""; # SendeIP (UDP)
                        my $send_port = ""; # Sendeport (UDP)    
                        my $recv_ip = ""; # EmpfangsIP (UDP)
                        my $recv_port = ""; # Empfangsport (UDP)
                         
                        
                        # Kommunikationsart
                        my $Kom_Art = "S"; # "S" = seriell; "M" = Moxa
                         
                        
                        # Dauer einer Abfrage
                        my $Zaehler = "2500"; #Mit dieser Variable Zaehler wird beeinflusst, wie lange das Plugin auf den Abschluss einer Rückmeldung der KWL wartet; empfohlener Wert für seriell: 2'500; für Moxa: 250
                         
                        # Debug level 0 = nur die wichtigsten Infos, 1 = Alle Zustaende, 2 = Rohdaten (nur für Fehlersuche)
                        my $debug=0;
                         
                         
                        #Weitere Variablen die benötigt werden -> NICHT verändern!
                        my $seriel;
                        my $sin; #Serial Input = Empangener Datenstrom
                        my $cin; #Counter Input =  Länge des Datenpackets
                        my $laenge; #Länge des empfangenen Datenstrings nachdem kürzen
                         
                        my $checksum = 0; #Checksumme
                        my @hex; #Hilfsarray für die Checksummenberechnung
                        my $x07warschon; #Hilfsvariable für die Checksummenberechnung
                         
                        &readConf(); #conf.d einlesen
                         
                        my $return_value2;
                        my $daten;
                        my $reciv;
                        my $reciv_all;
                        my $ack = pack("H*","07F3");
                        my $rcv_checksum;
                         
                        # Zyklischer Aufruf nach restart, empfang GA oder nach einstellung rrd (typisch 300sek).
                        $plugin_info{$plugname.'_cycle'}  = 300; 
                        
                        use Device::SerialPort;
                        
                         
                        #Einrichten der Seriellen Schnittstelle fuer die Kommunikation mit dem ComfoAir falls Schnittstelle auf "S" steht
                        if ($Kom_Art eq "S"){
                                     $seriel = Device::SerialPort->new($schnittstelle) || die "Kann $schnittstelle nicht öffnen! ($!)\n";
                                     $seriel->baudrate(9600);
                                     $seriel->parity("none");
                                     $seriel->databits(8);
                                     $seriel->stopbits(1);
                                     if($debug>=1){plugin_log($plugname,'Schnittstelle: ' . $schnittstelle . ' erfolgreich geöffnet')};
                        }elsif ($Kom_Art eq "M"){
                            if (!$socket[$socknum]) { # socket erstellen
                                    $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                                              Proto => "udp",
                                                              LocalAddr => $recv_ip,
                                                              PeerPort  => $send_port,
                                                              PeerAddr  => $send_ip,
                                                              ReuseAddr => 1
                                                               )
                                or return ("open of $recv_ip : $recv_port failed: $!");
                                $socksel->add($socket[$socknum]); # add socket to select
                                $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # Plugin an Socket "anmelden"
                                return "opened Socket $socknum";
                                                     if($debug>=1){plugin_log($plugname,'Socket: ' . $socknum . ' erfolgreich geöffnet')};
                            }
                        }
                        
                         
                        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 setzen');
                                $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 setzen');
                                $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 setzen');
                                $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 setzen');
                                $return_value2 = command_senden($daten);
                            }elsif ($msg{'dst'} eq $ga_komforttemp) {
                                my $komforttemp = knx_read($msg{'dst'},0,9.001);
                                plugin_log($plugname,'Komforttemp auf: ' . $komforttemp . '°C setzen');
                                my $temphex = ($komforttemp + 20)*2; #Rechne die Temperatur fuer die ComfoAir um
                                $temphex = sprintf "%x" , $temphex; # Mache aus Integer HEX
                                $daten = "00D301" . $temphex;
                                $return_value2 = command_senden($daten);
                            }elsif ($msg{'dst'} eq $ga_reset_filter && knx_read($msg{'dst'},0,1) == 1) {
                                $daten = "00DB0400000001";
                                plugin_log($plugname,'Filter zurücksetzen');
                                $return_value2 = command_senden($daten);
                            }elsif ($msg{'dst'} eq $ga_reset_error && knx_read($msg{'dst'},0,1) == 1) {
                                $daten = "00DB0401000000";
                                plugin_log($plugname,'Fehler zurücksetzen');
                                $return_value2 = command_senden($daten);
                            }
                            if($debug>=2){plugin_log($plugname,'ENDE Aufruf durch GA');}
                            return;
                                     
                        } else { # zyklischer Aufruf
                            # Plugin an Gruppenadresse "anmelden", hierdurch wird das Plugin im folgenden bei jedem eintreffen eines Telegramms auf die GA aufgerufen und der obere Teil dieser if-Schleife durchlaufen
                            $plugin_subscribe{$ga_stufeabwesend}{$plugname} = 1;
                            $plugin_subscribe{$ga_stufe1}{$plugname} = 1;
                            $plugin_subscribe{$ga_stufe2}{$plugname} = 1;
                            $plugin_subscribe{$ga_stufe3}{$plugname} = 1;
                            $plugin_subscribe{$ga_komforttemp}{$plugname} = 1;
                            $plugin_subscribe{$ga_reset_filter}{$plugname} = 1;
                            $plugin_subscribe{$ga_reset_error}{$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";
                                if($debug>=1){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";
                                if($debug>=1){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";
                                if($debug>=1){plugin_log($plugname,'Betriebsstunden abrufen');}
                                $return_value2 = command_senden($daten);
                            }
                                     
                            if($ga_zustand_badschalter){ #Nur wenn die GA vergeben ist, die Binaereingaenge abfragen
                                $daten = "000300";
                                if($debug>=1){plugin_log($plugname,'Binäreingänge abrufen');}
                                $return_value2 = command_senden($daten);
                            }
                                     
                            if($ga_aktstufe){ #Nur wenn die GA vergeben ist, die Ventilationsstufe abfragen
                                $daten = "00CD00";
                                if($debug>=1){plugin_log($plugname,'Ventilationsstufe abrufen');}
                                $return_value2 = command_senden($daten);
                            }
                                     
                            #Hier werden die Stoermeldungen abgefragt
                            $daten = "00D900";
                            if($debug>=1){plugin_log($plugname,'Störungen abrufen');}
                            $return_value2 = command_senden($daten);
                        
                        
                            if($debug>=2){plugin_log($plugname,'ENDE Zyklische Abfrage');}
                            return;
                        }
                         
                         
                        # Ab hier wird das Datenpaket inklusive Checksumme zusammengestellt und an die ComfoAir uebertragen
                        sub command_senden{
                            my $data = $_[0];
                            if($debug>=2){plugin_log($plugname,'data: ' . $data);} 
                            $checksum = checksum_berechnen($data);
                            if($debug>=2){plugin_log($plugname,'Checksumme aus der Subroutine: '.$checksum);}
                            my $command = pack("H*","07F0" . $data . $checksum . "070F");
                            my $commandhex = $command;
                            
                            $commandhex =~ s/(.)/sprintf("0x%x ",ord($1))/eg;
                            if($debug>=2){plugin_log($plugname,'transmit: ' . $commandhex);} #Zeigt im Pluginlog das fertige Datenpaket, dass uebertragen wird
                                     if ($Kom_Art eq "S"){    
                                                     $seriel->write($command); #Befehl an die ComfoAir senden
                                     } elsif ($Kom_Art eq "M"){    
                                                     $plugin_info{$plugname.'_debug'} = $command;
                                                     syswrite($socket[$socknum], $command);
                                     }
                            $reciv = '';
                                
                            $|=1;
                            my $exit=0;
                            while($exit < $Zaehler) 
                            {
                                if ($Kom_Art eq "S"){
                                     ($cin, $sin) = $seriel->read(45);
                                }elsif ($Kom_Art eq "M"){
                                                         $sin ='';
                                                         if ($fh) { # Antwort auslesen
                                                                        recv($fh,$sin,80,0);
                                                         }
                                                         $cin = length($sin);
                                }
                                if($cin > 0){
                                    $sin = unpack "H*", $sin;
                                    $reciv .= $sin;
                                    $exit=0;
                                }else{
                                    $exit++
                                }
                                
                                if($debug>=2){plugin_log($plugname,'reciv-direkt:     ' . $sin);}
                             
                                    if($reciv =~ /070f/i){           
                                        last;
                                    }
                            }#Ende While   
                        
                            if ($Kom_Art eq "S"){
                                $seriel->write($ack); #ACK senden
                                if($debug>=2){plugin_log($plugname,'ACK senden');}
                            } elsif ($Kom_Art eq "M"){
                                syswrite($socket[$socknum], $ack); #ACK senden
                                if($debug>=2){plugin_log($plugname,'ACK senden');}
                            }
                        
                            while ((length($reciv) > 3) && (substr($reciv,(length($reciv)-4),4) ne '070f')) #solange das Ende nicht 070f lautet
                            {
                                            if($debug>=2){plugin_log($plugname,'String vor Kuerzung Ende: '.$reciv);}
                                            $reciv = substr($reciv,0,-4); #String um die letzten vier Zeichen kürzen
                                            if($debug>=2){plugin_log($plugname,'String nach Kuerzung Ende: '.$reciv);}
                            }
                         
                                #Hier wird der empfangene String um Start- und Endbyte gekürzt
                                $laenge = length($reciv); #Laenge des Antworttelegramms ermitteln
                                $reciv = substr($reciv,0,($laenge-4));
                                if($debug>=2){plugin_log($plugname,'String ohne 07f3: '.$reciv);}
                                                                    
                                my $test = substr($reciv,0,4);
                                if($debug>=2){plugin_log($plugname,'Erste 4 Byte des Datenpakets: '.$test);}
                        
                                                                    
                                while ( $test eq '07f3' or $test eq '07f0' ){
                                    $reciv = substr($reciv,4); #falls noch ein 07f3 oder 07f0 am Anfang des Strings enthalten ist, wir dieses hier entfernt.
                                    if($debug>=2){plugin_log($plugname,'reciv gekuerzt: '.$reciv);}
                                    $test = substr($reciv,0,4);
                                    if($debug>=2){plugin_log($plugname,'NEU. Erste 4 Byte des Datenpakets: '.$test);}
                                }
                        
                                                     
                                #Nun wird die Checksumme gelesen und aus dem Datenstring entfernt
                                $checksum = 0;
                                $checksum = substr($reciv,-2,2);
                                if($debug>=2){plugin_log($plugname,'Checksumme gelesen: '.$checksum);}
                                $laenge = length($reciv); #Laenge des Antworttelegramms ermitteln
                                $reciv = substr($reciv,0,($laenge-2));
                                if($debug>=2){plugin_log($plugname,'Datenpaket ohne Checksumme: '.$reciv);}
                        
                                #Hier wird die Subroutine für die Berechnung der Checksumme aufgerufen und das Ergebnis in $rcv_checksum zurück gegeben
                                $rcv_checksum = checksum_berechnen($reciv);
                        
                                                    
                                if($rcv_checksum eq $checksum){ #Hier wird geprüft ob die Checksumme korrekt ist
                                    if($debug>=2){plugin_log($plugname,'Checksumme OK ');}
                                    if($reciv =~ /00D209/i){ #Wenn die Temperaturen empfangen wurden und die Laenge passt
                        
                                        my $t1 = substr($reciv,8,2);
                                        my $t2 = substr($reciv,10,2);
                                        my $t3 = substr($reciv,12,2);
                                        my $t4 = substr($reciv,14,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;
                        
                                        #Wenn die GA's vergeben wurde, die Temperaturen auf die GA's senden
                                        if($ga_aul_temp ne ''){knx_write($ga_aul_temp,$t1,9.001);}
                                        if($ga_zul_temp ne ''){knx_write($ga_zul_temp,$t2,9.001);}
                                        if($ga_abl_temp ne ''){knx_write($ga_abl_temp,$t3,9.001);}
                                        if($ga_fol_temp ne ''){knx_write($ga_fol_temp,$t4,9.001);}
                                        
                                        #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,'AUL: ' . $t1 . '°C, ZUL:' . $t2 . '°C, ABL: ' . $t3 . '°C, FOL: ' . $t4 . '°C');
                        
                                    }elsif($reciv =~ /000C06/i){ #Wenn der Status fuer die Ventilatoren empfangen wurden
                                        my $vent_zul = substr($reciv,6,2);
                                        my $vent_abl = substr($reciv,8,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 =~ /00CE0E/i){ #Wenn Status Ventilatorenstufe empfangen wurden
                                        my $akt_stufe = substr($reciv,22,2);
                                        plugin_log($plugname,'AKT_STUFE: ' . hex($akt_stufe));
                                        knx_write($ga_aktstufe,hex($akt_stufe),5.005);                                                                                
                        
                                    }elsif($reciv =~ /000E04/i){ #Wenn der Status fuer die Bypassklappe empfangen wurden
                                        my $bypass_prozent = substr($reciv,6,2);
                                        plugin_log($plugname,'Bypass: ' . hex($bypass_prozent) . '%');                
                                        knx_write($ga_status_bypass_prozent,hex($bypass_prozent),5.001);
                        
                                    }elsif($reciv =~ /00DE14/i){ #Wenn die Rueckmeldung der Betriebsstunden empfangen wurden
                                        my $betriebsstunden_filter = substr($reciv,36,4);
                                        plugin_log($plugname,'Betriebsstunden: ' . hex($betriebsstunden_filter) . 'h');                 
                                        knx_write($ga_betriebsstunden_filter,hex($betriebsstunden_filter) . 'h',16.000);
                                        
                                    }elsif($reciv =~ /000402/i){ #Wenn die Rueckmeldung der Binaereingaenge empfangen wurden
                                        my $zustand_badschalter = substr($reciv,8,1);
                                        plugin_log($plugname,'Zustand Badezimmerschalter: ' . $zustand_badschalter);                 
                                        knx_write($ga_zustand_badschalter,$zustand_badschalter,1.001);
                                        
                                    }elsif($reciv =~ /00DA11/i){ #Wenn die Rueckmeldung der Stoermeldungen empfangen wurden
                                        my $fehlerAlo = substr($reciv,6,2);
                                        my $fehlerAhi = substr($reciv,30,2);
                                        my $fehlerE = substr($reciv,8,2);
                                        my $fehlerFilter = substr($reciv,22,2);
                                        my $fehlerEA = substr($reciv,24,2);
                                        
                                        my $numAlo = 'A';
                                        my $numAhi = 'A';
                                        my $numE = 'A';
                                        my $numEA = 'A';
                                        
                                        $numAlo .= unpack("B*",pack("H*",$fehlerAlo));
                                        $numAhi .= unpack("B*",pack("H*",$fehlerAhi));
                                        $numE .= unpack("B*",pack("H*",$fehlerE));
                                        $numEA .= unpack("B*",pack("H*",$fehlerEA));
                                        
                                        
                                        $fehlerAlo = reverse($numAlo); #Wandle den Wert in Binaer und drehe die Reihenfolge um. z.B 0x02 = 00000010 = 010000000
                                        $fehlerAlo = index($fehlerAlo,'1')+1; # Zaehle an welcher Stelle die 1 auftaucht (von links gelesen) z.B. 01000000 = INDEX 2 = Fehler2
                                        
                                        if($fehlerAhi ne '00'){
                                            $fehlerAhi = index(reverse($numAhi),'1')+9;
                                        }else{
                                            $fehlerAhi = '';
                                        }
                                        
                                        $fehlerE = index(reverse($numE),'1')+1;
                                        $fehlerEA = index(reverse($numEA),'1')+1;
                                                                                                    
                                        if($fehlerAhi == 16){$fehlerAhi = 0;}
                                                                                                    
                                        if($ga_fehlercode){ #Wenn die GA fuer das uebertragen den Fehlercodes eingertagen wurde, ab hier auswerten
                                            if($fehlerAlo > 0){
                                                plugin_log($plugname,'Aktueller Fehlercode: A' . $fehlerAlo);
                                                knx_write($ga_fehlercode,'A' . $fehlerAlo,16.001);
                                            }elsif($fehlerAhi ne ''){
                                                plugin_log($plugname,'Aktueller Fehlercode: A' . $fehlerAhi);
                                                knx_write($ga_fehlercode,'A' . $fehlerAhi,16.001);                        
                                            }elsif($fehlerE > 0){
                                                plugin_log($plugname,'Aktueller Fehlercode: E' . $fehlerE);
                                                knx_write($ga_fehlercode,'E' . $fehlerE,16.001);
                                            }elsif($fehlerEA > 0){
                                                plugin_log($plugname,'Aktueller Fehlercode: EA' . $fehlerEA);
                                                knx_write($ga_fehlercode,'EA' . $fehlerEA,16.001);
                                            }else{
                                                plugin_log($plugname,'Aktueller Fehlercode: keiner' );
                                                knx_write($ga_fehlercode,'keiner' . $fehlerEA,16.001);
                                            }    
                                        }
                                        
                                        if(hex($fehlerFilter) > 0){
                                            plugin_log($plugname,'Aktueller Fehler: Filter Voll');
                                            knx_write($ga_fehler_filter,1,1);
                                        }else{
                                            knx_write($ga_fehler_filter,0,1);
                                        }               
                                    }
                                }else{
                                    if($debug>=1){plugin_log($plugname,'Checksumme fehlerhaft! Gelesen: '.$checksum.' Berechnet: '.$rcv_checksum);}
                                }
                        } #ENDE Sub command_senden
                        
                        sub checksum_berechnen {    
                            my $chk_datasum = $_[0];
                            $rcv_checksum =0;
                            my $i;
                             $chk_datasum = $chk_datasum . "AD"; #+173 fuer die Checksummenberechnung
                                if($debug>=2){plugin_log($plugname,'String für die Berechnung der Checksumme: '.$chk_datasum);}
                            $x07warschon = 0;
                            $laenge = length($chk_datasum);
                                for($i = 0; $i< $laenge; $i++) {
                                    my $wertstring = substr($chk_datasum,$i,2);
                                    if($debug>=3){plugin_log($plugname,'Zahl: '.$wertstring);}
                                    my $wertbetrag = hex($wertstring);
                                    if ($wertbetrag == 7) {
                                        if ($x07warschon == 1) {
                                            $x07warschon = 0;
                                            $i++;
                                            next;
                                        } else {
                                            $x07warschon = 1;
                                        }
                                    }
                                $rcv_checksum += $wertbetrag;
                                    if($debug>=3){plugin_log($plugname,'Summe: '.$rcv_checksum);}
                                $i++;
                            }
                                    if($debug>=3){plugin_log($plugname,'Summe def: '.$rcv_checksum);}
                        
                            if($debug>=2){plugin_log($plugname,'Checksumme vor der Umwandlung: '.$rcv_checksum);}
                            $rcv_checksum = sprintf "%x\n" , $rcv_checksum; #Mache aus Integer wieder HEX
                            if($debug>=2){plugin_log($plugname,'Checksumme vor der Kürzung: '.$rcv_checksum);}
                            $rcv_checksum = substr($rcv_checksum,-3,2); #Verwende nur die letzten beiden Stellen
                            if($debug>=2){plugin_log($plugname,'Checksumme nach der Kürzung: '.$rcv_checksum);}
                            return $rcv_checksum;
                        } #Ende checksum_berechnen
                        
                         
                        
                        sub readConf
                        {
                            my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
                            if (! -f $confFile)
                            {
                                plugin_log($plugname, " no conf file [$confFile] found!"); 
                            }
                            else
                            {
                                if($debug>=1){plugin_log($plugname, " reading conf file [$confFile].");}
                                open(CONF, $confFile);
                                my @lines = <CONF>;
                                close($confFile);
                                my $result = eval("@lines");
                                ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
                                if ($@) 
                                {
                                    if($debug>=1){plugin_log($plugname, " conf file [$confFile] returned:");}
                                    my @parts = split(/\n/, $@);
                                    if($debug>=2){plugin_log($plugname, " --> $_") foreach (@parts);}
                                }
                            }
                        } # readConf
                        Hoffe das klapt
                        Gruss Patrik alias swiss

                        Kommentar


                          Hallo Christian

                          Du bist meines wissens der erste mit einer ComoAir 200 Luxe aber da die auch mit der selben CC EASE gesteuert wird wie die 350 und die 550 sollte die Steuerung über das Plugin trotzdem möglich sein.
                          Gruss Patrik alias swiss

                          Kommentar


                            Hier mein neues Log:
                            http://gehrig.info/share/wiregate_plugin.log
                            Gruß
                            Thorsten

                            Kommentar


                              Sieht auf den ersten Blick wesentlich besser aus. Stelle mal debug zurück auf 1 und lass das mal so weiterlaufen. Wenn da wieder "Lücken" auftreten sind die da auch zu erkennen. Zumal das Protokoll nicht mehr so mit Informationen überschwemmt wird
                              Gruss Patrik alias swiss

                              Kommentar


                                @Thorsten: Tut mir leid, habs jetzt erst gesehen, sonst hätte ich dir gerne die Einstellungen von der Moxa gegeben. Hast es aber ja dann eh wie ich damals auch bewätigt

                                @Patrik: jetzt hab ich genau das gleiche Problem wie Thorsten! Alles lief schon super (vielen Dank dafür!!), bis vorgestern?! Da bin ich auf Update im Wiregate und er hat ein paar Kleinigkeiten geladen glaube ich.. könnte das daran liegen?
                                Hab jetzt mal die geänderte Version von dir eingespielt, nach wie vor kommen nur noch vereinzelt Werte, Schaltbefehle gehen gar nicht mehr.

                                Das zeigt der Log mit der 1.6 vom Dezember:

                                Code:
                                2013-04-05 19:48:15.084,Zehnder1,reciv-direkt:     00000000
                                2013-04-05 19:48:15.088,Zehnder1,reciv-direkt:     00000000
                                2013-04-05 19:48:15.096,Zehnder1,reciv-direkt:     98070f
                                2013-04-05 19:48:15.096,Zehnder1,ACK senden
                                2013-04-05 19:48:15.096,Zehnder1,String ohne 07f3: 07f307f000da11000000000000000000000000000000000098
                                2013-04-05 19:48:15.097,Zehnder1,Erste 4 Byte des Datenpakets: 07f3
                                2013-04-05 19:48:15.097,Zehnder1,reciv gekuerzt: 07f000da11000000000000000000000000000000000098
                                2013-04-05 19:48:15.097,Zehnder1,NEU. Erste 4 Byte des Datenpakets: 07f0
                                2013-04-05 19:48:15.097,Zehnder1,reciv gekuerzt: 00da11000000000000000000000000000000000098
                                2013-04-05 19:48:15.097,Zehnder1,NEU. Erste 4 Byte des Datenpakets: 00da
                                2013-04-05 19:48:15.097,Zehnder1,Checksumme gelesen: 98
                                2013-04-05 19:48:15.098,Zehnder1,Datenpaket ohne Checksumme: 00da110000000000000000000000000000000000
                                2013-04-05 19:48:15.098,Zehnder1,String für die Berechnung der Checksumme: 00da110000000000000000000000000000000000AD
                                2013-04-05 19:48:15.098,Zehnder1,Checksumme vor der Umwandlung: 408
                                2013-04-05 19:48:15.098,Zehnder1,Checksumme vor der Kürzung: 198
                                
                                2013-04-05 19:48:15.099,Zehnder1,Checksumme nach der Kürzung: 98
                                2013-04-05 19:48:15.099,Zehnder1,Checksumme OK 
                                2013-04-05 19:48:15.099,Zehnder1,Aktueller Fehlercode: keiner
                                2013-04-05 19:48:15.117,Zehnder1,ENDE Zyklische Abfrage
                                2013-04-05 19:48:50.554,Zehnder1,conf file [/etc/wiregate/plugin/generic/conf.d/Zehnder1.conf] returned result[1]
                                2013-04-05 19:48:50.555,Zehnder1,Temperatur abrufen
                                2013-04-05 19:48:50.558,Zehnder1,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
                                2013-04-05 19:48:50.559,Zehnder1,Ventilator Status abrufen
                                2013-04-05 19:48:50.562,Zehnder1,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
                                2013-04-05 19:48:50.562,Zehnder1,Bypass Zustand abrufen
                                2013-04-05 19:48:50.565,Zehnder1,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
                                2013-04-05 19:48:50.565,Zehnder1,Betriebsstunden abrufen
                                2013-04-05 19:48:50.569,Zehnder1,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
                                2013-04-05 19:48:50.569,Zehnder1,Binäreingänge abrufen
                                2013-04-05 19:48:50.572,Zehnder1,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
                                2013-04-05 19:48:50.572,Zehnder1,Ventilationsstufe abrufen
                                2013-04-05 19:48:50.575,Zehnder1,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
                                2013-04-05 19:48:50.576,Zehnder1,Störungen abrufen
                                2013-04-05 19:48:50.579,Zehnder1,Checksumme fehlerhaft! Gelesen:  Berechnet: ad
                                2013-04-05 19:48:50.630,Zehnder1,conf file [/etc/wiregate/plugin/generic/conf.d/Zehnder1.conf] returned result[1]
                                2013-04-05 19:48:50.630,Zehnder1,Temperatur abrufen
                                2013-04-05 19:48:50.632,Zehnder1,Checksumme fehlerhaft! Gelesen: 6b Berechnet: 7b
                                2013-04-05 19:48:50.632,Zehnder1,Ventilator Status abrufen
                                2013-04-05 19:48:50.641,Zehnder1,Checksumme fehlerhaft! Gelesen: 26 Berechnet: 40
                                2013-04-05 19:48:50.641,Zehnder1,Bypass Zustand abrufen
                                2013-04-05 19:48:50.687,Zehnder1,Checksumme fehlerhaft! Gelesen: c1 Berechnet: 3e
                                2013-04-05 19:48:50.687,Zehnder1,Betriebsstunden abrufen
                                2013-04-05 19:48:50.737,Zehnder1,Betriebsstunden: 66h
                                2013-04-05 19:48:50.744,Zehnder1,Binäreingänge abrufen
                                2013-04-05 19:48:50.771,Zehnder1,Zustand Badezimmerschalter: 0
                                2013-04-05 19:48:50.773,Zehnder1,Ventilationsstufe abrufen
                                2013-04-05 19:48:50.812,Zehnder1,AKT_STUFE: 2
                                2013-04-05 19:48:50.815,Zehnder1,Störungen abrufen
                                2013-04-05 19:48:50.862,Zehnder1,Aktueller Fehlercode: keiner
                                Das ist der erweiterte Log mit der neusten Version von gestern:

                                Share Text Post v0Gd

                                Besten Dank!
                                Schöne Grüße
                                Moritz

                                Kommentar

                                Lädt...
                                X