Ankündigung

Einklappen
Keine Ankündigung bisher.

ComfoAir Steuerung über RS232

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

    #46
    seltsam...

    Ok. Füge zum debugen mal zwischen Zeile 82 und Zeile 83 folgende Zeile ein:
    Code:
    plugin_log($plugname,'Plugin von GA: '.$msg{'dst'}.' getriggert');
    und lass das mal ein paar Sekunden laufen. Dann schaue nochmal im Pluginlog nach
    Gruss Patrik alias swiss

    Kommentar


      #47
      PS: Ich habe gerade einen ganz blöden Verdacht...

      Dein Pluginname enthält:

      - leerschläge
      - Punkte

      Bitte benenne das Plugin mal um. Es darf weder Leerschläge, Sonderzeichen, Punkte noch Umlaute enthalten!

      Danach auch die conf.d neu anlegen. Könnte sein, dass sich da was beisst.
      Gruss Patrik alias swiss

      Kommentar


        #48
        Das war wohl der Fehler

        Zitat von swiss Beitrag anzeigen
        Dein Pluginname enthält:

        - leerschläge
        - Punkte

        Jep,
        das hat geholfen - und wie

        Tausend Dank für die schnelle Hilfe und das "Hellsehvermögen"
        Gruß -mfd-
        KNX-UF-IconSet since 2011

        Kommentar


          #49
          Gern geschehen

          Viel Spass mit dem Plugin
          Gruss Patrik alias swiss

          Kommentar


            #50
            Darstellung in Visu

            Ich gehe mal davon aus, dass du das Plugin über die CV visualisiert hast bzw. ansteuerst.
            Kannst du verraten wie die Lüfterstufen am besten umgesetzt werden können. Das sind ja einzelne GAs und ich verstehe nicht so recht wie ich das am geschicktesten anlegen soll.
            Gruß -mfd-
            KNX-UF-IconSet since 2011

            Kommentar


              #51
              Hallo Marco

              Ich verwende das Plugin (noch) nicht zur Steuerung der KWL (die Steuerung erfolgt bei mir über die 1-10V Schnittstelle, resp. einen Analogaktor ); vielleicht kann Dir meine CometVisu-Umsetzung trotzdem als Inspiration dienen. Sie basiert auf der Release-Version (nicht auf der SVN-Version) der CV und verwendet den Group-Tag, was bedeutet, dass sie nicht mit dem eingebauten Editor der CV bearbeitet werden kann.

              Wenn Du Deine KWL mittels des Plugins über die Stufen steuern willst, musst Du den Multitrigger durch vier Switches ersetzen; allenfalls wäre es eleganter den Multitrigger zu belassen, und dessen GA in einem kleinen Wiregate-Plugin auszuwerten und dann die entsprechenden GA zur Ansteuerung der Stufen an das Swiss-KWL-Ansteuerungs-Plugin zu senden.

              Code:
              <page name="Wohnung">
                          <group align="Left" flavour="potassium" name="Regelung ">                
                                  <info format="%.2f %">
                                      <label>Aktuelle Leistung</label>
                                      <address transform="DPT:5.001" readonly="true" variant="">7/4/200</address>
                                  </info>
                                  <switch  mapping="LftgBetriebsart">
                                      <label>Gewählte Betriebsart</label>
                                      <address transform="DPT:5.005" readonly="true" variant="">7/4/205</address>
                                  </switch>
                              <multitrigger button1label="Automatik" button1value="0" button2label="Manuell" button2value="1" button3label="Stosslüften" button3value="2" button4label="Abwesend" button4value="3">
                                  <label>Betriebsart wählen</label>
                                  <address transform="DPT:5.005" readonly="false" type="">7/4/205</address>
                              </multitrigger>        
                              <switch mapping="LftgTempSteuerung">
                                      <label>Temperatursteuerung</label>
                                      <address transform="DPT:5.005" readonly="false" variant="">7/4/208</address>
                              </switch>
                              <slide min="0" max="100" step="1">
                                    <label>Manueller Wert</label>
                                    <address transform="DPT:5.001" readonly="false" variant="">7/4/207</address>
                              </slide>
                              <infotrigger uplabel="+" upvalue="1" downlabel="-" downvalue="-1" align="center" infoposition="1" change="absolute" format="%.2f °C" max="24">
                                  <label>Solltemperatur</label>
                                  <address transform="DPT:9.001" readonly="false">7/4/209</address>
                              </infotrigger>
                          </group>        
                          <group align="Left" flavour="potassium" name="Standardwerte Regelung ">                
                              <infotrigger uplabel="+" upvalue="4" downlabel="-" downvalue="-4" align="center" infoposition="1" change="absolute" format="%.2f%%" max="100">
                                  <label>Standardwert Automatik</label>
                                  <address transform="DPT:5.001" readonly="false">7/4/220</address>
                              </infotrigger>
                              <infotrigger uplabel="+" upvalue="4" downlabel="-" downvalue="-4" align="center" infoposition="1" change="absolute" format="%.2f%%" max="100">
                                  <label>Standardwert Nacht</label>
                                  <address transform="DPT:5.001" readonly="false">7/4/221</address>
                              </infotrigger>
                              <infotrigger uplabel="+" upvalue="4" downlabel="-" downvalue="-4" align="center" infoposition="1" change="absolute" format="%.2f%%" max="100">
                                  <label>Standardwert Mittag</label>
                                  <address transform="DPT:5.001" readonly="false">7/4/222</address>
                              </infotrigger>
                              <infotrigger uplabel="+" upvalue="4" downlabel="-" downvalue="-4" align="center" infoposition="1" change="absolute" format="%.2f%%" max="100">
                                  <label>Standardwert Stosslüften</label>
                                  <address transform="DPT:5.001" readonly="false">7/4/223</address>
                              </infotrigger>
                              <infotrigger uplabel="+" upvalue="4" downlabel="-" downvalue="-4" align="center" infoposition="1" change="absolute" format="%.2f%%" max="100">
                                  <label>Standardwert Abwesend</label>
                                  <address transform="DPT:5.001" readonly="false">7/4/224</address>
                              </infotrigger>
                              <infotrigger uplabel="+" upvalue="4" downlabel="-" downvalue="-4" align="center" infoposition="1" change="absolute" format="%.2f%%" max="100">
                                  <label>Standardwert Kühlen</label>
                                  <address transform="DPT:5.001" readonly="false">7/4/230</address>
                              </infotrigger>
                              <infotrigger uplabel="+" upvalue="4" downlabel="-" downvalue="-4" align="center" infoposition="1" change="absolute" format="%.2f%%" max="100">
                                  <label>Standardwert Turbokühlen</label>
                                  <address transform="DPT:5.001" readonly="false">7/4/231</address>
                              </infotrigger>
                              <infotrigger uplabel="+" upvalue="4" downlabel="-" downvalue="-4" align="center" infoposition="1" change="absolute" format="%.2f%%" max="100">
                                  <label>Standardwert Drosseln</label>
                                  <address transform="DPT:5.001" readonly="false">7/4/232</address>
                              </infotrigger>
                          </group>
                          <group align="Left" flavour="potassium" name="Temperaturen">                    
                              <info format="%.2f °C">
                                  <label>Lüftung Abluft</label>
                                  <address transform="DPT:9.001" readonly="true" variant="">7/4/210</address>
                              </info>
                              <info format="%.2f °C">
                                  <label>Lüftung Zuluft</label>
                                  <address transform="DPT:9.001" readonly="true" variant="">7/4/211</address>
                              </info>
                              <info format="%.2f °C">
                                  <label>Lüftung Fortluft</label>
                                  <address transform="DPT:9.001" readonly="true" variant="">7/4/212</address>
                              </info>
                              <info format="%.2f °C">
                                  <label>Lüftung Aussenluft</label>
                                  <address transform="DPT:9.001" readonly="true" variant="">7/4/213</address>
                              </info>
                              <info format="%.2f °C">
                                  <label>Aussenluft</label>
                                  <address transform="DPT:9.001" readonly="true" variant="">5/1/200</address>
                              </info>
                          </group>
                          <group align="Left" flavour="potassium" name="Historie">    
                          <text>&lt;a href=    "/graph.pl?--start=-96h;--end=now;-X=0;-W=WireGate;--slope-mode;-h=450;-w=650;--full-size-mode;--vertical-label=%B0%20Celsius;--title=L%FCftung%20Wohnung;-c=BACK%23000000;-c=CANVAS%23000000;-c=SHADEA%23000000;-c=SHADEB%23000000;-c=GRID%23960000;-c=MGRID%236B4F42;-c=FONT%23FFFFFF;-c=AXIS%23000000;-c=FRAME%23000000;-c=ARROW%23000080;DEF:ds0=28.00A31B030000_temp.rrd:value:AVERAGE;LINE1:ds0%23FF0000:Abluft;VDEF:ds0_LAST=ds0,LAST;GPRINT:ds0_LAST:%8.2lf%20%B0C;VDEF:ds0_MIN=ds0,MINIMUM;GPRINT:ds0_MIN:Min\:%8.2lf%20%B0C;VDEF:ds0_AVERAGE=ds0,AVERAGE;GPRINT:ds0_AVERAGE:Mittel\:%8.2lf%20%B0C;VDEF:ds0_MAX=ds0,MAXIMUM;GPRINT:ds0_MAX:Max\:%8.2lf%20%B0C\n;TEXTALIGN:right;DEF:ds1=28.50AF1B030000_temp.rrd:value:AVERAGE;LINE1:ds1%230000FF:Zuluft;VDEF:ds1_LAST=ds1,LAST;GPRINT:ds1_LAST:%8.2lf%20%B0C;VDEF:ds1_MIN=ds1,MINIMUM;GPRINT:ds1_MIN:Min\:%8.2lf%20%B0C;VDEF:ds1_AVERAGE=ds1,AVERAGE;GPRINT:ds1_AVERAGE:Mittel\:%8.2lf%20%B0C;VDEF:ds1_MAX=ds1,MAXIMUM;GPRINT:ds1_MAX:Max\:%8.2lf%20%B0C\n;DEF:ds2=28.3C931B030000_temp.rrd:value:AVERAGE;LINE1:ds2%2300FF00:Fortluft;VDEF:ds2_LAST=ds2,LAST;GPRINT:ds2_LAST:%8.2lf%20%B0C;VDEF:ds2_MIN=ds2,MINIMUM;GPRINT:ds2_MIN:Min\:%8.2lf%20%B0C;VDEF:ds2_AVERAGE=ds2,AVERAGE;GPRINT:ds2_AVERAGE:Mittel\:%8.2lf%20%B0C;VDEF:ds2_MAX=ds2,MAXIMUM;GPRINT:ds2_MAX:Max\:%8.2lf%20%B0C\n;DEF:ds3=28.00AB1B030000_temp.rrd:value:AVERAGE;LINE1:ds3%2300FFFF:Aussenluft;VDEF:ds3_LAST=ds3,LAST;GPRINT:ds3_LAST:%8.2lf%20%B0C;VDEF:ds3_MIN=ds3,MINIMUM;GPRINT:ds3_MIN:Min\:%8.2lf%20%B0C;VDEF:ds3_AVERAGE=ds3,AVERAGE;GPRINT:ds3_AVERAGE:Mittel\:%8.2lf%20%B0C;VDEF:ds3_MAX=ds3,MAXIMUM;GPRINT:ds3_MAX:Max\:%8.2lf%20%B0C\n;DEF:ds4=28.BEBA8B020000_temp.rrd:value:AVERAGE;LINE1:ds4%23FFFF00:Dachsensor;VDEF:ds4_LAST=ds4,LAST;GPRINT:ds4_LAST:%8.2lf%20%B0C;VDEF:ds4_MIN=ds4,MINIMUM;GPRINT:ds4_MIN:Min\:%8.2lf%20%B0C;VDEF:ds4_AVERAGE=ds4,AVERAGE;GPRINT:ds4_AVERAGE:Mittel\:%8.2lf%20%B0C;VDEF:ds4_MAX=ds4,MAXIMUM;GPRINT:ds4_MAX:Max\:%8.2lf%20%B0C\n;" 
                          target="_blank" &gt;Diagramm&lt;/a&gt;</text>                    
                          </group>
                  </page>
              Bei Fragen stehe ich Dir gerne zur Verfügung.

              Bei dieser Gelegenheit danke ich Dir ganz herzlich für Deine Icon-Sammlung, die ich im Moment noch nicht verwende, auf deren Einsatz ich mich aber freue, sobald der neue Release der CV verfügbar sein wird.

              Beste Grüsse
              Diego
              Angehängte Dateien

              Kommentar


                #52
                Hallo Marco

                Ich selbst verwende das Plugin nicht, da ich nicht einmal eine KWL habe. Bei der Stufenschaltung mit getrennten GA's ging es mir damals hauptsächlich um Multifunktionalität. So könnte die KWL auch über normale KNX Taster gesteuert werden. (jeder Taster und jede Visu unterstützt 1bit GA. Aber nur Visus und wehnige Taster können definierte Werte auf eine 8bit GA senden)
                Gruss Patrik alias swiss

                Kommentar


                  #53
                  Zitat von Fechter65 Beitrag anzeigen
                  Wenn Du Deine KWL mittels des Plugins über die Stufen steuern willst, musst Du den Multitrigger durch vier Switches ersetzen; allenfalls wäre es eleganter den Multitrigger zu belassen, und dessen GA in einem kleinen Wiregate-Plugin auszuwerten und dann die entsprechenden GA zur Ansteuerung der Stufen an das Swiss-KWL-Ansteuerungs-Plugin zu senden.
                  Ich habe zunächst mal die einfache 4 Schalter-Variante gebaut - nicht schön aber funktioniert zumindest schonmal. Bis ich Zeit finde mich mit WG-Plugins beschäftigen dauert noch...

                  Trotzdem habe ich noch das Problem, dass ich keine Rückmeldung bekomme bzw. nicht erkennen kann welche Lüfterstufe jetzt überhaupt aktiv ist.
                  Läßt sich das irgendwie bewerkstelligen?
                  Gruß -mfd-
                  KNX-UF-IconSet since 2011

                  Kommentar


                    #54
                    Hallo Marco

                    Zitat von mfd Beitrag anzeigen
                    Trotzdem habe ich noch das Problem, dass ich keine Rückmeldung bekomme bzw. nicht erkennen kann welche Lüfterstufe jetzt überhaupt aktiv ist.
                    Läßt sich das irgendwie bewerkstelligen?
                    Hier wurde die entsprechende Abfrage vorgestellt: https://knx-user-forum.de/261057-post32.html
                    Ich persönlich habe dies bei mir darauf etwas anders umgesetzt; die entsprechende Auswertung der Abfrage sieht bei mir wie folgt aus:

                    Code:
                        }elsif($reciv =~ /07f0000C06/i and $laenge == 28){ #Wenn der Status fuer die  Ventilatoren empfangen wurden
                                    my $vent_zul =  substr($reciv,10,2);
                                    my $vent_abl =  substr($reciv,12,2);
                                    plugin_log($plugname,'ZUL: ' .  hex($vent_zul) . '% ABL: ' . hex($vent_abl) . '%');
                                     knx_write($ga_status_ventilator_zul,hex($vent_zul),5.001);
                                     knx_write($ga_status_ventilator_abl,hex($vent_abl),5.001);
                        }elsif($reciv  =~ /07f000CE0E/i and $laenge == 44){ #Wenn Status Ventilatorenstufe empfangen  wurden
                                my $akt_stufe = substr($reciv,26,2);
                                 plugin_log($plugname,'AKT_STUFE: ' . hex($akt_stufe));
                                 knx_write($ga_aktstufe,hex($akt_stufe),5.005);                    
                         }elsif($reciv =~ /07f0000E04/i and $laenge == 24){ #Wenn der Status fuer die  Bypassklappe empfangen wurden
                    Selbstverständlich müssen auch noch noch die ganzen Variablen eingearbeitet werden, wie im Post 32 beschrieben.

                    In der CV kannst Du dann den Wert der Variable $akt_stufe über ein Info-Feld ausgeben.

                    Patrik (swiss) wird gelegentlich ein überarbeitetes Plugin herausgeben (in meiner Version erfolgt die Abfrage nicht über die Serielle Schnittstelle des Wiregates, sondern über einen UDP-Austausch mit einer MOXA, an welcher die KWL angehängt ist).

                    Beste Grüsse
                    Diego

                    Kommentar


                      #55
                      Zitat von Fechter65 Beitrag anzeigen

                      Patrik (swiss) wird gelegentlich ein überarbeitetes Plugin herausgeben (in meiner Version erfolgt die Abfrage nicht über die Serielle Schnittstelle des Wiregates, sondern über einen UDP-Austausch mit einer MOXA, an welcher die KWL angehängt ist).
                      Hallo Diego,

                      kannst du in der Zwischenzeit vielleicht dein gesamtes Plugin/Config posten, damit ich die notwendigen Änderungen für die Ansteuerung über Moxa sehe? Bin gerade dabei, selbst meine KWL per Moxa anzubinden...

                      Danke & LG, Stefan

                      Kommentar


                        #56
                        Hallo Stefan

                        Das mach ich gerne:
                        Code:
                        # Plugin zur Ansteuerung einer Zender ComfoAir
                        # Version 1.5 14.08.2012 BETA
                        # Copyright: swiss (https://knx-user-forum.de/members/swiss.html)
                        # Aufbau moeglichst so, dass man unterhalb der Einstellungen nichts veraendern muss!
                        #
                        #
                        
                        ####################
                        ###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 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 das augeben 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 = '';
                        #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 = "25000"; #Mit dieser Variable Zaehler wird beeinflusst, wie lange das Plugin auf den Abschluss einer Rückmeldung der KWL wartet; empfohlener Wert für seriell: 25'0000; für Moxa: 250
                        
                        #Weitere Variable
                        my $seriel;
                        my $sin;
                        my $cin;
                        
                        
                        &readConf(); #conf.d einlesen
                        
                        if ($Kom_Art eq "S"){
                            use Device::SerialPort;
                        }
                        
                        my $return_value2;
                        my $daten;
                        my $reciv;
                        my $reciv_all;
                        my $ack = pack("H*","07F3");
                        
                        
                        # Zyklischer Aufruf nach Restart, Empfang GA oder nach Einstellung rrd .
                        $plugin_info{$plugname.'_cycle'}  = 25; 
                        
                        if ($Kom_Art eq "S"){
                            #Einrichten der Seriellen Schnittstelle fuer 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);
                        }
                        #plugin_log($plugname,''); 
                        
                        if ($msg{'apci'} eq "A_GroupValue_Write"){ #Wenn ein Telegramm vom KNX empfangen wird, ab hier auswerten
                            if ($msg{'dst'} eq $ga_stufeabwesend && knx_read($msg{'dst'},0,1) == 1) {
                                $daten = "00990101";
                                plugin_log($plugname,'Stufe abwesend');
                                $return_value2 = command_senden($daten);
                            }elsif ($msg{'dst'} eq $ga_stufe1 && knx_read($msg{'dst'},0,1) == 1) {
                                $daten = "00990102";
                                plugin_log($plugname,'Stufe 1');
                                $return_value2 = command_senden($daten);
                            }elsif ($msg{'dst'} eq $ga_stufe2 && knx_read($msg{'dst'},0,1) == 1) {
                                $daten = "00990103";
                                plugin_log($plugname,'Stufe 2');
                                $return_value2 = command_senden($daten);
                            }elsif ($msg{'dst'} eq $ga_stufe3 && knx_read($msg{'dst'},0,1) == 1) {
                                $daten = "00990104";
                                plugin_log($plugname,'Stufe 3');
                                $return_value2 = command_senden($daten);
                            }elsif ($msg{'dst'} eq $ga_komforttemp) {
                                my $komforttemp = knx_read($msg{'dst'},0,9.001);
                                plugin_log($plugname,'Komforttemp    : ' . $komforttemp . '°C');
                                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);
                            }
                            return;
                        } else { # zyklischer Aufruf
                          if ($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";
                            }
                           }    
                        
                            # 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 den Status der Ventilatoren abfragen
                                $daten = "000B00";
                                plugin_log($plugname,'Ventilator Status abrufen');
                                $return_value2 = command_senden($daten);
                            }
                            if($ga_status_bypass_prozent){ #Nur wenn die GA vergeben ist, dann Zustand Bypassklappe abfragen
                                $daten = "000D00";
                                plugin_log($plugname,'Bypass Zustand abrufen');
                                $return_value2 = command_senden($daten);
                            }
                            if($ga_betriebsstunden_filter){ #Nur wenn die GA vergeben ist, die Betriebsstunden abfragen
                                $daten = "00DD00";
                                plugin_log($plugname,'Betriebsstunden abrufen');
                                $return_value2 = command_senden($daten);
                            }
                            if($ga_zustand_badschalter){ #Nur wenn die GA vergeben ist, die Binaereingaenge abfragen
                                $daten = "000300";
                                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";
                                plugin_log($plugname,'Ventilationsstufe abrufen');
                                $return_value2 = command_senden($daten);
                            }
                        
                            #Hier werden die Stoermeldungen abgefragt
                            $daten = "00D900";
                            plugin_log($plugname,'Störungen abrufen');
                            $return_value2 = command_senden($daten);
                            
                            return;
                        }
                        
                        # Ab hier wird das Datenpaket inklusive Checksumme zusammengestellt und an die ComfoAir uebertragen
                        sub command_senden{
                            my $checksum = 0;
                            my $data = $_[0];
                         
                            my $datasum = $data . "AD"; #+173 fuer 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,-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_log($plugname,'transmit       : ' . $commandhex); #Zeigt im Pluginlog das fertige Datenpaket, dass ?bertragen 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"){
                                 my ($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;
                        plugin_log($plugname,'reciv-direkt:     ' . $sin);
                            }else{
                                $exit++
                            }
                        
                                if($reciv =~ /070f/i){           
                                    if ($Kom_Art eq "S"){
                                        $seriel->write($ack); #ACK senden
                                    } elsif ($Kom_Art eq "M"){
                                        syswrite($socket[$socknum], $ack); #ACK senden
                                    }
                                    last;
                                }
                        }     #Ende While
                        
                        plugin_log($plugname,'reciv neu       : ' . $reciv);
                                my $test = substr($reciv,0,4);
                                if($test eq '07f3'){
                        
                                    $reciv = substr($reciv,4); #falls noch ein 07f3 enthalten ist, wird dieses hier entfernt.
                                    plugin_log($plugname,'reciv gekuerzt      : ' . $reciv);
                                }
                        
                            my $laenge = length($reciv); #Laenge des Antworttelegramms ermitteln
                        
                           if($reciv =~ /07f000D209/i and $laenge == 34){ #Wenn die Temperaturen empfangen wurden und die L?nge passt
                                my $t1 = substr($reciv,12,2);
                                        my $t2 = substr($reciv,14,2);
                                        my $t3 = substr($reciv,16,2);
                                        my $t4 = substr($reciv,18,2);
                                        
                                        #Hier werden die Temperaturen "decodiert" damit sie einen Sinn ergeben
                                        $t1 =  (hex($t1)/2)-20;
                                        $t2 =  (hex($t2)/2)-20;
                                        $t3 =  (hex($t3)/2)-20;
                                        $t4 =  (hex($t4)/2)-20;
                                        
                                        #Wenn die GA's vergebenwurde, 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 =~ /07f0000C06/i and $laenge == 28){ #Wenn der Status fuer die Ventilatoren empfangen wurden
                                        my $vent_zul = substr($reciv,10,2);
                                        my $vent_abl = substr($reciv,12,2);
                                        plugin_log($plugname,'ZUL: ' . hex($vent_zul) . '% ABL: ' . hex($vent_abl) . '%');
                                        knx_write($ga_status_ventilator_zul,hex($vent_zul),5.001);
                                        knx_write($ga_status_ventilator_abl,hex($vent_abl),5.001);
                            }elsif($reciv =~ /07f000CE0E/i and $laenge == 44){ #Wenn Status Ventilatorenstufe empfangen wurden
                                    my $akt_stufe = substr($reciv,26,2);
                                    plugin_log($plugname,'AKT_STUFE: ' . hex($akt_stufe));
                                    knx_write($ga_aktstufe,hex($akt_stufe),5.005);                    
                            }elsif($reciv =~ /07f0000E04/i and $laenge == 24){ #Wenn der Status fuer die Bypassklappe empfangen wurden
                                        my $bypass_prozent = substr($reciv,10,2);
                                        plugin_log($plugname,'Bypass: ' . hex($bypass_prozent) . '%');                
                                        knx_write($ga_status_bypass_prozent,hex($bypass_prozent),5.001);
                            }elsif($reciv =~ /07f000DE14/i and $laenge == 56){ #Wenn die Rueckmeldung der Betriebsstunden empfangen wurden
                                        my $betriebsstunden_filter = substr($reciv,40,4);
                                        plugin_log($plugname,'Betriebsstunden: ' . hex($betriebsstunden_filter) . 'h');                 
                                        knx_write($ga_betriebsstunden_filter,hex($betriebsstunden_filter) . 'h',16.000);
                            }elsif($reciv =~ /07f0000402/i){ #Wenn die Rueckmeldung der Binaereingaenge empfangen wurden
                                        my $zustand_badschalter = substr($reciv,12,1);
                                        plugin_log($plugname,'Zustand Badezimmerschalter: ' . $zustand_badschalter);                 
                                        knx_write($ga_zustand_badschalter,$zustand_badschalter,1.001);
                            }elsif($reciv =~ /07f000DA11/i and $laenge == 50){ #Wenn die Rueckmeldung der Stoermeldungen empfangen wurden
                                        my $fehlerAlo = substr($reciv,10,2);
                                        my $fehlerAhi = substr($reciv,34,2);
                                        my $fehlerE = substr($reciv,12,2);
                                        my $fehlerFilter = substr($reciv,26,2);
                                        my $fehlerEA = substr($reciv,28,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 = Feler2
                        
                                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);
                                        }               
                            }
                        }
                        
                        sub readConf
                        {
                            my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname).'.conf';
                        #        my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
                            if (! -f $confFile)
                            {
                                plugin_log($plugname, " no conf file [$confFile] found."); 
                            }
                            else
                            {
                                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 ($@) 
                                {
                                    plugin_log($plugname, " conf file [$confFile] returned:");
                                    my @parts = split(/\n/, $@);
                                    plugin_log($plugname, " --> $_") foreach (@parts);
                                }
                            }
                        } # readConf
                        Code:
                        ####################
                        ###Einstellungen:###
                        ####################
                        
                        #Zuordnung Steuerfunktionen zu den Gruppenadressen:
                        $ga_stufeabwesend = '7/3/230'; #1bit Trigger fuer Stufe "Abwesend". 1=Aktivieren
                        $ga_stufe1 = '7/3/231'; #1bit Trigger fuer Stufe1. 1=Aktivieren
                        $ga_stufe2 = '7/3/232'; #1bit Trigger fuer Stufe2. 1=Aktivieren
                        $ga_stufe3 = '7/3/233'; #1bit Trigger fuer Stufe3. 1=Aktivieren
                        $ga_komforttemp = '7/3/234'; #GA DPT 9.001 zum setzen der Komforttemperatur
                        $ga_reset_filter = '7/3/235'; #1bit Trigger fuer das Zuruecksetzen des Betriebsstundenzaehlers des Filters. 1=Reset
                        $ga_reset_error = '7/3/236'; #1bit Trigger fuer das zuruecksetzen der KWL nach einem Fehler. 1=Reset
                        
                        #Hier werden die Gruppenadressen fuer die Rueckmeldungen vergeben: (Nich vergeben = inaktiv)
                        $ga_status_ventilator_zul = '7/3/237'; #GA DPT5.001 fuer Status Ventilator Zuluft %
                        $ga_status_ventilator_abl = '7/3/238'; #GA DPT5.001 fuer Status Ventilator Abluft %
                        $ga_status_bypass_prozent = '7/3/239'; #GA DPT5.001 fuer Status Bypassklappe %
                        $ga_betriebsstunden_filter = '7/3/240'; #GA DPT16.000 fuer die Rueckmeldung der Betribsstunden des Filters
                        $ga_zustand_badschalter = ''; #GA DPT1.001 fuer die Rueckmeldung des Zustandes des Badezimmerschalters
                        $ga_fehler_filter = '7/3/242'; #GA DPT 1.001 fuer den Zustand des Filters. 0=OK, 1=Filter Voll
                        $ga_fehlercode = '7/3/243'; #GA DPT 16.000 fuer das augeben des Fehlercodes als Text
                        $ga_aktstufe    = '7/3/248';
                        
                        #Hier werden die Gruppenadressen für die Temperaturen vergeben: (Nicht vergeben=inaktiv)
                        $ga_aul_temp = '7/3/244'; #GA DPT 9.001 für die Aussenlufttemperatur
                        $ga_zul_temp = '7/3/245'; #GA DPT 9.001 für die Zulufttemperatur
                        $ga_abl_temp = '7/3/246'; #GA DPT 9.001 für die Ablufttemperatur
                        $ga_fol_temp = '7/3/247'; #GA DPT 9.001 für die Fortlufttemperatur
                        
                        #Zuordnung der Namen fuer die RRD's:
                        $Name_rrd_AUL = 'KWL_Kanzlei_Aussenluft'; #Name RRD Aussenluft
                        $Name_rrd_ZUL = 'KWL_Kanzlei_Zuluft'; #Name RRD Zuluft
                        $Name_rrd_ABL = 'KWL_Kanzlei_Abluft'; #Name RRD Abluft
                        $Name_rrd_FOL = 'KWL_Kanzlei_Fortluft'; #Name RRD Fortluft
                        
                        # Kommunikationsart; abhaengig davon, wie die KWL mit dem Wiregate verbunden ist, muessen nachfolgend unterschiedliche Einstellungen vorgenommen werden.
                        # Im Moment stehen zwei Moeglichkeiten zur Verfuegung: 
                        #    seriell, d.h. direkt an der seriellen Schnittstelle des Wiregates oder an einem seriell-USB-Wandler am USB-Port des Wiregates angeschlossen
                        #    MOXA: die serielle Schnittstelle der KNX ist über eine MOXA-Schnittstelle über das UDP-Protokoll mit dem Wiregate verbunden
                        $Kom_Art = "M"; # "S" = seriell; "M" = Moxa
                        
                        
                        #Serielle-Anbindung: Pfad zur seriellen Schnittstelle oder dem USB-Seriell-Wandler:
                        $schnittstelle = '/dev/ttyUSB-1-2';
                        #MOXA-Anbindung: 
                        #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 = "74"; # Eindeutige Nummer des Sockets, kann grundsaetzlich frei gewaehlt werden
                        $send_ip = "10.0.0.227"; # SendeIP (UDP): IP-Adresse der MOXA
                        $send_port = "16012"; # Sendeport (UDP): Auf der MOXA gewaehlter Port
                        $recv_ip = "10.0.1.10"; # EmpfangsIP (UDP): IP-Adresse des Wiregates
                        $recv_port = "16011"; # Empfangsport (UDP): Auf dem Wiregate gewaehlter Port
                        
                        
                        # Dauer einer Abfrage
                        $Zaehler = "250"; #Mit dieser Variable wird beeinflusst, wie lange das Plugin auf den Abschluss einer Rückmeldung der KWL wartet; empfohlener Wert für seriell: 25'0000; für Moxa: 250
                        
                        
                        ######################
                        ##ENDE Einstellungen##
                        ######################

                        Wie hier https://knx-user-forum.de/260620-post12.html berichtet, habe ich in den Wiregate-Einstellungen keine Socketverbindung erstellt.

                        Beste Grüsse und viel Erfolg
                        Diego

                        Kommentar


                          #57
                          Soo Dank Degos toller Vorarbeit war es ein leichtes das Plugin auf den neuen Hybridbetrieb umzurüsten. -> Danke dafür

                          Was noch auf der ToDo Liste für die nächsten Tage steht ist folgendes:

                          - Den gesammten Datenstrom über das längebyte im Telegramm auf korrekten Empfang prüfen.

                          - Auswerten der Lüfterstufe... -> Die Frage ist wie? Dieser Wert steht in keinem Telegramm ausser der EASE kommunikation und die ist im Protokoll nicht beschrieben.

                          Für Fragen und Anregungen so wie freiwillige Tester stehe ich immer gerne zur Verfügung
                          Gruss Patrik alias swiss

                          Kommentar


                            #58
                            Stelle mich gern als Tester zur Verfügung.
                            Allerdings kann ich nur mit direkter RS232-Anbindung ans WG dienen. Moxa habe ich leider nicht.
                            Gruß -mfd-
                            KNX-UF-IconSet since 2011

                            Kommentar


                              #59
                              Lieber Patrik

                              Zitat von swiss Beitrag anzeigen
                              - Auswerten der Lüfterstufe... -> Die Frage ist wie? Dieser Wert steht in keinem Telegramm ausser der EASE kommunikation und die ist im Protokoll nicht beschrieben.
                              Im obigen Code wird in der Variablen $ga_aktstufe die aktuell gewählte Lüftestufe zurückgegeben; oder habe ich Dich falsch verstanden?

                              Beste Grüsse
                              Diego

                              Kommentar


                                #60
                                Ohne mich jetzt wirklich auszukennen, ich hatte das auch schon in Post #25 geschrieben:
                                Kommando: 0x00 0xCD
                                Ventilationsstufe abrufen

                                habe ich in der Protokollbeschreibung (S.9) gefunden. Es müsste also vermutlich prinzipiell gehen.
                                Gruß -mfd-
                                KNX-UF-IconSet since 2011

                                Kommentar

                                Lädt...
                                X