FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: DS_Starter am 23 Juni 2019, 19:15:06

Titel: delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: DS_Starter am 23 Juni 2019, 19:15:06
Ich habe ein userattr (gesetzt mit addToDevAttrList):

userattr ptzPanel_Home:Home,Tanks,Treppe,home ptzPanel_iconPath ptzPanel_iconPrefix ptzPanel_row00 ptzPanel_row01 ptzPanel_row02 ptzPanel_row03 ptzPanel_row04 ptzPanel_row05 ptzPanel_row06 ptzPanel_row07 ptzPanel_row08 ptzPanel_row09 ptzPanel_use:0,1

Aus diesem will ich das ptzPanel_Home löschen um es danach verändert wieder hinzuzufügen.
Dazu verwende ich:

delFromDevAttrList($name, "ptzPanel_Home");

Das funktioniert aber nicht wie erwartet, d.h. "ptzPanel_Home" wird nicht gelöscht, sondern ist nach einem

delFromDevAttrList($name, "ptzPanel_Home");
addToDevAttrList($name, "ptzPanel_Home:Home,Preset_4,Tanks,Treppe,home");


doppelt vorhanden:

userattr ptzPanel_Home:Home,Preset_4,Tanks,Treppe,home ptzPanel_Home:Home,Tanks,Treppe,home ptzPanel_iconPath ptzPanel_iconPrefix ptzPanel_row00 ptzPanel_row01 ptzPanel_row02 ptzPanel_row03 ptzPanel_row04 ptzPanel_row05 ptzPanel_row06 ptzPanel_row07 ptzPanel_row08 ptzPanel_row09 ptzPanel_use:0,1

Es gibt noch das alte Attribut mit den Werten "Home,Tanks,Treppe,home" und das Neue mit den Werten "Home,Preset_4,Tanks,Treppe,home".
Um das Problem zu lösen, habe ich das grep in fhem.pl delFromDevAttrList abgeändert:

sub
delFromDevAttrList($$)
{
  my ($dev,$arg) = @_;

  my $ua = $attr{$dev}{userattr};
  $ua = "" if(!$ua);
  my %hash = map { ($_ => 1) }
             grep { $_ !~ m/$arg.*/ }
             split(" ", "$ua $arg");
  $attr{$dev}{userattr} = join(" ", sort keys %hash);
  delete $attr{$dev}{userattr}
        if(!keys %hash && defined($attr{$dev}{userattr}));
  map { delete $attr{$dev}{$_} } split(" ", (split(":", $arg))[0]);
 
}


Damit funktioniert es nun einwandfrei. Ich benutze jetzt zwar eine eigene Funktion weil mich das Löschen des User-Attributs
am Ende der Funktion in meinem Anwendungsfall stört, wollte aber meine Beobachtung zur Kenntnis geben.
Kann das bitte jemand (Rudi, Cooltux ?) nochmal gegenchecken ob ich irgendwas übersehen habe oder der Sommerhitze erlegen bin  ;) ?

Danke und LG,
Heiko
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: CoolTux am 23 Juni 2019, 19:55:01
Hallo Heiko,

Danke für die Meldung. Ich schaue es mir gerne an. Allerdings muss ich gestehen daß AutoShuttersControl diese Funktion schon seit über einem Jahr weit über 12 mal produktiv verwendet hat. Müsste ja selbst einige alte userattr entfernen und verändert wieder einfügen.
Ich schaue es mir aber morgen gleich mal an.


Grüße
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: DS_Starter am 23 Juni 2019, 20:04:17
Hab ich mir gedacht.  ;) Aber schau mal, ich konnte es eindeutig nachvollziehen. Liegt vermutlich daran dass das Attr Argumente hat.

Lg
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: CoolTux am 23 Juni 2019, 20:13:49
Ja ich sehe gerade. Du musst alles mit angeben, inklusive der Optionen

delFromDevAttrList($name,'ptzPanel_Home:Home');
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: CoolTux am 23 Juni 2019, 20:18:30
Kurze Erklärung worum so. Ich finde zum Attribut gehen auch die Optionen, daher bin ich der Meinung das sie auch beim entfernen korrekt mit angegeben werden sollten.
Nur zur Erklärung meines Standpunktes.
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: DS_Starter am 23 Juni 2019, 21:05:02
Ich würde jetzt allerdings eher das userattr löschen wollen unabhängig der Argumente weil die dynamisch sein können wie bei meinem Anwendungsfall. Naja, Ansichtssache ...

Lg,
Heiko
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: rudolfkoenig am 24 Juni 2019, 07:43:49
Ich bin unentschlossen, will aber keine Aenderungen einbauen, wenn nicht eine deutliche Mehrheit dafuer ist.
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: CoolTux am 24 Juni 2019, 07:50:30
Es denke das die Funktion kaum genutzt wird. Sonst hätten sich schon mehr gemeldet.

Grüße
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: DS_Starter am 24 Juni 2019, 07:58:47
Guten Morgen Rudi und Cooltux,

ich persönlich habe jetzt aus den beschiebenen Gründen eine eigene Funktion dafür verwendet.
D.h. ich wäre jetzt nicht auf eine Änderung angeweisen.
Allerdings würde ich als Nutzer grundsätzlich erwarten, dass ein Userattribut auch gelöscht wird wenn ich ein Userattribut löschen möchte.
Aber es ist sicherlich Ansichtssache wie Cooltux schon geschrieben hat. Könnte natürlich gut sein dass noch mehr User darüber stolpern. Habe gerade gesehen, dass die API-Doku um diese Befehle der Vollständigkeit halber erweitert werden müsste.

LG,
Heiko
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: CoolTux am 24 Juni 2019, 08:06:34
Wenn es für andere besser verständlich wäre ich natürlich für die Änderung. Es geht ja vornehmlich auch darum daß solche Funktionen nicht immer wieder neu erfunden werden sollen sondern Zentral zur Nutzung vor liegen.
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: DS_Starter am 24 Juni 2019, 08:43:27
Noch ein Punkt spräche meiner Meinung nach für eine Änderung.
Es kann durchaus sein, dass ein User die initial vergebenen Argumente für ein Userattribut ändert bzw. ergänzt um die Usability anzupassen. Dafür ist es ja ein Userattr.
Dann würde die Funktion auch versagen, es sei denn man holt sich vorher die Informationen aus der userattr.
Aber dann kann man sich ja gleich noch die Löschfunktion dazu schreiben und braucht  delFromDevAttrList auch nicht mehr.  ;)
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: CoolTux am 24 Juni 2019, 08:57:11
Zitat von: DS_Starter am 23 Juni 2019, 19:15:06
sub
delFromDevAttrList($$)
{
  my ($dev,$arg) = @_;

  my $ua = $attr{$dev}{userattr};
  $ua = "" if(!$ua);
  my %hash = map { ($_ => 1) }
             grep { $_ !~ m/$arg.*/ }
             split(" ", "$ua $arg");
  $attr{$dev}{userattr} = join(" ", sort keys %hash);
  delete $attr{$dev}{userattr}
        if(!keys %hash && defined($attr{$dev}{userattr}));
  map { delete $attr{$dev}{$_} } split(" ", (split(":", $arg))[0]);
 
}


Bitte Heiko seine Lösung nicht verwenden. Sie arbeitet sehr ungenau. Damit kann es passieren das ein entfernen von ASC_WohnzimmerFenster auch ASC_WohnzimmerFensterLinks und ASC_WohnzimmerFensterRechts entfernt.


Grüße
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: DS_Starter am 24 Juni 2019, 09:10:26
Stimmt in diesem Fall.
Müsste man noch etwas mehr präzisieren.
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: CoolTux am 24 Juni 2019, 09:35:31

sub
delFromDevAttrList($$)
{
  my ($dev,$arg) = @_;

  my $ua = $attr{$dev}{userattr};
  $ua = "" if(!$ua);
  my %hash = map { ($_ => 1) }
             grep { " $_ " !~ m/ $arg(:.+)? / }
             split(" ", "$ua $arg");
  $attr{$dev}{userattr} = join(" ", sort keys %hash);
  delete $attr{$dev}{userattr}
        if(!keys %hash && defined($attr{$dev}{userattr}));
  map { delete $attr{$dev}{$_} } split(" ", (split(":", $arg))[0]);
}


Ich kann mich damit arrangieren. 3 kleine Tests zeigten keine Probleme.
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: DS_Starter am 24 Juni 2019, 09:41:35
Sieht für mich auch gut aus.
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: CoolTux am 24 Juni 2019, 09:57:23
Lieber Rudi wärst Du bitte so nett  :)


--- Programmieren/Perl/Projekte/FHEM/fhem-code/fhem.pl 2019-06-24 09:51:36.557512929 +0200
+++ tmp/fhem.pl 2019-06-24 09:52:25.237705994 +0200
@@ -4144,7 +4144,7 @@
   my $ua = $attr{$dev}{userattr};
   $ua = "" if(!$ua);
   my %hash = map { ($_ => 1) }
-             grep { " $arg " !~ m/ $_ / }
+             grep { " $_ " !~ m/ $arg(:.+)? / }
              split(" ", "$ua $arg");
   $attr{$dev}{userattr} = join(" ", sort keys %hash);
   delete $attr{$dev}{userattr}


Vielen Dank Heiko für Deinen Denkanstoß. Ich würde sagen so ist es auch für andere verständlich.
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: rudolfkoenig am 24 Juni 2019, 21:03:22
Habe es mit folgenden Patch eingecheckt:
--- fhem.pl    (revision 19681)
+++ fhem.pl    (working copy)
@@ -4144,8 +4144,8 @@
   my $ua = $attr{$dev}{userattr};
   $ua = "" if(!$ua);
   my %hash = map { ($_ => 1) }
-             grep { " $arg " !~ m/ $_ / }
-             split(" ", "$ua $arg");
+             grep { $_ !~ m/^$arg(:.+)?$/ }
+             split(" ", $ua);
   $attr{$dev}{userattr} = join(" ", sort keys %hash);
   delete $attr{$dev}{userattr}
         if(!keys %hash && defined($attr{$dev}{userattr}));


Allerdings verstehe ich die Notwendigkeit immer noch nicht: das ist eine Routine fuer Modulprogrammierer.
Wissen sie nicht mehr genau, was sie hinzugefuegt haben?
Titel: Antw:delFromDevAttrList in fhem.pl funktioniert nicht wie erwartet
Beitrag von: CoolTux am 24 Juni 2019, 21:07:22
Auch wir Modulprogrammierer sind manchmal faul  ;D
Da ich keine Seiteneffekte erwarte kann ich mit der Änderung leben. Es vereinfacht halt.

Danke Dir Rudi.


Grüße