Hallo,
es gab bereits einen Thread der sich mit readingsGroup beschäftigte. Dieser beinhaltete genau auch mein Problem wurde bereits auf gelöst gestellt aber
die Kernfrage blieb offen.
Mein Wunsch ist es auf eine readingsGroup ein foreach anzuwenden um dann die jeweiligen Readings zu überprüfen:
Meine Group ist folgende:
#Batteriestatus aller Devices im Raum Zentral anzeigen
define BatterieSV readingsGroup .*:[Bb]atterieValueSV.*
attr BatterieSV DbLogExclude .*
attr BatterieSV group Grp-Batterie
attr BatterieSV notime 1
attr BatterieSV room 1.0.0_Haus
attr BatterieSV valueFormat {return "25" if( $VALUE < 64 );; return "50" if( $VALUE < 128 );; return "75" if( $VALUE < 192 );; return "100"}
Nun möchte ich irgendwie einmal am Tag um 19:00 via "at"
alle Readings auslesen und gegen einen Wert vergleichen um dann eine Aktion einzleiten.
Also irgendwie so:
foreach readingGroup.Element
my $value = readingsNum(readingGroup.Element);
if $value < 10 then
tue etwas
endif
end loop
Geht das und wenn ja wie?
Danke Andreas
Hallo Andreas,
schau mal hier ob das hilft.
https://forum.fhem.de/index.php?topic=106368.0
Gruß Otto
Danke Otto,
aber in dem Link werden alle Readings eines Devices ermittelt.
Ich benötige viel mer alle Devices eines Readings.
Könnte das hier vielleicht funktionieren:
define a_Battery at *19:00:00 \
{\
my @monitored=devspec2array("[Bb]atterienValueSV.*<64");;\
my $cnt_devs=@monitored;;\
my $i = 0;;\
my $msgtext = "";;\
foreach(@monitored)\
{\
$msgtext .= AttrVal($_,"alias",$_);;\
if ($i == 0)
{\
fhem ("gebe $msgtext aus");;\
}\
}\
}
a) Ich bin mir nicht ganz sicher was AttrVal($_,"alias",$_);; macht?
b) kann ich in devspec2arry auch den < operator verwenden?
c) Lautet der Wildcard in devspec2array .*?
Danke Andreas
Hi,
ich habe es nicht ganz verstanden, aber ich hätte noch den Artikel https://wiki.fhem.de/wiki/DevelopmentModuleAPI
Generell werden regExp verwendet, das sind keine Wildcards :)
Aber "ja" devspec für "alle" ist .*
Gruß Otto
Was spricht dagegen ein Notify zu nehmen, welches genau auf die gleichen Readings/Events "hört" wie deine readingsGroup um dann da die Werte gesammelt in einen Dummy zu schreiben.
Dann könntest du mit der verlinkten Methode "alle Readings eines Devices" weitermachen... ;)
Also in etwa so (schwer ungetestet ;) ):
define nSammelWerte notify .*:[Bb]atterieValueSV.* setreading dSammelDummy $NAME $EVENT
Und dann nat. den entsprechenden Dummy anlegen nicht vergessen ;)
Und evtl. statt $EVENT eben einen bestimmten $EVTPART...
EDIT: Dann gibt es für jedes Device welches eben ein solches Event "feuert" einen Eintrag mit "seinem Namen" und dem entsprechenden Wert (gesammelt) im Dummy...
Jaja, ich weiß: warum immer Dummy ;)
P.S.: da es irgendwie mit Batteriestatus zu tun hat, evtl. ja auch das interessant https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514 (dort wird es im Prinzip so [ähnlich] gemacht. Da werden auch die Batteriewerte "in gleicher Form" für alle Devices in einen Dummy geschrieben (und eben dabei gleich auf gleiche Form gebracht, egal was die einzelnen Devices sonst so alles "liefern": Spannung, ok/low, 0-100, 0%-100%, ...)...
EDIT: eine readingsGroup hat doch eigentlich gar keine "eigenen" Readings!?
Gruß, Joachim