Guten Morgen,
gibt es eine Möglichkeit alle Readings in einem Gerät, die mit Namen xy (regex bekomme ich hin), zusammen zu zählen? Also nicht power1 + power2 = power zusammen. Sondern eine Anzahl der Readings soll am Ende da stehen.
Beispiel:
Gerät A
Readings:
X
Y
Z
= 3
Danke!
über eine perlroutine in jedem Fall:
my $testName = "tre";
# Name des zu testenden Devices
my $testhash = $defs{$testName};
my $testreading = $testhash->{READINGS};
my @areadings = ( keys %{$testreading} );
my @trigg = grep( m/Trigger.*/, @areadings );
# Trigger.* -> regex
my $anz = @trigg;
#anzahl der gefundenen elemente
gruss Byte09
Das ist schon mal ne Idee die um zu setzen ist.
Dachte da an sowas, was sich quasi automatisch erzeugt. Also eine Art Reading in dem der Code steht. Und ich weiß, das ist jetzt ggf. ein wenig frech (ist aber so nicht gemeint), glaube aber, es muss viel einfacher gehen.
Zitat von: 87insane am 16 Februar 2019, 10:53:30
Das ist schon mal ne Idee die um zu setzen ist.
Dachte da an sowas, was sich quasi automatisch erzeugt. Also eine Art Reading in dem der Code steht. Und ich weiß, das ist jetzt ggf. ein wenig frech (ist aber so nicht gemeint), glaube aber, es muss viel einfacher gehen.
ja, kann sein das es einfacher geht , ich habe jetzt auch nicht danach geschaut ob fhem da 'direkt' eine Möglichkeit bietet. Das kam mir gerade nur so in den Sinn und ich würde dass etwas modifiziert in ein Userreading packen.
gruss Byte09
Google gerade danach aber glaube das es theoretisch auch mit Regex gehen sollte. So nach dem Motto wenn du Matches hast, dann gib aus wie viele....
In DOIF funktioniert das mit der Aggregation [#:"^A$":"power\d"]
Sonst über https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array oder im Gerätehash https://wiki.fhem.de/wiki/DevelopmentModuleIntro#Readings suchen.
wenn du es so als userreading setzt ist es ja im grunde automatisch:
attr tre userReadings anzahl1 {my $testreading = $hash->{READINGS};;\
my @areadings = ( keys %{$testreading} );;\
my $anz = grep( m/Trigger.*/, @areadings );;\
return $anz;;}
... oder habe ich die Anforderung falsch verstanden ?
gruss Byte09
Finde die Idee mit der Aggregation sehr gut. Damit habe ich bisher noch nichts gemacht.
Natürlich geht das nicht und ich habe einen Fehler drin... In deinem Beispiel hast du "power" genommen. Woher weiß dein Beispiel bei welchem Gerät es suchen muss?
Test-Beispiel:
Gerätname: ECHO_123
Readings die gezählt werden sollen: alarm_..status
Geht nicht:
{[#"^ECHO_123:alarm..status"]}
EDIT: Die Anforderung ist einfach eine Zahl als Ausgabe. Also bei meinem Beispiel sind z.B. 7 Readings mit dem Namen alarm..status in dem Gerät vorhanden. Und der Code, welcher es am Ende auch sein wird, soll dann einfach zählen wie viele es sind und am Ende eine 7 ausgeben. Mir geht es nicht um die Werte die im Reading stehen.
schon klar, aber willst du die anzahl automatisch in betreffendem device stehen haben , dann würde ich es über besagtes userreading machen , oder willst du diverse Geräte auf anzahl der Readings abfragen , dann ist wohl doif oder ähnliches die beste wahl.
wobei dieses zusätzliche device ( doif ) m.E. ja im Grunde nicht nötig ist ?!
gruss Byte09
edit: gekürztes userreading:
anzahl1 {my $anz = grep( m/.*/, ( keys %{$hash->{READINGS}} )); return $anz;}
Zitat von: 87insane am 16 Februar 2019, 11:16:20
Finde die Idee mit der Aggregation sehr gut. Damit habe ich bisher noch nichts gemacht.
Natürlich geht das nicht und ich habe einen Fehler drin... In deinem Beispiel hast du "power" genommen. Woher weiß dein Beispiel bei welchem Gerät es suchen muss?
Test-Beispiel:
Gerätname: ECHO_123
Readings die gezählt werden sollen: alarm_..status
Geht nicht:
{[#"^ECHO_123:alarm..status"]}
EDIT: Die Anforderung ist einfach eine Zahl als Ausgabe. Also bei meinem Beispiel sind z.B. 7 Readings mit dem Namen alarm..status in dem Gerät vorhanden. Und der Code, welcher es am Ende auch sein wird, soll dann einfach zählen wie viele es sind und am Ende eine 7 ausgeben. Mir geht es nicht um die Werte die im Reading stehen.
Nicht raten, lesen. Deine Syntay ist falsch, s. https://commandref.fhem.de/commandref_DE.html#DOIF_Inhaltsuebersicht analog zum Beispiel mit "Gruenschnitt".
Also mein Traum wäre es, einfach ein Reading zu haben innerhalb des betroffenen Gerätes in dem plump die aktuelle Zahl steht.
Ein gerät (welches auch immer) würde ich ungerne dafür extra haben...
Zitat von: 87insane am 16 Februar 2019, 11:28:04
Also mein Traum wäre es, einfach ein Reading zu haben innerhalb des betroffenen Gerätes in dem plump die aktuelle Zahl steht.
Ein gerät (welches auch immer) würde ich ungerne dafür extra haben...
dann verweise ich auf hier:
https://forum.fhem.de/index.php/topic,97471.msg907044.html#msg907044 (https://forum.fhem.de/index.php/topic,97471.msg907044.html#msg907044)
;)
gruss Byte09
Zitat von: 87insane am 16 Februar 2019, 11:28:04
Also mein Traum wäre es, einfach ein Reading zu haben innerhalb des betroffenen Gerätes in dem plump die aktuelle Zahl steht.
Ein gerät (welches auch immer) würde ich ungerne dafür extra haben...
Vielleicht gibt ja bald eine DOIF-API.
Zitat von: Ellert am 16 Februar 2019, 11:35:54
Vielleicht gibt ja bald eine DOIF-API.
??? .... und was stellst du dir darunter vor ?
gruss Byte09
Zitat von: 87insane am 16 Februar 2019, 11:28:04
Also mein Traum wäre es, einfach ein Reading zu haben innerhalb des betroffenen Gerätes in dem plump die aktuelle Zahl steht.
Ein gerät (welches auch immer) würde ich ungerne dafür extra haben...
Konkreter zum Vorschlag von Byte09:
anzahl1 {my $anz = grep( m/alarm.*status/, ( keys %{$hash->{READINGS}} )); return $anz;}
VG Sebastian
Kleinster Wert der Readings des Devices "abfall", in deren Namen "Gruenschnitt" vorkommt und die mit "_days" enden:
[#sum:"^ECHO_123$":"alarm_.._status$"]
Wenn ich das anpassen will, scheitere ich daran es zu testen. Fhem Comandline sagt auch immer ich habs falsch.
syntax error at (eval 926) line 1, at EOF
Missing right curly or square bracket at (eval 926) line 1, at end of line
Bei Grünschnitt geht er auf die Werte der Readings ein. Bei mir wäre es ja die Anzahl an sich.
@Byte09: Danke für deinen Code. Versuche aber mal beide Lösungen zu verstehen und zu testen.
EDIT: anzahl1 {my $anz = grep( m/alarm.*status/, ( keys %{$hash->{READINGS}} )); return $anz;} --- Das hier einfach in ein Reading packen und natürlich auf mein Gerät anpassen und fertig wäre es?
in ein userreading
attr 'userReadings' des betreffenden devices.
https://wiki.fhem.de/wiki/UserReadings (https://wiki.fhem.de/wiki/UserReadings)
gruss Byte09
Mega der kleine Schnippsel von Code und es läuft.
Wann wird das Reading denn immer aktualisiert? Die Berechnung als solche geht schon mal sauber durch :)
Zitat von: 87insane am 16 Februar 2019, 11:58:12
Mega der kleine Schnippsel von Code und es läuft.
Wann wird das Reading denn immer aktualisiert? Die Berechnung als solche geht schon mal sauber durch :)
immer dann , wenn ein beliebiges reading des devices aktualisiert wird
auszug commandref:
ZitatDiese benutzerdefinierte Readings werden bei jeder Aktualisierung der Gerätereadings gesetzt, indem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird......
gruss Byte09
Also das ist wirklich das, was ich haben wollte. Klein und effektiv! Danke und einen schönen Tag noch!