Hallo,
ich bin gerade verzweifelt. Ich möchte zum Beispiel diese Readings;
{([BTS_BA_Steckdose_Schrank_links:Rechenwert]+[BTS_BA_Steckdose_Toilette_rechts:Rechenwert]+[BTS_BA_Steckdose_Heizung:Rechenwert]+[BTS_BA_Steckdose_Spiegel_Doppelsteckdose:Rechenwert]+[BTS_BA_Steckdose_Toilette_links:Rechenwert]+[BTS_BA_Steckdose_Schrank_rechts:Rechenwert]+
[BTS_BA_Toilettenspuehlung:Rechenwert])}
alle summieren.
Möchte das aber so programmieren, dass ich mit [BTS_BA_.*:Rechenwert] alle summieren kann.
Wie mache ich das. Notify? DoiF und #sum? Ich hab es einfach nicht hinbekommen vielleicht kann mir jemand helfen. Bin schon den halben Tag dran und lese mich hier durchs Forum aber ich bekomme es nicht zum laufen.
Danke!
Das ist doch gefühlt schon dein 3 4ter Beitrag bzgl. dieses Themas? ;)
Irgendwo hattest du geschrieben: geschafft mit readingsGroup?
Daher hatte ich aufgehört zu lesen usw.
Also mal ein paar Stichworte:
devspec2array
D.h. wenn die Devices mit einer DevSpec zu erfassen sind, dann hast du damit alle Devices in einem array ;)
Dann das Array durcharbeiten und wenn auch noch das Reading immer gleich heißt, dann eben in der Schleife ein ReadingsNum/ReadingsVal und auf die einmal mit "null" initialisierte Variable addieren.
Dann noch überlegen wohin die Summe gespeichert werden soll...
...und wie die Sub (würde ich machen) aufgerufen wird: notify, wenn es einen Auslöser gibt oder at, wenn es zyklisch erfolgen soll.
EDIT: hier mal ein Schnipsel
sub mySumUp()
{
my @myDevices = devspec2array("NAME=BTS_BA_.*");
my $myActDevice = "";
my $mySum = 0;
foreach $myActDevice (@myDevices)
{
$mySum += ReadingsNum($myActDevice,"Rechenwert",0);
}
fhem("setreading DeviceToStore SumReading $mySum");
}
Gruß, Joachim
Zitat von: MadMax-FHEM am 10 Juli 2022, 16:08:28
foreach $myActDevice (@myDevices)
Da hat sich auf die Schnelle wohl ein Fehler eingeschlichen.
Es sollte wohl heißen:
foreach my $myActDevice (@myDevices)
Zitat von: Nobbynews am 10 Juli 2022, 16:33:20
Da hat sich auf die Schnelle wohl ein Fehler eingeschlichen.
Es sollte wohl heißen:
foreach my $myActDevice (@myDevices)
Stimmt ;)
Korrigiert...
Danke, Joachim
Hallo,
ja das stimmt. Ich habe das mit readingsGroup gelöst, kann aber die SUmme leider nicht mit InfluxDBLogger verarbeiten. AUf die altmodische Art mache ich das shcon, also Dummy erzeugen und alle Wertze durch Notify addieren. Diese Art sieht aber elegangter aus, da ich nun nicht mehr alle Decvices schreiben muss und wenn noch welche dazukommen sind die automatishc im Array.
Erstmal Danke für Eure Antworten. Soweit verstehe ich das SUb auch. Habe mal versucht das in ein Notify zu packen, bekomme aber noch kein Reading raus. Der Trigger stimmt und löst aus. Ich befürchte ich habe das Sub falsch "angebunden"? [Nicht wundern habe den Auslöser und den Neme= verändert].
Internals
CFGFN
DEF
STK_EG_BA_.*_BTR > 0
sub mySumUp()
{
my @myDevices = devspec2array("NAME=STK_EG_BA_.*_BTR");
my $mySum = 0;
foreach my $myActDevice (@myDevices)
{
$mySum += ReadingsNum($myActDevice,"Rechenwert",0);
}
fhem("setreading DevicetoStore SumReading $mySum");
}
FUUID 62cae17d-f33f-3e4f-cc00-4e555a407f7b92f3
NAME STK_EG_BA_Summe_Betriebsstunden_NOT
NR 4800
NTFY_ORDER 50-STK_EG_BA_Summe_Betriebsstunden_NOT
REGEXP (!) STK_EG_BA_.*_BTR
STATE 2022-07-10 17:03:38
TRIGGERTIME 1657465418.80644
TYPE notify
eventCount 20
Readings
state active 2022-07-10 17:04:38
triggeredByDev STK_EG_BA_Schrank_links_BTR 2022-07-10 17:03:38
triggeredByEvent Rechenwert: 1873 2022-07-10 17:03:38
Darf der .* nicht in der MItte sein? STK_EG_BA_.*_BTR
Could not optimize the regexp:
STK_EG_BA_.*_BTR
How I tried (notifyRegexpCheck):
STK_EG_BA_.*_BTR: no match (ignored)
Das hier ist doch keine Regex für ein Notify: STK_EG_BA_.*_BTR > 0
Siehe: https://wiki.fhem.de/wiki/Notify und https://fhem.de/commandref_DE.html#notify oder auch https://wiki.fhem.de/wiki/Event_monitor (damit kann man notify anlegen lassen)
EDIT:
Zitat von: netpirat am 10 Juli 2022, 17:18:50
Darf der .* nicht in der MItte sein? STK_EG_BA_.*_BTR
Doch das sollte gehen. Ist allerdings (soweit ich das umreiße) nicht optimal bzgl. NotifyDef (oder wie das heißt) und somit bzgl. Performance.
Reicht es nicht das zyklisch per at aufzurufen?
EDIT: und du musst nat. das Device DeviceToStore musst du schon an deine Umgebung anpassen oder halt genau mit dem Namen anlegen (dummy?).
Und eine sub-Definition kommt NICHT in ein notify sondern in eine myUtils, siehe: https://wiki.fhem.de/wiki/99_myUtils_anlegen
Ansonsten kannst du den Code INNERHALB der Sub auch ins notify stecken, wenn du das (unbedingt) willst.
In geschweifte Klammern für Perl-Code, siehe: https://wiki.fhem.de/wiki/Klammerebenen
Gruß, Joachim
Wahlweise auch mit einem schlanken DOIF?
Hier (nicht konkret angepasst, aber sollte zeigen, wie es geht):
defmod strom_eg.doif DOIF (["EG....PM$:apower"]) (setreading stromverbrauch.dum erdgeschoss [#sum:"EG....PM$":"^apower$"])
attr strom_eg.doif do always
Hiermit hole ich mir von allen Shelly im Erdgeschoss den aktuellen Verbauch, den ich dann mittels "setreading" summiert in ein dummy reinschreibe - dort wird dann via InfluxDBLogger wegprotokolliert.
Hallo,
danke für den Tipp mit der Performance. Da habe ich erstmal gar nicht so das Augenmer kdrauf gelegt. Ich habe drei Werte, Stormverbrauch in mA, Stromzählen in kwh und die hier beschriebenen Betriebsstunden. Die beiden letzteren können einmal am Tag in der Nacht aktualisiert werden. Das spart Ressourcen und reicht vollkomen aus. Daher ist ein DOIF, einmal täglich getriggert wirklich besser.
Habe das nun wie folgt umgebaut:
([23:50] )
{
my @myDevices = devspec2array("NAME=STK_EG_BA_.*_BTR");
my $mySum = 0;
foreach my $myActDevice (@myDevices)
{
$mySum += ReadingsNum($myActDevice,"Rechenwert",0);
}
fhem("setreading STK_EG_BA_Betriebsstunden_DUM Betriebsstunden_Badezimmer $mySum");
} DOELSE
Dazu dann das Dummy:
Internals
CFGFN
FUUID 62cb17c3-f33f-3e4f-5b9e-e59848f2b0f2810b
NAME STK_EG_BA_Betriebsstunden_DUM
NR 4894
STATE 3554
TYPE dummy
eventCount 2
Readings
Betriebsstunden_Badezimmer 3554 2022-07-10 20:28:44
attr stateFormat Betriebsstunden_Badezimmer
Funktioniert wunderbar.
Nun noch das Dummy in der Datenbank loggen lassen und dann ist alles perfekt!
Ich danke Euch für die Hilfe heute. Auf foreach wäre ich allein nicht so schnell gekommen.
Warum immer DOIF für so simple Dinge...
...werde ich nie verstehen, egal.
Ein at würde dasselbe tun... :)
Du kannst den Wert doch auch im DOIF selbst speichern, da braucht es doch keinen dummy... ;)
Aber wenn es geht...
...wie wäre dann ein [gelöst] o.ä. "vorne dran"? :)
Viel Spaß noch, Joachim
@netpirat: noch ein Vorschlag, wie es elegant mit einem DOIF im Perlmodus geht.
Zitatdefmod SummeBad DOIF summeBadezimmer {[23:50];; set_Reading("Betriebsstunden_Badezimmer",[?#sum:"^BTS_BA_Steckdose_:Rechenwert":Rechenwert],1)}\
attr SummeBad stateFormat Betriebsstunden_Badezimmer
Du kannst das als RAW importieren. Danach steht erst mal "Betriebsstunden_Badezimmer" im STATE, aber wenn Du einmal set summeBadezimmer klickst dann bekommst Du die Summe gerechnet und hast gleich getestet, ob es funktioniert. summeBadezimmer ist der Name des Perl-Blocks, den Du mit set ausführst.
Im Gegensatz zu Deiner Lösung, die wohl auch funktioniert, wird beim Perl-DOIF bei der Definition direkt Perl-code erzeugt und läuft dann maximal performant. Bei Deiner Lösung hast Du vom DOIF eigentlich nur den Zeittrigger genommen, wechselst dann in die Perl-Ebene {...} um danach einen fhem-Befehl aus DOIF heraus zu starten.
Da Du ja eh schon mit Perl arbeitest wäre Perl-DOIF vielleicht die beste Option, alles übersichtlich an einer Stelle zu haben. Die Attribut-problematik vom DOIF im fhem-Modus hast Du nicht, mußt dich allerdings selbst um alles kümmern, z.B. setzen des state oder Readings die events auslösen oder nicht. Ansonsten maximale Flexibilität mit subs und timern und per Template universell einsetzbar.
Alles weitere im Wiki: https://wiki.fhem.de/wiki/DOIF/Perl-Modus (https://wiki.fhem.de/wiki/DOIF/Perl-Modus)
Viel Erfolg!
Sany