Regex für attribute bei deleteattr

Begonnen von StefanStrobel, 21 September 2020, 17:57:07

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hallo Rudi,

bei HTTPMOD, Modbus oder FReplacer-Geräten mit vielen Wildcard-Attributen, wäre es hilfreich, wenn man Attribute nicht nur einzeln sondern auch gemeinsam mit einer Regex löschen könnte (so wie es auch bei deletereading möglich ist).

Folgende Änderung würde das ermöglichen:


--- svn/fhem.pl 2020-09-21 17:51:03.439575432 +0200
+++ fhem.pl     2020-09-21 17:51:03.440028645 +0200
@@ -2325,12 +2325,23 @@
       DoTrigger("global", "DELETEATTR $sdev", 1) if($init_done);

     } else {
-      delete($attr{$sdev}{$a[1]}) if(defined($attr{$sdev}));
-      addStructChange("deleteAttr", $sdev, join(" ", @a));
-      DoTrigger("global", "DELETEATTR $sdev $a[1]", 1) if($init_done);

+      # check for wildcard
+      if ($a[1] =~ /[\.\+\*\?]/) {    # wildcard specified
+        foreach my $dAttr (grep { /$a[1]/ }
+                                keys %{$attr{$sdev}} ) {
+          delete($attr{$sdev}{$dAttr});
+          addStructChange("deleteAttr", $sdev, "$sdev $dAttr");
+          DoTrigger("global", "DELETEATTR $sdev $dAttr", 1) if($init_done);
+          push @rets, "Deleted attr $dAttr for device $sdev";
+        }
+      }
+      else {
+        delete($attr{$sdev}{$a[1]}) if(defined($attr{$sdev}));
+        addStructChange("deleteAttr", $sdev, join(" ", @a));
+        DoTrigger("global", "DELETEATTR $sdev $a[1]", 1) if($init_done);
+      }
     }
-
   }

   return join("\n", @rets);


Ich bin mir nicht sicher, ob der Aufruf von addStructChange in der Änderung so optimal ist, aber da kennst Du Dich ja besser aus :-)

Gruss
    Stefan


rudolfkoenig

Ich habe den Vorschlag implementiert, aber leicht anders: alles wird als Regexp interpretiert, aber wie ueblich mit ^$ ergaenzt. addStructChange kriegt die deleteattr Parameter unverdaut, ist nachrichtlich gedacht.

Die Doku habe ich auch angepasst...

StefanStrobel