Hallo liebe Leute, ich bin vermutlich wieder mal zu doof, die einfachsten Dinge hinzubekommen.
Ich habe mir einen dummy angelegt. Dieser heißt Verbrauchsmeter.
nun möchte ich mit zwei notify berechnete Werte in den dummy schreiben - aber irgendwie bin ich zu doof für die Berechnung der Werte. Kann mich jemand auf den richtigen Weg bringen?
Hier mal meine zwei notify - im dummy Verbrauchsmeter steht dann anstatt einer Zahl, die ich eigentlich erwarte, z.B. {return (ReadingsNum("Stromzaehler_Einspeisung","power",0) - ReadingsNum("Stromzaehler_Verbrauch","power",0)}
define VB1 notify Stromzaehler_Einspeisung:power:.* set Verbrauchsmeter {return (ReadingsNum("Stromzaehler_Einspeisung","power",0) - ReadingsNum("Stromzaehler_Verbrauch","power",0)}
define VB2 notify Stromzaehler_Verbrauch:power:.* set Verbrauchsmeter {return ReadingsNum("Stromzaehler_Einspeisung","power",0) - ReadingsNum("Stromzaehler_Verbrauch","power",0)}
Was mache ich falsch?
Zitat von: Stonemuc am 12 September 2022, 17:38:54
Was mache ich falsch?
Syntax unzulässig mischen.... Du beginnst mit FHEM-sets und machst dann mit Perl weiter.
Vermutlich ginge es so:
define VB1 notify Stromzaehler_Einspeisung:power:.*|Stromzaehler_Verbrauch:power:.* set Verbrauchsmeter {(ReadingsNum('Stromzaehler_Einspeisung','power',0) - ReadingsNum('Stromzaehler_Verbrauch','power',0))}
Naja, so wie es aussieht kann man fhem-Befehle (das set) und Perl (die Berechnung) nicht mischen, so wie es aussieht macht eben fhem aus deinem Code:
set Verbrauchsmeter "Text" (mit Text ist deine Berechnung)...
Evtl. so:
define VB1 notify Stromzaehler_Einspeisung:power:.* {my $value = ReadingsNum("Stromzaehler_Einspeisung","power",0) - ReadingsNum("Stromzaehler_Verbrauch","power",0);; fhem("set Verbrauchsmeter $value")}
EDIT: korrigiert, also fhem-Befehl ergänzt ;) Danke TomLee! (peinlich 8) )
Wobei jetzt wo ich es copy/pasted habe: es fehlt mindestens eine runde Klammer oder es ist eine zu viel je nachdem ;)
Zitat
(ReadingsNum("Stromzaehler_Einspeisung","power",0) - ReadingsNum("Stromzaehler_Verbrauch","power",0)
es gehen 3 auf aber nur 2 zu ;)
Dann natürlich wie immer: warum einen dummy?
Aber das muss jeder selber wissen...
Gruß, Joachim
define VB1 notify Stromzaehler_Einspeisung:power:.* {my $value = ReadingsNum("Stromzaehler_Einspeisung","power",0) - ReadingsNum("Stromzaehler_Verbrauch","power",0);; set Verbrauchsmeter $value}
Ausprobiert ? :P
Eher so mit fhem-Befehl Funktion in Perl:
{my$v=ReadingsNum("Demo","Demo",0) - ReadingsNum("Demo","test",0);; fhem("set Demo state $v")}
Zitat von: TomLee am 12 September 2022, 18:08:17
define VB1 notify Stromzaehler_Einspeisung:power:.* {my $value = ReadingsNum("Stromzaehler_Einspeisung","power",0) - ReadingsNum("Stromzaehler_Verbrauch","power",0);; set Verbrauchsmeter $value}
Ausprobiert ? :P
Eher so mit fhem-Befehl Funktion in Perl:
{my$v=ReadingsNum("Demo","Demo",0) - ReadingsNum("Demo","test",0);; fhem("set Demo state $v")}
Äh, ja klar, mist, der fhem-Befehl ;)
Gruß, Joachim
oh, schön... ein Popcorn-Thread... 8)
Vielen Dank...hab es mit der Lösung von TomLee hinbekommen.
Jetzt mach ich das mit FHEM ja schon knapp drei Jahre, aber dieses PERL/FHEM Kommandogemische bekomme ich einfach nicht hin - bzw. es so hin, dass ich gerade eben nicht mische.
define VB1 notify Stromzaehler_Einspeisung:power:.* {my$SE=ReadingsNum("Stromzaehler_Einspeisung","power",0) - ReadingsNum("Stromzaehler_Verbrauch","power",0);; fhem("set Verbrauchsmeter state $SE")}
Und noch eine Frage....wie baue ich so eine Berechnung jetzt in ein at ein?
define StromETag at *23:58 setreading Stromzaehler_Einspeisung Tageseinspeisung ([Stromzaehler_Einspeisung:energy0] - [Stromzaehler_Einspeisung:Vortag])
Ergibt leider bei mir im reading dann z.B. (567.5 - 563.0) - muss da irgendwo noch ein return rein?
Zitat von: Stonemuc am 12 September 2022, 20:04:28
Und noch eine Frage....wie baue ich so eine Berechnung jetzt in ein at ein?
define StromETag at *23:58 setreading Stromzaehler_Einspeisung Tageseinspeisung ([Stromzaehler_Einspeisung:energy0] - [Stromzaehler_Einspeisung:Vortag])
Ergibt leider bei mir im reading dann z.B. (567.5 - 563.0) - muss da irgendwo noch ein return rein?
Genauso, nur statt set eben setreading...
...allerdings nutze ich die setMagic (glaub ich heißt das) nicht.
Nimm halt auch ReadingsNum...
Gruß, Joachim
Zitat von: MadMax-FHEM am 12 September 2022, 20:05:59
Genauso, nur statt set eben setreading...
...allerdings nutze ich die setMagic (glaub ich heißt das) nicht.
Nimm halt auch ReadingsNum...
Gruß, Joachim
Okay...jetzt hab ich es verstanden....der komplette Ausführungsteil kommt dann quasi "hinten dran"
Und welche Klammern setze ich dann bei "komplexeren" Berechnungen? Wenn ich z.B. den Eigenverbrauch berechnen will? Mit der Formel :Eigenverbrauchsquote (in %) =
(Erzeugung – Einspeisung) / Erzeugung * 100
define Eigenverbrauch at *23:59 {my$EV=(ReadingsNum("Wechselrichter","Daily.Energy.Last",0) - ReadingsNum("Stromzaehler_Einspeisung","Tageseinspeisung",0))/(ReadingsNum("Wechselrichter","Daily.Energy.Last",0)*100));; fhem("setreading Verbrauchsmeter Eiegenverbrauch $EV")}
Das klappt nämlich nicht
Wie bei Matheaufgaben halt auch, inkl. Rechenregeln: Punkt vor Strich...
Jedes ReadingsNum ist quasi wie eine Zahl.
Die Klammern stimmen ja auch mit Zahlen nicht: Anzahl (erneut) falsch: eine mehr zu als auf...
EDIT: wenn du ein "leeres" at/notify/... anlegst, also "define nName notify RegeX {}" und dann per Klick auf DEF bearbeitest und CodeMirror aktiviert hast, dann siehst du das und es wird auch geprüft vor dem Abspeichern... Alternative: externer Editor mit "Klammernzähler" und dann wenn es passt nach fhem "übernehmen"...
Gruß, Joachim
Ja..die Klammer war es...aber eigentlich eine auf zu wenig :)
Zitat von: MadMax-FHEM am 12 September 2022, 21:31:18
Wie bei Matheaufgaben halt auch, inkl. Rechenregeln: Punkt vor Strich...
Jedes ReadingsNum ist quasi wie eine Zahl.
Die Klammern stimmen ja auch mit Zahlen nicht: Anzahl (erneut) falsch: eine mehr zu als auf...
EDIT: wenn du ein "leeres" at/notify/... anlegst, also "define nName notify RegeX {}" und dann per Klick auf DEF bearbeitest und CodeMirror aktiviert hast, dann siehst du das und es wird auch geprüft vor dem Abspeichern... Alternative: externer Editor mit "Klammernzähler" und dann wenn es passt nach fhem "übernehmen"...
Gruß, Joachim
Zitat von: Stonemuc am 12 September 2022, 22:36:04
Ja..die Klammer war es...aber eigentlich eine auf zu wenig :)
Das kommt drauf an...
...bzw. geht es generell mit weniger Klammern auch...
Gruß, Joachim
Naja..hauptsache es ist fast so wie ich es möchte. Gut wäre jetzt noch, wenn ich die Nachkommastelle mit sprintf irgendwie formatieren könnte...am besten auf 2 Nachkommastellen..aber wo kommt das dann hin? Das ist auch wieder etwas, was ich nicht verstehe....
fhem("setreading Verbrauchsmeter Autarkie $Aut")
$Aut=round($Aut,2);fhem("setreading Verbrauchsmeter Autarkie $Aut")
Auch wenn ich noch was davor habe? Weil dann gibt er mir nen Klammerfehler aus....
defmod Autarkie at +*00:30:00 {my$Aut=((ReadingsNum("Wechselrichter","Daily.Energy",0) - ReadingsNum("Stromzaehler_Einspeisung","Tageseinspeisung",0))/(ReadingsNum("Stromzaehler_Verbrauch","Tagesverbrauch",0))*100);; fhem("setreading Verbrauchsmeter Autarkie $Aut")}
Wie wäre es denn, wenn du den Fehler psoten würdest?
Und ich denke hier fehlt ein Leerzeichen?
my$Aut=... vs. my $Aut=...
Und: warum so elendsviele Klammern?
Und: wie gibst du das ein? Jedes mal KOMPLETT SO in FHEMWeb-cmd ODER per Klick auf DEF? ODER Raw-Def? -> wegen der Strichpunkte... z.B. hier https://forum.fhem.de/index.php?topic=98634.0
Ja, einfach NACHDEM du $Aut korrekt berechnet hast einen "Einschub" (von betateilchen) mit dem Runden und DANACH dann das set/setreading das du schon hast...
Pseudocode (weil mir deine Klammern zu viel sind):
my $Aut=Berechnung;; $Aut=round($Aut,2);; fhem("set...")
Gruß, Joachim
Naja, mit der Klammersetzung scheinst Du ja grundsätzlich auf Kriegsfuß zu stehen.
Grundsätzlich gilt bei Klammern nicht "viel hilft viel". Klammern sollte man genau da setzen, wo sie notwendig sind, und nicht "auf Verdacht".
Klammern können in Deinem Konstrukt aus zwei Gründen notwendig sein: Entweder, weil sie zu einer aufgerufenen perl Funktion z.B. ReadingsNum() gehören ODER weil sie mathematisch notwendig sind. Eigentlich müsste das Ganze so aussehen, wenn ich Dein Vorhaben richtig interpretiere:
my $Aut=( ReadingsNum("Wechselrichter","Daily.Energy",0) - ReadingsNum("Stromzaehler_Einspeisung","Tageseinspeisung",0) ) / ReadingsNum("Stromzaehler_Verbrauch","Tagesverbrauch",0) * 100;
Zitat von: MadMax-FHEM am 13 September 2022, 13:49:39
Wie wäre es denn, wenn du den Fehler psoten würdest?
Und ich denke hier fehlt ein Leerzeichen?
my$Aut=... vs. my $Aut=...
Und: warum so elendsviele Klammern?
Und: wie gibst du das ein? Jedes mal KOMPLETT SO in FHEMWeb-cmd ODER per Klick auf DEF? ODER Raw-Def? -> wegen der Strichpunkte... z.B. hier https://forum.fhem.de/index.php?topic=98634.0
Ja, einfach NACHDEM du $Aut korrekt berechnet hast einen "Einschub" (von betateilchen) mit dem Runden und DANACH dann das set/setreading das du schon hast...
Pseudocode (weil mir deine Klammern zu viel sind):
my $Aut=Berechnung;; $Aut=round($Aut,2);; fhem("set...")
Gruß, Joachim
Die Berechnung funktioniert mit meinen Klammern und dem my$Aut ohne Leerzeichen korrekt. Es kommt ja der richtige Wert raus - auch händisch nachgerechnet. Das Ändern mache ich immer über die RAW-def.
Dank deinem "Pseudocode" konnte ich es jetzt nachvollziehen. Ich muss also immer nach jedem "Abschnitt" ein doppel ;; machen...daran hat es bei mir gelegen.
Typischer Fall von Beratungsresistenz...
Ne..so soll es ja nicht sein, ich füge das Leerzeichen ein und versuch es mal mit deinem Vorschlag mit weniger Klammern...solte mathematisch ja auch klappen :)