Darauf muss man erstmal kommen. Ich probiere das gleich mal aus...
Ankündigung
Einklappen
Keine Ankündigung bisher.
Neues Plugin: Logikprozessor.pl
Einklappen
X
-
Zitat von Wookie81 Beitrag anzeigenHat jemand eine Erklärung für das Phänomen?
Zitat von chriss1980 Beitrag anzeigenCode:LueftungBedarfHumidityGradientBadOG => { debug => 1, receive => '3/4/35', transmit => '3/3/201', transmit_changes_only => 1, translate => sub { return( $input > 2 ) ? 1 : undef }},
VG
Micha
Kommentar
-
Bugfix / neues Feature
Hallo zusammen,
ich weiß nicht, ob ich alleine mit diesem Problem war/bin, aber ich hatte immer wieder mal ungewolltes Auslösen einer Logik. Nach etwas Recherche merkte ich, dass diese immer nach einem Restart des wiregated auftraten. Betroffen waren Logiken die ich ausführen lasse wenn sich Werte ändern (um zB ein RSS Log zu füllen wenn das Garagentor auf/zu geht). Ursache dafür ist, dass die Logiken mit "execute_on_input_changes_only" ausgeführt werden - und nach einem Restart sind die Vergleichswerte "undefined" - und damit auf jeden Fall anders als die aktuellen Werte => die Logik wird ausgeführt. Und das obwohl sich (wahrscheinlich) nichts geändert hat.
Das hat mich etwas genervt und ich habe das versucht zu beheben. Dazu habe ich eine weitere Option hinzugefügt: "execute_on_input_changes_and_previous_state_is_ca ched_only" (ja, ich weiß, ein sehr langer Name - hat jmd eine bessere Idee?). Diese kann statt "execute_on_input_changes_only" benutzt werden und führt dazu, dass die Logik nur ausgeführt wird, wenn die Vergleichswerte aus dem vorherigen Durchlauf der Logik bereits definiert (also im lokalen Cache "$plugin_cache{$plugname}{inputcache}") vorhanden sind.
So sieht dann meine Logik aus:
Code:raffstoreWetterstationTagNachtUmschaltung => { receive=>'1/2/3', execute_on_input_changes_and_previous_state_is_cached_only=>1, translate=>sub{ addRssLog(content=>'Wetterstation Tag-Nacht-Umschaltung: '.($input ? 'Tag' : 'Nacht'), tags=>'raffstores, automatik', debug=>0); }, debug=>0 },
VG
Micha
PS: Achtung, ich habe den ursprünglichen Post geändert da ich den Fix noch etwas angepasst habe...
Hier ist der Patch für den Logikprozessor (Basis: Frys letzte Version, die den gepatchen wiregated.pl benötigt):
Code:@@ -163,7 +163,7 @@ if($event=~/restart|modified/ || $config_modified || !defined $plugin_cache{$plu my @keywords=qw(receive fetch trigger transmit translate debug delay timer prowl eibd_cache reply_to_read_requests ignore_read_requests transmit_only_on_request recalc_on_request state transmit_changes_only - execute_on_input_changes_only cool rrd transmit_on_startup followup prowl execute_only_if_input_defined); + execute_on_input_changes_only cool rrd transmit_on_startup followup prowl execute_only_if_input_defined execute_on_input_changes_and_previous_state_is_cached_only); my $keywords="(".join("|",@keywords).")"; for my $k (keys %{$logic{$t}}) @@ -1419,13 +1419,17 @@ sub execute_logic } # ab hier liegt $input komplett vor. Ggf testen, ob Inhalte sich gaendert haben - if($logic->{$t}{execute_on_input_changes_only}) + if($logic->{$t}{execute_on_input_changes_only} || $logic->{$t}{execute_on_input_changes_and_previous_state_is_cached_only}) { my $inputstr=((!ref $receive) ? $input : join(";", @{$input})).";"; if(defined $plugin_cache{$plugname}{inputcache}{$t}) { return undef if $plugin_cache{$plugname}{inputcache}{$t} eq $inputstr; + } elsif($logic->{$t}{execute_on_input_changes_and_previous_state_is_cached_only}) + { + $plugin_cache{$plugname}{inputcache}{$t}=$inputstr; + return undef; } $plugin_cache{$plugname}{inputcache}{$t}=$inputstr;
Kommentar
-
Hi,
ich bin momentan am probieren, den Wert vom VOC auslesen zu können. Momentan schreibt er ja alle 60s via Plugin auf eine GA. Das klappt auch. Der Wert kommt, aber ich muss ihn abfragen können, um ein Diagramm im Gira HS zu erstellen (genauer gesagt, ein Archiv).
Dazu dachte ich, ich könnte einfach schnell die Memory-Funktion nutzen.
Also habe ich den Logikprozessor hinzugefügt und die config auch eingefügt.
Ich habe nur 3 Sachen gemacht.
1. Oben die GA des Wiregate (TP-UART) eingetragen.
2. apikey von Prowl eingetragen, da ich ihn gerade zur Hand hatte
3. Memory programmiert. Ich habe einfach nur die entsprechende GA reingeschrieben, auf dem der VOC schreibt.
Ich bekomme die folgende Fehlermeldung:
Code:config error: Can't find string terminator "'" anywhere before EOF at (eval 156) line 10.
Code:memory => { transmit=>'10/0/0' },
Meine Minimalkonfig war diese hier:
Code:#!/usr/bin/perl # # Logikprozessor.pl - Konfiguration # $eibd_backend_address='1.2.240; # eigene Adresse zur Vermeidung von Zirkellogiken, ist oft auch '1.1.254' # Zentrale Einstellungen, insb. fuer die Prowl Mechanik, s. u.. %settings=( prowl => { apikey => "HIER STAND MEIN APIKEY", application => 'WireGate KNX', priority => 0, event => '[unbenanntes Ereignis]', description => '', url => '' } ); %logic=( # 4. Memory-Funktion. Fuer KNX-Geraete, die kein Auslesen ihres Statuswerts zulassen (z.B. MDT DaliControl # bei Einzel-EVG-Ansteuerung). Sehr einfach: memory => { transmit=>'10/0/0' }, # Hier wird folgende Eigenschaft der Logik ausgenutzt: Wenn ein Write-Telegramm auf die Transmit-Adresse kommt, # speichert der Logikprozessor den Wert immer automatisch ab. Eine Leseanfrage auf der transmit-GA hingegen wird # immer mit dem letzten Wert (hier also dem gespeicherten) beantwortet. Eine receive-Adresse oder translate-Logik # werden hier gar nicht gebraucht. );
Code:config error: Can't find string terminator "'" anywhere before EOF at (eval 186) line 23.
EIB-Adresse der lokalen Schnittstelle: 1.2.240 (im Wiregate)
(Daher habe ich diese eingetragen. So hatte ich es verstanden)
GA 10/0/0: Auf diese GA wird vom VOC der ppm-Wert geschrieben, den ich im Gruppenmonitor in ETS alle 60s sehen kann, aber nicht abfragen kann.
Vielleicht weiß ja jemand etwas damit anzufangen, ich leider nicht. Ich würde mich über einen Tipp freuen.
Viele Grüße
Nils
EDIT:
Den Logikprozessor habe ich aus dem sourceforge. Ich habe keine Ahnung, was SVN hier immer bedeutet und es auch nicht herausgefunden. sourceforge.net wäre in meinen Augen eher SFN?!? Vielleicht klärt mich auch hier jemand auf
Kommentar
-
Hallo Sebastian,
Oh man. Bei der Fehlermeldung habe ich die ganze Zeit bei der Zeile gesucht und da stand ja auch ein String. Oben wäre mir das nie aufgefallen.
Nun bekomme ich keine Fehlermeldung mehr, sondern ein:Code:1 initialisiert;
Sind die 600s die Zeit, wenn keine Änderung erfolgt?
Und hast Du zufällig noch einen Tipp, ob ich noch etwas falsch gemacht habe, um endlich den Wert von GA 10/0/0 auslesen zu können?
Viele Grüße
Nils
Kommentar
-
Hallo Nils,
Um ein Antworttelegramm vom Logikprozessor zu bekommen mußt Du noch reply_to_read_requests verwenden.
Ich habe das z.B. für die Heizungssollwerte so gemacht:
Code:HeizenSollwertKomfortUGGarderobeFBH => { transmit=>'2/2/0', reply_to_read_requests=>1 },
Gruß
AndiGruß
Andi
Kommentar
-
Wie knx_read bei mehreren receive Adressen in einer Logik vermeiden?
Hallo,
versuche nun schon länger eine mittlere Raumtemperatur zu berechnen. Die Temperatur GA werden alle durch am WG angeschlossene 1w Sensoren beschrieben.
Code:MittlereRaumtemperatur => { receive=>['7/0/2','7/0/3','7/0/5','7/0/6','7/0/7','7/0/8','7/0/10','7/0/12'], transmit=>['7/7/10'], translate=>sub { my $sum = $input->[0]+$input->[1]+$input->[2]+$input->[3]+$input->[4]+$input->[5]+$input->[6]+$input->[7]; return $sum/8; }, reply_to_read_requests=>1, debug=>1, },
Was könnte ich machen um die Werte immer ohne knx_read direkt verfügbar zu haben? Die 1w Temperaturen habe ich schon auf zyklisches Senden alle 300s stehen, daher dachte ich daß im eibd die Werte immer aktuell sind und ohne knx_read erst gelesen werden müssen.
Hat jemand einen Tip für mich?
Gruß
AndiGruß
Andi
Kommentar
-
Zitat von Marino Beitrag anzeigenEDIT:
Den Logikprozessor habe ich aus dem sourceforge. Ich habe keine Ahnung, was SVN hier immer bedeutet und es auch nicht herausgefunden. sourceforge.net wäre in meinen Augen eher SFN?!? Vielleicht klärt mich auch hier jemand auf
sourceforge ist in dem Sinne eine Art Anbieter eines öffentlichen SVN
VG
Micha
Kommentar
-
Zitat von tger977 Beitrag anzeigenMußt mal ein paar Einträge weiter vorne schauen nach einem WG.zip von fry.
VG
Micha
Kommentar
-
Moin,
die WG hatte ich gefunden.
Die dort enthaltene wiregated habe ich genutzt und den Logikprozessor.
Anschließend hatte ich den Fehler:
Code:Can't locate Frontier/Client.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at (eval 106) line 1647. BEGIN failed--compilation aborted at (eval 106) line 1647.
Gesagt, getan... Fehlermeldung weg.
Dann habe ich es so probiert, wie Andi oben schrieb:
Code:HeizenSollwertKomfortUGGarderobeFBH => { transmit=>'2/2/0', reply_to_read_requests=>1 },
"[...] Eine Leseanfrage auf der transmit-GA hingegen wird immer mit dem letzten Wert (hier also dem gespeicherten) beantwortet [...]"
Nun bekomme ich allerdings auch noch, wie auch schon zuvor nur ein:
Code:1 initialisiert;
Hat noch jemand nen Tipp?
Vielen Dank euch für die Hilfe.
Viele Grüße
Nils
Kommentar
-
Zitat von Marino Beitrag anzeigenObwohl ich immer noch nicht genau weiß warum, da ja im Sample-Config steht:
"[...] Eine Leseanfrage auf der transmit-GA hingegen wird immer mit dem letzten Wert (hier also dem gespeicherten) beantwortet [...]"
Zitat von Marino Beitrag anzeigenHat noch jemand nen Tipp?
memoryGa => { receive=>'1/1/2', transmit=>'1/1/2', reply_to_read_requests=>1, translate=>sub{return $input}, delay=>300, debug=>0},
VG
Micha
Kommentar
Kommentar