Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Logikprozessor - Krisenstimmung

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

    @Fry & @StefanW: Kann man in einem Plugin relativ einfach herausfinden, welcher Patchlevel auf dem WG installiert ist? Dann wäre ein FETTER Hinweis im Log möglich, wenn LP oder andere Plugins einen bestimmten Patchlevel brauchen. (Ich ahne, dass das nicht der letzte Fall ist... )

    @StefanW: Könnt Ihr irgendwie am Ende vom Patchen einbauen, dass gleich wieder geprüft wird ob weitere Updates anstehen? Und dann gleich wieder einen fetten Hinweis bringen, dass da noch mehr kommt. Oder noch cooler: Ein Hinweis oben auf allen Seiten, wenn Updates anstehen - wird einfach bei jedem Einloggen abgetestet. Könnte auf Dauer auch einige Support-Anfragen einsparen...
    Baubeginn: 1676d. Sanierungsbeginn: 6/2010. Einzug: 9/2014. Fertig? Nie ;-)

    Kommentar


      Nach der frustierenden Erkenntnis von gestern, dass Murphy mal wieder recht behalten hat ("wenn es eine Grube gibt, fällt irgendwann einer hinein ") und der ebenso alten Erkenntnis - "wer lesen kann ist klar im Vorteil" -, habe ich heute morgen meinen Kopf wieder aus dem Sand gezogen.

      Schön und selbstverständlich extrem lobenswert(!!) finde ich, dass man hier nicht im Stich gelassen und "pädagogisch angemessen" (Lob und Tadel) behandelt wird.

      Das nächste Bier nehme ich also gerne auf meine Kappe - aber wie gibt man das aus bei einem virtuellen Treff? Oder gibt es tatsächlich ein "reales" Meeting irgendwann und irgendwo in dieser Republik?

      Der Spaß am LP ist gestern schon spontan ausgebrochen, UND- und ODER-Verknüpfungen sind bereits umgesetzt, nur negierte Funktionen (NOT) und negierte Eingänge (also z.B.: wenn a=1 und b=0 dann c=1) habe ich noch nirgends gefunden. Vieleicht hat einer mal Beispiele dazu..

      Kommentar


        Zitat von Stefan Uphaus Beitrag anzeigen
        Oder gibt es tatsächlich ein "reales" Meeting irgendwann und irgendwo in dieser Republik?
        Naja, es gibt nicht das _eine_ Treffen, aber lokale User-Treffen gibt es schon:
        KNXUF-Stammtische - KNX-User-Forum

        Zitat von Stefan Uphaus Beitrag anzeigen
        Der Spaß am LP ist gestern schon spontan ausgebrochen, UND- und ODER-Verknüpfungen sind bereits umgesetzt, nur negierte Funktionen (NOT) und negierte Eingänge (also z.B.: wenn a=1 und b=0 dann c=1) habe ich noch nirgends gefunden. Vieleicht hat einer mal Beispiele dazu..
        In einer sub-Routine kannst du doch alles machen was du möchtest, zb:
        Code:
        sub{	return (int($input->[0])>17 && int($input->[1])==0 ? 1 : undef) }
        gibt 1 zurück wenn der erste Wert > 17 und der zweite Wert 0 ist; sonst schreibt er nix (wg "undef") auf die Transmit-GAs.

        VG
        Micha

        Kommentar


          Manchmal braucht man ja nur einen Anstoß....

          Verstanden, angewendet, ausprobiert und klappt wie Teufel.

          Wenn jetzt noch jemand ´ne Hysterese hätte..

          Kommentar


            Eine "echte" Hysterese könntest Du Dir selbst bauen - wenn's aber nur darum geht, dass eine Logik hin- und herflippt schau' Dir mal "cool" und "delay" an.
            Baubeginn: 1676d. Sanierungsbeginn: 6/2010. Einzug: 9/2014. Fertig? Nie ;-)

            Kommentar


              Zitat von Dirk42 Beitrag anzeigen
              Kann man in einem Plugin relativ einfach herausfinden, welcher Patchlevel auf dem WG installiert ist?
              Ja, mit `cat /etc/wiregate.patch`sollte man das herausbekommen


              Zitat von Dirk42 Beitrag anzeigen
              Könnt Ihr irgendwie am Ende vom Patchen einbauen, dass gleich wieder geprüft wird ob weitere Updates anstehen?
              Es gibt bereits solche Überlegungen. Werden vermutlich in das nächste Major-Release einfließen.


              Zitat von Dirk42 Beitrag anzeigen
              Oder noch cooler: Ein Hinweis oben auf allen Seiten, wenn Updates anstehen
              Auch hierzu gibt es einige Gedanken und auch konzeptionelle Überlegungen. Ich darf aber nicht alles verraten...

              lg

              Stefan

              Kommentar


                Zitat von Dirk42 Beitrag anzeigen
                Eine "echte" Hysterese könntest Du Dir selbst bauen - wenn's aber nur darum geht, dass eine Logik hin- und herflippt schau' Dir mal "cool" und "delay" an.
                "cool" macht aber auch irgendwie, was es will - zumindest bei einer Analogwertüberwachung....

                Bin noch nicht hinter die Funktion gekommen. Stelle ich z.B einen Schwellwert für einen Luxwert ein, und sende mehrere Protokolle unterhalb des Schwellwertes, so wird als Ergebnis "Schwellwert unterschritten" mal verzögert gesendet, mal sofort gesendet, mal gar nicht gesendet..

                Quäle mich gerade mit einer Steuerung für meine abendliche Gartenbeleuchtung ab:
                - bei Unterschreiten von 50 Lux soll einmal ein 1-Signal gesendet werden
                - bei Unterschreiten von 20 Lux soll einmal ein 0-Signal gesendet werden
                - damit soll der Vorgang abgeschlossen sein und erst am nächsten Tag (also nach Überschreiten von z.B 100Lux) wieder aktiviert werden

                theoreretisch könnte man das an einen Zeitkanal koppeln
                - bei Unterschreiten von 50 Lux soll einmal ein 1-Signal gesendet werden
                - bei Unterschreiten von 20 Lux soll einmal ein 0-Signal gesendet werden
                - dies soll aber nur innerhalb eines Zeitintervall von 15:30 bis 23:00 möglich sein

                Kommentar


                  @Stefan, hast du einen Bug in "cool" gefunden? Dann bitte ich dich um eine Reproduktion des Bugs mit Logik-Config im debug-Mode und wiregate_plugin.log sowie eib.log. Dann kann ich den Bug nachvollziehen und korrigieren.

                  Oder hast du einfach nur die Sample-Conf zu "cool" nicht gelesen und verzweifelst nun an der sinnvollen Anwendung von cool? Dann empfehle ich, die Sample-Conf zu lesen.

                  Deine Gartenbeleuchtung ist zB so zu lösen (absichtlich mit Fokus auf Lesbarkeit):

                  Code:
                  $logic{A}={receive=>'HelligkeitsGA', transmit=>'LichtGA', 
                  
                  state=>{phase=>'Tag'},
                  
                  translate=>sub{
                    if($input>100)
                    {
                       if($state->{phase} eq 'Nacht') { $state->{phase}='Tag'; return 0; }
                       return undef;
                    }
                  
                    if($input<20)
                    {
                       if($state->{phase} eq 'Abend') { $state->{phase}='Nacht'; return 0; }
                       return undef;
                    }
                  
                    if($input<50)
                    {
                       if($state->{phase} eq 'Tag') { $state->{phase}='Abend'; return 1; } 
                       return undef;
                    }
                  
                    return undef;
                  }, debug=>1,
                  };
                  oder so ähnlich ohne state und mit cool und kürzer:

                  Code:
                  $logic{B}={receive=>'HelligkeitsGA', transmit=>'LichtGA', cool=>'30min',
                  
                  translate=>sub{
                    return 0 if $input<20;
                    return 1 if $input<50;
                    return undef;
                  }, 
                  
                  debug=>1,
                  };
                  VG, Fry

                  Kommentar


                    Zitat von Fry Beitrag anzeigen

                    Code:
                    $logic{B}={receive=>'HelligkeitsGA', transmit=>'LichtGA', cool=>'30min',
                    
                    translate=>sub{
                      return 0 if $input<20;
                      return 1 if $input<50;
                      return undef;
                    }, 
                    
                    debug=>1,
                    };
                    VG, Fry
                    Vielleicht ´ne dumme Frage -aber was macht die Routine bei einem Wert von 10? ist ja sowohl kleiner als 20 als auch kleiner als 50...

                    um "cool" kümmere ich mich am Montag...wo finde ich die Sample-Conf zu "cool"?

                    Kommentar


                      Stefan, probiere lieber die längere, erste Logik aus, die ich oben entworfen habe. Die sollte _exakt_ das tun, was du willst. Die andere sendet dann doch ein paar mehr Telegramme als nötig.

                      Und zu deiner Frage: bei 10 würde 0 gesendet, denn 10<20 und das wird zuerst geprüft.

                      VG, Fry

                      PS. Dumme Fragen gibt es nicht, nur Leute die die FAQ nicht lesen. Aber dass du kein Perl-Experte bist, verzeihe ich dir leichter als dass du die Doku zum LP nicht liest. Die Doku befindet sich unter conf.d/Logikprozessor.conf_sample. Diese Sample-Conf besteht fast nur aus Kommentaren und ist zum Durchlesen gedacht und tut out-of-the-box sicher nichts Nützliches. Sie ist auch ziemlich aktuell.

                      Kommentar


                        ... die Sample-Config kennt Stefan auch eigentlich schon, mit der hat er ja die ersten Configs gebastelt...
                        Baubeginn: 1676d. Sanierungsbeginn: 6/2010. Einzug: 9/2014. Fertig? Nie ;-)

                        Kommentar


                          Zitat von Fry Beitrag anzeigen
                          @Stefan, hast du einen Bug in "cool" gefunden?
                          [/code]VG, Fry
                          Doch alles prima!!!!


                          Laut config:
                          ...die Klausel "cool=>...", die eine Logik nur dann zur Ausfuehrung zulaesst, wenn seit der letzten Ausfuehrung die spezifizierte Zahl von Sekunden verstrichen ist...

                          Da funktioniert es dann doch so, wie es beschrieben ist: war ein wenig über das sofortige Senden erstaunt.

                          vielleicht schreibt man besser
                          ...die Klausel "cool=>...", die eine Logik nur dann zur erneuten Ausfuehrung zulaesst, wenn seit der letzten Ausfuehrung die spezifizierte Zahl von Sekunden verstrichen ist...

                          ..ist aber auch irgendwie Formulierungserbsenzählerei.

                          Ja, an Perl muss ich mich ein wenig gewöhnen, bin halt Programmierung aus LOGO!Soft bzw. Step7 oder ähnlichen Programmen gewohnt; erinnert mich manchmal an neue Fremdsprachen, die man zwar versteht, wenn man sie liest, man aber ratlos dasteht, wenn man selbst etwas formulieren, sprechen, bzw. schreiben soll.



                          Kommentar


                            Irgendwie ist der Logikprozessor noch nicht mein Freund.

                            Hatte also jetzt folgende Idee für die Umsetzung meiner Logik_01 in der Logikprozessor.conf
                            (vielleicht wichtiger Hinweis: die Adressen 9/1/20 ("Abend"), 9/1/21 ("Nacht"), 9/1/22 ("Zeitkanal an") sollen lediglich als Merker fungieren; ich habe sie daher als "Dummy" in der ETS3 angelegt).

                            Ab 16:00Uhr soll bei Erreichen der "Abend"-Schwelle von 80 Lux das Licht (1/4/72) im Garten einschalten und bei Erreichen der "Nacht"-Schwelle von 3 Lux wieder ausschalten.


                            Schaue mir also die Schwellen für das Ein-Ausschalten des Lichts an:
                            - falls der Luxwert (1/5/60) bestimmte Werte erreicht, wird "Abend" (zwischen 80 und 50Lux) bzw. "Nacht" (zwischen 1 und 3Lux) definiert
                            Code:
                            L01_Lux_Abend => { receive=>['5/1/60'], transmit=>'9/1/20', translate => sub{ return (int($input->[0])>50 && int($input->[0])<80 ? 1 : undef) }, debug=>1 },
                            L01_Lux_Nacht => { receive=>['5/1/60'], transmit=>'9/1/21', translate => sub{ return (int($input->[0])>1 && int($input->[0])<3 ? 1 : undef) }, debug=>1 },
                            Um 16:00 Uhr setze ich das Signal "Zeitkanal an" und merke mir den gesetzten Wert
                            Code:
                            L01_ZK_an => { transmit=>'9/1/22', timer=>{ time=>['16:00'] }, translate => 1, debug=>1 },
                                       memory => { transmit=>'9/1/22', reply_to_read_requests=>1 },
                            Jetzt die UND-Verknüpfung ("Abend" und "Zeitkanal an") für das Einschalten des Lichts (1/4/72)
                            Code:
                            L01_Licht_Garten_an => { receive=>['9/1/20','9/1/22'], transmit=>'1/4/72', translate => sub { return (int($input->[0]) && int($input->[1]) ? 1: undef) }, debug=>1 },
                            Wird jetzt die untere Schwelle "Nacht" erreicht und ist der "Zeitkanal an", soll das Licht wieder ausgeschaltet werden:

                            Code:
                            L01_Licht_Garten_aus => { receive=>['9/1/21','9/1/22'], transmit=>'1/4/72', translate => sub { return (int($input->[0]) && int($input->[1]) ? 0: undef) }, debug=>1 },
                            Um 21.59 setze ich nur den Zeitkanal wieder zurück
                            Code:
                                    L01_ZK_aus => { transmit=>'9/1/22', timer=>{ time=>['21:59'] }, translate => 0, debug=>1 },
                            Soweit so gut, dachte ich...

                            Jetzt gibt es folgende Protokolleinträge in der wiregate_plugin.log:

                            Code:
                            2015-02-24 16:00:00.276,Logikprozessor.pl,Naechster Aufruf der timer-Logik 'L01_ZK_an'  morgen um 16:00.
                            2015-02-24 16:00:00.284,Logikprozessor.pl,$logic->{L01_ZK_an}{transmit}(Logik) -> 9/1/22:1 gesendet (timer);  ,0s,
                            2015-02-24 16:00:00.317,Logikprozessor.pl,Bus: A_GroupValue_Write:[B] [U]9/1/22=1[/U][/B]
                            Zeitkanal wird aktiviert, prima!

                            Code:
                            2015-02-24 18:04:32.513,Logikprozessor.pl,Bus: A_GroupValue_Write: 5/1/60=96.32
                            2015-02-24 18:04:32.523,Logikprozessor.pl,1.1.50 5/1/60:96.32 -> $logic->{L01_Lux_Abend}{receive}(Logik) -> nichts zu senden;  1.1.50 5/1/60:96.32 -> $logic->{L01_Lux_Nacht}{receive}(Logik) -> nichts zu senden;  ,0s,
                            2015-02-24 18:05:32.991,Logikprozessor.pl,Bus: A_GroupValue_Write: [U][B]5/1/60=64.52[/B][/U]
                            2015-02-24 18:05:33.006,Logikprozessor.pl,1.1.50 5/1/60:64.52 -> $logic->{L01_Lux_Abend}{receive}(Logik) -> [U][B]9/1/20:1 gesendet[/B][/U]; 
                             1.1.50 5/1/60:64.52 -> $logic->{L01_Lux_Nacht}{receive}(Logik) -> nichts zu senden;  ,0s,
                            
                            
                            2015-02-24 18:05:33.028,Logikprozessor.pl,Bus: A_GroupValue_Write: 9/1/20=1
                            2015-02-24 18:05:34.045,Logikprozessor.pl,1.1.254 9/1/20:1 -> $logic->{L01_Licht_Garten_an}{receive}(Logik) -> nichts zu senden;  ,0.9s,
                            2015-02-24 18:05:34.053,Logikprozessor.pl,Bus: A_GroupValue_Read: [U][B][COLOR=Red]9/1/22=0[/COLOR][/B][/U]
                            
                            
                            2015-02-24 18:06:32.461,Logikprozessor.pl,Bus: A_GroupValue_Write: [U][B]5/1/60=56.08[/B][/U]
                            2015-02-24 18:06:32.476,Logikprozessor.pl,1.1.50 5/1/60:56.08 -> $logic->{L01_Lux_Abend}{receive}(Logik) -> [U][B]9/1/20:1 gesendet[/B][/U];  1.1.50 5/1/60:56.08 -> $logic->{L01_Lux_Nacht}{receive}(Logik) -> nichts zu senden;  ,0s, 
                            2015-02-24 18:06:32.502,Logikprozessor.pl,Bus: A_GroupValue_Write: 9/1/20=1
                            
                            
                            2015-02-24 18:06:32.519,Logikprozessor.pl,1.1.254 9/1/20:1 -> $logic->{L01_Licht_Garten_an}{receive}(Logik) -> [B][U][COLOR=Red]1/4/72:1 gesendet[/COLOR][/U][/B];  ,0s,
                            
                            2015-02-24 18:07:32.940,Logikprozessor.pl,Bus: A_GroupValue_Write: [U][B]5/1/60=49.64[/B][/U]
                            2015-02-24 18:07:32.950,Logikprozessor.pl,1.1.50 5/1/60:49.64 -> $logic->{L01_Lux_Abend}{receive}(Logik) -> [U][B]nichts zu senden[/B][/U];  1.1.50 5/1/60:49.64 -> $logic->{L01_Lux_Nacht}{receive}(Logik) -> nichts zu senden;  ,0s,
                            
                            2015-02-24 18:29:32.391,Logikprozessor.pl,Bus: A_GroupValue_Write: [U][B]5/1/60=2.18[/B][/U]
                            2015-02-24 18:29:32.421,Logikprozessor.pl,1.1.50 5/1/60:2.18 -> $logic->{L01_Lux_Abend}{receive}(Logik) -> nichts zu senden;  1.1.50 5/1/60:2.18 -> $logic->{L01_Lux_Nacht}{receive}(Logik) -> [U][B]9/1/21:1 gesendet[/B][/U];  ,0s,
                            2015-02-24 18:29:32.443,Logikprozessor.pl,Bus: A_GroupValue_Write: 9/1/21=1
                            
                            2015-02-24 18:29:33.467,Logikprozessor.pl,1.1.254 9/1/21:1 -> $logic->{L01_Licht_Garten_aus}{receive}(Logik) -> nichts zu senden;  ,0.9s,
                            2015-02-24 18:29:33.487,Logikprozessor.pl,Bus: A_GroupValue_Read: [COLOR=Red][U][B]9/1/22=0[/B][/U][/COLOR]
                            2015-02-24 18:30:32.867,Logikprozessor.pl,Bus: A_GroupValue_Write: 5/1/60=1.56
                            2015-02-24 18:30:32.895,Logikprozessor.pl,1.1.50 5/1/60:1.56 -> $logic->{L01_Lux_Abend}{receive}(Logik) -> nichts zu senden;  1.1.50 5/1/60:1.56 -> $logic->{L01_Lux_Nacht}{receive}(Logik) -> nichts zu senden;  ,0s,
                            Im ersten Block wird "Abend" gesendet, prima!
                            Im zweiten Block wird der Zeitkanal wird zu Null abgefragt (verstehe ich nicht - der war doch schon auf "1")
                            Im dritten Block wird wird "Abend" gesendet, prima!
                            Im vierten Block wird plötzlich "Licht_Garten_an" gesendet (verstehe ich nicht - 9/1/22 ist doch Null)
                            Im fünften Block wird "Abend" nicht mehr gesendet, prima!
                            Im sechsten Block wird "Nacht" gesendet, prima!
                            Im siebten Block wird der Zeitkanal wieder zu Null abgefragt - dann kann die letzte Logik L01_Licht_Garten_aus natürlich nicht mehr ausgeführt werden..

                            Hoffentlich versteht jemand mein Problem....

                            Kommentar


                              Ich habe nur bis zu deinem ersten Code-Block gelesen. Ersetze dort bitte mal $input->[0] überall einfach durch $input. Da nur eine receive-GA angegeben ist, ist $input kein Array. Dann bitte nochmal sehen, was los ist. VG, Fry

                              Kommentar


                                Habe den Code heute folgendermaßen geändert:
                                Code:
                                L01_Lux_Abend => { receive=>['5/1/60'], transmit=>'9/1/20', translate => sub{ return (int($input)>50 && int($input)<80 ? 1 : undef) }, debug=>1 },
                                        L01_Lux_Nacht => { receive=>['5/1/60'], transmit=>'9/1/21', translate => sub{ return (int($input)>1 && int($input)<3 ? 1 : undef) }, debug=>1 },
                                        L01_ZK_an => { transmit=>'9/1/22', timer=>{ time=>['16:00'] }, translate => 1, debug=>1 },
                                           memory => { transmit=>'9/1/22', reply_to_read_requests=>1 },
                                        L01_Licht_Garten_an => { receive=>['9/1/20','9/1/22'], transmit=>'1/4/72', translate => sub { return (int($input->[0]) && int($input->[1]) ? 1: undef) }, debug=>1 },
                                        L01_Licht_Garten_aus => { receive=>['9/1/21','9/1/22'], transmit=>'1/4/72', translate => sub { return (int($input->[0]) && int($input->[1]) ? 0: undef) }, debug=>1 },
                                        L01_ZK_aus => { transmit=>'9/1/22', timer=>{ time=>['21:59'] }, translate => 0, debug=>1 },
                                da passiert dann leider außer dem funktionierenden Zeitkanal gar nichts mehr:

                                Code:
                                2015-02-25 16:00:01.857,Logikprozessor.pl,Naechster Aufruf der timer-Logik 'L01_ZK_an'  morgen um 16:00.
                                2015-02-25 16:00:01.865,Logikprozessor.pl,$logic->{L01_ZK_an}{transmit}(Logik) -> 9/1/22:1 gesendet (timer);  ,0s,
                                2015-02-25 16:00:01.897,Logikprozessor.pl,Bus: A_GroupValue_Write: 9/1/22=1
                                
                                2015-02-25 17:57:49.100,Logikprozessor.pl,Bus: A_GroupValue_Write: 5/1/60=93.12 
                                2015-02-25 17:57:49.110,Logikprozessor.pl,1.1.50 5/1/60:93.12 -> $logic->{L01_Lux_Abend}{receive}(Logik) -> nichts zu senden;  1.1.50 5/1/60:93.12 -> $logic->{L01_Lux_Nacht}{receive}(Logik) -> nichts zu senden;  ,0s, 
                                2015-02-25 17:58:48.571,Logikprozessor.pl,Bus: A_GroupValue_Write: 5/1/60=59.88 
                                2015-02-25 17:58:48.583,Logikprozessor.pl,1.1.50 5/1/60:59.88 -> $logic->{L01_Lux_Abend}{receive}(Logik) -> nichts zu senden;  1.1.50 5/1/60:59.88 -> $logic->{L01_Lux_Nacht}{receive}(Logik) -> nichts zu senden;  ,0s,
                                
                                
                                2015-02-25 18:25:48.411,Logikprozessor.pl,Bus: A_GroupValue_Write: 5/1/60=4.04
                                2015-02-25 18:25:48.422,Logikprozessor.pl,1.1.50 5/1/60:4.04 -> $logic->{L01_Lux_Abend}{receive}(Logik) -> nichts zu senden;  1.1.50 5/1/60:4.04 -> $logic->{L01_Lux_Nacht}{receive}(Logik) -> nichts zu senden;  ,0s,
                                2015-02-25 18:26:48.870,Logikprozessor.pl,Bus: A_GroupValue_Write: 5/1/60=2.52
                                2015-02-25 18:26:48.880,Logikprozessor.pl,1.1.50 5/1/60:2.52 -> $logic->{L01_Lux_Abend}{receive}(Logik) -> nichts zu senden;  1.1.50 5/1/60:2.52 -> $logic->{L01_Lux_Nacht}{receive}(Logik) -> nichts zu senden;  ,0s,
                                Eigentlich müsste ich in der Version von gestern nur die Adresse 9/1/22, die durch den Zeitkanal beschrieben wird, sauber abspeichern, um sie später wieder abfragen zu können, dann hätte ich es!

                                Kommentar

                                Lädt...
                                X