FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: gestein am 25 Januar 2023, 17:35:16

Titel: Überprüfung ob Device-Name einem regex für ::devspec2array entspricht
Beitrag von: gestein am 25 Januar 2023, 17:35:16
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
Titel: Antw:Überprüfung ob Device-Name einem regex für ::devspec2array entspricht
Beitrag von: Beta-User am 25 Januar 2023, 17:57:48
count?

(help count sollte weiterhelfen)
Titel: Antw:Überprüfung ob Device-Name einem regex für ::devspec2array entspricht
Beitrag von: betateilchen am 25 Januar 2023, 18:21:50
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?


--
Titel: Antw:Überprüfung ob Device-Name einem regex für ::devspec2array entspricht
Beitrag von: gestein am 25 Januar 2023, 19:04:00
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
Titel: Antw:Überprüfung ob Device-Name einem regex für ::devspec2array entspricht
Beitrag von: betateilchen am 25 Januar 2023, 19:05:54
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.
Titel: Antw:Überprüfung ob Device-Name einem regex für ::devspec2array entspricht
Beitrag von: gestein am 25 Januar 2023, 19:13:27
Du hast natürlich vollkommen recht. Schlampigkeitsfehler  :)

Dann werde ich das mal so angehen.

Danke!
lg, Gerhard
Titel: Antw:Überprüfung ob Device-Name einem regex für ::devspec2array entspricht
Beitrag von: Sany am 27 Januar 2023, 08:12:29
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
Titel: Antw:Überprüfung ob Device-Name einem regex für ::devspec2array entspricht
Beitrag von: gestein am 30 Januar 2023, 18:37:22
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