Ankündigung

Einklappen
Keine Ankündigung bisher.

I-Button Plugin

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

    [wiregate] I-Button Plugin

    Heute läufts bei mir gar nicht so rund mit erweiterungen...
    Hab mir heute ein Digitales Schlüsselbrett gebaut in ein wenig anderer Variante.
    Funktioniert ganz gut soweit (Bis auf die LEd´s da warte ich noch auf StefanW )

    Ich wollte mir ein Plugin erstellen, um die Anwesenheits kontrolle ein und aus zu schalten. Klingt einfach. ABER:
    Ich hab 4 I-Buttons. Wenn alle ab sind soll die Anwesenheit ausgeschalten werden. Und sobald einer eingesteckt wird soll sie eingeschalten werden.

    Ich hab versucht mit an dem RolladenPlugin anzulehnen (die chin. Variante, hab wichtige Teile geändert) und schon ging gar nix mehr.

    Ich hab im Anschluss versucht ein ganz einfaches Plugin zu erstellen ohne hash usw. sondern nur wenn Telegramm kommt und value == 1 dann "return "ok"". Aber nicht mal das geht.
    Die CSV hab ich dann auch mal neu importiert, bringt aber auch nix.

    Das == hab ich auch mal versucht durch "eq" zu ersetzen. Woran scheitert es??

    Code:
    ##########################################################
    
    #################################################################
    # do not change anything below, all config stays above
    #################################################################
    
    my $schwarz= '13/2/1';
    my $blau= '13/2/2';
    my $gelb= '13/2/4';
    my $rot = '13/2/3';
    # subscribe plugin and call it only when necessary
    $plugin_subscribe{$schwarz}{$plugname} = 1;
    $plugin_subscribe{$gelb}{$plugname} = 1;
    $plugin_subscribe{$blau}{$plugname} = 1;
    $plugin_subscribe{$rot}{$plugname} = 1;
    $plugin_info{$plugname.'_cycle'} = 0;
    
    
    my @AlleButtons;
    push @AlleButtons, {name => "rot", GA => "13/2/3", anwesend => "0/0/1", ein => 1, aus => 0 };
    push @AlleButtons, {name => "schwarz", GA => "13/2/1", anwesend => "0/0/1", ein => 1, aus => 0 };
    push @AlleButtons, {name => "blau", GA => "13/2/2", anwesend => "0/0/1", ein => 1, aus => 0 };
    push @AlleButtons, {name => "gelb", GA => "13/2/4", anwesend => "0/0/1", ein => 1, aus => 0 };
    
    
    foreach my $element (@AlleButtons) {
    if ($msg{'dst'} eq ($element->{GA}) && ($msg{'apci'} eq 'A_GroupValue_Write'))
    {
    
    if ($msg{'value'} == 1) {
    ##        Anwesenheit($element->{ein}, $element->{GA});
    ##        plugin_log($plugname,"name: " . $element->{name} . "; ein: ");
    return "yes";
    }
    
    }
    }
    #sub Alleaus {
    #my ($global, $GA) = @_;
    #if ($global== 0 || $global == 1) {
    #knxwrite ($GA,$global,1);
    #}
    #}
    
    #sub Anwesenheit {
    #my ($anw, $GA) = @_;
    #if ($anw == 0 || $anw == 1) {
    #knxwrite ($GA,$anw,1);
    #}
    #}
    ich rel. viel auskommentiert um den Fehler zu suchen.
    Bitte helft mir!!


    Gruß

    #2
    Jetzt muss ich mir selbst antworten.
    War ein doofer tipp Fehler.
    So gehts schonmal:

    Code:
    ##########################################################
    
    #################################################################
    # do not change anything below, all config stays above
    #################################################################
    
    my $schwarz= '13/2/1';
    my $blau= '13/2/2';
    my $gelb= '13/2/4';
    my $rot = '13/2/3';
    # subscribe plugin and call it only when necessary
    $plugin_subscribe{$schwarz}{$plugname} = 1;
    $plugin_subscribe{$gelb}{$plugname} = 1;
    $plugin_subscribe{$blau}{$plugname} = 1;
    $plugin_subscribe{$rot}{$plugname} = 1;
    $plugin_info{$plugname.'_cycle'} = 0;
    
    
    my @AlleButtons;
    push @AlleButtons, {name => "rot1", GA => "13/2/3", anwesend => "0/0/0", ein => 1, aus => 0 };
    #push @AlleButtons, {name => "schwarz", GA => "13/2/1", anwesend => "0/0/1", ein => 1, aus => 0 };
    #push @AlleButtons, {name => "blau", GA => "13/2/2", anwesend => "0/0/1", ein => 1, aus => 0 };
    #push @AlleButtons, {name => "gelb", GA => "13/2/4", anwesend => "0/0/1", ein => 1, aus => 0 };
    
    
    foreach my $element (@AlleButtons) {
    if ($msg{'dst'} eq ($element->{GA}) && ($msg{'apci'} eq 'A_GroupValue_Write'))
    {
    
    if ($msg{'value'} == 1) {
            Anwesenheit($element->{ein}, $element->{anwesend});
            plugin_log($plugname,"name: " . $element->{name} . "; ein: ");
    return "yes";
    }
    if ($msg{'value'} == 0) {
            my $element->{name} = 0; 
            Alleaus($element->{aus}, $element->{anwesend});
            Anwesenheit($element->{aus}, $element->{anwesend});
            plugin_log($plugname,"name: " . $element->{name} . "; aus: ");
    return "yes";
    }
    
    
    } else {
    next;
    }
    }
    
    
    
    
    
    sub Alleaus {
    my ($global, $GA) = @_;
    if ($global == 0 || $global == 1) {
     
    }
    }
    
    sub Anwesenheit {
    my ($anw, $GA) = @_;
    if ($anw == 0 || $anw == 1) {
    knx_write ($GA,$anw,1);
    return;
    }
    }
    in dem Alleaus block würde ich gerne ein: wenn alle aus sind schalte die Anwesenheit aus machen. Wie für jeden Button ein Wert übergeben, die dann anschließend verglichen werden, und wenn alle 0 sind soll er die anwesenheit global auf 0 setzen.
    ohne dass ich die GA jedes mal lesen lassen muss??

    Die einzigste Idee die ich hatte war am ende des Plugins für jedes element ein knx_read auf alle I-Button GA´s zu machen um heraus zu finden ob die anderen auch 0 sind... sollte aber performance technisch nicht optimal sein. Daher würde ich sie gerne intern übergeben, ohne die GA lesen zu müssen. Hoffe das war verständlich.



    Gruß

    Kommentar


      #3
      Hallo Volker

      Die werte für DPT1 kommen als hex. Ich denke du müsstest hier auch 00 für 0 und 01 für 1 verwenden. Da der Vergleich nummerisch ist, muss da ein == hin. Mit eq geht das AFAIK nicht
      Gruss Patrik alias swiss

      Kommentar


        #4
        Hi,

        Danke für die Antwort. Hatte es folgendermaßen hinbekommen:

        Code:
        ##########################################################
        
        #################################################################
        # do not change anything below, all config stays above
        #################################################################
        
        my $schwarz= '13/2/1';
        my $blau= '13/2/2';
        my $gelb= '13/2/4';
        my $rot = '13/2/3';
        my $Anwesenheit = '13/2/0';
        # subscribe plugin and call it only when necessary
        $plugin_subscribe{$schwarz}{$plugname} = 1;
        $plugin_subscribe{$gelb}{$plugname} = 1;
        $plugin_subscribe{$blau}{$plugname} = 1;
        $plugin_subscribe{$rot}{$plugname} = 1;
        $plugin_info{$plugname.'_cycle'} = 0;
        
        
        my @AlleButtons;
        push @AlleButtons, {besitzer => "Elisa", name => "rot1", GA => "13/2/3", anwesend => "13/2/0", ein => 1, aus => 0 };
        push @AlleButtons, {besitzer => "Volker", name => "schwarz", GA => "13/2/1", anwesend => "13/2/0", ein => 1, aus => 0 };
        push @AlleButtons, {besitzer => "Samuel", name => "blau", GA => "13/2/2", anwesend => "13/2/0", ein => 1, aus => 0 };
        push @AlleButtons, {besitzer => "Christina", name => "gelb", GA => "13/2/4", anwesend => "13/2/0", ein => 1, aus => 0 };
        
        
        foreach my $element (@AlleButtons) {
        if ($msg{'dst'} eq ($element->{GA}) && ($msg{'apci'} eq 'A_GroupValue_Write'))
        {
        
        if ($msg{'value'} == 1) {
                
                Alleaus($element->{ein}, $element->{anwesend});
                plugin_log($plugname,"name: " . $element->{name} . "; ein: ");
        return "yes";
        }
        if ($msg{'value'} == 0) { 
                Alleaus($element->{aus}, $element->{anwesend});
                
                plugin_log($plugname,"name: " . $element->{name} . "; aus: ");
        return "no";
        }
        
        
        } else {
        next;
        }
        }
        
        sub Alleaus {
        my $rot_stat = knx_read($rot,0,1);
        my $schwarz_stat = knx_read($schwarz,0,1);
        my $gelb_stat = knx_read($gelb,0,1);
        my $blau_stat = knx_read($blau,0,1);
        my ($global, $GA) = @_;
        if ($global == 0 || $global == 1) {
        
         if (($rot_stat == 0) && ($blau_stat == 0) && ($gelb_stat == 0) && ($schwarz_stat == 0)) {
            knx_write($GA,0,1);
            return "keiner daheim";
        }
        }
        if (($rot_stat == 1) or ($blau_stat == 1) or ($gelb_stat == 1) or ($schwarz_stat == 1)) {
        knx_write($GA,1,1);
        return "Wilkommen zuahause";
        }
        }
        blöder Weise wird der Status der I-Buttons alle 300s neu gesendet. d.h ich bekomme alle 300s umsonst telegramme.
        Nebenbei geht die persönliche Begrüßung auch nicht, da ich alle 300s neu begrüßt werde

        Gruß

        Kommentar


          #5
          Um die Wiederholung der Telegramme zu filtern könntest du ja immer noch die Zustände zwischenspeichern und beim erneuten eintreffen eines Telegramms überprüben ob sich der Zustand geändert hat.
          Gruss Patrik alias swiss

          Kommentar


            #6
            Würdest du mir ein Tipp geben wie man zwischen speichert?

            Gruß

            Sent from my LG-P920 using Tapatalk

            Kommentar


              #7
              Das ist ganz einfach.

              Code:
              foreach my $element (@AlleButtons) {
                   if ($msg{'dst'} eq ($element->{GA}) && ($msg{'apci'} eq 'A_GroupValue_Write')[B] && knx_read($msg{'dst'},0,1) != $plugin_info{$plugname.'_' . ($element->{name}) }[/B])
                   {
                        if ($msg{'value'} == 1) {
                             Alleaus($element->{ein}, $element->{anwesend});
                             plugin_log($plugname,"name: " . $element->{name} . "; ein: ");
                             return "yes";
                        }elsif ($msg{'value'} == 0) {                Alleaus($element->{aus}, $element->{anwesend});
                             plugin_log($plugname,"name: " . $element->{name} . "; aus: ");
                             return "no";
                        }
                        [B]$plugin_info{$plugname.'_' . ($element->{name}) } = knx_read($element->{GA} ,0,1);[/B]
              
                   } else {
                        next;
                   }
              }
              Sollte so eigentlich gehen. Kannst es ja mal testen
              Gruss Patrik alias swiss

              Kommentar


                #8
                Mit der Zeilen erweiterung:

                Code:
                [B]&& knx_read($msg{'dst'},0,1) != $plugin_info{$plugname.'_' . ($element->{name}) }[/B])
                bekomme ich ein haufen fehler, dass teste ich morgen mal.
                Danke!

                Gruß

                Kommentar


                  #9
                  So ich hab deinen Code Block eingefügt. Ohne Fehler diesmal.
                  Aber ich bekomme immer noch alle 300s ne Begrüßung.
                  Wenn ich dass richtig verstanden habe übergibst du mit Plugin_Info den Status eines jeden elements wenn im folgenden ein "knx_read" für das element ausgeführt wird?
                  Ich habe die vermutung dass ich in meinen subs nicht auf die Info zurück greife, muss ich da was spezielles ändern?

                  Gruß und Dankeschön!

                  Kommentar


                    #10
                    Muss ich mir wieder selbst antworten...
                    Ich muss zugeben, dass ich mir mit den Perl Plugins sehr sehr hart tue.
                    Ich hab das jetzt vorerst über linknx gelöst, da tu ich mir um einiges leichter... (copy/paste fraktion )

                    folgender Code in linknx tut dass was ich will:
                    Code:
                    ## I-Buttons
                            <object id="rot" gad="13/2/3" type="1.001" init="persist" flags="cwtur">Rot</object>
                            <object id="gelb" gad="13/2/4" type="1.001" init="persist" flags="cwtur">Gelb</object>
                            <object id="schwarz" gad="13/2/1" type="1.001" init="persist" flags="cwtur">Schwarz</object>
                            <object id="blau" gad="13/2/2" type="1.001" init="persist" flags="cwtur">blau</object>
                                    <object id="merker_button" gad="13/2/6" type="1.001" init="persist" flags="cwtur">merker</object>
                                </objects>
                            <rules>
                            
                    <rule id="I-Buttons-aus">
                    <condition type="and">
                    <condition type="object" id="rot" trigger="true" value="0"/>
                    <condition type="object" id="gelb" trigger="true" value="0"/>
                    <condition type="object" id="schwarz" trigger="true" value="0"/>
                    <condition type="object" id="blau" trigger="true" value="0"/>
                    </condition>
                    <actionlist>
                    <action type="set-value" id="Anwesend-ein" value="0"/>
                    <action type="set-value" id="merker_button" value="0"/>
                    </actionlist>
                    </rule>
                    
                    <rule id="I-Buttons-ein">
                    <condition type="and">
                    <condition type="or">
                    <condition type="object" id="rot" trigger="true" value="1"/>
                    <condition type="object" id="gelb" trigger="true" value="1"/>
                    <condition type="object" id="schwarz" trigger="true" value="1"/>
                    <condition type="object" id="blau" trigger="true" value="1"/>
                    </condition>
                    <condition type="not">
                    <condition type="object" id="merker_button" trigger="true" value="1"/>
                    </condition>
                    </condition>
                    <actionlist>
                    <action type="set-value" id="merker_button" value="1"/> 
                    <action type="set-value" id="Anwesend-ein" value="1"/>
                    </actionlist>
                    </rule>
                    Weiter unter wird über den merker eine begrüßung geschalten. Das condition=not verhindert bei einem sonderzeichen (nach einem absturz, stromausfall o.ä) dass sich das linknx aufhängt. (persitance file mit sonderzeichen -> linknx.xml kann nicht geladen werden)

                    Mit Perl experimentier ich weiter um es iwie hinzubekommen. Aber wenn ich alle 5 min begrüßt werde eskalier ich demnächst

                    Gruß

                    Kommentar


                      #11
                      Hallo Volker.

                      Auch wenn du das jetzt mit linknx gelöst hast. Könntest du den Letzten Stand deines Plugins nochmal posten. Ich würde es gerne mal testen und sehen wiso es nicht ganz so funktioniert wie es sollte.
                      Gruss Patrik alias swiss

                      Kommentar


                        #12
                        Also er schreibt alles richtig ins Plugin_log, dass und welcher I-Button entfernt oder ran gesteckt wurde,
                        aber die subs werden gar nicht ausgeführt, so ist der letzte stand:

                        Code:
                        ##########################################################
                        
                        #################################################################
                        # do not change anything below, all config stays above
                        #################################################################
                        
                        my $schwarz= '13/2/1';
                        my $blau= '13/2/2';
                        my $gelb= '13/2/4';
                        my $rot = '13/2/3';
                        my $Anwesenheit = '13/2/0';
                        my $merker = '13/2/6';
                        my $begruessung = '13/2/5';
                        # subscribe plugin and call it only when necessary
                        $plugin_subscribe{$schwarz}{$plugname} = 1;
                        $plugin_subscribe{$gelb}{$plugname} = 1;
                        $plugin_subscribe{$blau}{$plugname} = 1;
                        $plugin_subscribe{$rot}{$plugname} = 1;
                        $plugin_info{$plugname.'_cycle'} = 0;
                        
                        
                        my @AlleButtons;
                        push @AlleButtons, {besitzer => "Elisa", name => "rot", GA => "13/2/3", anwesend => "13/2/0", ein => 1, aus => 0 };
                        push @AlleButtons, {besitzer => "Volker", name => "schwarz", GA => "13/2/1", anwesend => "13/2/0", ein => 1, aus => 0 };
                        push @AlleButtons, {besitzer => "Samuel", name => "blau", GA => "13/2/2", anwesend => "13/2/0", ein => 1, aus => 0 };
                        push @AlleButtons, {besitzer => "Christina", name => "gelb", GA => "13/2/4", anwesend => "13/2/0", ein => 1, aus => 0 };
                        
                        
                        foreach my $element (@AlleButtons) {
                             if ($msg{'dst'} eq ($element->{GA}) && ($msg{'apci'} eq 'A_GroupValue_Write') && knx_read($msg{'dst'},0,1) != $plugin_info{$plugname.'_' . ($element->{name}) })
                             {
                                  if ($msg{'value'} == 1 && knx_read($merker == 1)) {
                                       
                                       plugin_log($plugname,"name: " . $element->{name} . "; ein: ");
                                       
                                       return "yes";
                                  }
                                  if ($msg{'value'} == 1 && knx_read($merker == 0)) {
                                  ein($element->{ein}, $element->{anwesend});
                                  begruessung($element->{ein}, $element->{anwesend});
                                  }
                                  
                                  elsif ($msg{'value'} == 0) {               
                                   Alleaus($element->{aus}, $element->{anwesend});
                                       plugin_log($plugname,"name: " . $element->{name} . "; aus: ");
                                       return "no";
                                  }
                                  $plugin_info{$plugname.'_' . ($element->{name}) } = knx_read($element->{GA} ,0,1);
                        
                             } else {
                                  next;
                             }
                        }
                        sub begruessung {
                        knx_write($begruessung,1,1);
                        }
                        
                        sub Alleaus {
                        my $rot_stat = knx_read($rot,0,1);
                        my $schwarz_stat = knx_read($schwarz,0,1);
                        my $gelb_stat = knx_read($gelb,0,1);
                        my $blau_stat = knx_read($blau,0,1);
                        my ($global, $GA) = @_;
                        if ($global == 0 || $global == 1) {
                        
                         if (($rot_stat == 0) && ($blau_stat == 0) && ($gelb_stat == 0) && ($schwarz_stat == 0)) {
                            knx_write($GA,0,1);
                                knx_write($merker,0,1);
                            return "keiner daheim";
                        }
                        }
                        if (($rot_stat == 1) or ($blau_stat == 1) or ($gelb_stat == 1) or ($schwarz_stat == 1)) {
                        if ($merker == 0) {
                        knx_write($GA,1,1);
                        return "Wilkommen zuahause";
                        }
                        else {
                        return;
                        }
                        }
                        }
                        
                        sub ein {
                        my ($global, $GA) = @_;
                        if ($global == 0 || $global == 1) {
                        
                            knx_write($GA,1,1);
                                knx_write($merker,1,1);
                            return "keiner daheim";
                        }
                        
                        else {
                        return;
                        }
                        }
                        Wenn du es hin bekommst wäre es nett wenn du es veröffentlichst!

                        Gruß

                        Kommentar


                          #13
                          Ok. Danke

                          Ich sehe es mir mal durch. Ich bin mir nämlich nicht ganz sicher ob das schreiben und lesen der Zustände einwandfrei funktioniert. Das wird sich aber relativ schnell zeigen.
                          Gruss Patrik alias swiss

                          Kommentar


                            #14
                            PS: Ich glaube das Problem liegt an den returns die du in der foreach schleife eingebaut hast. dadurch wird das Plugin immer verlassen bevor die neuen Zustände remanent gespeichert werden. Desshald wiederholt sich auch die Ansage weil die Remanente-Variabel gar nicht existiert.

                            Ich teste das mal weiter...
                            Gruss Patrik alias swiss

                            Kommentar


                              #15
                              ah ok. die dinger hatte ich rein geschrieben um zu sehen in welchen stadium er hängen bleibt.
                              Jetzt wo ich sie raus genommen hab, schaltet er zumindest mal aus. Aber nicht mehr ein.

                              Gruß

                              Kommentar

                              Lädt...
                              X