Hauptmenü

devspec2array und regex

Begonnen von mrbreil, 11 Dezember 2016, 21:47:48

Vorheriges Thema - Nächstes Thema

mrbreil

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

FHEMAN

Hallo,

ich würde das so machen (ungetestet):

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

Gruß
Ronny
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

CoolTux

Statt TYPE wäre NAME richtig. Schau Dir die Internals Deines at's an.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

mrbreil

@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.

mrbreil

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?

CoolTux


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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

mrbreil

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.