FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: mrbreil am 11 Dezember 2016, 21:47:48

Titel: devspec2array und regex
Beitrag von: mrbreil am 11 Dezember 2016, 21:47:48
Guten Abend, ich habe ein Roommate Macro erstellt.
Name: Macro_strandstr_asleep
fhem "define atTmp_1_$NAME at +00:01:45 set ...
fhem "define atTmp_2_$NAME at +00:02:45 set ...
fhem "define atTmp_2_$NAME at +00:03:45 set ...
ect.


Jetzt möchte ich aber den Vorgang abrechen

my $device="";

foreach $device (devspec2array("NAME=atTmp_[0-9\.]+_Macro_strandstr_asleep")) {
fhem ("delete $device");
}
aber auch
my $device="";

foreach $device (devspec2array("NAME=atTmp_.+_Macro_strandstr_asleep")) {
fhem ("delete $device");
}
klapt nicht. Bekomme immer 0

Könnt ihr mir helfen meinen Denkfehler zu finden?

MfG MrBreil
Titel: Antw:devspec2array und regex
Beitrag von: FHEMAN am 11 Dezember 2016, 23:11:48
Hallo,

ich würde das so machen (ungetestet):

my @devs = grep { $defs{$_}{TYPE} =~ m/^atTmp_[0-9\.]+_Macro_strandstr_asleep$/ } keys %defs;

Gruß
Ronny
Titel: Antw:devspec2array und regex
Beitrag von: CoolTux am 11 Dezember 2016, 23:41:30
Statt TYPE wäre NAME richtig. Schau Dir die Internals Deines at's an.
Titel: Antw:devspec2array und regex
Beitrag von: mrbreil am 12 Dezember 2016, 08:43:10
@CoolTux Entschuldige da stand auch NAME habe bei Zusammenstellen des Post, um zu erläutern was ich ersuche falsch zusammengestellt.

@FHEMAN Mit deinem Code klappt es leider auch nicht. Ich Verstehe aber auch nicht wie er macht was er machen soll.

Jemand noch nen typ.
Titel: Antw:devspec2array und regex
Beitrag von: mrbreil am 12 Dezember 2016, 11:22:08
Gerne nutze ich auch eine andere Methode außer devspec2array.
Gibt es eine einfachere Möglichkeit zu prüfen ob ein at existiert und dieses dann zu löschen.
Ich könnte es ja noch so lösen:

fhem ("delete atTmp_1_Macro_strandstr_asleep") if (Value("atTmp_1_Macro_strandstr_asleep") ne "")

Aber da müsste ich ja für jedes Device einen Eintrag machen, oder kann ich das irgendwie über regex lösen?
Titel: Antw:devspec2array und regex
Beitrag von: CoolTux am 12 Dezember 2016, 12:04:58

my $device = join( "|",devspec2array("TYPE=at:FILTER=NAME=atTmp_[0-9\.].*") );
fhem "delete $device";


Versuch mal das. Du hast das Problem das Du bei devspec2array ja ein Array hast und ein $device Dir natürlich ein Anzahl der Einträge des Arrays ausgibt. ein join setzt aber die Einträge entsprechend zusammen und gibt Dir dann die Eintrage auch aus.
Titel: Antw:devspec2array und regex
Beitrag von: mrbreil am 12 Dezember 2016, 15:43:25
Danke CoolTux.
Deine Lösung nimmt aber alle "atTmp_.." 's an. Habe mir jetzt dank deiner Lösung so beholfen.

Habe die temporären at's umbenannt.
fhem "define atTmp_Macro_strandstr_absent_1 at +00:01:45 set Kuechen_Licht off";

Außerdem prüfe ich noch ob es überhaupt temporäre at's gibt, damit das Log nicht zumüllt.
my $device = join( "|",devspec2array("TYPE=at:FILTER=NAME=atTmp_Macro_strandstr_absent_[0-9\.].*") );
fhem ("delete $device") if (Value("$device") ne "");


Danke für eure Hilfe.