Hallo Freunde,
ich würde gerne mit devspec2array alle meine Fensterkontakte abfragen. Allerdings finde ich nirgends eine Funktionsbeschreibung für den Befehl. Ich habe schon einiges ausprobiert, bzw. Teile aus der Wiki angepasst, allerdings ohne Erfolg.
Hier meine Funktion (gekürzt):
sub CheckWindows() {
foreach my $dev (devspec2array("type=ShutterContact")) {
#... noch mehr Abfragen
$num = $num +1;
}
FB_mail('email@email.com','Test',$status."-".$text."-".$num);
}
Das liefert allerdings 0 (nix) zurück - es wird offensichtlich nichts ins Array geladen.
Was klappt ist die Abfrage mit
devspec2array("TYPE=MAX")
Aber das liefert mir ja alle 22 MAX-Komponenten und ich brauche ja nur die Fensterkontakte. Ich habe es noch mit
devspec2array("DEF=ShutterContact 062546")
versucht, das klappt. Aber das gibt mir ja nur den einen Shutter zurück. Mit Wildcard * funktioniert es leider nicht ("DEF=ShutterContact*").
Was/wie kann ich denn mit devspec2array genau abfragen?
Viele Grüße
doc
Hi nochmal, ich konnte das Testen nicht lassen und habe festgestellt, dass man sogar das Attribut comment auslesen kann. Sogar mit Wildcard. Wenn ich jetzt überall "Test" oder "Batterie;Test" als comment bei den Fensterkontakten eintrage, frägt er sie richtig ab:
foreach my $dev (devspec2array("comment=/*Test/*")) {
Aber deswegen verstehe ich immer noch nicht, warum er z.B. "type=ShutterContact" nicht mag. Also wäre ich immer noch an der grundsätzlichen Erklärung interessiert.
Viele Grüße
Doc
...weil type ne TYPE
devspec2array("TYPE=ShutterContact")
sollte gehen.
=8-)
Tja, da ist das Problem...
TYPE ist bei dem device leider was anderes wie type...
Internals:
CFGFN ./BB/max.conf
DEF ShutterContact 062546
IODev cm
LASTInputDev cm
MSGCNT 23
NAME BA_Fenster
NR 673
NTFY_TRIGGERTIME 2013-07-16 16:31:32
STATE Offen
TYPE MAX
addr 062546
backend cm
cm_MSGCNT 23
cm_RAWMSG Z0B8006300625461234990012
cm_TIME 2013-07-16 16:31:32
rferror 0
type ShutterContact
8-7
greetz
doc
DEF=ShutterContact.*
(Punkt vor dem Stern)
Ah.. genau. Danke, da war was mit den Leerzeichen. Aber zum Verständnis - theoretisch kann ich alles was mit beim Device angezeigt wird abfragen (Internals, Readings, Attribute)? Richtig?
Grüßle
Hi,
perl regexp -> * steht für "kein oder beliebig viele", ist also nur ein quantifier. Qualifier ist . (beliebiges Zeichen). Also .* = beliebiges Zeichen, davon 0 oder beliebig viele ( .+ = beliebiges Zeichen, davon beliebig viele aber mindestens eins ).
Bei bla* bin ich nicht sicher ob es heisst "bla beliebig oft" -> bla, blabla, blablabla, nicht blab; oder "bl und beliebig viele a" (bla, blaa, blaaaa, nicht blb). Kannste mal nachschauen, zB http://www.troubleshooters.com/codecorn/littperl/perlreg.htm (//www.troubleshooters.com/codecorn/littperl/perlreg.htm)
Hab gerade mal per Kommandozeile mit list probiert. Mir scheint, dass Internals und Attribute gehen, readings nicht.
=8-)
äh um ja - VIELEN DANK! Ich verstehe.
zum Großteil ;-)
sehr gut!
grüßle
doc
Schreibt er dann alle Offenen in die Mail?
Oder jedesmal eine Mail?
Ich hab es so gemacht. Bei jedem Event wird eine Mail geschrieben.
define notify_Alarmanlage_open notify sens.*:open {\
fhem ("set Geschlossen open");;\
if (ReadingsVal("Anwesend", "state", "") eq "Nein")\
{\
FB_mail ('gibsnicht@@gibsnicht.com','Status geöffnet','Statusänderung @ ist offen!!');;\
}\
}
Also so wie ich es gelöst habe, schreibt er alle in eine Mail. Das nütze ich wenn ich rausgehe - beim "Abmelden" bekomme ich quasi eine Benachrichtigung, wenn ich vergessen habe, ein Fenster zu schließen. In der Mail stehen dann alle drin, die noch offen sind. Ähnlich habe ich das mit der Abfrage des Batteriestatus gelöst. Da es dich zu interessieren scheint - hier mein Quälcode:
sub CheckWindows() {
my $datumzeit = sub{sprintf '%04d-%02d-%02d %02d:%02d', $_[5]+1900, $_[4]+1, $_[3], $_[2], $_[1]}->(localtime);
my $status = "ZU";
my $text ="";
foreach my $dev (devspec2array("comment=/*Fenster/*")) {
my $tmp = ReadingsVal($dev, "state", "nicht auslesbar");
if ($tmp eq "opened") {
$text = $text."Gerät: ".$dev." - Status:".$tmp."\n";
$status = "OFFEN";
}
}
if ($status eq "OFFEN") {
FritzBoxCallnr('**9');
FB_mail('bla@blu.b','Fensterkontrolle',$datumzeit." Uhr:\n".$text);
}
}