Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Zitat von renzge Beitrag anzeigen
    month=>'04,10' funktioniert leider nicht
    Hi,

    versuch mal
    Code:
    month=>['04', '10']
    VG
    Micha

    Kommentar


      Moin moin,
      frohes neues Jahr Euch allen!

      Ich habe irgendwie ein Problem und vermute, dass ich Tomaten auf den Augen habe... Ich versuche mittels LP Zählerstände in RRDs zu schreiben. Gibt es ein Problem, wenn ich einen DPT 14.031 Typ verwende?

      Folgenden Config-Code verwende ich (ausschnittsweise):

      Code:
      RRD_Aussenhelligkeit => { receive=>'Aussenhelligkeit', translate=>sub{update_rrd('Aussenhelligkeit','',$input)}, debug=>1 },
      RRD_WMZ_3OG_ENERGIE => { receive=>'WMZ_3OG_ENERGIE', translate=>sub{update_rrd('WMZ_3OG_ENERGIE','',$input)}, debug=>1 },
      Die Aussenhelligkeit wird perfekt geschrieben, die Energie nicht.
      Deshalb habe ich mir noch ein eigenes Plugin geschrieben um es ohne LP auszuprobieren:

      Code:
      # Zyklisch virtuelle Werte senden
      
      # Aufrufzyklus = Heartbeat RRD
      $plugin_info{$plugname.'_cycle'} = 275;
      
      # MAIN
      update_rrd("counterWMZ_3OG_ENERGIE","","4/7/1","COUNTER",24,7);
      update_rrd("dcounterWMZ_3OG_ENERGIE","","4/7/1","COUNTER",24);
      update_rrd("hcounterWMZ_3OG_ENERGIE","","4/7/1","COUNTER",1);
      return;
      Auf der GA WMZ_3OG_ENERGIE wird tatsächlich geschrieben, das Wiregate loggte zuletzt folgendes:

      Code:
       2017-01-01 07:13:38.389,A_GroupValue_Write,1.3.38,4/7/1,45 89 FF FF,4415.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 08:03:38.249,A_GroupValue_Write,1.3.38,4/7/1,45 8A 07 FF,4416.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 08:58:37.954,A_GroupValue_Write,1.3.38,4/7/1,45 8A 0F FF,4417.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 10:08:37.549,A_GroupValue_Write,1.3.38,4/7/1,45 8A 17 FF,4418.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 11:53:37.138,A_GroupValue_Write,1.3.38,4/7/1,45 8A 1F FF,4419.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 13:33:36.619,A_GroupValue_Write,1.3.38,4/7/1,45 8A 27 FF,4420.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0 2017-01-01 15:28:35.991,A_GroupValue_Write,1.3.38,4/7/1,45 8A 2F FF,4421.9995,DPT_Value_Energy,14.031,0,low,5,T_DATA_XXX_REQ,0
      Die RRDs für den WMZ werden aber leider alle nicht geschrieben. Siehe Bild im Anhang. Bild.JPG

      Die GA ist korrekt im GA-Editor des Wiregateservers eingetragen (siehe zweites Bild im Anhang). Bild2.JPG


      Jemand einen Tipp für mich? Verzweifele so langsam daran...

      VG, Sven
      Zuletzt geändert von Robosoc; 01.01.2017, 20:25.

      Kommentar


        Habe gerade entdeckt, dass im Log folgende Warnung steht

        Code:
         
         2017-01-01 21:18:08.303,ZYKLundRRD.pl,Warning: Argument "4/7/1" isn't numeric in multiplication (*) at /usr/sbin/wiregated.pl line 1294. 2017-01-01 21:18:08.304,ZYKLundRRD.pl,Warning: Argument "4/7/1" isn't numeric in multiplication (*) at /usr/sbin/wiregated.pl line 1294. 2017-01-01 21:18:08.308,ZYKLundRRD.pl,Warning: Argument "4/7/1" isn't numeric in multiplication (*) at /usr/sbin/wiregated.pl line 1294.
        Interessanter Weise kommt die Warnung nur für das selbstgeschriebene PlugIn und nicht für den Aufruf im Logikprozessor...

        Aber was heißt das nun? Ist ein DPT 14.031 in einem RRD nicht verwendbar?

        VG,
        Sven

        Kommentar


          An den doppelten Anführungszeichen liegt es leider auch nicht. Der folgende Code hat leider auch nichts gebracht. Es kommen die gleichen Warnmeldungen bezüglich "isn't numeric"
          Code:
          update_rrd("counterWMZ_3OG_ENERGIE","",'4/7/1',"COUNTER",24,7);
          update_rrd("dcounterWMZ_3OG_ENERGIE","",'4/7/1',"COUNTER",24);
          update_rrd("hcounterWMZ_3OG_ENERGIE","",'4/7/1',"COUNTER",1);
          Auch eine Änderung mit int() hilft nicht. Z.B.:

          Code:
          update_rrd("counterWMZ_3OG_ENERGIE","",int('4/7/1'),"COUNTER",24,7);
          Mir ist natürlich klar, dass ich nicht alle drei Zeilen brauche, aber ich möchte den Unterschied verstehen und ich hoffe, dass mir die Anlage von drei RRD dabei hilft.

          Vg,
          Sven
          Zuletzt geändert von Robosoc; 02.01.2017, 08:21.

          Kommentar


            Hi,

            stimmt, "4/7/1" isn't numeric Versuch's mal mit einem knx_read - zumindest im separaten Plugin sollte das gehen. Du willst ja den Wert den der Bus liefert ins rrd schreiben, und nicht den String "4/7/1".

            Bei mir funktioniert es. Beispiel :
            Code:
            update_rrd("SollTemp_BadEG","",knx_read("3/0/18",0,9));
            VG
            Matthias


            Kommentar


              Hallo
              ich würde gerne mit dem Logikprozessor meine Kühl und Gefriergeräte überwachen und in der Visu darstellen.

              Die Geräte laufen über einen Merten Aktor mit Stromerkennung.

              vom Aktor gibt es die Rückmeldung an aus, den Stromwert, und einen Stromschwellenwert.

              Mit der Anzeige funktioniert das auch über den Schrllenwert. Problem ist hier, dass die Geräte nun nicht dauerhaft Strom ziehen. Die Geräte ziehen in den Pausen, in denen der Kompressor nicht läuft keinen Strom. Dann wird momentan Ausfall angezeigt.

              Es soll aber nur dann Fehlfunktion angezeigt weren, wenn das Gerät über einen längeren Zeitraum keinen Strom zieht.

              Ist das mit dem Logikprozessor umsetzbar?


              LG Andre

              Kommentar


                Hallo Andre,

                ich würde dazu mit diesem Beispiel aus der Logikprozessor-Config starten und z.B. fünf Minuten lang jeweils einen Wert lesen - und nur wenn alle zu niedrig sind den Fehler auslösen:

                Code:
                   # 9. Ein komplexerer Fall nur zur Demonstration: hier besteht der Status des Logikprozessors aus mehreren Werten.
                    # Es wird der Mittelwert aus letztem, vorletztem und aktuellem Wert gesendet, und zwar mit 30s Verzoegerung.
                    mittelwert => { receive=>'9/5/205',
                            transmit=>'9/5/206',
                            delay=>30,
                            state => {val1=>0, val2=>0},
                            translate => sub { my $oldest=$state->{val2};
                                       $state->{val2}=$state->{val1}; $state->{val1}=$input;
                                       return ($oldest+$state->{val2}+$input)/3; },
                    },
                Viele Grüße

                Dirk
                Baubeginn: 1676d. Sanierungsbeginn: 6/2010. Einzug: 9/2014. Fertig? Nie ;-)

                Kommentar


                  Zitat von Matze76 Beitrag anzeigen
                  stimmt, "4/7/1" isn't numeric
                  Hi Matthias,

                  sorry, für die späte Rückmeldung. Danke für Deine Antwort, aber die habe ich nicht ganz verstanden...warum ist es logisch, dass "4/7/1" nicht numerisch ist? Wenn Du die doppelten Anführungszeichen meinst, die eher auf einen String hindeuten...deshalb habe ich es ja wie oben geschrieben auch mit einfachen '4/7/1' und keinen probiert. Ein 4Byte DPT 14.031 ist doch eindeutig numerisch!

                  Und vor allem funktioniert der exakt gleiche Aufruf für Temperaturwerte DPT 14.068 Werte im LP einwandfrei...


                  Code:
                  RRD_WMZ_3OG_VORLAUFTEMP => { receive=>'WMZ_3OG_VORLAUFTEMP', translate=>sub{update_rrd('WMZ_3OG_VORLAUFTEMP','',$input)}},
                  Ich probiere Deinen Code trotzdem einmal über Nacht, aber so richtig würde ich nicht verstehen, warum es damit klappt. Dann müsste es irgendwas mit der Cachezeit zutun haben. Die Temperatur oben wird bei Änderung 5% oder so gesendet. Der Zählerwert nur alle 12h oder so.

                  VG,
                  Sven

                  Kommentar


                    Hi Sven,
                    sorry, nein, die Anführungszeichen meinte ich nicht.

                    Zumindest wenn du außerhalb des Logikprozessors mit einem eigenen Plugin arbeitest, erwartet die update_rrd Funktion den Wert, der ins rrd geschrieben werden soll (z. B. 21 [Grad]). Wenn du "4/7/1" reinsetzt, ist das erstmal einfach nur ein nicht numerischer String. Die Funktion weiß nicht dass das eine GA ist, von der gelesen werden soll. D.h. erst mit knx_read wird der Wert von deiner GA 4/7/1 gelesen, und dieser wird dann ins rrd geschrieben.

                    Die Werte, bei denen es einwandfrei funktioniert, sind das alles Werte von Wiregate/1-Wire-Sensoren?

                    VG Matthias

                    Kommentar


                      Hallo Dirk
                      Danke für deinen Tipp!

                      Leider funktioniert es nicht so wie gedacht. Vermutlich habe ich doch etwas falsch gemacht.

                      Folgenden Eintrag habe ich in die Config des Logikprozessors eingegeben:
                      # Alarm Gefriertruhe
                      complex => { receive=>'2/5/44',
                      transmit=>'10/0/102',
                      delay=>600,
                      state => {val1=>0, val2=>0},
                      translate => sub { $state->{val2}=$state->{val1}; $state->{val1}=$state->{result};
                      $state->{val2}+$state->{val1}+$input; },
                      },
                      # Alarm Kuehlschrank
                      complex => { receive=>'2/5/41',
                      transmit=>'10/0/103',
                      delay=>600,
                      state => {val1=>0, val2=>0},
                      translate => sub { $state->{val2}=$state->{val1}; $state->{val1}=$state->{result};
                      $state->{val2}+$state->{val1}+$input; },

                      Die Adresse 2/5/44 und 2/5/41 sind Stromschwellenwerte, sprich 0 oder 1.

                      ETS Stromwert1.PNGCometvisu Kühl.PNG

                      Kommentar


                        Zitat von katerina Beitrag anzeigen
                        Leider funktioniert es nicht so wie gedacht. Vermutlich habe ich doch etwas falsch gemacht.
                        Was genau funktioniert denn nicht? Der erste Fehler der mir auffällt: beide Logiken haben den Namen "complex"; Namen müssen aber eindeutig sein, sonst überschreibt die zweite Definition die erstere. Am besten nennst du die Logiken zB "AlarmKuehlschrank" und "AlarmGefriertruhe".

                        VG
                        Micha

                        Kommentar


                          Hallo zusammen
                          Weiss jemand ob man im "delay=>" eine sub eintragen kann? Ich möchte bei einer Logik die Delayzeit in abhängikeit eines Input regeln, bekomme aber immer eine Fehlermeldung. Da ich in perl nur copy/paste kann bin ich nicht sicher ob das nicht geht, oder mein code falsch ist.

                          Folgende Logik habe ich:
                          Wenn das Fenster zu lange (abhängig von temp) offen ist, kommt ein Alarm
                          Code:
                          fensteralarm_badOG => { receive=>'8/0/60', fetch=>'7/2/0', transmit=>'8/0/61', delay=> sub { '0.46667' * $input->[1] + '6' }  , translate => sub { if ($input->[0] == 1) {return "1";} else {return "cancel";} }, },
                          8/0/60 ist ein Fensterkontakt
                          8/0/61 Alarm
                          7/2/0 Aussentemp

                          Folgenden Fehler bekomme ich: (logik ist in Zeile 40)

                          Code:
                           [TABLE="class: ui_table sortable"]
                          [TR="class: mainhigh, bgcolor: #EFEFEF"]
                          [TD] [/TD]
                           			[TD]config error: Global symbol "$input" requires explicit package name at (eval 236) line 40.[/TD]
                           		[/TR]
                          [/TABLE]
                          Danke für eure Hilfe
                          Gruess Markus

                          Kommentar


                            Zitat von mmarkus Beitrag anzeigen
                            Hallo zusammen
                            Weiss jemand ob man im "delay=>" eine sub eintragen kann? Ich möchte bei einer Logik die Delayzeit in abhängikeit eines Input regeln, bekomme aber immer eine Fehlermeldung. Da ich in perl nur copy/paste kann bin ich nicht sicher ob das nicht geht, oder mein code falsch ist.
                            Ich bin nicht auf die Idee gekommen, das mal auszuprobieren, glaube aber nicht, dass sub{} ausserhalb von translate geht.

                            Ich habe Deinen Code mal kurz formatiert, damit er übersichtlicher wird, bzw die Fehlermeldungen zumindest man näher zum Fehler kommen:

                            Code:
                            fensteralarm_badOG => {
                              receive=>'8/0/60',
                              fetch=>'7/2/0',
                              transmit=>'8/0/61',
                              delay=> sub { '0.46667' * $input->[1] + '6' },
                              translate => sub {
                                if ($input->[0] == 1) {
                                  return "1";
                                } else {
                                  return "cancel";
                                }
                              },
                            },
                            IMHO sollte der Logikprozessor Dir jetzt eine Fehlermeldung auf der Delay-Zeile geben, und wenn Du die durch delay=>60, o.ä. ersetzt das ganze akzeptieren. Dann hast Du Deine Antwort

                            BTW - return "cancel"? Sollte da nicht return undef stehen?

                            Kommentar


                              Hallo johnny

                              Danke für deine Hilfe.

                              Habs soeben mit deinem code ausprobiert, er gibt die Fehlermeldung tatsächlich in der Delay Zeile.
                              Ich habs jetzt anders gelöst, die Delayzeit berechne ich in der Translate sub, und speichere sie im Hash. Bei Delay rufe ich einfach den Hash auf, scheint bis jetzt zu funktionieren.

                              Code:
                              fensteralarm_badOG => {
                                receive=>'8/0/60',
                                fetch=>'7/2/0',
                                transmit=>'8/0/61',
                              
                                translate => sub {
                                  $plugin_info{"Fenser_alarm_timer"} = ('0.46667' * $input->[1] + '6')*'60' ;
                                  if ($input->[0] == 1) {
                                    return "1";
                                  } else {
                                    return "cancel";
                                  }
                                },
                                 delay=> $plugin_info{"Fenser_alarm_timer"} , debug=>1,
                              },
                              Mit den Return "cancel" setze ich den Timer zurück, sobald das Fenster geschlossen wird.
                              Zuletzt geändert von mmarkus; 02.03.2017, 22:33.

                              Kommentar


                                Hallo,

                                benutzt jemand erfolgreich die trigger-Option mit der Möglichkeit nur auf bestimmte Werte einer GA zu reagieren?
                                Ich meine so etwas wie im Beispiel 17c: trigger=>['ga1==1', 'ga2>2', 'ga3==ANY', 'within 2min', 'all'} ,nur für eine GA.

                                Genügt dafür ein trigger=>'meineGa==1' ?

                                Ciao, PP

                                Kommentar

                                Lädt...
                                X