Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Zitat von mivola Beitrag anzeigen
    Da hast du mich wohl falsch verstanden. Ich meinte ja nur, dass ich sowas bisher nicht im LP gemacht habe. Aber prinzipiell sollte es auch im LP (genauer: in einer "sub") machbar sein.
    Da hab ich dich tatsächlich falsch verstanden, sorry. Dank johnnychicago's Hilfe hab ich es nun hinbekommen:

    Code:
    execute_script => { receive=>'3/39/25', translate => sub { if ($input=="1") {system "/root/script.sh";} }, debug=>1, },
    Sprich: Kommt eine '1' an die 3/39/25, wird das Script ausgeführt.

    Das Script wird übrigens als root aufgerufen, also Vorsicht :-)
    "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

    Kommentar


      Ich empfehle, im system-Call noch ein "&" anzuhängen, damit der Logikprozessor und damit der Wiregate-Daemon nicht auf Beendigung des Scripts warten müssen. Also so:

      system "/root/script.sh &";

      Kommentar


        Stimmt, gute Idee!
        "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

        Kommentar


          Frage:
          wie kann man folgendes mit dem Logikpozessor abbilden wo am anfang noch nicht feststeht das überhaupt etwas gesendet wird?

          Folgende Logik will ich abbilden.

          TEMPAUSSEN < 11.0 && TEMPINNEN < 21.0 sende HEIZUNG=1
          TEMPAUSSEN > 12.0 && TEMPINNEN >= 21.0 sende HEIZUNG=0
          wenn keine der beiden Fälle vorliegt soll nichts gesendet werden.

          Wahrscheinlich ist das ganz einfach nur habe ich keinen plan wie das gehen könnte.

          VG & Danke
          Jürgen

          Kommentar


            Jürgen

            Ungestestet (auch nicht auf Verschreiber) würde ich Folgendes probieren:
            Code:
                    HeizungEinschalten    => { debug=> 1, 
                        transmit=>'3/1/65', # GA Heizung
                        receive=>[ 
                        '7/0/220',     #0: GA Temp Aussen
                        '7/0/219',     #1: GA Temp Innen
                        ], translate =>sub{
                            if (    (int($input->[0]) < 11) and         #Aussentemp kleiner 11
                                    (int($input->[1]) < 21)            #Innentemp kleiner als 21
                                )
                                 {return 1;}        #einschalten
                            elsif (    (int($input->[0]) >= 11) and         #Aussentemp grösser/gleich  11
                                    (int($input->[1]) >= 21)            #Innentemp grösser/gleich 21
                                )
                                 {return 0;}        #ausschalten
                            else {return undef;}        #nichts
                        }
                    },
            Gruss
            Diego

            Kommentar


              Hi Diego,
              das scheint gut zu Funktionieren. Mit return undef kann man also die Engine zum nixtun überreden.
              Viele Grüsse
              Jürgen

              Kommentar


                Ja, und der Vollständigkeit halber:

                Wenn bereits ein "delay"-Timer aus einer früheren Logikausführung läuft, d.h. demnächst was gesendet werden wird, dann gibt es folgende Optionen:

                return <WERT>; startet den Timer neu und sendet nach Ablauf des Delays den neuen Wert

                return 'cancel'; storniert den Timer

                return undef; macht nichts, d.h. Timer läuft weiter, alter Wert wird nach Ablauf gesendet

                VG; Fry

                Kommentar


                  Kann man den Logikprozessor auch verschachteln?

                  Also, um Diegos - exzellentes! - Beispiel zu nehmen in etwa so:

                  Code:
                  Heizung_Sommerbetrieb    => { debug=> 1,
                      receive        => [
                          '7/0/220',        # Heizung Sommerbetrieb (0: Winterbetrieb, 1: Sommerbetrieb)
                          '3/1/65',        # GA Heizung
                          ],
                      translate    => sub {
                          if (    (int($input->[0]) = 0) )    # Winterbetrieb
                              {
                                  [B]heizung_AN    => { transmit=>'3/1/65', timer=>{ time=>['06:00'], }, translate => 1, debug=>1, },    # Schalte Heizung um 06:00 Uhr an
                                  heizung_AUS    => { transmit=>'3/1/65', timer=>{ time=>['21:00'], }, translate => 0, debug=>1, },    # Schalte Heizung um 21:00 Uhr wieder aus (Nachtbetrieb)[/B]
                              }
                          elsif (    (int($input->[0]) = 1) )    # Sommerbetrieb
                              {
                                 [B] heizung_sommer_AN    => { transmit=>'3/1/65', timer=>{ time=>['06:00','13:00'], }, translate => 1, debug=>1, },    # Schalte Heizung um 06:00 Uhr und um 13:00 nur kurz an, um das Warmwasser zu erwärmen
                                  heizung_sommer_AUS    => { receive=>'3/1/65', transmit=>'3/1/65', delay=>1800, translate => 0, debug=>1, },        # Schalte Heizung nach 30 Minuten wieder aus[/B]
                              }
                          else {return undef;}    #nichts
                      }
                  },
                  Was ich damit versuche zu erreichen, ist übrigens nicht DVGW-konform (Stichwort: Legionellen), also Vorsicht!
                  "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

                  Kommentar


                    SO geht das leider nicht. Du kannst den gewünschten Effekt aber genau so auch ohne Verschachtelung erzielen, indem du fünf Logiken definierst (eine pro Uhrzeit und eine ohne Timer-Angabe). Vielleicht geht es auch mit vier, habe ich jetzt nicht durchdacht.
                    VG, Fry

                    Kommentar


                      Zitat von Fry Beitrag anzeigen
                      SO geht das leider nicht. Du kannst den gewünschten Effekt aber genau so auch ohne Verschachtelung erzielen, indem du fünf Logiken definierst
                      So finde ich es persönlicher auch übersichtlicher als mit einer Verschachtelung.

                      VG
                      Micha

                      Kommentar


                        Also quasi aufgedröselt:

                        Code:
                        [B]heizung_AN[/B]        => { debug=> 1,
                            receive        => [
                                '7/0/220',        # Heizung Sommerbetrieb (0: Winterbetrieb, 1: Sommerbetrieb)
                                '3/1/65',        # GA Heizung
                                ],
                            transmit    => '3/1/65',    # GA Heizung
                            [B]timer[/B]        => { time=>['06:00'], },    # Schalte Heizung um 06:00 Uhr an
                            translate    => sub {
                                if (    (int($input->[0]) = 0) )    # Winterbetrieb
                                    {return 1;}            # Einschalten
                                else {return undef;}    #nichts
                            }
                        },
                        [B]heizung_AUS[/B]        => { debug=> 1,
                            receive        => [
                                '7/0/220',        # Heizung Sommerbetrieb (0: Winterbetrieb, 1: Sommerbetrieb)
                                '3/1/65',        # GA Heizung
                                ],
                            transmit    => '3/1/65',    # GA Heizung
                            [B]timer[/B]        => { time=>['21:00'], },    # Schalte Heizung um 21:00 Uhr wieder aus
                            translate    => sub {
                                if (    (int($input->[0]) = 0) )    # Winterbetrieb
                                    {return 0;}            # Ausschalten
                                else {return undef;}    #nichts
                            }
                        },
                        [B]heizung_sommer_AN[/B]    => { debug=> 1,
                            receive        => [
                                '7/0/220',        # Heizung Sommerbetrieb (0: Winterbetrieb, 1: Sommerbetrieb)
                                '3/1/65',        # GA Heizung
                                ],
                            transmit    => '3/1/65',    # GA Heizung
                            [B]timer[/B]        => { time=>['06:00','13:00'], },    # Schalte Heizung um 06:00 Uhr und um 13:00 nur kurz an, um das Warmwasser zu erwärmen
                            translate    => sub {
                                if (    (int($input->[0]) = 1) )    # Sommerbetrieb
                                    {return 1;}            # Einschalten
                                else {return undef;}    #nichts
                            }
                        },
                        [B]heizung_sommer_AUS[/B]    => { debug=> 1,
                            receive        => [
                                '7/0/220',        # Heizung Sommerbetrieb (0: Winterbetrieb, 1: Sommerbetrieb)
                                '3/1/65',        # GA Heizung
                                ],
                            transmit    => '3/1/65',    # GA Heizung
                            [B]delay[/B]=>1800,    # Schalte Heizung nach 30 Minuten wieder aus
                            translate    => sub {
                                if (    (int($input->[0]) = 1) )    # Sommerbetrieb
                                    {return 0;}            # Ausschalten
                                else {return undef;}    #nichts
                            }
                        },
                        "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

                        Kommentar


                          Wo wir gerade bei Timern, Delay etc. sind:

                          Gibt es denn irgendeine Möglichkeit, die zeitliche Ausführung einer Aktion parametrisierbar zu machen, also auf gut deutsch: 'Den Wecker zu stellen?'

                          Die Idee dahinter: Es gibt eine definierbare Uhrzeit 'Auftstehen' und einige Logiken mit Timern, die dann z.B. zum Zeitpunkt Aufstehen -2h usw. ausgeführt werden.

                          Die Weckzeit hat einen default (z.B. 7:00h) und kann bei Bedarf über die CometVisu abends verändert werden (morgen muss ich früher los).

                          Hat jemand dazu eine Idee, oder sogar schon was umgesetzt?
                          Beste Grüße, Dirk

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

                          Kommentar


                            @Dirk: ja gibt es, sieh mal hier im Thread weiter oben unter "followup".

                            @wuestenfuchs: damit das Ganze funktioniert, solltest du noch "eibd_cache=>5000" (oder so) sowie "execute_on_input_changes_only=>1" als Optionen an alle Logiken setzen. (Neueste Version des Logikprozessors, wie in diesem Thread gepostet, wird vorausgesetzt, die letzte Option gibt es noch nicht so lange). Zusätzlich dafür sorgen, dass Telegramme auf den beiden receive-Adressen in regelmäßigen Abständen kommen (Einmal alle 15min oder so reicht). Dann wird der Wert immer vom Cache gelesen, und falls das irgendwie mal nicht klappen sollte (zB nach Neustart des eibd), dann wird die Logik nicht ausgeführt.

                            Hintergrund: du hast zwei receive-Adressen. Kommt ein Telegramm auf der einen, dann wird ein knx_read auf die andere ausgeführt. Kommt dann keine Antwort, so ist der gelesene Wert undefiniert (undef) und landet in @input. Nun ist aber leider int(undef)==0 - und so kannst du leicht sehen, was schiefgehen wird.

                            VG, Fry

                            Kommentar


                              Hallo Dirk

                              Vielleicht hilft Dir diese Spur:
                              Ich habe einmal etwas in diese Richtung erstellt, siehe hier:
                              https://knx-user-forum.de/cometvisu/...te-plugin.html .

                              Es ist ist nicht sehr elegant, weil die Uhrzeit auf zwei GA (Stunde und Minute) abgelegt wird, weil ich zu faul war, mich mit DPT 10.001 auseinanderzusetzen. Im Prinzip sollte es möglich sein, die durch "mein" Plugin bedienten GA auch aus dem Logikprozessor zu lesen und gestützt darauf dann zu einem bestimmten Zeitpunkt etwas auszulösen. Allerdings wäre es eleganter, wenn man direkt auf DPT 10.0001 schreiben könnte.

                              Gruss
                              Diego

                              Kommentar


                                @wuestenfuchs: noch was: dass deine transmit-Adresse gleich einer der beiden receive-Adressen ist, leuchtet nicht ein. Pass auf, dass du dir keine Endlosschleife erzeugst... (vielleicht besser eine Adresse als receive, die andere als "fetch" definieren).

                                VG, Fry

                                Kommentar

                                Lädt...
                                X