Ankündigung

Einklappen
Keine Ankündigung bisher.

Plugin für Fensterzustände

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

    [wiregate] Plugin für Fensterzustände

    Hallo zusammen. Dank der grossartigen Hilfe von makki hab ich nun endlich mein erstes eigenes Plugin am laufen. Es ist noch im Beta stadium aber wer will kann es gerne testen.

    Für Fragen und Anregungen bin ich immer dankbar.

    Grundsätzliches zum Plugin selbst...

    Unter einstellungen ist für jedes Fenster eine GA für den oberen MK, eine GA für den unteren MK und eine GA für den Status einzutragen. Dabei ist darauf zu achten, dass die zusammengehörenden GA's auch an der gleichen Position in den Array's eingetragen werden müssen.

    Der Status wird als 8bit ausgegeben. Folgende Zustände werden ausgegeben:

    0 = Fenster geschlossen
    1 = Fenster offen
    2 = Fenster gekipt
    3 = Fehler (unmöglicher Zustand)


    Und hier das Plugin:

    Code:
    # Plugin zum auswerten beliebig vieler Fensterzustände
    # Version 0.3 10.03.2011
    # Copyright: swiss (https://knx-user-forum.de/members/swiss.html)
    # License: GPL (v2)
    # Aufbau möglichst so, dass man unterhalb der Einstellungen nichts verändern muss!
    
    
    ####################
    ###Einstellungen:###
    ####################
    
    
    my @MK_unten = ('7/1/180','7/1/182','7/1/184'); #Pro Fenster ein Eintrag hinzufügen " ,'GA MK unten' " und die GA eintragen.
    my @MK_oben  = ('7/1/181','7/1/183','7/1/185'); #Pro Fenster ein Eintrag hinzufügen " ,'GA MK oben' " und die GA eintragen.
    my @Status_8bit  = ('9/1/180','9/1/182','9/1/184'); #Pro Fenster ein Eintrag hinzufügen " ,'GA Status' " und die GA eintragen.
    
    
    ######################
    ##ENDE Einstellungen##
    ######################
    
    
    
    # Eigenen Aufruf-Zyklus auf 1T setzen
    $plugin_info{$plugname.'_cycle'} = 86400; 
    # Zyklischer Aufruf nach restart und alle 86400 sek., dient dem anmelden an die Gruppenadresse, einmalig (0) würde in diesem Fall auch genügen
    
    
    my $i = 0; #Hauptzählervariabel für diverse Schleifen im Plugin
    my $m = 0; #Noch eine Hilfsvariabel die zur Laufzeit gebraucht wird
    my %MKs_unten = ();
    my %MKs_oben  = ();
    
    #Hier wird die aktuelle Anzahl Fenster anhand der eingetragenen GA's
    #in "@schluessel_MK_unten" ermittelt.
    my $Fensteranzahl = @MK_unten;
    
    for($i = 0; $i < $Fensteranzahl; $i++) {
        $MKs_unten{$MK_unten[$i]} = '';
        $MKs_oben{$MK_oben[$i]} = '';
    }
    
    #Ab hier werden die remanenten Variabeln ausgelesen und weiter verarbeitet:
    
    my @hilfsarry_MK_oben = split(/-/,$plugin_info{$plugname.'_MKoben'});
    my @hilfsarry_MK_unten = split(/-/,$plugin_info{$plugname.'_MKunten'});
    my $hilfszaehler = $Fensteranzahl * 2;
    
    $hilfszaehler = $hilfszaehler - 2;
    
    
    #An dieser Stelle werden die Hash's mit den aus dem Speicher gelesenen Werten aktualisiert:
    $i = 0;
    
    for(my $hilfsvariabel = 0; $i <= $hilfszaehler; $i = $i + 2) {
        $hilfsvariabel = $i + 1;
        $MKs_unten{$hilfsarry_MK_unten[$i]} = $hilfsarry_MK_unten[$hilfsvariabel];
        $MKs_oben{$hilfsarry_MK_oben[$i]} = $hilfsarry_MK_oben[$hilfsvariabel];
    }
    
    
    #Ab hier wird nun auf eine Statusänderung reagiert:
    
    #Hier werden die Hash's bei Statusänderungen aktualisiert und die neuen Werte auf den BUS geschrieben
    if ($msg{'apci'} eq "A_GroupValue_Write"){
        if (exists($MKs_unten{$msg{'dst'}})){
            $MKs_unten{$msg{'dst'}} = knx_read($msg{'dst'},0,1);
        }
        
        if (exists($MKs_oben{$msg{'dst'}})){
            $MKs_oben{$msg{'dst'}} = knx_read($msg{'dst'},0,1);
        }    
    
        #Ab hier geschieht nun die Berechnung der neuen Zustände:
        
        #Um das zusammen gehörende GA paar (MK oben und MK unten) zu bestimmen, wird die Indexnummer ermittelt
        if (exists($MKs_unten{$msg{'dst'}})){
            for($i = 0; $i < $Fensteranzahl; $i++) {
            if($MK_unten[$i] eq $msg{'dst'}) { last }
            }
        }
        elsif (exists($MKs_oben{$msg{'dst'}})){
            for($i = 0; $i < $Fensteranzahl; $i++) {
            if($MK_oben[$i] eq $msg{'dst'}) { last }
            }
        }
        
        #Hier wird aus den Zuständen der 2 zusammen gehörenden MK's der Status ermittelt und auf den BUS gesendet
        if ($MKs_oben{$MK_oben[$i]} == 0 and $MKs_unten{$MK_unten[$i]} == 0){
            knx_write($Status_8bit[$i],0,5.010); #Wenn das Fenster geschlossen ist, wird eine 0 gesendet
        }
        elsif ($MKs_oben{$MK_oben[$i]} == 1 and $MKs_unten{$MK_unten[$i]} == 1){
            knx_write($Status_8bit[$i],1,5.010); #Wenn das Fenster offen ist, wird eine 1 gesendet
        }
        elsif ($MKs_oben{$MK_oben[$i]} == 1 and $MKs_unten{$MK_unten[$i]} == 0){
            knx_write($Status_8bit[$i],2,5.010); #Wenn das Fenster gekipt ist, wird eine 2 gesendet
        }
        else{
            knx_write($Status_8bit[$i],3,5.010); #Wenn das Fenster einen unmöglichen Zustand hat, wird eine 3 gesendet
        }
    }
    
    #Ab hier werden die Zustände der MK's aufbereitet und danach remanent gespeichert:
    
    my $MKobenListe = '';
    my $MKuntenListe ='';
    
    #Hier werden erst mal alle Hash's in einen String umgewandelt und das Trennzeichen (-) eingefügt
    for($i = 0; $i < $Fensteranzahl; $i++) {
        $MKobenListe = $MKobenListe.$MK_oben[$i];
        $MKobenListe = $MKobenListe."-";
        $MKobenListe = $MKobenListe.$MKs_oben{$MK_oben[$i]};
        if ($i != ($Fensteranzahl - 1)){
            $MKobenListe = $MKobenListe."-";
        }
        
        $MKuntenListe = $MKuntenListe.$MK_unten[$i];
        $MKuntenListe = $MKuntenListe."-";
        $MKuntenListe = $MKuntenListe.$MKs_unten{$MK_unten[$i]};
        if ($i != ($Fensteranzahl - 1)){
            $MKuntenListe = $MKuntenListe."-";
        }
        
        #Hier werden alle MK - GA's angemeldet
        $plugin_subscribe{$MK_oben[$i]}{$plugname} = 1;
        $plugin_subscribe{$MK_unten[$i]}{$plugname} = 1;
    }
    
    
    #Hier werden die neu erstellten Zustandslisten an die remanenten Variabeln übergeben.
    $plugin_info{$plugname.'_MKoben'} = $MKobenListe;
    $plugin_info{$plugname.'_MKunten'} = $MKuntenListe;
    Gruss Patrik alias swiss

    #2
    Kann es sein, dass das Plugin die Zustände nach einem Wiregate-Neustart nicht aktualisiert? Bzw. kann/muss man das WG irgendwie dazu bewegen die Zustände neu zu Lesen?
    Gruß -mfd-
    KNX-UF-IconSet since 2011

    Kommentar


      #3
      Richtig. Dieses uralte Plugin aus meinen Anfängen mit Perl reagiert nicht auf einen Neustart. Das bedeutet, dass wenn sichder Zustand eines fensters wärend eines neustarts verändert, dass dies das Wiregate nicht mit bekommt und den falschen Status ausgibt.

      Hast du eine genauere Umschreibung des auftretenden Fehlers? Stimmt "nur" der Zustand nicht (z.B. offen obwohl geschlossen) oder werden ungültige Zustände (3 = Fehler) ausgegeben?
      Gruss Patrik alias swiss

      Kommentar


        #4
        Es wird einfach gar kein Zustand nach WG-Neustart angezeigt also nur " - ".
        Erst wenn man dann z.B. Fenster öffnet und wieder schließt passt die Anzeige und der jeweilige Zustand wird angezeigt.
        Alle Binäreingänge sind "Lesen" aktiviert.
        Gruß -mfd-
        KNX-UF-IconSet since 2011

        Kommentar


          #5
          Ach sooo... Der Zustand wird in der CometVisu ausgegeben... Joa dann ist natürlich der Cache leer und weil das Plugin nicht antwortet wird auch nichts angezeigt.

          Ob es aber sinnvoll ist nach einem Neustart alle Zustände abzufragen ist das andere... Was ich machen könnte (relativ einfach zu lösen) dass wenn das Wiregate neustartet, dass alle Zustände die remanent gespeichert sind auf den BUS gesendet werden.
          Gruss Patrik alias swiss

          Kommentar


            #6
            Zitat von swiss Beitrag anzeigen
            Was ich machen könnte (relativ einfach zu lösen) dass wenn das Wiregate neustartet, dass alle Zustände die remanent gespeichert sind auf den BUS gesendet werden.
            Ja, das wäre denke ich vollkommen ausreichend. Wenn das klappen würde wäre super.
            Gruß -mfd-
            KNX-UF-IconSet since 2011

            Kommentar

            Lädt...
            X