Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Habe hier ein Problem mit einer Routine. Und zwar soll eine Sprachansage generiert werden (sende 1 auf Transmitadresse), wenn einer der Kanäle im Heizungsaktor eine 1 für Fehler meldet.

    Das sieht dann so aus:

    Code:
    ####Warnmeldung Heizung
    heatingWarning => { receive=>['6/4/1','6/4/2','6/4/3','6/4/4','6/4/101','6/4/102','6/4/103','6/4/104','6/4/201','6/4/202','6/4/203','6/4/204','6/4/205','6/4/206','6/4/207','6/4/208','6/4/251','6/4/252','6/4/253'],
    transmit=>'15/0/50',
    translate => sub { if(defined $input && int($input) > 0) { 1; } else {return undef;}},
    debug=>1},
    Wenn nun aber auf recieve-Adressen eine 0 gesendet wird, wird trotzdem auf die Transmitadresse eine 1 gesendet und die Sprachmeldung ausgelöst. Ich will aber, dass dieses nur auf die Transmitadresse gesendet, wenn die Recieve-Adresse eine 1 erhält, bei 0 soll nichts passieren. Ich versteh nicht, warum obiger Code nicht funktioniert. Hier der Auszug vom Debug

    Code:
    Logikprozessor.pl,1.1.254 6/4/252:0 -> $logic{heatingWarning}{receive}(Logik) -> 15/0/50:1

    Kommentar


      Mach es mit einer Logik pro GA.
      Folgenden Code direkt im Config-File aber UNTERHALB von %logic=(...); einfügen:

      Code:
      ####Warnmeldung Heizung 
      for my $ga ('6/4/1', '6/4/2','6/4/3','6/4/4','6/4/101','6/4/102','6/4/103','6/4/104','6/4/201','6/4/202','6/4/203','6/4/204','6/4/205','6/4/206','6/4/207','6/4/208','6/4/251','6/4/252','6/4/253')
      {
            $logic{'heatingWarning_'.$ga} = { 
               receive=>$ga, transmit=>'15/0/50', 
          translate => sub { return int($input) > 0 ? 1: undef; },
            };
      }
      Eleganter und effizienter. Deine Logikdefinition würde bei einem Telegramm auf einer der Receive-Adressen erstmal alle anderen receive-Adresse abfragen und daraus ein Input-Array bauen. Der translate-Code würde korrekt auch viel länger.

      VG, Fry

      Kommentar


        Zitat von Fry Beitrag anzeigen
        Mach es mit einer Logik pro GA.
        Folgenden Code direkt im Config-File aber UNTERHALB von %logic=(...); einfügen:

        Code:
        ####Warnmeldung Heizung 
        for my $ga ('6/4/1', '6/4/2','6/4/3','6/4/4','6/4/101','6/4/102','6/4/103','6/4/104','6/4/201','6/4/202','6/4/203','6/4/204','6/4/205','6/4/206','6/4/207','6/4/208','6/4/251','6/4/252','6/4/253')
        {
              $logic{'heatingWarning_'.$ga} = { 
                 receive=>$ga, transmit=>'15/0/50', 
            translate => sub { return int($input) > 0 ? 1: undef; },
              };
        }
        Eleganter und effizienter. [...]

        VG, Fry
        So eine Struktur scheint mir sehr praktisch, ich habe viele duplizierte Logiken. Dazu frage ich mich, ob man der for-Schleife auch GA-Paare für receive und transmit übergeben könnte? Wenn ja, wie?
        Beste Grüße, Dirk

        ________________________________________
        Haus ist fertig - KNX wird's nie werden ;-)

        Kommentar


          Hi Fry, vielen Dank, das funktioniert. Ich habe einen grossen Server, auf dem das Mutlifunktionsgateway läuft. Nun habe ich folgende Logik:

          Code:
             #Muellabfuhr/Entsorgung -> Medlung, falls nicht rausgestellt
               restmuell => { fetch=>'8/3/4', transmit=>'15/0/5', 
                                 timer=>{ time=>['11:30+5m-22:30']},
                               #translate => sub { if(defined $input && int($input) > 1) { 1; } else {return undef;}},
                               translate => sub { return int($input) > 0 ? 1: undef; },
                               debug=>1},
          Laut Log funktionierts auch beim ersten Aufruf, der zweite Aufruf wären um 16:25, zeigt er im Log auch an, allerdings wird hier schon kein Sound mehr abgespielt. Der Timer bleibt dann bei 16:25 stehen. Hab ich wieder was falsch gemacht ?

          Code:
          2013-11-08 16:18:22.903,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'restmuell' um 16:20.
          
          2013-11-08 16:20:23.781,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'restmuell' um 16:25.
          
          2013-11-08 16:20:23.781,Logikprozessor.pl,$logic{restmuell}{transmit}(Logik) -> 15/0/5:1 gesendet (Timer);  ,0s,
          
          2013-11-08 16:20:23.784,mpd_Player_6003.pl,Cycle retvalue,0s,
          
          2013-11-08 16:20:25.450,Ansagen.pl,speak lfd_radio -> 1 ->  /etc/init.d/mpd8 restart; export MPD_HOST=192.168.2.111; export MPD_PORT=6608; /usr/bin/mpc add "Ansagen/Beep/03.wav" "Ansagen/Ereignisse/Restmuelltonne.wav" "Ansagen/silence.wav" 
          2013-11-08 16:20:25.978,Ansagen.pl,paging:03 Restmuelltonne silence,2.1s,
          Allerdings dann hört der Timer auf und es tut sich nichts mehr. Kann es sein, dass sich der Logigprozessor aufhängt ?

          Er aktualisiert zumindest den Wert nicht mehr:

          Logikprozessor.pl__restmuell_timer1383924623.78195

          Macht es Sinn, die kompilierte Version zu nutzen, um sicher zu gehen, dass der Logikprozessort nicht abstürzt?

          Kommentar


            Da scheint einfach deine Receive-Adresse nicht auf knx_read zu antworten. Versuche es ggf mit der Option
            Code:
            eibd_cache=>10000,
            oder so.
            VG, Fry

            PS. Ja, kompilieren ist auf jeden Fall gut.

            Kommentar


              Zitat von Fry Beitrag anzeigen
              Code:
              myrrd => { receive=>'1/2/3', translate=>sub{update_rrd('myrrd','',$input)} },
              Hallo Fry,

              an dieser Stelle erstmal ein großes Dankeschön für den Logikprozessor und den ganzen anderen Aufwand rund um das WG! Damit macht die ganze Geschichte gleich noch viel mehr Spaß!!

              Nun zur Problemstellung: ich habe, wie du oben beschrieben hast, eine GA dessen Werte in ein rrd geschrieben werden. Die Werte kommen minütlich, aber es wird ja nur alle 5min ein Wert in das rrd geschrieben. Zumindest zeigt die entsprechende Grafik dies so an. Nun die Fragen:
              - Welcher Wert wird alle 5min ins rrd geschrieben?
              -- Mittelwert aller empfangenen Werte der letzten 5min?
              -- der letzte Wert auf der GA?
              - wie kann ich einstellen, dass für dieses eine rrd eine höhere "Auflösung" benutzt werden soll?

              Danke und VG
              Micha
              Angehängte Dateien

              Kommentar


                rrd mittelt die Werte: RRDtool - rrdcreate

                Zur zweiten Frage:
                Wenn du ein rrd-File mit rrdcreate und kürzeren Steps (z.B.1 Minute) anlegst und dann darein schreibst, hättest du eine höhere Auflösung.
                KNX: MDT, Gira TS3, Berker, Theben, PEAR, Preussen BWM, B.E.G., BMS Quadra, WireGate, Timberwolf 2500 | Baublog

                Kommentar


                  @dombn: danke fürs Antworten, ich hätte die Antwort übrigens gar nicht gewusst.
                  @mivola: in der neuesten Version des Logikprozessors reicht übrigens
                  myrrd => { receive=>'1/2/3', rrd=>'myrrd' },Macht genau das Gleiche!
                  VG, Fry

                  Kommentar


                    Zitat von dombn Beitrag anzeigen
                    rrd mittelt die Werte: RRDtool - rrdcreate

                    Zur zweiten Frage:
                    Wenn du ein rrd-File mit rrdcreate und kürzeren Steps (z.B.1 Minute) anlegst und dann darein schreibst, hättest du eine höhere Auflösung.
                    Danke für die schnelle Antwort und den Link! Allerdings habe ich es nicht hinbekommen ein passendes rrd für die Windgeschwindigkeit und Step=1min anzulegen. Kann mir da jmd nachhelfen?

                    Danke!
                    Micha

                    Kommentar


                      Ich hab mir mal vor einiger Zeit was in Excel gebastelt um meine RRD's zu konfigurieren. Sollte halbwegs selbsterklärend sein, auch wenn's eigentlich nur als Hilfe für mich gedacht war.
                      Der erste Reiter ist als überblick gedacht, wie groß ein RRD wird wenn man welche RRA's in welcher Auflösung reinpackt.
                      Der zweite Reiter ist zum zusammenstellen der Syntax für die Konsole. Die Parameter kann man oben ändern und dann den Befehl unten direkt in die Konsole einfügen (ich bin immer den Umweg über nen Texteditor gegangen, keine Ahnung ob das mit den Zellenumbrüchen auch direkt aus Excel funktioniert. Denke aber schon).

                      Hoffe das hilft weiter.

                      Gruß,
                      Hauke
                      Angehängte Dateien
                      Endlich umgezogen. Fertig? Noch lange nicht... ;-)

                      Kommentar


                        Hallo Fry,

                        erstmal Hut ab vor dem Plugin-Monster. Funktioniert soweit prima. Ich habe allerdings ein Problem mit meiner Logik zum Schalten der Fassadenbeleuchtung. Es ist ein einfaches UND zwischen einem Wert aus Deinem Schaltuhr-Plugin und einem DPT1 zur Tag-/Nachtumschaltung. Es funktioniert nicht, weil, wenn die Umschaltung erfolgt, sagt die Logik:
                        Code:
                        2013-12-07 16:15:51.789,Logikprozessor.pl,7/2/4:1 -> $logic{AussenleuchtenSchaltenWennDunkel}{receive}(Logik) -> nichts zu senden;  ,1.2s,
                        Was bedeutet das und wie kann ich ihn zwingen doch den Wert 1 zu senden?

                        Ciao, PP

                        Kommentar


                          Zitat von Pontius Pilatus Beitrag anzeigen
                          Es ist ein einfaches UND zwischen einem Wert aus Deinem Schaltuhr-Plugin und einem DPT1 zur Tag-/Nachtumschaltung.
                          Vielleicht könntest du den Teil der config mal posten? Dann kann man wahrscheinlich besser helfen!

                          @Hauke: das werde ich heute abend mal ausprobieren!

                          Danke!
                          Micha

                          Kommentar


                            Zitat von Hauke Beitrag anzeigen
                            Hoffe das hilft weiter.
                            Ja, hat geholfen. Allerdings ist das Thema schon recht komplex. Hier mal als Beispiel ein rrd mit 1min-Auflösung:
                            Code:
                            rrdtool create /var/www/rrd/wetterStationWind.rrd --start 20131208_23:00 --step 60 \
                             DS:value:GAUGE:120:0:50 \
                             RRA:AVERAGE:0.99:1:60 \
                             RRA:AVERAGE:0.99:5:2880 \
                             RRA:AVERAGE:0.99:30:2880 \
                             RRA:AVERAGE:0.99:180:8760 \
                             RRA:AVERAGE:0.99:1440:10950 \
                             RRA:MIN:0.99:1440:10950 \
                             RRA:MAX:0.99:1440:10950
                            Danke
                            Micha

                            Kommentar


                              Hier mal noch ein Beispiel wie ein rrd mit 5min-Auflösung gegen ein rrd mit 1-min-Auflösung aussieht.

                              VG
                              Micha
                              Angehängte Dateien

                              Kommentar


                                Zitat von Fry Beitrag anzeigen
                                @mivola: in der neuesten Version des Logikprozessors reicht übrigens
                                myrrd => { receive=>'1/2/3', rrd=>'myrrd' },Macht genau das Gleiche!
                                VG, Fry
                                Hi Fry,

                                ist diese neueste Version schon im SVN? (svn://svn.code.sf.net/p/openautomation/code/wiregate/plugin/generic/Logikprozessor.pl)
                                Ich habe die verkürzte Schreibweise ausprobiert aber dann kommen keine Werte im rrd an. Eine Fehlermeldung habe ich aber auch nicht gefunden...

                                Danke,
                                Micha

                                Kommentar

                                Lädt...
                                X