Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Das funktioniert bei dir so nicht, weil diese Abfrage erwartet, dass IM Hash @UG ein element mit der bezeichnung name und dem Wert NAME existiert. Du hast also bei der Zuweisung zu viel gelöscht. Diesen Teil habe ich so eingebaut um die Zustände remanent zu speichern. Bei dir fehlt aber der Wert $element->{name}.
Es müsste also weiter oben eigentlich so aussehen:
#
# Fensterstatus v0.1
#
# by JNK, 2011-09-19
my @Fenster_GA = ('7/7/7', '7/7/8');
my $Sammel_GA = '7/7/9';
# AusfUhren des Plugin
# $plugin_subscribe >> bei neUm Wert auf GA
$plugin_info{$plugname.'_cycle'} = 0;
if (($msg{'apci'} eq 'A_GroupValue_Write') && (grep {$_ eq $msg{'dst'};} @Fenster_GA)) {
# ist wirklich fuer uns
my $status = 0;
foreach my $GA (@Fenster_GA) {
if (knx_read($GA, 0, 1) == 01) {
$status = 1;
}
}
knx_write($Sammel_GA, $status, 1);
return 'Sent Value'.$status;
}
# keine Telegramme, also Init
foreach my $GA (@Fenster_GA) {
$plugin_subscribe{$GA}{$plugname} = 1;
$retval .= $GA;
}
return 'Init';
Sollte genau tun, was Du willst. Wenn eine von den Fenster_GA auf 1 wechselt, wird eine 1 gesendet. Weinn eine von den Fenster_GA auf 0 wechselt, wird eine 0 gesendet.
syntax error at (eval 398) line 35, near ") {" syntax error at (eval 398)line 44, near "}
Was will mir mein Wiregate sagen??
Du wirst nicht drum herum kommen, diese Fehlermeldungen verstehen zu lernen, was aber gar nicht so schwer ist. Die blauen Teile kannst Du für den Anfang ignorieren. Das was rot ist, sagt aber meistens recht genau, worauf es ankommt. In diesem Fall war es die Zeile 44, die es in Deinem Script aber nicht gibt/gab bzw. leer ist/war, weil es nur 43 Zeilen Code hat/te. Das bedeutet, wie zuvor ja bereits aufgeklärt wurde, das am Ende was fehlt/e. In diesem Fall die geschweifte Klammer.
Das soll nur eine Hilfe zu Selbsthilfe sein. Aber der Lernprozess ist nicht trivial: Perl kann sehr gemein sein, auch zu erfahrenen Perl-Programmierern.
Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.
Jetzt hab ich es auch gesehen. Du beschreibst die Variabel Status mit 1 und überschreibst sie wieder wenn ale GA's 0 haben. Jetzt kapier ich es auch.
Im Prinzip ist es ja nichts anderes als ein OR der Einzel-Stati. Ich bin auch kein PERL-Experte, vielleicht geht das noch einfacher.
Gruss,
der Jan
Edit: Je nachdem, wie häufig die Einzel-Stati gesendet werden, könnte man sich noch den Sammel-GA-Status vom letzten Aufruf merken und nur bei Änderung auf der Sammel-GA senden.
Nein. Das sendet ja immer eine 0, weil $status mit 0 initialisiert wird. Wenn dann
Code:
foreach my $GA (@Fenster_GA) {
if (knx_read($GA, 0, 1) == 01) {
knx_write($Sammel_GA, 1, 1); # da war ne1, senden und raus
return 'Sent Value 1';
}
}
knx_write($Sammel_GA, 0, 1); # keine 1 dabei gewesen
return 'Sent Value 0';
Aber das finde ich ehrlich gesagt weniger schön im Code.
[FONT="Courier New"]
foreach my $GA (@Fenster_GA) {
if (knx_read($GA, 0, 1) == 01) {
knx_write($Sammel_GA, 1, 1);
return 'Sent Value 1';
}
}
...
[/FONT]
In dem Moment, wo die erste '1' entdeckt wird, ist der Käse doch gegessen. return findet ja nicht statt, wenn keine '1' gefunden wurde. Dann wird der Code ausgeführt, der nach dem Loop kommt (hier durch die drei Punkte ersetzt). Da kann man dann zurücksetzen, was zurückzusetzen ist. So hat Jan das im seinem letzten Beispiel ja auch gemacht.
Es ist ja nicht sinnvoll, die Schleife weiter zu durchlaufen, wenn man bereits ein offenes Fenster entdeckt hat.
PS: Und eben erst sehe ich, dass es exakt der gleiche Code ist.
Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.
Ich habs nochmal geändert auf "Nur senden, wenn Status geändert" und "auf/zu" kann zwischen 0 und 1 frei gewählt werden.
@emax: auf last; war ich dann auch gekommen.
@makki: commit?
Code:
#
# Fensterstatus v0.2
#
# by JNK, 2011-09-19
my @Fenster_GA = ('7/7/7', '7/7/8'); # hier alle Fenster-Einzel-GA
my $Sammel_GA = '7/7/9'; # hier die Sammel-GA
my $zustand_geschlossen = 01; # auf richtige polarität achten!
my $zustand_offen = 00;
# Flossen weg, der Rest geht automatisch
$plugin_info{$plugname.'_cycle'} = 0; # nur bei Telegramm aufrufen
if (($msg{'apci'} eq 'A_GroupValue_Write') && (grep {$_ eq $msg{'dst'};} @Fenster_GA)) {
# Telegramm auf einer Einzel-GA erhalten
my $status = $zustand_geschlossen; # mit geschlossen anfangen
my $old_status = $plugin_info{$plugname.'_oldstatus'};
foreach my $GA (@Fenster_GA) {
if (knx_read($GA, 0, 1) == $zustand_offen) { # da war eine 'offen', also Status auf 1 setzen
$status = $zustand_offen;
last;
}
}
if ($old_status != $status){ #
knx_write($Sammel_GA, $status, 1); # Status hat sich geaendert, senden
$plugin_info{$plugname.'_oldstatus'} = $status; # neuen Status speichern
}
return 'Sent Value'.$status;
}
# keine Telegramme, also Init
foreach my $GA (@Fenster_GA) { # an allen Fenster-Einzel-GA anmelden
$plugin_subscribe{$GA}{$plugname} = 1;
}
# bis zum Beweis des Gegenteils sind alle Fenster zu
$plugin_info{$plugname.'_oldstatus'} = $zustand_geschlossen;
return 'Init';
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar