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:
Plugin:
Danke für eure Hilfe
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]
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); } } }
Kommentar