Hallo,
ich müsste für die Berechnung herausfinden, ob der gegebene Device-Name bei einem "::devspec2array" enthalten wäre.
Die Regex für das "::devspec2array" ist z.B. "id=shelly.*:FILTER=disable!=1:FILTER=group=Haushaltsgeräte".
Normalerweise würde ich das "::devspec2array($RegEx)" durchführen und dann schauen, ob das Device in dem Array enthalten ist, dass zurück kommt.
Das dürfte aber ziemlich ressourcen-fressend sein.
Gibt es da einen besser Weg?
Danke, lg, Gerhard
count?
(help count sollte weiterhelfen)
Zitat von: Beta-User am 25 Januar 2023, 17:57:48
help count sollte weiterhelfen)
Was hat count mit der Fragestellung hier im Thread zu tun?
count prüft nicht, ob ein bestimmtes device im Ergebnis vorkommt, sondern nur, wieviele Elemente im array sind.
Grundsätzlich würde ich mir bezüglich devspec2array() keine allzu großen Sorgen wegen Performance machen.
Viel interessanter ist im Nachgang die Frage, wie man das Array dann bezüglich des gesuchten devices auswertet.
grep( /^$deviceName$/, @devspecArray )
liefert true zurück, wenn $deviceName in @devspecArray enthalten ist.
Aber was willst Du denn wirklich tun? Eventuell ist Deine Aufgabe viel einfacher lösbar.
Und was sollen die zwei Doppelpunkte bedeuten, die Du offenbar systematisch vor devspec2array() schreibst?
--
Hallo,
die Doppelpunkte sind notwendig, wenn ich im Def-Teil eines DOIF auf die Funktion zugreifen möchte.
Es stimmt, es ist verwirrend, dass ich das mitkopiert habe.
Mein Anwendungsfall ist wie folgt:
In einem DOIF möchte ich gerne die Verbrauchswerte nach Gruppen aufaddieren.
Sobald ein Änderungs-Event des Verbrauchs-Reading im DOIF erkannt wird, sollen alle Gruppen auch aktualisiert werden.
Dazu dahcte ich mir, dass es am einfachsten ist, einen Filter (RegEx) zu definieren; eben z.B. das "id=shelly.*:FILTER=disable!=1:FILTER=group=Haushaltsgeräte".
Damit sollen dann alle Verbrauchswerte der Haushaltsgeräte aufsummiert werden.
Im Endeffekt wäre das eben so zu lösen:
my @devspecArray=devspec2array($FilterGroup);
if(grep( /^$deviceName$/, @devspecArray ) { ... }
Oder?
lg, Gerhard
Zitat von: gestein am 25 Januar 2023, 19:04:00
Im Endeffekt wäre das eben so zu lösen:
my @devspecArray=devspec2array($FilterGroup);
if(grep( /^$deviceName$/, @devspecArray ) { ... }
Oder?
Zähle Deine Klammern, Du musst genausoviele schließen wie Du öffnest.
Du hast natürlich vollkommen recht. Schlampigkeitsfehler :)
Dann werde ich das mal so angehen.
Danke!
lg, Gerhard
Guten Morgen,
deine Suche nach einer Lösung im Threadtitel ist ja das eine, deine Erklärung im Post #4 ist das andere. Was Du ganz genau machen willst hast Du bisher noch nicht gesagt, nur daß Du eine betimmte Gruppe an Geräten auswählen willst um dann genau was zu machen? Addieren, zählen, Mittelwert....??
Es gibt ja für alles irgendwelche fertigen Lösungen, so auch hier:
https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Aggregationsfunktionen (https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Aggregationsfunktionen)
zugegeben, erfordert etwas Einarbeitung, aber vermutlich kommst Du damit sehr charmant auf die Lösung.
Beispiele, die Aggregatsfunktionen zu filtern nach TYPE/group etc. gibt es einige.
Ich würde dann auch im DOIF-Forum weiterschreiben....
Gruß
Sany
Hallo Sany,
vielen Dank.
Von den Funktionen des DOIF habe ich schon gelesen.
Denke aber momentan nicht, dass das mein Problem löst.
Wieso passt die Überschrift nicht zur Erklärung?
Mein Grundthema ist, dass ich den Verbrauch bestimmter Geräte gerne als Summe pro Tag, pro Monat, pro Jahr aufsummieren möchte.
Und dazu wollte ich wissen, wie ich feststellen kann, dass ein bestimmter Gerätename in einer Liste enthalten ist, die von devspec2array geliefert wird.
Das Thema könnte man sicherlich anders (besser) auch lösen als ich es mir ausdenke.
Danke, lg, Gerhard