Ankündigung

Einklappen
Keine Ankündigung bisher.

Codeschnipsel: Einfache Zeitschaltuhr mit Wiregate-Plugin

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

    Codeschnipsel: Einfache Zeitschaltuhr mit Wiregate-Plugin

    Grundsätzlich arbeite ich für die Zeitschaltfunktionen mit Fry's Logikprozessor. Um es meiner Gemahlin möglich zu machen, bestimmte Zeitautomatiken selbst einzustellen, habe ich heute eine sehr einfache Lösung in der CometVisu umgesetzt.

    Sie benötigt ein Wiregate-Plugin (das sämtliche Zeitschaltfunktionen bedient) und pro Zeitschaltfunktion drei GA, nämlich
    - Zeitschaltfunktion ein/aus (DPT 1.001)
    - Zeitschaltfunktion Stunde (DPT 7.007)
    - Zeitschaltfunktion Minute (DPT 7.006)

    (als spätere Erweiterung wäre denkbar, auch noch einen Wochentag einzufügen).

    Die Bedienung in der CV kann frei gestaltet werden. Meine Lösung sieht wie folgt aus:


    Code:
          <mapping name="ZeitAutomatik">
            <entry value="0"><icon name="control_x" color="red"/></entry>
            <entry value="1"><icon name="control_on_off" color="green"/></entry>
          </mapping>
    
    
          <styling name="RedGreen">
            <entry value="0">red</entry>
            <entry value="1">green</entry>
          </styling>
    
    
    
            <group name="Licht zeitgesteuert ausschalten">
                <layout colspan="3"/>
                <group name=" "  flavour="black" nowidget="true" >
                    <layout rowspan="3" colspan="1"/>
                      <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                        <layout colspan="1"/>
                        <address transform="DPT:1.001" mode="readwrite">10/0/63</address>
                      </switch>
                </group>
                <group name="Stunde"  flavour="black" nowidget="true">
                    <layout colspan="1"/>
                    <infotrigger format="%02s:" uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="right" change="absolute" min="0" max="23" infoposition="middle">
                        <layout colspan="1"/>
                        <address transform="DPT:7.007" mode="readwrite">10/0/61</address>
                    </infotrigger>
                </group>
                <group name="Minute"  flavour="black" nowidget="true">
                    <layout colspan="1"/>
                    <infotrigger format="%02s" uplabel="+" downlabel="-" upvalue="5" downvalue="-5" align="right" change="absolute" min="0" max="55" infoposition="middle">>
                        <layout colspan="1"/>
                                <address transform="DPT:7.006" mode="readwrite">10/0/62</address>
                    </infotrigger>
                </group>
            </group>
    Das Plugin
    Code:
    # Einfaches Plugin, um über Einstellungen in der CometVisu zeitbezogene Aktionen auszuführen
    # Version 1.0 05.01.2014
    # Copyright: fechter65 (https://knx-user-forum.de/members/fechter65.html)
    
    
    ####################
    ###Einstellungen:###
    ####################
    my @Aktionen;
    my $Minute;
    my $Stunde;
    my $Status;
    my $GATest;
    my $Value;
    my $debug = 0;
    ######################
    ##ENDE Einstellungen##
    ######################
    
    #Ab hier nichts mehr aendern.
    ######################
    ##Hauptverarbeitung:##
    ######################
    
    &readConf(); #Konfigurationsdatei einlesen
        
    $plugin_info{$plugname . '_cycle'} = 59;
    if ($msg{'apci'} eq "A_GroupValue_Read") 
    { #das Plugin wird aufgerufen, um einen ihm verwalteten Wert abzufragen
        $GATest = $msg{'dst'};
        if($debug>=1){plugin_log($plugname," beantworte GA ".$GATest);}
        foreach my $element (@Aktionen) {
            if ($element->{GAm} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Minute"},$element->{DPT});}
            if ($element->{GAh} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"},$element->{DPT});}
            if ($element->{GAStatus} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Status"},$element->{DPT});}
        }
    }
    elsif ($msg{'apci'} eq "A_GroupValue_Write" )
    { #das Plugin wird aufgerufen, weil ein von ihm verwalteter Wert geändert wird
        $GATest = $msg{'dst'};
        $Value = $msg{'value'};
        #geänderten Wert abspeichern, da mit er remanent wird
        foreach my $element (@Aktionen) {
            if ($element->{GAm} eq $GATest)
            {
                if (!defined $Value) { 
                   # Wert muss dekodiert werden
                   $Value = decode_dpt7($msg{'data'});
                } 
                if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                $plugin_info{$plugname.'_'.$element->{Name}."_Minute"} = $Value;
            }
            if ($element->{GAh} eq $GATest)
            {
                if (!defined $Value) { 
                   # Wert muss dekodiert werden
                   $Value = decode_dpt7($msg{'data'});
                } 
                if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"} = $Value;
            }
            if ($element->{GAStatus} eq $GATest)
            {
                if (!defined $Value) { 
                   # Wert muss dekodiert werden
                   $Value = knx_read($GATest,0,$element->{DPT});
                } 
                if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                $plugin_info{$plugname.'_'.$element->{Name}."_Status"} = $Value;
            }
        }
    }
    else 
    {#zyklischer Aufruf 
        my $crtHour = `date \"+%H\"`;
        my $crtMin = `date \"+%M\"`;
        if($debug>=1){plugin_log($plugname, " Testzeit: ".$crtHour." : " ."y" . $crtMin . "xxx" );}
        foreach my $element (@Aktionen) {
            #zunächst alle GA subskribieren (nicht sehr elegant, dass dies bei jedem Aufruf erfolgt)
            $plugin_subscribe{$element->{GAStatus}}{$plugname} = 1;
            $plugin_subscribe{$element->{GAh}}{$plugname} = 1;
            $plugin_subscribe{$element->{GAm}}{$plugname} = 1;
    
            #Prüfen, ob Zeitpunkt für Schaltbefehl gegeben ist
            $Status = knx_read($element->{GAStatus},0,1);
            if ($Status eq '')
            {
                $Status = $plugin_info{$plugname.'_'.$element->{Name}."_Status"}
            }
            if($debug>=1){plugin_log($plugname,$element->{Name}." Status ".$Status);}
            if (($Status > "0"))
            {
                if($debug>=1){plugin_log($plugname,$element->{Name}." Status passiert ");}
                $Stunde = knx_read($element->{GAh},0,7.007);
                if (($crtHour == $Stunde))
                {
                    $Minute = knx_read($element->{GAm},0,7.006);
                    if (($crtMin == $Minute))
                    {
                        plugin_log($plugname,$element->{Name}." ausgefuehrt um ".$Stunde .":"  . $Minute ." an " . $element->{GASchalten} . " mit Wert " . $element->{SchaltBefehl});
                        knx_write($element->{GASchalten},$element->{SchaltBefehl},$element->{DPT}); 
                    }
                }
            }
        }
    }
    
    #++++++++++++++++++++++++
    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");
            if (($result) and ($debug>=1)){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);}
            }
        }
    } #Ende readConf
    und die zugehörige Conf-Datei:
    Code:
    #!/usr/bin/perl
    #
    # CVZeitschaltuhr - Konfiguration
    #
    
    @Aktionen = 
        #Name:             Frei waehlbar, dient der Übersicht und als Protokolleintrag
        #GASchalten:     GA, die im entsprechenden Zeitpunkt ausgeführt wird
        #SchaltBefehl:    Wert, der an die GA Schalten übermittelt wird
        #DPT:            Datenformat des Schaltbefehls
        #GAStatus:        GA, welche den Status enthält; zulässige Stati: 0: nicht aktiv, 1: aktiv (muss von CV befüllt werden)
        #GAh:            GA, welche die Stunde des Schaltzeitpunkts enthält (muss von CV befüllt werden)
        #GAm            GA, welche die Minute des Schaltzeitpunkts enthält (muss von CV befüllt werden)
    
        ( 
          {Name=>'LichtBueroDCausschalten', GASchalten=>'1/1/130', SchaltBefehl=>'0', DPT=>'1',
           GAStatus=>'10/0/63', GAh=>'10/0/61' ,GAm=>'10/0/62'},
        );
    Vielleicht dient dies auch einem anderen CV-Andwender.

    Beste Grüsse - und herzlichen Dank an die CV-Entwickler
    Diego
    Angehängte Dateien

    #2
    Danke für deine Vorarbeit!

    Das werde ich mir kopieren und für die automatische Weckfunktion (Rollo hochfahren, ggf. zeitverzögert Licht einschalten) nutzen.

    Grüße
    Guste

    Kommentar


      #3
      Hallo ,

      kann es sein, dass ein Fehler im Plugin ist?
      Code:
      else 
      {#zyklischer Aufruf 
          my $crtHour = `date \"+%H\"`;
          my $crtMin = `date \"+%M\"`;
          if($debug>=1){plugin_log($plugname, " Testzeit: ".$crtHour." : " ."y" . $crtMin . "xxx" );}
          foreach my $element (@Aktionen) {
              #zunächst alle [URL="http://redaktion.knx-user-forum.de/lexikon/GA/"][U][COLOR=#0066cc]GA[/COLOR][/U][/URL] subskribieren (nicht sehr elegant, dass dies bei jedem Aufruf erfolgt)
              $plugin_subscribe{$element->{GAStatus}}{$plugname} = 1;
              $plugin_subscribe{$element->{GAh}}{$plugname} = 1;
              $plugin_subscribe{$element->{GAm}}{$plugname} = 1;
      Bringt dann bei mir folgende Zeilen im Editor (Siehe Anhang)

      Gruß Manuel
      Angehängte Dateien

      Kommentar


        #4
        Ich bin ein Stück weiter gekommen und zwar weiß ich nun, dass es wohl an den Anführungsstrichen liegt.

        Ich habe das nun so geändert. Jedoch wird das Plugin nicht ausgeführt.
        Die config wir auch gefunden, jedoch kommt sonst kein Log eintrag.

        Code:
        # Einfaches Plugin, um über Einstellungen in der CometVisu zeitbezogene Aktionen auszuführen
        # Version 1.0 05.01.2014
        # Copyright: fechter65 ([URL]https://knx-user-forum.de/members/fechter65.html[/URL])
         
        ####################
        ###Einstellungen:###
        ####################
        my @Aktionen;
        my $Minute;
        my $Stunde;
        my $Status;
        my $GATest;
        my $Value;
        my $debug = 0;
        ######################
        ##ENDE Einstellungen##
        ######################
         #Ab hier nichts mehr aendern.
        ######################
        ##Hauptverarbeitung:##
        ######################
         &readConf(); #Konfigurationsdatei einlesen
            
        $plugin_info{$plugname . '_cycle'} = 59;
        if ($msg{'apci'} eq "A_GroupValue_Read") 
        { #das Plugin wird aufgerufen, um einen ihm verwalteten Wert abzufragen
            $GATest = $msg{'dst'};
            if($debug>=1){plugin_log($plugname," beantworte GA ".$GATest);}
            foreach my $element (@Aktionen) {
                if ($element->{GAm} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Minute"},$element->{DPT});}
                if ($element->{GAh} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"},$element->{DPT});}
                if ($element->{GAStatus} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Status"},$element->{DPT});}
            }
        }
        elsif ($msg{'apci'} eq "A_GroupValue_Write" )
        { #das Plugin wird aufgerufen, weil ein von ihm verwalteter Wert geändert wird
            $GATest = $msg{'dst'};
            $Value = $msg{'value'};
            #geänderten Wert abspeichern, da mit er remanent wird
            foreach my $element (@Aktionen) {
                if ($element->{GAm} eq $GATest)
                {
                    if (!defined $Value) { 
                       # Wert muss dekodiert werden
                       $Value = decode_dpt7($msg{'data'});
                    } 
                    if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                    $plugin_info{$plugname.'_'.$element->{Name}."_Minute"} = $Value;
                }
                if ($element->{GAh} eq $GATest)
                {
                    if (!defined $Value) { 
                       # Wert muss dekodiert werden
                       $Value = decode_dpt7($msg{'data'});
                    } 
                    if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                    $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"} = $Value;
                }
                if ($element->{GAStatus} eq $GATest)
                {
                    if (!defined $Value) { 
                       # Wert muss dekodiert werden
                       $Value = knx_read($GATest,0,$element->{DPT});
                    } 
                    if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                    $plugin_info{$plugname.'_'.$element->{Name}."_Status"} = $Value;
                }
            }
        }
        else 
        {#zyklischer Aufruf 
            my $crtHour = 'date \"+%H\"';
            my $crtMin = 'date \"+%M\"';
            if($debug>=1){plugin_log($plugname, " Testzeit: ".$crtHour." : " ."y" . $crtMin . "xxx" );}
            foreach my $element (@Aktionen) {
                #zunächst alle GA subskribieren (nicht sehr elegant, dass dies bei jedem Aufruf erfolgt)
                $plugin_subscribe{$element->{GAStatus}}{$plugname} = 1;
                $plugin_subscribe{$element->{GAh}}{$plugname} = 1;
                $plugin_subscribe{$element->{GAm}}{$plugname} = 1;
                 #Prüfen, ob Zeitpunkt für Schaltbefehl gegeben ist
                $Status = knx_read($element->{GAStatus},0,1);
                if ($Status eq '')
                {
                    $Status = $plugin_info{$plugname.'_'.$element->{Name}."_Status"}
                }
                if($debug>=1){plugin_log($plugname,$element->{Name}." Status ".$Status);}
                if (($Status > "0"))
                {
                    if($debug>=1){plugin_log($plugname,$element->{Name}." Status passiert ");}
                    $Stunde = knx_read($element->{GAh},0,7.007);
                    if (($crtHour == $Stunde))
                    {
                        $Minute = knx_read($element->{GAm},0,7.006);
                        if (($crtMin == $Minute))
                        {
                            plugin_log($plugname,$element->{Name}." ausgefuehrt um ".$Stunde .":"  . $Minute ." an " . $element->{GASchalten} . " mit Wert " . $element->{SchaltBefehl});
                            knx_write($element->{GASchalten},$element->{SchaltBefehl},$element->{DPT}); 
                        }
                    }
                }
            }
        }
         #++++++++++++++++++++++++
        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");
                if (($result) and ($debug>=1)){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);}
                }
            }
        } #Ende readConf

        Kommentar


          #5
          Hallo Manuel

          Kannst es bitte einmal mit dieser Version versuchen (bei mir arbeitet diese):

          Code:
          # Einfaches Plugin, um über Einstellungen in der CometVisu zeitbezogene Aktionen auszuführen
          # Version 1.1 08.03.2014
          # Copyright: fechter65 (https://knx-user-forum.de/members/fechter65.html)
          
          
          ####################
          ###Einstellungen:###
          ####################
          my @Aktionen;
          my $Minute;
          my $Stunde;
          my $Status;
          my $GATest;
          my $Value;
          my $debug = 0;
          ######################
          ##ENDE Einstellungen##
          ######################
          
          #Ab hier nichts mehr aendern.
          ######################
          ##Hauptverarbeitung:##
          ######################
          
          &readConf(); #Konfigurationsdatei einlesen
              
          $plugin_info{$plugname . '_cycle'} = 29;
          if ($msg{'apci'} eq "A_GroupValue_Read") 
          { #das Plugin wird aufgerufen, um einen ihm verwalteten Wert abzufragen
              $GATest = $msg{'dst'};
              if($debug>=1){plugin_log($plugname," beantworte GA ".$GATest);}
              foreach my $element (@Aktionen) {
                  if ($element->{GAm} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Minute"},7.006);}
                  if ($element->{GAh} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"},7.007);}
                  if ($element->{GAStatus} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Status"},$element->{DPT});}
              }
          }
          elsif ($msg{'apci'} eq "A_GroupValue_Write" )
          { #das Plugin wird aufgerufen, weil ein von ihm verwalteter Wert geändert wird
              $GATest = $msg{'dst'};
              $Value = $msg{'value'};
              #geänderten Wert abspeichern, damit er remanent wird
              foreach my $element (@Aktionen) {
                  if ($element->{GAm} eq $GATest)
                  {
                      if (!defined $Value) { 
                         # Wert muss dekodiert werden
                         $Value = decode_dpt7($msg{'data'});
                      } 
                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                      $plugin_info{$plugname.'_'.$element->{Name}."_Minute"} = $Value;
                  }
                  if ($element->{GAh} eq $GATest)
                  {
                      if (!defined $Value) { 
                         # Wert muss dekodiert werden
                         $Value = decode_dpt7($msg{'data'});
                      } 
                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                      $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"} = $Value;
                  }
                  if ($element->{GAStatus} eq $GATest)
                  {
                      if (!defined $Value) { 
                         # Wert muss dekodiert werden
                         $Value = knx_read($GATest,0,$element->{DPT});
                      } 
                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                      $plugin_info{$plugname.'_'.$element->{Name}."_Status"} = $Value;
                  }
              }
          }
          else 
          {#zyklischer Aufruf 
              my $crtHour = `date \"+%H\"`;
              my $crtMin = `date \"+%M\"`;
              if($debug>=1){plugin_log($plugname, " Testzeit: ".$crtHour." : " ."y" . $crtMin . "xxx" );}
              foreach my $element (@Aktionen) {
                  #zunächst alle GA subskribieren (nicht sehr elegant, dass dies bei jedem Aufruf erfolgt)
                  $plugin_subscribe{$element->{GAStatus}}{$plugname} = 1;
                  $plugin_subscribe{$element->{GAh}}{$plugname} = 1;
                  $plugin_subscribe{$element->{GAm}}{$plugname} = 1;
          
                  #Prüfen, ob Zeitpunkt für Schaltbefehl gegeben ist
                  $Status = knx_read($element->{GAStatus},0,1);
                  if ($Status eq '')
                  {
                      $Status = $plugin_info{$plugname.'_'.$element->{Name}."_Status"}
                  }
                  if($debug>=1){plugin_log($plugname,$element->{Name}." Status ".$Status);}
                  if (($Status > "0"))
                  {
                      if($debug>=1){plugin_log($plugname,$element->{Name}." Status passiert ");}
                      $Stunde = knx_read($element->{GAh},0,7.007);
                      if (($crtHour == $Stunde))
                      {
                          $Minute = knx_read($element->{GAm},0,7.006);
                          if (($crtMin == $Minute))
                          {
                              plugin_log($plugname,$element->{Name}." ausgefuehrt um ".$Stunde .":"  . $Minute ." an " . $element->{GASchalten} . " mit Wert " . $element->{SchaltBefehl});
                              knx_write($element->{GASchalten},$element->{SchaltBefehl},$element->{DPT}); 
                          }
                      }
                  }
              }
          }
          
          #++++++++++++++++++++++++
          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");
                  if (($result) and ($debug>=1)){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);}
                  }
              }
          } #Ende readConf
          Beste Grüsse
          Diego

          Kommentar


            #6
            Hallo Diego,

            habe es heute erst geschafft dein Plugin zu testen, habe aber damit das selbe Ergebnis. Es wird nicht ausgeführt. Wie könnte ich den Fehler eingrenzen ?

            Gruß Manuel

            Kommentar


              #7
              Hallo Manuel

              Ich weiss nicht woran es liegt, dass es bei Dir nicht läuft. Nachfolgend einige Ideen:

              Dürfte ich allenfalls einmal Deine conf-Datei sehen?
              Sind alle verwendeten GA in der eibga-conf-Datei eingetragen?
              Hast Du in der CometVisu Zeiten eingestellt, so dass die GA-alle Werte enthalten?
              Willst Du allenfalls den nachfolgenden Code (mit mehr Debug-Stellen) ausprobieren und dann die Einträge im Plugin-Log hier publizieren?

              Code:
              ####################
              ###Einstellungen:###
              ####################
              my  @Aktionen;
              my $Minute;
              my $Stunde;
              my $Status;
              my $GATest;
              my  $Value;
              my $debug = 2;
              ######################
              ##ENDE  Einstellungen##
              ######################
                
               #Ab hier nichts mehr  aendern.
              ######################
              ##Hauptverarbeitung:##
              ######################
                
               
              if($debug>=1){plugin_log($plugname," Plugin wird aufgerufen  ");}
              &readConf(); #Konfigurationsdatei  einlesen
               
              $plugin_info{$plugname . '_cycle'} = 29;
                
               
              if ($msg{'apci'} eq "A_GroupValue_Read") 
              { #das Plugin wird  aufgerufen, um einen ihm verwalteten Wert abzufragen
               $GATest =  $msg{'dst'};
               if($debug>=1){plugin_log($plugname," beantworte GA  ".$GATest);}
               foreach my $element (@Aktionen) {
                if ($element->{GAm}  eq $GATest){knx_write($GATest,  $plugin_info{$plugname.'_'.$element->{Name}."_Minute"},7.006);}
                if  ($element->{GAh} eq $GATest){knx_write($GATest,  $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"},7.007);}
                if  ($element->{GAStatus} eq $GATest){knx_write($GATest,  $plugin_info{$plugname.'_'.$element->{Name}."_Status"},$element->{DPT});}
               }
              }
              elsif  ($msg{'apci'} eq "A_GroupValue_Write" )
              { #das Plugin wird aufgerufen, weil  ein von ihm verwalteter Wert geändert wird
               $GATest = $msg{'dst'};
               $Value  = $msg{'value'};
               #geänderten Wert abspeichern, damit er remanent  wird
               foreach my $element (@Aktionen) {
                if ($element->{GAm} eq  $GATest)
                {
                 if (!defined $Value) { 
                    # Wert muss dekodiert  werden
                    $Value = decode_dpt7($msg{'data'});
                 }  
                 if($debug>=1){plugin_log($plugname," GA ".$GATest." Value  ".$Value);}
                 $plugin_info{$plugname.'_'.$element->{Name}."_Minute"} =  $Value;
                }
                if ($element->{GAh} eq $GATest)
                {
                 if (!defined  $Value) { 
                    # Wert muss dekodiert werden
                    $Value =  decode_dpt7($msg{'data'});
                 }  
                 if($debug>=1){plugin_log($plugname," GA ".$GATest." Value  ".$Value);}
                 $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"} =  $Value;
                }
                if ($element->{GAStatus} eq $GATest)
                {
                 if  (!defined $Value) { 
                    # Wert muss dekodiert werden
                    $Value =  knx_read($GATest,0,$element->{DPT});
                 }  
                 if($debug>=1){plugin_log($plugname," GA ".$GATest." Value  ".$Value);}
                 $plugin_info{$plugname.'_'.$element->{Name}."_Status"} =  $Value;
                }
               }
              }
              else 
              {   #zyklischer Aufruf 
                
                if($debug>=1){plugin_log($plugname," zyklischer Aufruf  ");}
               if(int($debug)>=1){plugin_log($plugname," zyklischer Aufruf2  ");}
               
               my $crtHour = `date \"+%H\"`;
               my $crtMin = `date  \"+%M\"`;
               if($debug>=1){plugin_log($plugname, " Testzeit: ".$crtHour." :  " ."y" . $crtMin . "xxx" );}
               foreach my $element (@Aktionen)  {
                #zunächst alle GA subskribieren (nicht sehr elegant, dass dies bei jedem  Aufruf erfolgt)
                $plugin_subscribe{$element->{GAStatus}}{$plugname} =  1;
                $plugin_subscribe{$element->{GAh}}{$plugname} =  1;
                $plugin_subscribe{$element->{GAm}}{$plugname} = 1;
                
                 #Prüfen, ob Zeitpunkt für Schaltbefehl gegeben ist
                $Status =  knx_read($element->{GAStatus},0,1);
                if ($Status eq  '')
                {
                 $Status =  $plugin_info{$plugname.'_'.$element->{Name}."_Status"}
                }
                if($debug>=1){plugin_log($plugname,$element->{Name}."  Status ".$Status);}
                if (($Status >  "0"))
                {
                 if($debug>=1){plugin_log($plugname,$element->{Name}."  Status passiert ");}
                 $Stunde =  knx_read($element->{GAh},0,7.007);
                 if (($crtHour ==  $Stunde))
                 {
                  $Minute =  knx_read($element->{GAm},0,7.006);
                  if (($crtMin ==  $Minute))
                  {
                   plugin_log($plugname,$element->{Name}."  ausgefuehrt um ".$Stunde .":"  . $Minute ." an " . $element->{GASchalten} . "  mit Wert " .  $element->{SchaltBefehl});
                   knx_write($element->{GASchalten},$element->{SchaltBefehl},$element->{DPT});  
                  }
                 }
                }
               }
              }
                
               #++++++++++++++++++++++++
              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
                  {
                      open(CONF,  $confFile);
                      my @lines = <CONF>;
                       close($confFile);
                      my $result = eval("@lines");
                      if  (($result) ){plugin_log($plugname, "conf file [$confFile] returned  result[$result]")};
                      if ($@) 
                      {
                          my @parts =  split(/\n/, $@);
                      }
                  }
              } #Ende readConf
              Beste Grüsse
              Diego

              Kommentar


                #8
                Hallo Diego,

                ich habe noch ein Fehler in der config gefunden. Nun läuft das Plugin auch, aber es wird noch nichts geschaltet.

                das ist der Auzug aus meiner Log
                Code:
                2014-10-12 03:00:30.831,outdoorlight_garage_time_off, Plugin wird aufgerufen   2014-10-12 03:00:30.839,outdoorlight_garage_time_off,conf file [/etc/wiregate/plugin/generic/conf.d/outdoorlight_garage_time_off.conf] returned  result[1] 2014-10-12 03:00:30.840,outdoorlight_garage_time_off, zyklischer Aufruf   2014-10-12 03:00:30.840,outdoorlight_garage_time_off, zyklischer Aufruf2   2014-10-12 03:00:30.840,outdoorlight_garage_time_off, Testzeit: date \"+%H\" :  ydate  \"+%M\"xxx 2014-10-12 03:00:30.847,outdoorlight_garage_time_off,Wohnzimmer 2  Status 1 2014-10-12 03:00:30.847,outdoorlight_garage_time_off,Wohnzimmer 2  Status passiert
                Im Anhang habe ich das Plugin

                Das Plugin heißt bei mir "outdoorlight_garage_time_off"

                Eingetragen habe ich die Ga´s ins Wiregate auch.

                Gruß und Danke Manuel
                Angehängte Dateien

                Kommentar


                  #9
                  Guten Morgen Manuel

                  Der ursprüngliche Fehler lag bei Dir wahrscheinlich (so vermute ich) in der Config-Datei (diese hast Du mir nicht zugestellt), diesen hast Du - wie Du schreibst - in der Zwischenzeit bereits gefunden.

                  Der Grund, weshalb das Plugin bei Dir weiterhin nicht läuft, dürfte bei der von Dir vorgenommenen Änderung liegen: Die beiden Zeilen müssen tatsächlich

                  Code:
                      my $crtHour = `date \"+%H\"`;
                      my $crtMin = `date \"+%M\"`;
                  lauten, auch wenn dies im Web-Editor des Wiregates zu einem optisch (d.h. farblich) unschönen Ergebnis führt.

                  Ich habe die von Dir verwendeten Code für diese beiden Zeilen testweise in mein laufendes Plugin eingebaut. Dies führt - wie bei Dir - zu folgendem Ergebnis:
                  Code:
                  2014-10-12 05:04:53.662,CVZeitschaltuhr, Testzeit: date \"+%H\" : ydate  \"+%M\"xxx
                  D.h. den beiden Variablen wird nicht die aktuelle Uhrzeit, sondern der String zugewiesen.

                  Ohne Deine Änderung gibt das Plugin Folgendes aus:
                  Code:
                  2014-10-12 05:04:40.442,CVZeitschaltuhr, Testzeit: 05  : y04 xxx
                  Bitte ändere diese beiden Zeilen und berichte über das Ergebnis.

                  Für den produktiven Einsatz empfehle ich Dir, wieder die Version aus Post 5 zu verwenden.

                  Beste Grüsse
                  Diego

                  Kommentar


                    #10
                    Noch der Vollständigkeit halber: Statt über Tasten (+/-), wie dies im Post 1 dargestellt wurde, kann man die Zeit natürlich auch über zwei Slider einstellen. Das sieht dann - im Vergleich zur ersten Variante - so aus:




                    Der entsprechende Code dazu:

                    Code:
                            <group name="Licht zeitgesteuert ausschalten">
                              <layout colspan="3"/>
                              <group name=" " flavour="black" nowidget="true">
                                <layout colspan="1"/>
                                <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                  <layout colspan="1"/>
                                  <address transform="DPT:1.001" mode="readwrite">8/2/60</address>
                                </switch>
                              </group>
                              <break/>
                              <group name="Stunde" flavour="black" nowidget="true">
                                <layout colspan="3"/>
                                <slide min="0" max="23" step="1" format="%02sh">
                                  <layout colspan="3"/>
                                  <address transform="DPT:7.007" mode="readwrite">8/2/61</address>
                                </slide>
                              </group>
                              <group name="Minuten" flavour="black" nowidget="true">
                                <layout colspan="3"/>
                                <slide min="0" max="55" step="5" format=":%02s">
                                  <layout colspan="3"/>
                                  <address transform="DPT:7.006" mode="readwrite">8/2/62</address>
                                </slide>
                              </group>
                            </group>


                    Gruss
                    Diego
                    Angehängte Dateien

                    Kommentar


                      #11
                      Das gefällt mir richtig gut,
                      Ich würde es gerne für meine rolladen steuerung nehmen.
                      wo muss ich denn welche dateien hinkopieren um zum erfolg zu kommen.
                      ich nutze ubuntu jnd kein wiregate
                      Elektroinstallation-Rosenberg
                      -Systemintegration-
                      Planung, Ausführung, Bauherren Unterstützung
                      http://www.knx-haus.com

                      Kommentar


                        #12
                        Da kann ich leider nicht helfen. Ich weiss nicht, wo bei Deiner Installation die Plugin-Dateien zu platzieren sind.

                        Sorry, Diego

                        Kommentar


                          #13
                          Hallo zusammen,

                          Es ist schon etwas her, das hier etwas gepostet wurde. Aber ich habe das als Basis für eine Weiterentwicklung genutzt, die ich hier vorstellen möchte.

                          Vorab möchte ich aber noch meinen Dank an alle Beteiligten, also die Entwickler von Wiregate und Cometvisu sowie alle die im Forum aktiv sind, aussprechen
                          Tolles Engangement!

                          Ich bin schon einige Zeit im Forum dabei neben wenigen Beiträgen, die ich geschrieben habe, lese ich aber im wesentlichen mit.
                          Seit ca. 3 Jahren habe ich mit dem Wiregate begonnen seit ca. einem Jahr beschäftige ich micht mit der Cometvisu.

                          Nun habe ich auf Basis des Plugins von Fechter65 und des Plugin-Skeletts von Fry eine Weiterentwicklung mit Wochenschaltuhr vorgenommen. Zusätzlich gibt es noch einen "Party Schalter" um alle Zeitschaltungen ausser Kraft zu setzen.

                          Ich würde mich freuen wenn die Erweiterungen einigen hilft, Anregungen und Kritik nehme ich auch gerne entgegen.

                          Mit perl habe ich noch nicht viel Erfahrung habe mich aber vor Jahren mit Programmierung auseinandergesetzt, das ist aber wirklich lange her.

                          Nun aber zum Inhalt:

                          Zum Verstellen der Wochentage habe je Schaltpunkt 7 GA vom Typ DPT 1 genutzt.

                          Hier der Code:
                          Code:
                          #!/usr/bin/perl -w
                          #
                          ######################
                          # cv_WSchaltuhr      #
                          ######################
                          #
                          # Wiregate-Plugin
                          #
                          # (c) 2016 Arno Zietz, licensed under the GNU Public License v2 or later
                          # Auf Basis des Plugin CV-Schaltuhr von Fechter65 und dem Plugin Skelett von Fry
                          #
                          
                          
                          # Option zum einfachen Deaktivieren
                          # $plugin_info{$plugname.'_cycle'}=0; return "deaktiviert";
                          
                          # Benutzte Perl-Packages
                          # use POSIX qw(floor strftime);
                          
                          ####################
                          ###Einstellungen:###
                          ####################
                          my @Aktionen;
                          my $Status;
                          my $GATest;
                          my $Value = 0;
                          my @Tage =();
                          my $Stunde = 0;
                          my $Minute = 0;
                          my $So = 0;
                          my $Mo = 0;
                          my $Di = 0;
                          my $Mi = 0;
                          my $Do = 0;
                          my $Fr = 0;
                          my $Sa = 0;
                          my $debug = 2;
                          my $sec; #Sekunde
                          my $min; # Minute
                          my $hour; #Stunde
                          my $mday; #Monatstag
                          my $mon; #Monatsnummer
                          my $year; #Jahr
                          my $wday; #Wochentag 0-6
                          my $yday; #Tag ab 01.01.xxxx
                          my $isdst;
                          my $element;
                          my $party = 0;
                          my $party_ga = "";
                          ######################
                          ##ENDE Einstellungen##
                          ######################
                          
                          
                          # Aufrufgrund ermitteln
                          my $event=undef;
                          if (!$plugin_initflag)
                          { $event='restart'; } # Restart des daemons / Reboot
                          elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'})
                          { $event='modified'; } # Plugin modifiziert
                          elsif (%msg) { $event='bus'; } # Bustraffic
                          elsif ($fh) { $event='socket'; } # Netzwerktraffic
                          else { $event='cycle'; } # Zyklus
                          
                          # Konfigurationsfile einlesen
                          
                          &readConf();
                          
                          # Plugin-Code fuer die verschiedenen Aufrufvarianten
                          if($event=~/restart|modified/)
                          {
                              # Erster Aufruf nach Reboot, Daemon-Restart oder Plugin-Modifikation
                          
                              # Cleanup aller Variablen
                              for my $k (grep /^$plugname\_/, keys %plugin_info)
                              {
                              delete $plugin_info{$k};
                              }
                          
                              # Alle GAs abonnieren
                               foreach $element (@Aktionen) {
                                   plugin_log($plugname, "Subscribe'.$element->{GAStatus}.'.");
                                   $plugin_subscribe{$element->{GAStatus}}{$plugname} = 1;
                                   $plugin_subscribe{$element->{GAh}}{$plugname} = 1;
                                   $plugin_subscribe{$element->{GAm}}{$plugname} = 1;
                               $plugin_subscribe{$element->{GAMo}}{$plugname} = 1;
                               $plugin_subscribe{$element->{GADi}}{$plugname} = 1;
                               $plugin_subscribe{$element->{GAMi}}{$plugname} = 1;
                               $plugin_subscribe{$element->{GADo}}{$plugname} = 1;
                               $plugin_subscribe{$element->{GAFr}}{$plugname} = 1;
                               $plugin_subscribe{$element->{GASa}}{$plugname} = 1;
                               $plugin_subscribe{$element->{GASo}}{$plugname} = 1;
                               }
                          
                          
                              $plugin_info{$plugname.'_cycle'}=59;
                          
                              return 'initialisiert';
                          }
                          elsif($event=~/cycle/)
                          {
                              # Aktivitaet bei zyklischem Aufruf
                              ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
                              $year += 1900;
                              $mon += 1;
                              if($debug>=1){plugin_log($plugname, " Testzeit: ".$hour." : "."h".$min."min".$wday."d");}
                              $party = knx_read($party_ga,0);
                              if($debug>=1){plugin_log($plugname, " Party: ".$party_ga.":".$party);}
                              if ($party==1) {
                                if($debug>=1) {plugin_log($plugname, "Partymodus")};
                                return "Partymodus";}
                              else {
                                if($debug>=1) {plugin_log($plugname, "kein Partymodus")};
                              foreach my $element (@Aktionen) {
                          
                                  #Prüfen, ob Zeitpunkt für Schaltbefehl gegeben ist
                                  $Status = knx_read($element->{GAStatus},0,1);
                                  if ($Status eq '')
                                  {
                                      $Status = $plugin_info{$plugname.'_'.$element->{Name}."_Status"}
                                  }
                                  if($debug>=1){plugin_log($plugname,$element->{Name}." Status ".$Status);}
                                  if (($Status > "0"))
                                  {
                                      if($debug>=1){plugin_log($plugname,$element->{Name}." Status passiert ");}
                                        $So = knx_read($element->{GASo},0,1);
                                        $Mo = knx_read($element->{GAMo},0,1);
                                        $Di = knx_read($element->{GADi},0,1);
                                        $Mi = knx_read($element->{GAMi},0,1);
                                        $Do = knx_read($element->{GADo},0,1);
                                        $Fr = knx_read($element->{GAFr},0,1);
                                        $Sa = knx_read($element->{GASa},0,1);
                                        @Tage = ($So,$Mo,$Di,$Mi,$Do,$Fr,$Sa);
                                      if($debug>=1){plugin_log($plugname,$element->{Name}." Tage ".$So.",".$Mo.",".$Di.",".$Mi.",".$Do.",".$Fr.",".$Sa);}
                                      $Stunde = knx_read($element->{GAh},0,7.007);
                                      $Minute = knx_read($element->{GAm},0,7.006);
                                      if($debug>=1){plugin_log($plugname,$element->{Name}." Zeit ".$Stunde."h ".$Minute."min");}
                                      if (($Tage[$wday]==1) && ($hour == $Stunde) && ($min == $Minute))
                                      {
                                          plugin_log($plugname,$element->{Name}." ausgefuehrt um ".$Stunde .":"  . $Minute ." an " . $element->{GASchalten} . " mit Wert " . $element->{SchaltBefehl});
                                          knx_write($element->{GASchalten},$element->{SchaltBefehl},$element->{DPT});
                                      }
                                    }
                                 } }
                              return 'cycle';
                          }
                          elsif($event=~/bus/)
                          {
                              # Aufruf durch Bustraffic
                              return if $msg{apci} eq 'A_GroupValue_Response'; # darauf nicht reagieren
                              $GATest = $msg{'dst'};
                              $Value = $msg{'value'};
                              #geänderten Wert abspeichern, da mit er remanent wird
                              foreach my $element (@Aktionen) {
                                  if ($element->{GAm} eq $GATest)
                                  {
                                      if (!defined $Value) {
                                         # Wert muss dekodiert werden
                                         $Value = decode_dpt7($msg{'data'});
                                      }
                                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                                      $plugin_info{$plugname.'_'.$element->{Name}."_Minute"} = $Value;
                                  }
                                  if ($element->{GAh} eq $GATest)
                                  {
                                      if (!defined $Value) {
                                         # Wert muss dekodiert werden
                                         $Value = decode_dpt7($msg{'data'});
                                      }
                                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                                      $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"} = $Value;
                                  }
                                  if ($element->{GAStatus} eq $GATest)
                                  {
                                      if (!defined $Value) {
                                         # Wert muss dekodiert werden
                                         $Value = knx_read($GATest,0,$element->{DPT});
                                      }
                                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                                      $plugin_info{$plugname.'_'.$element->{Name}."_Status"} = $Value;
                                  }
                                  if ($element->{GAMo} eq $GATest)
                                  {   $Value = knx_read($GATest,0,$element->{DPT});
                                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                                      $plugin_info{$plugname.'_'.$element->{Name}."_Mo"} = $Value;
                                  }
                                  if ($element->{GADi} eq $GATest)
                                  {
                                      $Value = knx_read($GATest,0,$element->{DPT});
                                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                                      $plugin_info{$plugname.'_'.$element->{Name}."_Di"} = $Value;
                                  }
                              if ($element->{GAMi} eq $GATest)
                                  {
                                      $Value = knx_read($GATest,0,$element->{DPT});
                                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                                      $plugin_info{$plugname.'_'.$element->{Name}."_Mi"} = $Value;
                                  }
                              if ($element->{GADo} eq $GATest)
                                  {
                                      $Value = knx_read($GATest,0,$element->{DPT});
                                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                                      $plugin_info{$plugname.'_'.$element->{Name}."_Do"} = $Value;
                                  }
                              if ($element->{GAFr} eq $GATest)
                                  {
                                      $Value = knx_read($GATest,0,$element->{DPT});
                                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                                      $plugin_info{$plugname.'_'.$element->{Name}."_Fr"} = $Value;
                                  }
                              if ($element->{GASa} eq $GATest)
                                  {
                                      $Value = knx_read($GATest,0,$element->{DPT});
                                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                                      $plugin_info{$plugname.'_'.$element->{Name}."_Sa"} = $Value;
                                  }
                              if ($element->{GASo} eq $GATest)
                                  {
                                      $Value = knx_read($GATest,0,$element->{DPT});
                                      if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);}
                                      $plugin_info{$plugname.'_'.$element->{Name}."_So"} = $Value;
                                  }
                              }
                          
                          }
                          
                          return;
                          
                          #++++++++++++++++++++++++
                          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");
                                  if (($result) and ($debug>=1)){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);}
                                  }
                              }
                          } #Ende readConf
                          und die Konfigurationsdatei:
                          Code:
                          #!/usr/bin/perl
                          #
                          # CV_WSchaltuhr - Konfiguration
                          #
                          
                          $party_ga = "12/6/0";  # Wenn gesetzt werden keine Aktionen ausgeführt
                          
                          @Aktionen =
                              #Name:             Frei waehlbar, dient der Übersicht und als Protokolleintrag
                              #GASchalten:     GA, die im entsprechenden Zeitpunkt ausgeführt wird
                              #SchaltBefehl:    Wert, der an die GA Schalten übermittelt wird
                              #DPT:            Datenformat des Schaltbefehls
                              #GAStatus:        GA, welche den Status enthält; zulässige Stati: 0: nicht aktiv, 1: aktiv (muss von CV befüllt werden)
                              #GAh:            GA, welche die Stunde des Schaltzeitpunkts enthält (muss von CV befüllt werden)
                              #GAm            GA, welche die Minute des Schaltzeitpunkts enthält (muss von CV befüllt werden)
                              #GAMo - GASo    GA, welche die Wochentage enthält 1 ist gesetzt
                          
                              (
                                {Name=>'Rolladen_auf_AT', GASchalten=>'12/5/2', SchaltBefehl=>'0', DPT=>'1',
                                 GAStatus=>'12/7/3', GAh=>'12/7/0' ,GAm=>'12/7/1',GAMo=>'12/7/20',GADi=>'12/7/21',GAMi=>'12/7/22',GADo=>'12/7/23',GAFr=>'12/7/24',GASa=>'12/7/25',GASo=>'12/7/26'},
                                {Name=>'Rolladen_ab_AT', GASchalten=>'12/5/2', SchaltBefehl=>'1', DPT=>'1',
                                 GAStatus=>'12/7/7', GAh=>'12/7/4' ,GAm=>'12/7/5',GAMo=>'12/7/30',GADi=>'12/7/31',GAMi=>'12/7/32',GADo=>'12/7/33',GAFr=>'12/7/34',GASa=>'12/7/35',GASo=>'12/7/36'},
                                {Name=>'Rolladen_auf_WE', GASchalten=>'12/5/2', SchaltBefehl=>'0', DPT=>'1',
                                 GAStatus=>'12/7/11', GAh=>'12/7/8' ,GAm=>'12/7/9',GAMo=>'12/7/40',GADi=>'12/7/41',GAMi=>'12/7/42',GADo=>'12/7/43',GAFr=>'12/7/44',GASa=>'12/7/45',GASo=>'12/7/46'},
                                {Name=>'Rolladen_ab_WE', GASchalten=>'12/5/2', SchaltBefehl=>'1', DPT=>'1',
                                 GAStatus=>'12/7/15', GAh=>'12/7/12' ,GAm=>'12/7/13',GAMo=>'12/7/50',GADi=>'12/7/51',GAMi=>'12/7/52',GADo=>'12/7/53',GAFr=>'12/7/54',GASa=>'12/7/55',GASo=>'12/7/56'},
                              );
                          Hier noch der Ausschnit aus der visu_config:

                          Code:
                                   <group name="Rolläden Woche auf">
                                      <layout rowspan="4" colspan="7"/>
                                      <group name="Aktiv"  flavour="black" nowidget="true" >
                                          <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <layout colspan="1"/>
                                              <address transform="DPT:1.001" mode="readwrite">12/7/3</address>
                                            </switch>
                                      </group>
                                      <group name="Stunde"  flavour="black" nowidget="true">
                                          <layout colspan="3"/>
                                          <infotrigger format="%02s:" uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="right" change="absolute" min="0" max="23" infoposition="middle">
                                              <address transform="DPT:7.007" mode="readwrite">12/7/0</address>
                                          </infotrigger>
                                      </group>
                                      <group name="Minute"  flavour="black" nowidget="true">
                                          <layout colspan="3"/>
                                          <infotrigger format="%02s" uplabel="+" downlabel="-" upvalue="5" downvalue="-5" align="right" change="absolute" min="0" max="55" infoposition="middle">>
                                                      <address transform="DPT:7.006" mode="readwrite">12/7/1</address>
                                          </infotrigger>
                                      </group>
                                      <group name="Wochentage"  flavour="black" nowidget="true" >
                                         <layout rowspan="2" colspan="7"/>
                                      <group name="Mo"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/20</address>
                                            </switch>
                                       </group>
                                      <group name="Di"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/21</address>
                                            </switch>
                                      </group>
                                      <group name="Mi"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                          <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/22</address>
                                            </switch>
                                       </group>
                                      <group name="Do"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/23</address>
                                            </switch>
                                       </group>
                                      <group name="Fr"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/24</address>
                                            </switch>
                                       </group>
                                      <group name="Sa"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/25</address>
                                            </switch>
                                       </group>
                                        <group name="So"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/26</address>
                                            </switch>
                                       </group>
                                       </group>    
                                  </group>
                                  <group name="Rolläden Woche ab">
                                      <layout rowspan="4" colspan="7"/>
                                      <group name="Aktiv"  flavour="black" nowidget="true" >
                                          <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <layout colspan="1"/>
                                              <address transform="DPT:1.001" mode="readwrite">12/7/7</address>
                                            </switch>
                                      </group>
                                      <group name="Stunde"  flavour="black" nowidget="true">
                                          <layout colspan="3"/>
                                          <infotrigger format="%02s:" uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="right" change="absolute" min="0" max="23" infoposition="middle">
                                              <address transform="DPT:7.007" mode="readwrite">12/7/4</address>
                                          </infotrigger>
                                      </group>
                                      <group name="Minute"  flavour="black" nowidget="true">
                                          <layout colspan="3"/>
                                          <infotrigger format="%02s" uplabel="+" downlabel="-" upvalue="5" downvalue="-5" align="right" change="absolute" min="0" max="55" infoposition="middle">>
                                                      <address transform="DPT:7.006" mode="readwrite">12/7/5</address>
                                          </infotrigger>
                                      </group>
                                      <group name="Wochentage"  flavour="black" nowidget="true" >
                                         <layout rowspan="2" colspan="7"/>
                                      <group name="Mo"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/30</address>
                                            </switch>
                                       </group>
                                      <group name="Di"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/31</address>
                                            </switch>
                                      </group>
                                      <group name="Mi"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                          <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/32</address>
                                            </switch>
                                       </group>
                                      <group name="Do"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/33</address>
                                            </switch>
                                       </group>
                                      <group name="Fr"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/34</address>
                                            </switch>
                                       </group>
                                      <group name="Sa"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/35</address>
                                            </switch>
                                       </group>
                                        <group name="So"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/36</address>
                                            </switch>
                                       </group>
                                       </group>
                                  </group>
                                  <group name="Rolläden Wochenende auf">
                                      <layout rowspan="4" colspan="7"/>
                                      <group name="Aktiv"  flavour="black" nowidget="true" >
                                          <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <layout colspan="1"/>
                                              <address transform="DPT:1.001" mode="readwrite">12/7/11</address>
                                            </switch>
                                      </group>
                                      <group name="Stunde"  flavour="black" nowidget="true">
                                          <layout colspan="3"/>
                                          <infotrigger format="%02s:" uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="right" change="absolute" min="0" max="23" infoposition="middle">
                                              <address transform="DPT:7.007" mode="readwrite">12/7/8</address>
                                          </infotrigger>
                                      </group>
                                      <group name="Minute"  flavour="black" nowidget="true">
                                          <layout colspan="3"/>
                                          <infotrigger format="%02s" uplabel="+" downlabel="-" upvalue="5" downvalue="-5" align="right" change="absolute" min="0" max="55" infoposition="middle">>
                                                      <address transform="DPT:7.006" mode="readwrite">12/7/9</address>
                                          </infotrigger>
                                      </group>
                                      <group name="Wochentage"  flavour="black" nowidget="true" >
                                         <layout rowspan="2" colspan="7"/>
                                      <group name="Mo"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/40</address>
                                            </switch>
                                       </group>
                                      <group name="Di"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/41</address>
                                            </switch>
                                      </group>
                                      <group name="Mi"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                          <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/42</address>
                                            </switch>
                                       </group>
                                      <group name="Do"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/43</address>
                                            </switch>
                                       </group>
                                      <group name="Fr"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/44</address>
                                            </switch>
                                       </group>
                                      <group name="Sa"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/45</address>
                                            </switch>
                                       </group>
                                        <group name="So"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/46</address>
                                            </switch>
                                       </group>
                                       </group>
                                  </group>
                                  <group name="Rolläden Wochenende ab">
                                      <layout rowspan="4" colspan="7"/>
                                      <group name="Aktiv"  flavour="black" nowidget="true" >
                                          <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <layout colspan="1"/>
                                              <address transform="DPT:1.001" mode="readwrite">12/7/15</address>
                                            </switch>
                                      </group>
                                      <group name="Stunde"  flavour="black" nowidget="true">
                                          <layout colspan="3"/>
                                          <infotrigger format="%02s:" uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="right" change="absolute" min="0" max="23" infoposition="middle">
                                              <address transform="DPT:7.007" mode="readwrite">12/7/12</address>
                                          </infotrigger>
                                      </group>
                                      <group name="Minute"  flavour="black" nowidget="true">
                                          <layout colspan="3"/>
                                          <infotrigger format="%02s" uplabel="+" downlabel="-" upvalue="5" downvalue="-5" align="right" change="absolute" min="0" max="55" infoposition="middle">>
                                                      <address transform="DPT:7.006" mode="readwrite">12/7/13</address>
                                          </infotrigger>
                                      </group>
                                      <group name="Wochentage"  flavour="black" nowidget="true" >
                                         <layout rowspan="2" colspan="7"/>
                                      <group name="Mo"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/50</address>
                                            </switch>
                                       </group>
                                      <group name="Di"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/51</address>
                                            </switch>
                                      </group>
                                      <group name="Mi"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                          <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/52</address>
                                            </switch>
                                       </group>
                                      <group name="Do"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/53</address>
                                            </switch>
                                       </group>
                                      <group name="Fr"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/54</address>
                                            </switch>
                                       </group>
                                      <group name="Sa"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/55</address>
                                            </switch>
                                       </group>
                                        <group name="So"  flavour="black" nowidget="true">
                                            <layout colspan="1"/>
                                            <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen">
                                              <address transform="DPT:1.001" mode="readwrite">12/7/56</address>
                                            </switch>
                                       </group>
                                       </group>
                                  </group>
                          So sieht es dann in der CV aus:

                          schaltuhr.JPG


                          Kommentar


                            #14
                            Hallo amoz,

                            ich lese hier auch schon seit ein paar Jahren mit.
                            Heute habe ich mal deine Version der Zeitschaltuhr eingebaut. .... Funktioniert und macht ihren Job. Super.

                            Gruß,
                            Dennis

                            Kommentar

                            Lädt...
                            X