[GELÖST] - Readings einer bestimmten Art zusammen zählen (Anzahl von Readings)

Begonnen von 87insane, 16 Februar 2019, 10:21:10

Vorheriges Thema - Nächstes Thema

87insane

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!

Byte09

ü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

87insane

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.

Byte09

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

87insane

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....

Ellert

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.

Byte09

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

87insane

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.

Byte09

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;}

Ellert

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".

87insane

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...

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...

dann verweise ich auf hier:

https://forum.fhem.de/index.php/topic,97471.msg907044.html#msg907044

;)

gruss Byte09

Ellert

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.

Byte09

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

binford6000

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