Ankündigung

Einklappen
Keine Ankündigung bisher.

Wiregate Plugin 1 Bit zu 8 Bit

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Wiregate Plugin 1 Bit zu 8 Bit

    Hallo Kollegen

    Leider fehlt mir Momentan etwas der Ansatz und auch die nötigen Kenntnisse. Ich suche eine Möglichkeit mit einem 1 Bit Schaltbefehl mehrere GA's mit 8 Bit Werten zu befeuern. Hintergrund ist folgender:
    Mein KNX DMX Gateway von Elka ist leider nicht in der Lage vordefinierte Szenen per Taster anzusteuern. Ich möchte aber nicht immer an der Visu per Colorchooser eine Lichtstimmung auswählen, sondern per Tastendruck "Szenen" abrufen.
    Somit kam mir die Idee mit Hilfe des Nachdimmen-Plugins oder Logikprozessor etwas zu machen.

    Ohne Code-Schnipsel bin ich aber etwas auf verlorenem Posten

    Untenstehender Versuch funtioniert zwar, aber ich möchte ja auf mehrere GA's verschiedene Werte senden.

    Kann ich die Code-Zeile verschachteln, oder muss ich für jeden Wert eine neue Zeile machen?
    Wenn ja? Wie?

    Ein weiter Schönheitsfehler ist, die Nicht benötigte Tag/Nacht Umschaltung.

    config:
    Code:
    # [BOF /etc/wiregate/plugin/generic/conf.d/nachdimmen_extern.conf]
    
    ### Definitionen 
    
    # Im Debug-Modus werden einige Werte in die Plugin-Logdatei geschrieben
    $debug = 0;
    
    ### Hier werden die Werte/Gruppenadressen definiert
    # id:        ID fürs Speichern der dynamischen Werte (Tag/Nacht)
    # name:      Name zur Ausgabe der Debug-Meldungen
    # gaEin:     Gruppenadresse Licht Ein/Aus
    # valueEin:  Wert für Ein
    # gaDimm:    Gruppenadresse Licht Dimmwert
    # valueDimm: Dimmwert
    # dptDimm:   DPT gaDimm
    # gaNacht:   GA zum ein-/ausschalten der Nachdimm-Funktion
    # nachtEin:  Wert, der auf gaNacht gesendet werden muss, damit die Nachdimm-Funktion aktiviert wird
    # nachtAus:  Wert, der auf gaNacht gesendet werden muss, damit die Nachdimm-Funktion deaktiviert wird
    # dptNacht:  DPT gaNacht
    # tagNact:   Licht ist gerade im Tag-, oder Nacht-Modus
    push @gt_lichter, { id => "Watch_TV_1", name => "Watch_TV_1", gaEin => "0/2/23", valueEin => 1, gaDimm => "2/3/26", valueDimm => "36", dptDimm => "5.001", gaNacht => "2/4/1", nachtEin => "1", nachtAus => "0", dptNacht => "1", tagNacht => TAG };
    
    ### Ende Definitionen
    
    # [EOF /etc/wiregate/plugin/generic/conf.d/nachdimmen_extern.conf]
    Plugin:
    Code:
    #############################################################################
    # Licht nachts nach dem einschalten auf einen definierten Dimmwert stellen
    # V1.0 2012-08-21
    # Copyright: Marcus Lichtenberger (marcus@lichtenbergers.at)
    # License: GPL (v3)
    #
    #############################################################################
    #
    # Wenn nachts ein Licht eingeschaltet wird das hier definiert wurde,
    # soll es nur auf einen bestimmten Dimmwert gefahren werden.
    # Das heißt, es wird sofort nach dem Einschalt-Telegramm ein Dimmwert-Telegramm
    # nachgeschickt, das den Einschaltvorgang beim Dimmwert beendet.
    # Ob es Nacht ist, oder nicht, kann mittels einer externen GA für jedes
    # Licht einzeln definiert werden.
    #
    #############################################################################
    #
    # Änderungshistorie:
    # 20120821 - mclb - Erstellung des Plugins
    # 20121009 - mclb - Es kann nun auf beliebige Werte getriggert werden.
    #                   Z.B. bei Szene Nr. 5 die Lichter nachdimmen.
    #
    #############################################################################
    #
    # Offene Punkte:
    # - dzt. keine bekannt
    #
    #############################################################################
    #
    # Abhängigkeiten:
    # - Time::Local
    #
    #############################################################################
    #
    # plugin_info-Werte
    # - nachtEin: Hier wird für jedes Licht hinterlegt, ob für dieses Licht Tag oder Nacht ist
    #
    #############################################################################
    
    # Konstanten
    use constant TAG => 'T';
    use constant NACHT => 'N';
    # Konstanten für Aufrufart
    use constant EVENT_RESTART => 'restart';
    use constant EVENT_MODIFIED => 'modified';
    use constant EVENT_BUS => 'bus';
    use constant EVENT_SOCKET => 'socket';
    use constant EVENT_CYCLE => 'cycle';
    # Konstanten für die Trennung der dynamischen Freigabe-Werte
    use constant SEPARATOR1 => ';';
    use constant SEPARATOR2 => '->';
    
    ### Variablen Einlesen/Deklarieren
    
    use Time::Local;
    my ($sec, $min, $hour, $day, $mon, $year, $wday, $yday) = localtime();
    my $now = sprintf ("%02d:%02d",$hour,$min);
    my ($sh,$sm,$eh,$em);
    my ($su, $eu, $time);
    my $debug = 0;
    my $gs_licht;
    my @gt_lichter;
    my $gv_freigabe_dyn;
    my @gt_freigabe_dyn;
    my $gv_index;
    my ($gv_id, $gv_tagNacht);
    my $gv_valueEin;
    &readConf;
    
    # Kein zyklischer Aufruf, wird nur aktiv bei entsprechendem Telegramm
    $plugin_info{$plugname.'_cycle'} = 0;
    
    # Plugin an Gruppenadresse "anmelden"
    foreach my $gs_licht (@gt_lichter) {
     $plugin_subscribe{$gs_licht->{gaEin}}{$plugname} = 1;
     $plugin_subscribe{$gs_licht->{gaNacht}}{$plugname} = 1;
    }
    
    # Dynamische Werte aus plugin_info lesen.
    @gt_freigabe_dyn = split(SEPARATOR1, $plugin_info{$plugname.'_gt_freigabe_dyn'});
    foreach $gv_freigabe_dyn (@gt_freigabe_dyn) {
     ($gv_id, $gv_tagNacht) = split(SEPARATOR2, $gv_freigabe_dyn);
    
     # Wegen Update auf gt_lichter hier eine for-Schleife
     for ($gv_index=0; $gv_index<@gt_lichter; $gv_index++) {
      $gs_licht = $gt_lichter[$gv_index];
      if ($gs_licht->{id} eq $gv_id) {
       $gs_licht->{tagNacht} = $gv_tagNacht;
       $gt_lichter[$gv_index] = $gs_licht;
       last();
      }
     }
    }
    
    # Aus welchem Grund läuft das Plugin gerade
    my $gv_event=undef;
    if (!$plugin_initflag) {
     $gv_event = EVENT_RESTART;           # Restart des daemons / Reboot
    } elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'}) {
     $gv_event = EVENT_MODIFIED;          # Plugin modifiziert
    } elsif (%msg) {
     $gv_event = EVENT_BUS;               # Bustraffic
    } elsif ($fh) {
     $gv_event = EVENT_SOCKET;            # Netzwerktraffic
    } else {
     $gv_event = EVENT_CYCLE;             # Zyklus
    }
    
    # Abarbeiten der Telegramme
    if ($gv_event eq EVENT_BUS) {
     # Wegen Update auf gt_lichter hier eine for-Schleife
     for ($gv_index=0; $gv_index<@gt_lichter; $gv_index++) {
      $gs_licht = $gt_lichter[$gv_index];
    
      if ($debug == 1) { plugin_log($plugname, "1: ".$msg{'dst'}.", ".$gs_licht->{gaEin}.", ".$msg{'value'}); }
    
      if (exists $gs_licht->{valueEin}) {
       $gv_valueEin = $gs_licht->{valueEin};
      } else {
       $gv_valueEin = 1;
      }
    
      if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gs_licht->{gaEin} and $msg{'value'} == $gv_valueEin) {
       plugin_log($plugname, "2: ".$gs_licht->{tagNacht});
       # Abarbeiten der Telegramme auf gaEin
       if ($gs_licht->{tagNacht} eq NACHT) {
        knx_write($gs_licht->{gaDimm}, $gs_licht->{valueDimm}, $gs_licht->{dptDimm});
        if ($debug == 1) { plugin_log($plugname,"$gs_licht->{name} gedimmt auf $gs_licht->{valueDimm}% um $now Uhr ($gs_licht->{dptDimm})"); }
       }
      } elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gs_licht->{gaNacht}) {
       # Abarbeiten der Telegramme auf gaNacht
       if ($msg{'value'} == $gs_licht->{nachtEin}) {
        $gs_licht->{tagNacht} = NACHT;
       } elsif ($msg{'value'} == $gs_licht->{nachtAus}) {
        $gs_licht->{tagNacht} = TAG;
       }
      }
    
      $gt_lichter[$gv_index] = $gs_licht;
     }
    }
    
    # Dynamische Werte nach plugin_info schreiben
    @gt_freigabe_dyn = ();
    foreach $gs_licht (@gt_lichter) {
     unshift(@gt_freigabe_dyn, join(SEPARATOR2, $gs_licht->{id}, $gs_licht->{tagNacht}));
    }
    $gv_freigabe_dyn = join(SEPARATOR1, @gt_freigabe_dyn);
    $plugin_info{$plugname.'_gt_freigabe_dyn'} = $gv_freigabe_dyn;
    
    return;
    
    ### READ CONF ###
    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 {
      #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, "ERR: conf file [$confFile] returned:");
       my @parts = split(/\n/, $@);
       plugin_log($plugname, "--> $_") foreach (@parts);
      }
     }
    }
    Danke für eure Hilfe

    #2
    Denke das würde sich mit dem Logikprozessor leicht machen lassen. zB mit followup (ungetestet)

    Code:
    szene1start => { trigger=>'1/1/1==1',transmit=>'1/1/2',translate => 100 , followup=>{'szene1licht2'=>1},debug=>1  },
    szene1licht2 => { transmit=>'1/1/3',translate => 234 , followup=>{'szene1licht3'=>1},debug=>1  },
    szene1licht3 => { transmit=>'1/1/3',translate => 55 ,debug=>1  },
    Bei bedarf die mittlere Logik wiederholen und werte anpassen.


    Gruess und viel spass

    markus

    Kommentar


      #3
      Hoi Markus

      Funktioniert wunderbar. Hab mir schon gedacht, dass das einfacher geht. Wusste nur nicht wie.

      Vielen Dank

      Kommentar

      Lädt...
      X