Darauf muss man erstmal kommen. Ich probiere das gleich mal aus...
Ankündigung
Einklappen
Keine Ankündigung bisher.
Neues Plugin: Logikprozessor.pl
Einklappen
X
-
Nicht wirklich. Ist mir mit meinen fast 200 Logiken bisher auch noch nicht aufgefallen ...Zitat von Wookie81 Beitrag anzeigenHat jemand eine Erklärung für das Phänomen?
Pack doch mal ein plugin_log($plugname, "LueftungBedarfHumidityGradientBadOG: input: ".$input) vor das return. Dann sieht man im Log evtl. etwas erhellendes...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:
@Fry: ich hoffe meine Änderung ist so OK und ich habe nix anderes kaputt gemacht...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:
line 10:Code:config error: Can't find string terminator "'" anywhere before EOF at (eval 156) line 10.
Ich habe alle anderen Logiken sogar mal raus genommen. Der Fehler zeigt immer auf diese Zeile.Code:memory => { transmit=>'10/0/0' },
Meine Minimalkonfig war diese hier:
Mit diesem Minimalbeispiel heißt die Fehlermeldung natürlichCode:#!/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:Alle 600s wird das ganze ausgeführt, aber den Wert bekomme ich bei der GA 10/0/0 leider immer noch nicht gelesen.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:
Dafür benötigt man aber glaube ich den gepatchten wiregated und den aktuellsten Logikprozessor von fry. Mußt mal ein paar Einträge weiter vorne schauen nach einem WG.zip von fry.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.
Meist funktioniert das Ganze bestens, nur ab und zu kommt eine viel zu geringe Temperatur raus. Soweit ich das sehen kann passiert das immer dann wenn durch die Logik noch für eine weitere der acht Temperaturen ein knx_read abgesetzt wird (und damit wohl kein gültiger Wert im Cache steht?!). Die Antwort auf dem Bus dauert dann etwas und anscheinend wird dann ein ungültiger Wert in die Summe eingerechnet und es kommt ein zu niedriger Mittelwert bei der Division mit 8 raus.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
-
SVN = SubVersioN = Versionsverwaltung von Dateien: SVN ? WikipediaZitat 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
-
Hier wäre der Eintrag #460: https://knx-user-forum.de/409984-post460.htmlZitat 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:
Im Forum fand ich dann heraus, dass das ein Fehler mit Samurai ist und man den auskommentieren kann, wenn man keine SMS nutzt.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:
Obwohl ich immer noch nicht genau weiß warum, da ja im Sample-Config steht: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:
Mit ETS auslesen klappt nach wie vor nicht. Alle 60s wird der Wert vom VOC-Plugin auf den Bus geschrieben, aber lesen geht nicht.Code:1 initialisiert;
Hat noch jemand nen Tipp?
Vielen Dank euch für die Hilfe.
Viele Grüße
Nils
Kommentar
-
Naja, die Sample-Config gehört noch zur "alten" Version des LP (ausm SVN) - da wird wohl nicht mehr alles zur aktuellen "gepatchten" Version passen...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 [...]"
Ich gehe mit solchen Werte folgendermaßen um: ich schreibe sie zyklisch auf den Bus. Andere Teilnehmer sollten den Wert dann entsprechend aus dem eibd-Cache bekommen: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