Überprüfung ob Device-Name einem regex für ::devspec2array entspricht

Begonnen von gestein, 25 Januar 2023, 17:35:16

Vorheriges Thema - Nächstes Thema

gestein

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

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

#2
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?


--
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gestein

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gestein

Du hast natürlich vollkommen recht. Schlampigkeitsfehler  :)

Dann werde ich das mal so angehen.

Danke!
lg, Gerhard

Sany

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
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
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

gestein

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