Standard-FHEM Problem ReadingVal für Summierung von PV-Strom

Begonnen von Matthias76, 01 Januar 2020, 23:50:45

Vorheriges Thema - Nächstes Thema

Matthias76

Ich erfasse von 3 Modulwechselrichtern die eingehende Leistung per FritzDect-Geräte, da diese auch in beide Richtungen funktionieren - zählen.
Nun hatte ich ich also immer die 3 Werte, 3 Logfiles, 3 Plots.

Ich möchte aber einen gesamten addierten Verlauf darstellen.

Dazu habe ich mir dummy-Variabeln geschaffen:
AnlageClassicSumme (ist die definierte AT Anweisung, zum Auslesen, addieren, neu schreiben)
AnlageClassicPower (in dieser definierten Variabel/dummy soll der Wert reingeschrieben werden)

COMMAND
{ my $sued= ReadingVal("FBDECT_fbahahttp_11657_0146783", "power", 0); my $west= ReadingVal("FBDECT_fbahahttp_11657_0152660", "power", 0); my $suedwest= ReadingVal("FBDECT_fbahahttp_11657_0150743", "power", 0); my $powersum=value("sued")+value("west")+value("suedwest"); fhem("set AnlageClassicPower $powersum")}
DEF    
+*00:05:00 { my $sued= ReadingVal("FBDECT_fbahahttp_11657_0146783", "power", 0); my $west= ReadingVal("FBDECT_fbahahttp_11657_0152660", "power", 0); my $suedwest= ReadingVal("FBDECT_fbahahttp_11657_0150743", "power", 0); my $powersum=value("sued")+value("west")+value("suedwest"); fhem("set AnlageClassicPower $powersum")}

Jetzt sollte eine 0 in AnlageClassicPower geschrieben werden, alle 5 Minuten, so lange alles aus ist.
Das passiert aber nicht. Es bliebt immer undefiniert: ???
Manuell mal auf "1" festgesetzt, bleibt es auf "1", obwohl alle 5 Minuten das AT abgearbeitet wird.

Dann habe ich mir mal das FHEM-Log angeschaut:
2020.01.01 23:45:23 1: ERROR evaluating { my $sued= ReadingVal("FBDECT_fbahahttp_11657_0146783", "power", 0);  my $west= ReadingVal("FBDECT_fbahahttp_11657_0152660", "power", 0);  my $suedwest= ReadingVal("FBDECT_fbahahttp_11657_0150743", "power", 0);  my $powersum=value("sued")+value("west")+value("suedwest"); fhem("set AnlageClassicPower $powersum")}: Undefined subroutine &main::ReadingVal called at (eval 44687127) line 1.
2020.01.01 23:45:23 3: AnlageClassicSumme: Undefined subroutine &main::ReadingVal called at (eval 44687127) line 1.

Wo liegt denn mein Fehler in der Befehlskette?
"power" ist doch das Reading des Devices, welches ich abfragen will.
Es liefert etwas wie "0.0 W" ab. Ob der Text und der Punkt darin stört?
Aber wie wäre die Abfrage korrekt?

Byte09

#1
Zitat von: Matthias76 am 01 Januar 2020, 23:50:45
Ich erfasse von 3 Modulwechselrichtern die eingehende Leistung per FritzDect-Geräte, da diese auch in beide Richtungen funktionieren - zählen.
Nun hatte ich ich also immer die 3 Werte, 3 Logfiles, 3 Plots.

Ich möchte aber einen gesamten addierten Verlauf darstellen.

Dazu habe ich mir dummy-Variabeln geschaffen:
AnlageClassicSumme (ist die definierte AT Anweisung, zum Auslesen, addieren, neu schreiben)
AnlageClassicPower (in dieser definierten Variabel/dummy soll der Wert reingeschrieben werden)

COMMAND
{ my $sued= ReadingVal("FBDECT_fbahahttp_11657_0146783", "power", 0); my $west= ReadingVal("FBDECT_fbahahttp_11657_0152660", "power", 0); my $suedwest= ReadingVal("FBDECT_fbahahttp_11657_0150743", "power", 0); my $powersum=value("sued")+value("west")+value("suedwest"); fhem("set AnlageClassicPower $powersum")}
DEF    
+*00:05:00 { my $sued= ReadingVal("FBDECT_fbahahttp_11657_0146783", "power", 0); my $west= ReadingVal("FBDECT_fbahahttp_11657_0152660", "power", 0); my $suedwest= ReadingVal("FBDECT_fbahahttp_11657_0150743", "power", 0); my $powersum=value("sued")+value("west")+value("suedwest"); fhem("set AnlageClassicPower $powersum")}

Jetzt sollte eine 0 in AnlageClassicPower geschrieben werden, alle 5 Minuten, so lange alles aus ist.
Das passiert aber nicht. Es bliebt immer undefiniert: ???
Manuell mal auf "1" festgesetzt, bleibt es auf "1", obwohl alle 5 Minuten das AT abgearbeitet wird.

