Hallo FHEMisten!
Ich möchte gern alle batteriebetriebenen (Homematic-)Geräte in ein Array schreiben, komme aber in diesem Fall mit devspec2array nicht klar.
Die folgende "Lösung" funktioniert zwar, findet aber natürlich nur Geräte mit battery: ok
my @battArray = devspec2array("(.*):FILTER=battery=ok");
Ich habe es mit einem RegEx versucht, aber damit werden dann sämtliche Geräte gefunden (auch solche ohne Batterie):
my $filter =~ /low|ok/;
my @battArray = devspec2array("(.*):FILTER=battery=$filter");
Wie stelle ich es an, dass alle Batteriegeräte unabhängig vom Batteriestatus gefunden werden?
FILTER=battery=.+ oder FILTER=battery=..*
Vielen Dank für deine Hilfe! :)
Wenn Du nur bestimmte Werte "durchlassen" willst dann wäre auch sowas möglich:
my @battArray = devspec2array("battery=(ok|low)");
Gruß
Dan
Zitat von: DeeSPe am 29 Mai 2017, 20:10:17
Wenn Du nur bestimmte Werte "durchlassen" willst dann wäre auch sowas möglich:
my @battArray = devspec2array("battery=(ok|low)");
Auch ein sehr nützliche Info! Vielen Dank!
Wo finde ich den grundsätzliche Informationen zur Funktion "devspec2array"? In der cmdref habe ich nix gefunden, im Wiki nur verschiedenste Anwendungsbeispiele.
Danke!
Da gibt es keine weiteren grundsätzlichen Informationen.
Der Name ist Programm. ;)
Gruß
Dan
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array)
Danke für den Wiki-Link. Den Artikel hatte ich eigentlich erwartet aber wohl aus Betriebsblindheit übersehen.
Spuckt mir folgendes dann die Anzahl der Türfensterkontakte aus, die den Status offen haben?
my @tfk=devspec2array("subType=threeStateSensor");
my @windowOpen = undef;
foreach(@tfk) {
$state = ReadingsVal($_,"state","nA");
if ($stage eq "open"){
push(@windowOpen,$_);
}
}
print "Es sind $#windowOpen Fenster offen!";
Kann so ein Codeschnipsel auch irgendwie "live" getestet werden (FHEM Telnetkonsole o.ä.)?
Danke und Gruß
das geht auch auf einen rutsch mit FILTER. testen kannst du es direkt per telnet:{devspec2array("subType=threeStateSensor:FILTER=state=open")}
Cool! Aber da ich gerade versuche PERL zu lernen, interessiert mich ob mein Codesnipsel das (von mir) erwartete Ergebnis liefern würde. :)
probier es doch aus :)
alles in eine routine in 99_myUtils.pm stecken und dann per {...} aufrufen.
gruss
andre
Gesagt, getan:
sub tfkTest2($) {
my ($recipient) = @_;
my @tfk=devspec2array("subType=threeStateSensor:FILTER=NAME=sec.tfk..*"); # Welche "echten" Türfensterkontakte gibt es überhaupt
my @windowOpen = undef;
my @lastStanding = undef;
# Anzahl offener Fenster ermitteln
#
foreach(@tfk) {
my $state = ReadingsVal($_,"state","nA");
my $dev = AttrVal($_,"alias", "nA");
if ($state eq "open") {
push(@windowOpen,$dev);
}
}
my $msg = "Es sind $#windowOpen Fenster offen! Bitte @windowOpen schliessen."; #@lastStanding hat als letztes das Haus verlassen.";
#Debug($msg);
Log3("tfkAlert", 3, $msg);
fhem("set TelegramBot msg $recipient $msg");
}
Funktioniert (ja, große Teile meines Codes wären durch {devspec2array("subType=threeStateSensor:FILTER=state=open")} bereits erschlagen, aber ich will mich ja in Perl einarbeiten). Und jetzt spame ich den Thread nicht weiter voll.