devspec2array - Funktionsbeschreibung

Begonnen von docb, 16 Juli 2013, 12:45:37

Vorheriges Thema - Nächstes Thema

docb

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
I love FHEM!

docb

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
I love FHEM!

UliM

...weil type ne TYPE
devspec2array("TYPE=ShutterContact")
sollte gehen.
=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

docb

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
I love FHEM!

UliM

DEF=ShutterContact.*  
(Punkt vor dem Stern)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

docb

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
I love FHEM!

UliM

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


Hab gerade mal per Kommandozeile mit list probiert. Mir scheint, dass Internals und Attribute gehen, readings nicht.

=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

docb

äh um ja - VIELEN DANK! Ich verstehe.
zum Großteil ;-)
sehr gut!
grüßle
doc
I love FHEM!

AK-868

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!!');;\
 }\
}
Hardware FHEM:
Neue Fritzbox 7390 keine Labor von AVM
Konfigurationsadapter Lan
Funk-Schließerkontaktschnittstellen
Funk-Fenster/Türkontakt
Funk-Schaltaktoren UP ein und zweifach
Funk-Jalousieaktoren
Funk-Rauchmelder


docb

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);
   }
 }
 
I love FHEM!