[GELÖST!] devspec2array - ich krieg's nicht hin

Begonnen von DocCyber, 29 Mai 2017, 17:47:04

Vorheriges Thema - Nächstes Thema

DocCyber

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?
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

justme1968

FILTER=battery=.+ oder FILTER=battery=..*
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

DocCyber

Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

DeeSPe

Wenn Du nur bestimmte Werte "durchlassen" willst dann wäre auch sowas möglich:
my @battArray = devspec2array("battery=(ok|low)");

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DocCyber

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!
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

Jorge3711

Wo finde ich den grundsätzliche Informationen zur Funktion "devspec2array"? In der cmdref habe ich nix gefunden, im Wiki nur verschiedenste Anwendungsbeispiele.

Danke!

DeeSPe

Da gibt es keine weiteren grundsätzlichen Informationen.
Der Name ist Programm. ;)

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Jorge3711

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ß

justme1968

das geht auch auf einen rutsch mit FILTER. testen kannst du es direkt per telnet:{devspec2array("subType=threeStateSensor:FILTER=state=open")}
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Jorge3711

Cool! Aber da ich gerade versuche PERL zu lernen, interessiert mich ob mein Codesnipsel das (von mir) erwartete Ergebnis liefern würde. :)

justme1968

probier es doch aus :)

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

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Jorge3711

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.