Wie alle Readings eines Devices die einer Regex entsprechen addieren?

Begonnen von bicmac, 03 Juni 2019, 17:19:48

Vorheriges Thema - Nächstes Thema

bicmac

Hallo,
ich würde gern die alle Readings eines Devices die mit "Station-" beginnen addieren und in ein UserReading mit dem Namen "Summe" des selben devices Zurückschreiben.
Ist sowas möglich? ich weiss das ich alle einzeln nacheinander addieren kann. Ich würde aber gern automatisch alle addieren ohne jedes mal den notify oder was auch immer anpassen zu müssen wenn die Anzahl der vorhandenen Stationen und damit die Anzahl der Readings sich ändert.

Das sind die momentanen readings im Device. Die Summe müsste also momentan 0 sein. Sobald sich eine Station auf 1 ändert sollte sich die "Summe" automatisch anpassen. (und beim zurückrudern das selbe wieder)


READINGS:
     2019-06-03 17:16:42   Station-1       0
     2019-06-03 17:16:42   Station-2       0
     2019-06-03 17:16:42   Station-3       0
     2019-06-03 17:16:42   Station-4       0
     2019-06-03 17:16:42   Station-5       0
     2019-06-03 17:16:42   Station-6       0
     2019-06-03 17:16:42   Station-7       0
     2019-06-03 17:16:42   Station-8       0

Gisbert

attr userreadings Summe {readingsVal($name,'Station-1','') + readingsVal($name,'Station-2','') + ...}
... bitte selbst ergänzen.

Bitte Groß/Kleinschreibung anhand der commandref und Wiki selbst überprüfen, da gerade mobil.

Edit: gerade nachgeschaut:

  • userReadings
  • ReadingsVal
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Geht auch mit einem userReading:
attr Devicename userReading Summe:Station-.* {
my $hash = $defs{"Devicename"};
my $summe = 0;
my $key;
while (($key) = each($hash->{READINGS})){
$summe += ReadingsNum("Devicename", $key, 0) if ($key =~ 'Station-');
}
return $summe;
}
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

bicmac

ich bekomme einen Fehler wenn ich das mit dem user reading mache:

"Error evaluating Bewaesserung userReading Summe: Experimental each on scalar is now forbidden at (eval 149578) line 5."


attr Bewaesserung userReadings Summe:Station-.* {\
my $hash = $defs{"Bewaesserung"};;\
my $summe = 0;;\
my $key;;\
while (($key) = each($hash->{READINGS})){\
$summe += ReadingsNum("Bewaesserung", $key, 0) if ($key =~ 'Station-');;\
}\
return $summe;;\
}

amenomade

Sorry. Funktionierte mit einer frühere Version von Perl, jetzt nicht mehr. Probier mal mit
while (($key) = each(%$hash->{READINGS})){\
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Frank_Huber

Hallo,

Ich kapere mal diesen alten Thread da ich gerade genau das selbe vorhabe. :-)
per Sysstat SNMP frage ich die PoE Leistung einer Switch pro Port ab.
Daraus will ich eine Summe bilden.
Wen ich das UserReading anlege bekomme ich den Fehler "Experimental aliasing via reference not enabled at (eval 773) line 2."

Hier das userReading aus der RAW:
attr CWGE26FX2TX24MSPOE userReadings Summe:port-.* {\\
my $hash = $defs{'CWGE26FX2TX24MSPOE'};;\\
my $summe = 0;;\\
my $key;;\\
while (($key) = each(%$hash->{READINGS})){\\
$summe += ReadingsNum('CWGE26FX2TX24MSPOE', $key, 0) if ($key =~ 'port-');;\\
}\\
return $summe;;\\
}


Die Readings lauten "port-01_PoE_PowerUsed" "port-02_PoE_PowerUsed" usw...
Mache ich was falsch?

Danke & Grüße
Frank

Otto123

Hallo Frank,

ich habe ein Beispiel mit for ... (das baut alle Readings eines Devices in einen json String)
{my $d="fuehler1";;my $hash = $defs{$d};;my $readings = $hash->{READINGS};;my $message="{ ";;foreach my $a ( keys %{$readings} ) {my $val=ReadingsVal($d,$a,"error");;$message .= toJSON($a)." : ".toJSON($val)." ," };;chop($message);;$message.="}"}


Wenn ich mir das anschaue, muss es bei Dir eventuell each(%{$hash->{READINGS}}) heissen?
Sagt Dir ein Perlziemlichunwissender :)

Oder Du nimmst meine for Schleife ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Frank_Huber

#8
Danke Otto,

jedoch kommt mit each(%{$hash->{READINGS}}) die gleiche Fehlermeldung.
Das ist in Zeile 5, er mackert ja auch an Zeile 2: "my $hash = $defs{'CWGE26FX2TX24MSPOE'};;\\" an.

Ich glaube ich habe von Perl noch viel weniger Ahnung als Du. ;-)
Deine for Schleife macht einen JSON string, aber wie bekäme man daraus die Summe?

Beta-User

...wirklich eine Frage für den Anfängerbereich...

Hier mal ein dummy in RAW, der zu funktionieren scheint:
defmod test_sum dummy
attr test_sum userReadings Summe:port-.* { my $summe = 0;;\
for my $a ( keys %{$defs{$name}->{READINGS}} ) {\
$summe += ReadingsNum($name, $a, 0) if ($a =~ 'port-');;\
} return $summe;; }

setstate test_sum 2020-11-10 13:02:14 Summe 4
setstate test_sum 2020-11-10 13:01:58 port-1 1
setstate test_sum 2020-11-10 13:02:14 port-2 3

Bei dem Trigger sollte man aber aufpassen, ob es nicht Sinn macht, den noch weiter zu begrenzen (ist egal, wenn das via bulkUpdate kommt). Sonst werden halt die Berechnungen zu oft ausgeführt...
Und direkt auf die Hashes zugreifen ist auch nur bedingt zur Nachahmung zu empfehlen, ich weiß nur auf die Schnelle auch keine bessere Lösung.
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

Otto123

Ich würde in deinem Raw Definition Ausdruck jede Zeile anmeckern :), sehe ich aber jetzt erst:
die doppelten \\ führen doch unweigerlich zu Fehlern?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Frank_Huber

Danke Jörg, das funktioniert! :-)

@Otto, habs auch als Einzeiler versucht ganz ohne "\".
Bin halt nur "Bastler" und "User".

Beta-User

Danke für die Rückmeldung.

Vielleicht noch eine Anmerkung betr. "$name": Das funktioniert in userReadings immer und ist auch les- und übertragbarer (und nicht empfindlich gegen spätere Umbenennungen); "hartvercoded" sollte man m.E. nur machen, wenn man auf andere Devices zugreifen will (wobei das eh' zumindest gefühlt suboptimal ist; wenn, dann macht das nur für zentrale Infos Sinn, z.B. den aktuellen Strompreis oder so).

Ansonsten bin ich auch eher der c&p-Typ und hatte nur in jüngster Zeit häufiger das "Vergnügen", mit Hashes rumzuschubsen...

(btw. @Otto: das Grundgerüst aus https://forum.fhem.de/index.php/topic,115620.msg1099706.html#msg1099706 solltst du dir mal ansehen, kann man sicher auch woanders mal brauchen, und jetzt ist es auch (fast) auf einem "verständlichen" Stand...)
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