Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Darauf muss man erstmal kommen. Ich probiere das gleich mal aus...

    Kommentar


      Zitat von Wookie81 Beitrag anzeigen
      Hat jemand eine Erklärung für das Phänomen?
      Nicht wirklich. Ist mir mit meinen fast 200 Logiken bisher auch noch nicht aufgefallen ...

      Zitat von chriss1980 Beitrag anzeigen
      Code:
          LueftungBedarfHumidityGradientBadOG => {
              debug => 1,
              receive => '3/4/35',
              transmit => '3/3/201',
              transmit_changes_only => 1,
              translate => sub { return( $input > 2 ) ? 1 : undef }},
      Pack doch mal ein plugin_log($plugname, "LueftungBedarfHumidityGradientBadOG: input: ".$input) vor das return. Dann sieht man im Log evtl. etwas erhellendes...

      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 },
        @Fry: ich hoffe meine Änderung ist so OK und ich habe nix anderes kaputt gemacht...

        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.
          line 10:
          Code:
          	memory => { transmit=>'10/0/0' },
          Ich habe alle anderen Logiken sogar mal raus genommen. Der Fehler zeigt immer auf diese Zeile.

          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.
          
             );
          Mit diesem Minimalbeispiel heißt die Fehlermeldung natürlich
          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


            Moin Marino,
            du machst einen String auf, aber nicht wieder zu.
            Code:
            $eibd_backend_address='1.2.240[B][COLOR="Red"]'[/COLOR][/B]
            Gruß, Sebastian
            Baustelle 2.0 (Detailprogrammierung und Restarbeiten)
            Ruhri? -> Komm zum Stammtisch

            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;
              Alle 600s wird das ganze ausgeführt, aber den Wert bekomme ich bei der GA 10/0/0 leider immer noch nicht gelesen.

              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 },
                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.

                Gruß
                Andi
                Gruß
                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,
                          },
                  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.

                  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ß
                  Andi
                  Gruß
                  Andi

                  Kommentar


                    Moin Andi,
                    Versuche es mal mit dem zusätzlichen Parameter
                    execute_only_if_input_defined=>1,

                    Dann wird die Rechnung nur ausgeführt, wenn alle Werte vorliegen.

                    Gruß, Sebastian
                    Baustelle 2.0 (Detailprogrammierung und Restarbeiten)
                    Ruhri? -> Komm zum Stammtisch

                    Kommentar


                      Danke, Sebastian. Hab ich nun mal eingetragen und werde beobachten...
                      Gruß
                      Andi

                      Kommentar


                        Zitat von Marino Beitrag anzeigen
                        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
                        SVN = SubVersioN = Versionsverwaltung von Dateien: SVN ? Wikipedia
                        sourceforge ist in dem Sinne eine Art Anbieter eines öffentlichen SVN

                        VG
                        Micha

                        Kommentar


                          Zitat von tger977 Beitrag anzeigen
                          Mußt mal ein paar Einträge weiter vorne schauen nach einem WG.zip von fry.
                          Hier wäre der Eintrag #460: https://knx-user-forum.de/409984-post460.html

                          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.
                            Im Forum fand ich dann heraus, dass das ein Fehler mit Samurai ist und man den auskommentieren kann, wenn man keine SMS nutzt.
                            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 },
                            Obwohl 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 [...]"


                            Nun bekomme ich allerdings auch noch, wie auch schon zuvor nur ein:
                            Code:
                            1 initialisiert;
                            Mit ETS auslesen klappt nach wie vor nicht. Alle 60s wird der Wert vom VOC-Plugin auf den Bus geschrieben, aber lesen geht nicht.

                            Hat noch jemand nen Tipp?

                            Vielen Dank euch für die Hilfe.
                            Viele Grüße
                            Nils

                            Kommentar


                              Zitat von Marino Beitrag anzeigen
                              Obwohl 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 [...]"
                              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 anzeigen
                              Hat noch jemand nen Tipp?
                              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:
                              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


                                nur zur Sicherheit: Du hast auch in der eibga.conf oder über das webmin des WG die GA dem Wiregate korrekt mitgeteilt und den DPT korrekt gesetzt?
                                Gruß
                                Andi

                                Kommentar

                                Lädt...
                                X