Ankündigung

Einklappen
Keine Ankündigung bisher.

Entwicklung eines Plugins - Möglichkeiten

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

    [wiregate] Entwicklung eines Plugins - Möglichkeiten

    Hallo zusammen,

    ich habe mal ein paar Fragen zu den Möglichkeiten von Logiker im Wiregate / CV.

    Als Beispiel würde ich gerne folgendes Realisieren und würde gerne wissen ob das Möglich ist und vielleicht einen kleinen Tipp - wie?

    Wenn Fernseher Strom zieht (Aktor mit Stromerkennung) soll die Fernsehbeleuchtung eingeschaltet werden, wenn es draußen dunkel ist (Wetterstation). Wenn es hell ist soll die Helligkeit im Raum gemessen werden (PM auslesen) und wenn zu hell, sollen die Raffstoren auf Beschattung fahren.

    2. Beispiel:

    Wenn Taste "Schlafen" gedrückt wird, sollen alle PM´s deaktiviert werden, zeitgleich soll bei einem PM nur noch der 2. Kanal aktiv sein (andere Leuchte wird geschaltet) und falls ein Fenster noch offen ist, soll eine Nachricht (Prowl) gesendet werden. Ebenso sollen alle Leuchten ausgeschaltet werden.

    Kann mir dazu jemand was sagen, wie sowas und ob sowas funktioniert?

    #2
    Zitat von Jache Beitrag anzeigen
    ich habe mal ein paar Fragen zu den Möglichkeiten von Logiker im Wiregate / CV.
    Geht alles mit WG Plugins. Die CV hat damit nichts zu tun.
    => Thema ins andere Forum verschieben?
    Zitat von Jache Beitrag anzeigen
    Als Beispiel würde ich gerne folgendes Realisieren und würde gerne wissen ob das Möglich ist und vielleicht einen kleinen Tipp - wie?

    Wenn Fernseher Strom zieht (Aktor mit Stromerkennung) soll die Fernsehbeleuchtung eingeschaltet werden, wenn es draußen dunkel ist (Wetterstation). Wenn es hell ist soll die Helligkeit im Raum gemessen werden (PM auslesen) und wenn zu hell, sollen die Raffstoren auf Beschattung fahren.
    WG-Plugin auf Strom hören lassen (optimal bzgl. Reakton sendet der Aktor per Schwellwert ein Telegramm, aber auch ein regelmäßiges Senden des Stromwertes mit Schwellwert im WG-Plugin funktioniert).
    Wenn das Plugin läuft und durch das Strom-Telegramm getriggert wurde die Außenhelligkeit abfragen und vergleichen.
    Basierend auf diesen Infos dann entsprechende Aktionen durchführen.

    => Simpel

    Evtl. etwas schwieriger ist dann das ganze definiert wieder zurück zu fahren. Je nach Aufwand könnte sich hier ein Zustandsautomat anbieten (hab dazu mal ein Code-Schnipsel veröffentlicht)
    Zitat von Jache Beitrag anzeigen
    2. Beispiel:

    Wenn Taste "Schlafen" gedrückt wird, sollen alle PM´s deaktiviert werden, zeitgleich soll bei einem PM nur noch der 2. Kanal aktiv sein (andere Leuchte wird geschaltet) und falls ein Fenster noch offen ist, soll eine Nachricht (Prowl) gesendet werden. Ebenso sollen alle Leuchten ausgeschaltet werden.

    Kann mir dazu jemand was sagen, wie sowas und ob sowas funktioniert?
    Du brauchst einen sperrbaren PM (klar würde auch alles per Logik gehen, ist aber nicht so elegant). Den direkt per ETS auf den Schalter hören lassen.
    Gleichzeitig das Wiregate-Plugin auf den Schalter hören lassen, wenn das deswegen läuft da drinnen den Fenster-Staus abfragen und ggf. Nachricht senden.
    Leuchten auch auf den Schalter hören lassen (-> ETS)

    ==> Das sind alles normale Anwendungsfälle für eine Logik
    TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

    Kommentar


      #3
      Hallo Chris,

      Danke dir.
      Wie ich das verstehe sind das alles Plugins im WG, die ich dafür schreibe, richtig?

      Was hat es mit einer logikengine auf sich? Wofür brauche ich diese? Und was ist hier der Unterschied zwischen sh.py, linKNX bzw. logikprozessor Plugin?

      Installiert man solche Logikengines und schreibt dann dort die Plugins statt direkt im WG?

      Meine letzte Frage, sollte man Szenen mit unterschiedlichen DLP's direkt in der ETS machen, sofern möglich oder dafür ein Plugin schreiben?

      Kommentar


        #4
        Hallo Jache

        Eine Logikengine ist einfach ein stück Software dass in echtzeit auf Ereignisse reagiert und entsprechend der Konfiguration eine Handlung ausführt...

        Wenn du kleine einfache Aufgaben hast die nicht sonderlich Zeitkritisch sind, kannst du direkt ein WG Plugin schreiben/verwenden. Soll es aber komplex und in echtzeit sein, kommst du um eine spezialisierte Lösung nicht herum...

        Logikprozessor von Fry: Wird erst richtig sinnvoll einsetzbar mit dem ebenfalls von ihm gepatchten wiregated.pl oder dem hoffendlich bald von ElabNet kommenden Update.

        linknx: Wenn dich XML editieren nicht abschrekt ist das eine sehr gute Lösung da aufdemWG bereits vorinstalliert und damit einsatzbereit.

        sh.py: Läuft nicht auf dem Wiregate. Dazu wird ein RasperyPi oder ein zusätzlich laufender Linuxserver benötigt. Das Image für den Pi hat den Vorteil, dass es sofort einsatzbereit ist. In die Konfiguration müsstest du dich ebenfalls einlesen. Die Programmiersprache ist Pyton.

        Für Szenen könntest du direkt ein WG Plugin verwenden. Wenn ich mich nicht irre gab es mal ein fertiges Szenenplugin fürdas WG dass du nur noch konfigurierenmüsstest. Damit erspaarst du dir die Arbeit das Rad neu zu erfinden
        Gruss Patrik alias swiss

        Kommentar


          #5
          Hallo Swiss,
          Danke auch dir.

          Was ich nicht verstehe ist das Thema Echtzeit.

          Ich kann ja auch ein normales WG Plugin in Echtzeit auf einer GA hören lassen mit plugin_sibscripe und dann mit dem $msg Objekt.

          Das ist doch auch in Echtzeit oder nicht?

          Kommentar


            #6
            Nein nicht ganz...

            Das Pluginsystem ist so aufgebaut, dass alle Plugins und noch andere Funktionen in einem einzigen grossen "Prozess" abgearbeitet werden. Natürlich kann mit dem plugin_subscribe auf eine GA reagiert werden. Solange du nur einpaar kleine Plugins hast,die schnell abgearbeitet werden, funktioniert dass auch. Wenn du aber Plugins einsetzt, die einiges an Laufzeit benötigen, verzögert sich auch die Abarbeitung der nachfolgenden Plugins und demzufolge auch die Reaktion auf eine GA.

            Fry's Logikprozessor mit gepatchtem wiregated.pl wird vorkompiliert was die Ausfürungsdauer erheblich reduziert. So bleibt auch ein Fettes Plugin flink und bremst nicht das gesammte Pluginsystem aus.

            linknx läuft paralell in einem eigenen "Prozess" und wird nicht durch die fetten Wiregateplugins ausgebremst.

            Wie gesagt... Bis zu einem bestimmten Punkt funktionieren Wiregate Plugins sehr gut.Aber sobald du dich darauf verlassen musst,dass es wirklich verzögerungsfrei arbeitet, würde ich es nicht als Plugin lösen. Denn das Problem geht noch weiter... Durch die unterennbare verknüpfung aller Plugins kann es auch sein, dass es heute super flink läuft und morgen tüftelst du an einem neuen Plugin was vieleicht einen Fehler enthält und die zuvor super funktionierende Logik wird brutal träge macht.

            Wenn du dir dessen bewust bist, kannstdu relativ viel mit Wiregate Plugins machen aber eben immer mit vorsicht.
            Gruss Patrik alias swiss

            Kommentar


              #7
              Hallo,

              ok, dann werde ich vorerst bei den WG Plugins bleiben.

              Eine Szene "Schlafen", bei welcher mehrere GAs angesprochen werden sollen mit unterschiedlichen DPT´s, dafür würde ich dann ein Plugin schreiben, richtig?

              Kommentar


                #8
                Hallo Jache,

                ich würde mir eine GA definieren, die "Schlafen" bedeutet, die kannst Du dann triggern.
                Im WG hört ein Plugin auf diese GA und schaltet alle aus.

                Parallel gibts ein Plugin, welches alle "Lichter" verodert. Dieses gibt das Ergebnis auf eine GA "mindestens ein Licht an":

                Hier mal meine Plugins:

                Schlafen
                Code:
                #return 0;
                # COMPILE_PLUGIN
                
                
                my @Ausgang_ga;
                
                my $Schlafen_ga="5/0/2";
                my $PM_sperren_ga="5/0/1";
                my $VDR_aus_ga="0/3/30";
                
                
                
                
                push @Ausgang_ga, { name => "Flur Altbau aus", ga => "5/0/240"};
                push @Ausgang_ga, { name => "Wohnzimmer aus", ga => "0/0/200"};
                push @Ausgang_ga, { name => "Küche aus", ga => "2/0/0"};
                push @Ausgang_ga, { name => "Flur Neubau aus", ga => "4/0/200"};
                push @Ausgang_ga, { name => "Büro aus", ga => "1/0/200"};
                push @Ausgang_ga, { name => "Wohnzimmer Stern", ga => "0/0/34"};
                push @Ausgang_ga, { name => "Wohnzimmer Vase", ga => "0/0/35"};
                push @Ausgang_ga, { name => "Büro Vase", ga => "1/0/43"};
                push @Ausgang_ga, { name => "Terrasse aus", ga => "5/0/210"};
                push @Ausgang_ga, { name => "Kinderbad Steckdose", ga => "4/0/111"};
                push @Ausgang_ga, { name => "Durchgang Steckdose", ga => "4/0/191"};
                push @Ausgang_ga, { name => "Küche Steckdose", ga => "2/0/31"};
                push @Ausgang_ga, { name => "Hausplatz Steckdose", ga => "5/0/81"};
                push @Ausgang_ga, { name => "Flur Altbau aus", ga => "5/0/240"};
                push @Ausgang_ga, { name => "Außenbeleuchtung Neubau Hand aus", ga => "15/3/13"};
                push @Ausgang_ga, { name => "Außenbeleuchtung Neubau aus", ga => "15/3/11"};
                
                
                
                $plugin_info{$plugname . '_cycle'} = 0; # Aufrufzyklus - never
                
                
                my $sec; #Sekunde
                my $min; # Minute
                my $hour; #Stunde
                my $mday; #Monatstag
                my $mon; #Monatsnummer
                my $year; #Jahr
                my $wday; #Wochentag 0-6
                my $yday; #Tag ab 01.01.xxxx
                my $isdst;
                
                ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
                $year += 1900;
                $mon += 1;
                
                
                
                
                if ($msg{'apci'} eq "A_GroupValue_Write") { # Telegramm eingetroffen
                        if ($msg{'dst'} eq $Schlafen_ga) {
                            return if $msg{'value'} == 1;
                
                
                # Fernseher ausschalten
                knx_write($VDR_aus_ga,1,1);
                
                foreach my $element (@Ausgang_ga) {
                
                # Alle ausschalten
                        plugin_log($plugname,$element->{name});
                        knx_write($element->{ga},0,1);
                        usleep(200);
                        }
                        }
                # Bei Nacht PM im Flur sperren
                        if ($hour <5 or $hour>20) {
                        plugin_log($plugname,"PM gesperrt");
                        knx_write ($PM_sperren_ga,1,1);
                        }
                } else { # zyklischer Aufruf/initialisierung
                    #subscribe GAs
                        $plugin_subscribe{$Schlafen_ga}{$plugname} = 1;
                }
                return;
                Einer an:
                Code:
                # COMPILE_PLUGIN
                
                my @Oder_ga;
                my $Ausgang_ga="15/0/201";
                
                
                push @Oder_ga, { name => "Wohnzimmer", ga => "0/0/201"};
                push @Oder_ga, { name => "Küche", ga => "2/0/201"};
                push @Oder_ga, { name => "Büro", ga => "1/0/201"};
                push @Oder_ga, { name => "Moritz", ga => "3/0/201"};
                push @Oder_ga, { name => "Felix", ga => "4/0/1"};
                push @Oder_ga, { name => "Flur Neubau", ga => "4/0/201"};
                push @Oder_ga, { name => "Flur Altbau", ga => "5/0/241"};
                push @Oder_ga, { name => "Schlafzimmer", ga => "6/0/201"};
                
                
                $plugin_info{$plugname.'_cycle'} = 0;
                
                if ($msg{apci} eq 'A_GroupValue_Response'){
                        return ;
                        }
                
                my $Oderwert;
                my $Oderwert1;
                foreach my $element (@Oder_ga) {
                        $plugin_subscribe{$element->{ga}}{$plugname} = 1;
                        $Oderwert1=knx_read($element->{ga},0,1);
                #       plugin_log($plugname,$element->{name}.' '.$Oderwert1);
                        $Oderwert=$Oderwert || $Oderwert1;
                        }
                if (knx_read($Ausgang_ga,0,1)!=$Oderwert){
                        knx_write($Ausgang_ga,$Oderwert,1);
                        }
                
                return ;
                vG
                Wolfgang

                Kommentar


                  #9
                  Hab das Thema mal in's WG-Forum verschoben, da es mit der CV nichts zu tun hat.
                  TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

                  Kommentar


                    #10
                    Hallo,

                    Danke fürs verschieben

                    Habe nun mein erstes Plugin fertig und es funktioniert

                    Die Frage ist nur, ob das elegant so ist oder katastrophal

                    Die Taster GA 0/1/203 hat dazu noch alle Sperrobjekte von allen PM´s in der ETS verknüpft dann muss ich das nicht noch hier in dem Plugin machen. Oder sollte man das nicht tun?
                    Code:
                    # Plugin Schlafen/Aufstehen
                    # V1.0 2014-01-11
                    
                    ### Definitionen
                    my $taster_ga = "0/1/203";
                    
                    #Alle Raffstoren in einem Array
                    my $raffstore_nord = "3/3/0";
                    my $raffstore_sued = "3/4/0";
                    my $raffstore_west = "3/5/0";
                    my $raffstore_schlafzimmer = "3/6/0";
                    my $raffstore_ankleide = "3/7/0";
                    
                    #Alles aus
                    my $zentral_aus = "1/0/248";
                    
                    #Lueftung
                    my $lueftung_soll_ga = "6/0/4";
                    
                    # Plugin an Gruppenadresse "anmelden"
                    $plugin_subscribe{$taster_ga}{$plugname} = 1;
                    
                    # Plugin anmelden
                    if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $taster_ga) {
                       
                    plugin_log($plugname,"Taster gedrückt: Wert: " . $msg{'value'});
                       
                       if ($msg{'value'} eq 1) {
                         #sende 25% für Stufe 2
                         knx_write($lueftung_soll_ga,25,5);
                       
                         #sende 1 für ab
                         knx_write($raffstore_nord,1,1);
                         knx_write($raffstore_sued,1,1);
                         knx_write($raffstore_west,1,1);
                         knx_write($raffstore_schlafzimmer,1,1);
                         knx_write($raffstore_ankleide,1,1);
                       
                         #sende 0 fuer alles aus
                         knx_write($zentral_aus,0,1);
                       } 
                       if ($msg{'value'} eq 0) {
                         #sende 50% für Stude 5
                         knx_write($lueftung_soll_ga,50,5);
                       
                         #sende 0 für auf
                         knx_write($raffstore_nord,0,1);
                         knx_write($raffstore_sued,0,1);
                         knx_write($raffstore_west,0,1);
                         knx_write($raffstore_schlafzimmer,0,1);
                         knx_write($raffstore_ankleide,0,1);
                       
                       }
                       
                    }

                    Kommentar


                      #11
                      Sieht gut aus Hätte ich für mich auch nicht anders gelöst.

                      Wenn ich sowas für andere/die Community schreibe, gestalte ich das ganze modular mit Array damit jederzeit beliebig viele GA's und Zustände einfach eingepflegt werden können ohne die Programmierung anzufassen
                      Gruss Patrik alias swiss

                      Kommentar


                        #12
                        Ich auch, ist schlampig geschrieben und war mein erster Test. Sachen die ich hier "veröffentliche" werden sauberer geschrieben, versprochen

                        Wollte erst mal das Prinzip verstehen

                        Danke dir!

                        Kommentar


                          #13
                          Noch eine Frage als Nachtrag.

                          Ich habe nun mit diesem Plugin ja eigentlich nichts anderes als eine Szene dargestellt.

                          Was ist nun eigentlich sinnvoller?

                          Solche Szenen über das WG abbilden, wie Kochen, Essen, Fernsehen, etc.
                          Oder dies mittels den Szenen meiner MDT Taster bzw. gira TS3 Komfort?

                          Oder Szenen soweit wie möglich direkt in der ETS abbilden und nur Logiken dann per WG? Das heißt ich greife per WG Plugin den Wert der Szenen GA ab und reagiere auf den gewünschten Wert und überschreibe zum Beispiel eine Aktion.

                          Beispiel: Szene Fernsehen.

                          Ich nutze die internen Szenen meines TS3.
                          Spots Aus
                          Lichtvoute an
                          Raffstoren runter fahren.

                          Nun möchte ich Logik drinnen haben.
                          1. Raffstoren sollen nur runterfahren wenn es draußen hell ist und die Sonne in den Raum scheint(Helligkeitssensor)
                          Dazu würde ich per WG Plugin auf die GA der Szene reagieren (Tastendruck) und die Bedingungen prüfen und ggf. Die Raffstoren direkt wieder hochfahren lassen, oder sollte ich die Raffstoren dann garnicht über die Szene steuern, sondern direkt über das Plugin nach Prüfung der Befingungen.

                          2. Szene Fernsehen soll noch den TV per IRTrans einschalten.
                          Ich greife per Plugin ebenfalls den Tastendruck ab und schalte per Plugin noch den TV ein?

                          3. die Szene TV soll automatisch aufgerufen werden, wenn der TV eingeschaltet wird.
                          Hier würde ich per Plugin auf die GA reagieren wo der aktuelle Stromverbrauch des Aktors vom TV drauf liegt und bei Überschreitung von x Watt die Szene TV starten.
                          Der Taster TV hört dann darauf um mitzubekommen, dass die Szene aktiv ist.
                          Das Plugin würde man dann periodisch aufrufen oder starten wenn die GA vom Stromverbrauch was empfängt?

                          Kommentar


                            #14
                            Zu 1... Da würde ich die Raffstoren aus der Szene nemen und das Plugin die ansteuerung übernehmen lassen...

                            Zu 2... Jup genau so

                            Zu 3... Das würde ich nicht zyklisch sondern beim eintreffen eines Telegramms machen. Wie Szenenlogik auch
                            Gruss Patrik alias swiss

                            Kommentar

                            Lädt...
                            X