set / get zur Laufzeit erweitern

Begonnen von betateilchen, 28 Mai 2026, 16:57:37

Vorheriges Thema - Nächstes Thema

betateilchen

Wahrscheinlich ist die Lösung so simpel, dass ich einfach nicht draufkomme.

Aktuell stehe ich vor der Aufgabe, die Liste der möglichen set-Befehle in einem device zur Laufzeit um weitere Befehle zu erweitern, wenn ein bestimmtes Attribut gesetzt wird.

Dass getAllSets() "set ... ?" aufruft und die "Fehlermeldung" auswertet, weiß ich.
Aber das hilft mir ja nicht, die Optionen zu erweitern.

Mir fehlt sowas wie

sub addToDevAttrList($$;$$);
sub delFromDevAttrList($$);

nur für set/get.

BTW: was verbirgt sich eigentlich hinter diesem Konstrukt:

  if(AttrVal("global", "apiversion", 1)> 1) {
    my @setters= getSetters($defs{$d});
    return join(" ", @setters);
  }

Was ist denn "apiversion"? Die commandref schweigt sich dazu aus.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

Die Instanz muss doch einfach nur den Befehl ausführen.... (und auf das Kommando mit "keiner" Info antworten).

Und optimaler Weise auf die Anfrage mit ? eine zutreffende Antwort geben ;) .
Server: HP-elitedesk@Debian 13, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

Ja.

Hast Du mein 'Problem' verstanden?

  • Die Instanz wird per xx_Define() angelegt (und ggf. auch benutzt).
  • In xxx_Set() sind drei mögliche Befehle enthalten.
  • Jetzt wird irgendwann xxx_Attr() ausgeführt und ein bestimmtes optionales Attribut gesetzt.
  • Danach sollen weitere zwei mögliche Befehle in xxx_Set() zur Verfügung stehen.

Das Attribut schaltet quasi weitere Befehle frei, die man dann auch im Frontend zur Auswahl finden soll.
Ohne das gesetzte Attribut machen die Befehle in der Dropdown-Liste keinen Sinn.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#3
Zitat von: betateilchen am 28 Mai 2026, 16:57:37Wahrscheinlich ist die Lösung so simpel, dass ich einfach nicht draufkomme.

Jo. Das Problem habe ich jetzt dadurch gelöst, dass ich die möglichen setter in den devicehash schreibe.
Dort kann ich die beliebig ergänzen und auch wieder reduzieren.

In xxx_Set() werden drei setter hinzugefügt:

  $defs{$name}{set}{sendmsg}       = "";
  $defs{$name}{set}{backup_peers}  = ":noArg";
  $defs{$name}{set}{restore_peers} = ":noArg"; 

  return ("Unknown argument $a->[1], choose one of ".
        join(" ", map { "$_$defs{$name}{set}{$_}" } sort keys %{$defs{$name}{set}}))
        if(!defined($defs{$name}{set}{$a->[1]}));

In xxx_Attr() werden bei Bedarf zwei weitere setter hinzugefügt:

  if($attrName eq "useAuth" && $type eq "set" && $param[0] == 1) {
    $defs{$devName}{set}{user_add}    = "";
    $defs{$devName}{set}{user_delete} = "";
  }

und bei $type eq "del" oder bei $param[0] == 0 werden die beiden EInträge wieder gelöscht.

Funktioniert offenbar problemlos.

Falls jemandem was Besseres/Einfacheres einfällt, immer raus damit!


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Ich haette die zusaetzlichen Befehle erst in xxx_Set in Abhaengigkeit der Attribute temporaer hinzugefuegt, aber das ist sicher Geschmacksfrage.

ZitatWas ist denn "apiversion"? Die commandref schweigt sich dazu aus.
Das ein Uebrigbleibsel von dem Versuch von Boris, in FHEM standardisierte Interfaces fuer die unterschiedlichen Geraete zu schaffen.
Ich habe es so verstanden: ein Schalter kann an und aus, mit einem Thermostat kann man Temperatur setzen, usw.

Das Feature kam mit 5.3 rein, und wurde mit 6.5 wieder entfernt, da es sich nicht durchgesetzt hat.
Ich habe den o.g. Codestueck jetzt auch entfernt, weil die Funktion getSetters nicht mehr vorhanden ist.

Beta-User

Zitat von: rudolfkoenig am 28 Mai 2026, 21:28:58Ich haette die zusaetzlichen Befehle erst in xxx_Set in Abhaengigkeit der Attribute temporaer hinzugefuegt, aber das ist sicher Geschmacksfrage.

In dem stub "subDeviceProxy" hatte ich das ähnlich gemacht, und dann den dynamisch erstellten kompletten string im Hash solange zwischengespeichert, bis sich Attribute ändern (=> einfach löschen und bei Bedarf neu basteln lassen). Auszugsweise:
sub Set {
    my ($hash,$name,$opt,@args ) = @_;  # Übergabe-Parameter
   
    # Hier richtig?
    return "set $name needs at least one argument" if !defined $opt;
   
    return $hash->{'.sets'} if $opt eq '?' && defined $hash->{'.sets'}; # return value for getAllSets()
    # Standard Parameter setzen
   
    if ($opt eq 'clearReadings' ) {   # set <name> clearReadings: clear all readings immeadiatlely
        AnalyzeCommand($hash,"deletereading $name .*");
        return;
    }
    if ($opt eq 'resetSet' ) {   # just rebuilt set list
        delete $hash->{'.sets'};
        return;
    }

    my $val = "unknown value $opt, choose one of clearReadings:noArg resetSet:noArg ";
    $val .= 'weekprofile ' if defined $hash->{useWeekprofile} || defined $hash->{weekprofileAdditionalArg};
   
    my $commands = getAllSets($hash->{master});
    for my $commnd ( split m{\s+}x, $commands ) {
        my ($cmnd, $opts) = split m{:}x, $commnd;
        if ( defined $hash->{helper} && defined $hash->{helper}->{mappings} && defined $hash->{helper}->{mappings}->{$cmnd} ) {
            $hash->{helper}->{sets}->{$hash->{helper}->{mappings}->{$cmnd}} = $cmnd;
            $val .= defined $opts ? "$hash->{helper}->{mappings}->{$cmnd}:$opts " : "$hash->{helper}->{mappings}->{$cmnd} ";
        } elsif ( defined $hash->{regexp} && $cmnd =~ m{$hash->{regexp}} ) {
            $val .= defined $opts ? "${cmnd}:$opts " : "${cmnd} ";
        }
    }
    $hash->{'.sets'} = $val;
[...]
       
Zitat von: betateilchen am 28 Mai 2026, 19:20:05Hast Du mein 'Problem' verstanden?
Kommunikation ist was schwieriges, ich war davon ausgegangen, sonst hätte ich nichts geschrieben...
Server: HP-elitedesk@Debian 13, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors