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
Hallo,
ich würde das so machen (ungetestet):
my @devs = grep { $defs{$_}{TYPE} =~ m/^atTmp_[0-9\.]+_Macro_strandstr_asleep$/ } keys %defs;
Gruß
Ronny
Statt TYPE wäre NAME richtig. Schau Dir die Internals Deines at's an.
@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.
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?
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.
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.