Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - BUG oder Anwenderfehler: KNXWRITE auf DPT 5.005

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

  • Bodo
    antwortet
    Zitat von makki Beitrag anzeigen
    sonst wirds als Zahl übergeben; 5 geht beides, 5.005 nicht, Perl-Magic
    Hoi

    Das Komma und der Punkt, das sind halt so Sachen die dann eventuell unkorrekt als Dezimalzahl interpretiert werden...

    Einen Kommentar schreiben:


  • makki
    antwortet
    Kein Problem dafür sind wir ja da

    "" (also doppelte Gänsefüsschen) um $element->{DPT} täte es vermutlich, sonst wirds als Zahl übergeben; 5 geht beides, 5.005 nicht, Perl-Magic

    Makki

    Einen Kommentar schreiben:


  • Fechter65
    antwortet
    Hallo Makki

    Es tut mir leid, wenn ich Dir keine Ruhe lasse. Der Vollständigkeit halber hier mein Plugin:

    Code:
    # Treppenlichtlogik:  
    # V1.0 2012-08-13
    #
    ##############################
    ### Initialisierung 
    #
    use POSIX;
    #-----------------------------------------------------------------------------
    # konfigurierbare Werte, eigentliche Definition erfolgt in der conf-Datei
    #-----------------------------------------------------------------------------
    my @Aufgaben = ();
    
    ### Ende Initialisierung 
    ##############################    
    #
    ##############################
    ###Subroutinen
    #
    #-----------------------------------------------------------------------------
    # Numerischen string als Zahl zurückgeben
    # - blanks entfernen
    # - führende Nullen entfernen
    #-----------------------------------------------------------------------------
    sub toNumber
    {
        my $value = shift;
        (!defined $value) and return 0;
    
        $value =~ s/\s+//g; # whitespace entfernen
        $value =~ s/^0+(.)$/$1/g; # fuehrende Nullen entfernen
        return $value;
    } # toNumber
    
    #-----------------------------------------------------------------------------
    # Auswertung von Bereichs und Listenvergleichen
    # Prueft, ob ein Wert zu einer Liste oder in einen Bereich passt
    #-----------------------------------------------------------------------------
    sub matches
    {
        my ($value, $def) = @_;  # Zu pruefender Wert, Bereichsdefinition
        (!defined $def)  and return 1;
        $value = &toNumber($value);
    
        foreach (split(/,/, $def))
        {
            $_ = &toNumber($_);
        # Vergleich auf Alpha-Basis (vermeidet Laufzeit-Fehler)
            (/^$value$/) and return 1;
            (/^([\d]+)-(\d+)/) and return ($value >= $1 && $value <= $2);
        }
        return 0;
    } # matches
    
    
    sub readConf
    {
        my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
        if (! -f $confFile)
        {
            plugin_log($plugname, " no conf file [$confFile] found."); 
        }
        else
        {
    #        plugin_log($plugname, " reading conf file [$confFile]."); 
            open(CONF, $confFile);
            my @lines = <CONF>;
            close($confFile);
            my $result = eval("@lines");
    #        ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
            if ($@) 
            {
                plugin_log($plugname, "conf file [$confFile] returned:");
                my @parts = split(/\n/, $@);
                plugin_log($plugname, "--> $_") foreach (@parts);
            }
        }
    } # readConf
    #
    ### Ende Subroutinen
    ##############################
    #
    ###Main
    ###############################
    my $Aufruf_ga ="";    
    my $timeAusloeser =0;    
    &readConf();
    # Eigenen Aufruf-Zyklus auf 1s setzen
    $plugin_info{$plugname.'_cycle'} = 1; 
    #Anmelden aller betroffenen Gruppenadressen
    foreach my $element (@Aufgaben) {
        $plugin_subscribe{$element->{GA_Ausloeser}}{$plugname} = 1;    
    }
    # Abarbeiten eines Aufrufs
        #nur ausführen wenn das Telegram ein Write Telegram ist und kein Read oder Response Telegram.
        if ($msg{'apci'} eq "A_GroupValue_Write") {  
            my $Aufruf_ga = $msg{'dst'};
    #plugin_log($plugname, $Aufruf_ga); 
            foreach my $element (@Aufgaben) {
                if ($Aufruf_ga eq ($element->{GA_Ausloeser})) {
                    (defined $element->{Aktiv} && !$element->{Aktiv})                    and next;
                    (defined $element->{Log}   && $element->{Log} eq '1') and 
                        plugin_log($plugname, "[$element->{GA_Ausloeser}]: Preparing Value[$element->{Wert}] to GA[$element->{GA_Aktion}], $element->{Name}"); 
                    if (!$plugin_info{$plugname."_".$element->{Name}}){
                        #Startzeit erfassen:
                        $plugin_info{$plugname."_".$element->{Name}} = time();
                    }
                }
                # wenn Bedingung nicht zutrifft, dann das nächste Element abarbeiten
                else {
                     next;
                }
            }
        }
        else {foreach my $element (@Aufgaben) {
                    (defined $element->{Aktiv} && !$element->{Aktiv})                    and next;
                    $timeAusloeser = $plugin_info{$plugname."_".$element->{Name}};
                    if (($timeAusloeser > "") && (time() - $timeAusloeser > $element->{Delay})) {
                        delete($plugin_info{$plugname."_".$element->{Name}});
                        knx_write($element->{GA_Aktion},$element->{Wert}, $element->{DPT});   
                        (defined $element->{Log}   && $element->{Log} eq '1') and 
                            plugin_log($plugname, "[$element->{GA_Ausloeser}]: Sending Value[$element->{Wert}] to GA[$element->{GA_Aktion}], $element->{Name}"); 
                    }
                        # wenn Bedingung nicht zutrifft, dann das nächste Element abarbeiten
                else {
                     next;
                }
            }
    
        }
    return;
    Code:
    ##############################
    ### Definitionen 
    #
    @Aufgaben = 
        ( 
          {Name=>'PraxisStosslueften', Aktiv=>'1', GA_Ausloeser=>'7/2/225', GA_Aktion=>'7/2/205', Delay=>600, Wert=>"0", DPT=>'5', Log=>'1'  },
          {Name=>'KanzleiStosslueften', Aktiv=>'1', GA_Ausloeser=>'7/3/225', GA_Aktion=>'7/3/205', Delay=>600, Wert=>"0", DPT=>'5', Log=>'1'  },
          {Name=>'WohnungStosslueften', Aktiv=>'1', GA_Ausloeser=>'7/4/225', GA_Aktion=>'7/4/205', Delay=>600, Wert=>"0", DPT=>'5', Log=>'1'  }
        );    
    #
    ### Ende Definitionen 
    ##############################
    Dies nur zwecks Dokumentation.
    Beste Grüsse
    Diego

    Einen Kommentar schreiben:


  • makki
    antwortet
    Hat mir jetzt doch keine Ruhe gelassen: '5.005' als String übergeben funktioniert sowohl beim en- als auch beim decode;
    Was nicht geht ist 5.005 als Zahl (ohne Gänsefüsschen)

    Makki

    Einen Kommentar schreiben:


  • Fechter65
    antwortet
    Besten Dank für Eure Rückmeldungen.

    Mit DPT "5" arbeitet der KNX-Writebefehl.

    Bleibt noch das Problem mit Frys Logikprozessor, der sich den Datentyp aus der eibga.conf holt.

    Herzliche Grüsse
    Diego

    Einen Kommentar schreiben:


  • makki
    antwortet
    Richtig, 5.005 gibt es da so nicht, geht aber mit "5", ich hab das mal auf die Liste der Grausamkeiten geschrieben

    Makki

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hi,

    soviel ich weiß, gibt es den 5.005 beim knxwrite gar nicht! Du schreibst dpt5 (also nur 5 als Argument). Dann klappt auch alles.

    Gruß, Waldemar

    Einen Kommentar schreiben:


  • - √ - BUG oder Anwenderfehler: KNXWRITE auf DPT 5.005

    Ich versuchte zunächst mit dem Logikprozessor von Fry (herzlichen Dank für das mächtige und tolle Plugin) eine Treppenlichtfunktion umzusetzen. Ziel war es, auf eine GA vom Datenpunkttyp 5.005 den Wert 0 zu schreiben. Die GA war entsprechend definiert in eibga.conf.
    Dies führte dazu, dass zwar in der Pluginlog-Datei ein entsprechender Eintrag zu finden war, im KNX (resp. im Busmonitor) nie ein entsprechender Wert ankam, resp. zu sehen war.

    Daraufhin habe ich selbst ein Plugin zusammengeschustert, welche die Treppenlichtfunktion umsetzt. Auch hier war KNXWrite (GA, 0, 5.005") im Busmonitor nicht zu sehen.

    Nachdem ich in meinem Plugin beim KNXWrite den DPT auf "1" geändert habe, arbeitete alles korrekt. Daraufhin änderte ich auch den Eintrag in eibga.conf, woraufhin auch Frys Logikprozessor zum gewünschten Resultat führte.

    Habe ich irgend etwas falsch gemacht?
    Beste Grüsse
    Diego
Lädt...
X