FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: DocCyber am 29 Mai 2017, 17:47:04

Titel: [GELÖST!] devspec2array - ich krieg's nicht hin
Beitrag von: DocCyber am 29 Mai 2017, 17:47:04
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?
Titel: Antw:devspec2array - ich krieg's nicht hin
Beitrag von: justme1968 am 29 Mai 2017, 19:59:22
FILTER=battery=.+ oder FILTER=battery=..*
Titel: Antw:devspec2array - ich krieg's nicht hin
Beitrag von: DocCyber am 29 Mai 2017, 20:02:36
Vielen Dank für deine Hilfe!  :)
Titel: Antw:devspec2array - ich krieg's nicht hin
Beitrag 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)");

Gruß
Dan
Titel: Antw:devspec2array - ich krieg's nicht hin
Beitrag von: DocCyber am 30 Mai 2017, 14:53:07
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!
Titel: Antw:[GELÖST!] devspec2array - ich krieg's nicht hin
Beitrag von: Jorge3711 am 31 Mai 2017, 21:28:58
Wo finde ich den grundsätzliche Informationen zur Funktion "devspec2array"? In der cmdref habe ich nix gefunden, im Wiki nur verschiedenste Anwendungsbeispiele.

Danke!
Titel: Antw:[GELÖST!] devspec2array - ich krieg's nicht hin
Beitrag von: DeeSPe am 31 Mai 2017, 21:42:38
Da gibt es keine weiteren grundsätzlichen Informationen.
Der Name ist Programm. ;)

Gruß
Dan
Titel: Antw:[GELÖST!] devspec2array - ich krieg's nicht hin
Beitrag von: justme1968 am 31 Mai 2017, 22:13:45
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array)
Titel: Antw:[GELÖST!] devspec2array - ich krieg's nicht hin
Beitrag von: Jorge3711 am 31 Mai 2017, 22:34:03
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ß
Titel: Antw:[GELÖST!] devspec2array - ich krieg's nicht hin
Beitrag von: justme1968 am 31 Mai 2017, 22:37:57
das geht auch auf einen rutsch mit FILTER. testen kannst du es direkt per telnet:{devspec2array("subType=threeStateSensor:FILTER=state=open")}
Titel: Antw:[GELÖST!] devspec2array - ich krieg's nicht hin
Beitrag von: Jorge3711 am 31 Mai 2017, 22:57:28
Cool! Aber da ich gerade versuche PERL zu lernen, interessiert mich ob mein Codesnipsel das (von mir) erwartete Ergebnis liefern würde. :)
Titel: Antw:[GELÖST!] devspec2array - ich krieg's nicht hin
Beitrag von: justme1968 am 01 Juni 2017, 11:13:51
probier es doch aus :)

alles in eine routine in 99_myUtils.pm stecken und dann per {...} aufrufen.

gruss
  andre
Titel: Antw:[GELÖST!] devspec2array - ich krieg's nicht hin
Beitrag von: Jorge3711 am 02 Juni 2017, 19:14:44
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.