Ankündigung

Einklappen
Keine Ankündigung bisher.

Plugin für Rollladen verstehen und verbessern

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Plugin für Rollladen verstehen und verbessern

    Hallo Miteinander,

    ich arbeite mich gerade in die Plugins für das Wiregate ein und habe in diesem Zusammenhang ein einfaches Plugin erstellt, welches die Rollläden hochfährt, wenn die Fenster geöffnet werden:

    PHP-Code:
    # Plugin zum Hochfahren der Rollläden bei geöffnetem Fenster
    #Variablen
    my $feli_ga "6/0/152"#Gruppenadresse linkes Fenster
    my $rollo_ga "3/0/151"#Gruppenadresse Rollladen Schalten

    #Ablauf
    $plugin_subscribe{$feli_ga}{$plugname}=1;

    if ((
    $msg{'dst'eq $feli_ga) and ($msg{'apci'eq "A_GroupValue_Write"))
    {
    my $feli knx_read($feli_ga,0,1);
    my $rollo knx_read($rollo_ga,0,1);

                if ((
    $rollo == 1) and ($feli == 0)) {
                
    knx_write($rollo_ga,0,1);
                return 
    "Linkes Fenster wurde geöffnet, daher Rollladen geöffnet";
                }

    Da ich Teile des Codes von anderen Plugins übernommen habe, würde ich gerne wissen, welche Auswirken sie genau haben:
    1.) $plugin_subscribe{$feli_ga}{$plugname}=1
    Wenn ich es richtig verstanden habe, bewirkt diese Zeile, dass das Plugin immer dann ausgeführt wird, wenn sich die Werte der Gruppenadresse "$feli_ga" ändern!? Was bedeutet aber "=1" am Ende?
    2.) if (($msg{'dst'} eq $feli_ga) and ($msg{'apci'} eq "A_GroupValue_Write"))
    Ich weiß, dass $msg Werte des eingetroffenen KNX-Telegramms enthält, aber was bedeutet 'dst', 'apci' und "A_GroupValue_Write"?

    Dies ist mein erstes Plugin. Ich bin dankbar für Vorschläge, wie ich es eleganter schreiben kann. So kann ich für zukünftige Plugins lernen.

    Beste Grüße
    Marco

    #2
    Hallo Marco,

    hast Du in der Zwischenzeit die Antworten bekommen?
    Sind natürlich ziemliche Basis-Fragen, die Du mit etwas googeln auch selbst herausfinden könntest...
    Meine Antworten daher auch nur grundsätzlich.

    zu 1) mit der =1 wird die Gruppenadesse beim Wiregate "zur Überwachung angemeldet". Mit einer =0 könnte man sie auch wieder abmelden
    zu 2) $msg ist Perl-Hash. Details dazu in jedem Perl-Tutorial.
    dst steht für "Destination", in da steht die Empfänger-Adresse jedes Telegramms drin
    apci steht für "Application Layer Protocol Control Information". Da steht grob gesagt der Telegrammtyp drin.

    Das Script (ab der if-Bedingung) wertet also nur Telegramme aus, die an die Adresse "$feli_ga" gehen und wenn es ein Telegramm der Art "A_GroupValue_Write" ist.

    Nachtrag:
    Die im Betrieb (nicht zur Einstellung/Programmierung von KNX-Geräten) üblichen APCI sind:
    APCI Name
    0000 GroupValueRead
    0001 GroupValueResponse
    0010 GroupValueWrite
    Viele Grüße
    Joe
    Zuletzt geändert von JoeKool; 22.05.2017, 18:46.

    Kommentar


      #3
      Hallo Marco,

      falls du mit dem Gedanken spielst noch weitere Logiken zu programmieren (und das wird mMn nicht ausbleiben ;-), kannst du dir auch mal den Logikprozessor anschauen: https://knx-user-forum.de/forum/%C3%...ikprozessor-pl

      Der Logikprozessor ist sehr mächtig, aber die Konfiguration ist eigentlich recht einfach und es gibt gute Beispiele und Doku. Die aktuelle Versionen findest du hier:
      https://github.com/OpenAutomationPro...ikprozessor.pl
      https://github.com/OpenAutomationPro...or.conf_sample

      Viele Grüße,
      Micha

      Kommentar


        #4
        Vielen Dank JoeKool, dass du mir geholfen hast den Code besser zu verstehen.
        Ich hatte mir ein Perl Tutorial angesehen, aber da waren diese Codes nicht enthalten - ich dachte daher, dass es sich, um Sonderfälle handelt, die nicht in allgemeinen Tutorials abgehandelt werden bzw. nur in der KNX-Umgebung auftauchen.

        Vielen Dank auch an dich Micha für den Hinweis auf den Logikprozessor. Den werde werde ich mir mal anschauen, wenn ich mehr Zeit habe.

        PS: Ich finde die Community in diesem Forum einfach klasse.

        Kommentar


          #5
          Den Logikprozessor kann ich nur empfehlen. Damit kannst du dir sicher in vielen Fällen die Programmierung eigener Plugins ersparen.

          Beispiel für Rolladen in Lüftungsposition (90%) fahren wenn das Fenster geöffnet wird, bzw. schließen (100%) wenn Fenster geschlossen wird. Einfach, aber hat alles was ich brauche:

          Code:
          # Rolladen Schlafzimmer in Lüftungsposition wenn Fenster geöffnet
          RolladenLueftSchlaf => { receive => ['[I]Fenster_Status[/I]','[I]aktuelle[/I]_[I]Rolladen_Position[/I]'],
          transmit => '[I]Rolladen_Position_abs_neu[/I]', 
          translate => sub {
          if ($input->[0] == 1 && $input->[1] == 100)           # wenn Fenster offen und Rolladen geschlossen
           { return 90;                                                         #  dann Rolladen in Lüftungsposition
          } elsif ($input->[0] == 0 && $input->[1] == 90) {    # wenn Fenster zu und Rolladen in Lüftungsposition
            return 100;                                                         #  dann Rolladen zu
           } else {
           return undef;                                                       # sonst nichts machen
           }
           }
           },

          Gruß
          Matthias

          Kommentar

          Lädt...
          X