Dann habe ich mir mal das FHEM-Log angeschaut:
2020.01.01 23:45:23 1: ERROR evaluating { my $sued= ReadingVal("FBDECT_fbahahttp_11657_0146783", "power", 0);  my $west= ReadingVal("FBDECT_fbahahttp_11657_0152660", "power", 0);  my $suedwest= ReadingVal("FBDECT_fbahahttp_11657_0150743", "power", 0);  my $powersum=value("sued")+value("west")+value("suedwest"); fhem("set AnlageClassicPower $powersum")}: Undefined subroutine &main::ReadingVal called at (eval 44687127) line 1.
2020.01.01 23:45:23 3: AnlageClassicSumme: Undefined subroutine &main::ReadingVal called at (eval 44687127) line 1.

Wo liegt denn mein Fehler in der Befehlskette?
"power" ist doch das Reading des Devices, welches ich abfragen will.
Es liefert etwas wie "0.0 W" ab. Ob der Text und der Punkt darin stört?
Aber wie wäre die Abfrage korrekt?

ohne das ich jetzt den code gelesen habe - da unleserlich ( bitte code-tags benutzen ) - steht das erste problem doch dort:
ZitatUndefined subroutine &main::ReadingVal called at (eval 44687127) line 1.

ReadingVal  ist nicht ReadingsVal - und somit eine nicht vorhandene Routine .

gruss Byte09

Wzut

#2
Zitat von: Matthias76 am 01 Januar 2020, 23:50:45
my $powersum=value("sued")+value("west")+value("suedwest");

sorry , aber der Teil ist Blödsinn, entweder :

my $powersum=$sued+$west+$suedwest;

oder gleich ganz ohne $powersum

fhem("set AnlageClassicPower ".$sued+$west+$suedwest)

und wegen  Punkt und Watt : Tausche das falsch geschriebene ReadingsVal gegen ReadingsNum

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Matthias76

Ein großes DANKE geht raus.
Ich hatte mir das Reading(s)Val aus nen Beispiel im Netz zu eigen gemacht.
Da fehlte schon das S, so hatte ich es fortgeführt.
Komisch auch, dass man ReadingsNum seltener in Beispielen findet, als ReadingsVal, da es bestimmt nicht nur in meinen Fall gerade besser geeignet ist.  ;)

Es geht nun jedenfalls.  :)

Wzut

Zitat von: Matthias76 am 12 Januar 2020, 12:01:49
Komisch auch, dass man ReadingsNum seltener in Beispielen findet, als ReadingsVal,
verstehe ich auch nicht , ich bin jedenfalls ein großer Fan ReadingsNum und AttrNum (das findest du noch weniger) 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Matthias76

Noch eine Frage:
Das weiter zum Energiezähler zu machen, wird hier und da beschrieben, mit der Anwendung von UserReadings und Integral.
Aber so wie es 2015 auftauchte, versackte es auch wieder.

Mir wurde es noch nicht klar genug.
Aktuell habe ich also einen aktuellen Leistungs-Gesamt-Wert.
Das einfachste wäre nun ein Zähler, der einfach nur weiter hochläuft, wie ein normaler Zähler.
Aufwändiger sicher ,,letzte Stunde", ,,letzter Tag", ,,Monat x".

Aber ich kann jetzt nicht einfach einen dummy SummeTotal anlegen und darin einen Bezug zu dem anderen Dummy machen.
Einfach wäre es, wenn es so ginge:
attr SummeTotal userReadings integral {AnlageClassicPower}
...und dies dazu führen würde, wenn in SummeTotal der zeitlich korrekt in Relation gebrachte aufsummierte Energiewerte stünde).
Ein Reading brauche ich ja nicht mehr, stehen ja nackte Zahlen zum Zeitpunkt x in diesem Dummy bzw. dem Log dahinter.

Wzut

das wird so nicht gehen,
wenn du in einem Dummy ein attr userreading anlegst wird es vermutlich nie getriggert.
(BTW man sollte userreadings auch nie so nackt stehen lassen sondern immer mit den : den passenden Trigger angeben)
Besser für deinen Zweck wäre ein noitfy und dort die Summe bilden zb. in deinen Dummy mit setreading schreiben.
oder gleich auf den Dummy verzichten und mit userreading im Strom Device bleiben.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

TomLee

Hallo,

also mir ist scheinbar gestern Set_magic klarer geworden, wenn ich diesen Beitrag jetzt lese hätte ich folgendes einfaches (lang machen es nur deine Devicenamen) setreading in deinem AT als weiteren Lösungsansatz:

define at_powersum at +*00:05:00 setreading AnlageClassicPower powersum {([FBDECT_fbahahttp_11657_0146783:power]+[FBDECT_fbahahttp_11657_0152660:power]+[FBDECT_fbahahttp_11657_0150743:power])}


Gruß

Thomas

TomLee

Muss meinen Vorschlag revidieren, nach einmal drüber schlafen fragte ich mich ob es in dem Reading noch eine Einheit gibt und kurze Recherche hat ergeben : ja. Ist ja auch oben irgendwo schon angemerkt.

Das setreading muss dann mit Set Magic so aussehen:

define at_powersum at +*00:05:00 setreading AnlageClassicPower powersum {([FBDECT_fbahahttp_11657_0146783:power:d]+[FBDECT_fbahahttp_11657_0152660:power:d]+[FBDECT_fbahahttp_11657_0150743:power:d])}