Hallo zusammen,
Ich würde gerne in einem DOIF eine berechnung machen.
Zählerstand aktuell - Zählerstand Monatsanfang.
Im Prinzip ja kein Problem aber die Readings enthalten Einheit sprich kWh und dadurch streikt die Berechnung mit der Meldung:
Unrecognized character \xC3; marked by <-- HERE after 165 kWh-[Z<-- HERE near column 15 at (eval 33874) line 1.
Das DOIF
([23:58] and (strftime ("%d",localtime time+86400) == 01))(setreading Zaehler Vormonat_bezug {([Zaehler:Energy_export__kWh]-[Zähler:Monats_Anfang_ex])})(setreading Zaehler Vormonat_einspeisung {([Zaehler:Energy_import__kWh]-[Zähler:Monats_Anfang_im])})
Und das Reading
Energy_export__kWh
78.614 kWh
Energy_import__kWh
161.193 kWh
Monats_Anfang_ex
77.327 kWh
Monats_Anfang_im
160.233 kWh
Hoffe ihr versteht was ich meine und könnt mir helfen.
Zitat von: Tueftler1983 am 07 Juli 2023, 23:18:46Unrecognized character \xC3; marked by <-- HERE after 165 kWh-[Z<-- HERE near column 15 at (eval 33874) line 1.
Zitat{([Zaehler:Energy_export__kWh]-[Zähler:Monats_Anfang_ex])})(setreading Zaehler Vormonat_einspeisung {([Zaehler:Energy_import__kWh]-[Zähler:Monats_Anfang_im])})
Im ersten Schritt würde ich mal die beiden "Zähler" durch "Zaehler" ersetzen.
Und dann bitte den Thread in das richtige Unterforum für DOIF verschieben.
Edit:
Besser wäre mMn eine Lösung mit einem at und atultimo() -> siehe commandref
Um nur den Zahlenwert zu bekommen, hilft ein :d - siehe hier:
http://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen
Also:
([23:58] and (strftime ("%d",localtime time+86400) == 01))(setreading Zaehler Vormonat_bezug {([Zaehler:Energy_export__kWh:d]-[Zaehler:Monats_Anfang_ex:d])})(setreading Zaehler Vormonat_einspeisung {([Zaehler:Energy_import__kWh:d]-[Zaehler:Monats_Anfang_im:d])})
Das Szenario ist genau die Grundlage dafür, dass in at die Funktion at_ultimo() eingebaut wurde: "Immer am Monatsletzten um kurz vor Mitternacht irgendetwas ausführen". Damit kann man sich die Prüfung, "ob jetzt + 1 Tag der 01. des Monats ist", komplett sparen.
Es geht mir nicht in den Kopf, warum man als Anwender nicht einfache und vom System bereitgestellte Funktionalitäten nutzt, anstatt dauernd das Rad neu erfinden zu wollen.
Zitat von: betateilchen am 08 Juli 2023, 10:20:09Das Szenario ist genau die Grundlage dafür, dass in at die Funktion at_ultimo() eingebaut wurde: "Immer am Monatsletzten um kurz vor Mitternacht irgendetwas ausführen". Damit kann man sich die Prüfung, "ob jetzt + 1 Tag der 01. des Monats ist", komplett sparen.
Es geht mir nicht in den Kopf, warum man als Anwender nicht einfache und vom System bereitgestellte Funktionalitäten nutzt, anstatt dauernd das Rad neu erfinden zu wollen.
I h habe nur einen Codes Schnipsel aus einem anderen Beitrag übernommen in dem das at_ultimo wohl nicht funktionierte.
Es ging mir in meinem Beitrag auch eigentlich nur um die Berechnung, diese funktioniert mit dem :d jetzt!
Problem ist damit gelöst, werde das at_ultimo aber nutzen bzw testen.
Wie muss die at_ultimo() Definition im DOIF denn aussehen?.
Im Wiki habe ich dazu leider nix gefunden oder war blind.
LG holger
Zitat von: Tueftler1983 am 08 Juli 2023, 11:38:56Wie muss die at_ultimo() Definition im DOIF denn aussehen?.
Im Wiki habe ich dazu leider nix gefunden oder war blind.
Du sollst ja auch in der commandref nachsehen, und nicht im Wiki.
https://fhem.de/commandref_DE.html#at (https://fhem.de/commandref_DE.html#at)
ZitatUm einen FHEM Befehl immer am letzten Tag des Monats auszuführen, kann die Funktion at_ultimo() als perlfunc für eine datespec verwendet werden.
define at_ultimo at *{at_ultimo()} set lamp1 off
Hiermit wird ein at device erzeugt, der immer am letzten Tag des Monats um 23:59:00 Uhr ausgeführt wird.
at_ultimo() kann drei optionale Parameter verarbeiten, um eine andere Uhrzeit anzugeben.
define at_ultimo at *{at_ultimo(12,23,45)} set lamp1 off
Es wird ein at device erzeugt, das immer um 12:34:45 am Monatsletzten ausgeführt wird.
Okay also meinen Berechnungsteil nicht im DOIF sondern in ein at.
Aber kann es sein das in der commandref ein Fehler ist?
define at_ultimo at *{at_ultimo(12,23,45)} set lamp1 off
Es wird ein at device erzeugt, das immer um 12:34:45 am Monatsletzten ausgeführt wird.
Muss das dann nicht 12:23:45?
So ich nochmal,
Ist das so dann richtig definiert?
define at_ultimo at *{at_ultimo()} setreading Zaehler Vormonat_bezug {([Zaehler:Energy_export__kWh:d]-[Zaehler:Monats_Anfang_ex:d])} ;; setreading Zaehler Vormonat_einspeisung {([Zaehler:Energy_import__kWh:d]-[Zaehler:Monats_Anfang_im:d])}
Zitat von: Tueftler1983 am 09 Juli 2023, 00:35:29Muss das dann nicht 12:23:45?
Nein, muss es nicht.
Die Angabe in der commandref ist korrekt.
Edit:
Die Zahlenwerte sind in der Tat nicht richtig. Das Format aber schon:
Zitat von: Tueftler1983 am 09 Juli 2023, 00:47:41Ist das so dann richtig definiert?
Versuch macht kluch....
Vermutlich werden hier bei der Verwendung von setmagic die Varianten von Syntax 1 und Syntax 2 unzulässig vermischt.
https://wiki.fhem.de/wiki/Set_magic (https://wiki.fhem.de/wiki/Set_magic)
Würde ich mit Perl-Code lösen:
...at_ultimo()} {
my $wert = ReadingsNum("Zaehler","Energy_export__kWh",0) - ReadingsNum("Zaehler","Monats_Anfang_ex",0);
fhem ("setreading Zaehler Vormonat_bezug $wert");
....
}
Zitat von: Tueftler1983 am 09 Juli 2023, 00:47:41Ist das so dann richtig definiert?
Du kannst das angelegte at doch einfach testen, indem Du ein "set <name> execNow" ausführst. Dann siehst Du, ob er gewünschte Wert korrekt (natürlich bezogen auf den aktuellen Tag) angelegt wird und brauchst nicht erst bis zum Monatsende warten.
Jo, vielen lieben dank an euch!
Es klappt wie es soll und ich muss sagen es sieht viel übersichtlicher aus als alles in ein DOIF zu packen.
So lasse ich jetzt die Verbrauchsrechnung und Einspeiserechnung am Letzten des Monats um 23:59:50 machen und die Speicherung des aktuellen zählerstandes am Letzten des Monats um 23:59:59.
Vielen lieben Dank nochmal, auch für die geduld
Zitat von: Tueftler1983 am 09 Juli 2023, 11:51:41ich muss sagen es sieht viel übersichtlicher aus als alles in ein DOIF zu packen.
Mein Reden seit vielen Jahren. Man muss nicht jeden Mist mit einem DOIF machen, es gibt für viele (eigentlich alle) Aufgaben sehr viel einfachere und vor allem einfacher und auch in drei Jahren noch zu verstehende Lösungen in FHEM.
Zitat von: betateilchen am 09 Juli 2023, 13:06:45Mein Reden seit vielen Jahren. Man muss nicht jeden Mist mit einem DOIF machen, es gibt für viele (eigentlich alle) Aufgaben sehr viel einfachere und vor allem einfacher und auch in drei Jahren noch zu verstehende Lösungen in FHEM.
Jo, jo...
Nur leider: oft kennt man die anderen Möglichkiten nicht oder findet bei ungeschickter Suche andere/alternative Lösungen nicht...
Zitat von: RalfRog am 09 Juli 2023, 15:42:56Nur leider: oft kennt man die anderen Möglichkiten nicht
Zum Glück habe ich FHEM in einer Zeit kennengelernt, als es DOIF noch gar nicht gab. Das ist zwar lange her, aber es war glücklicherweise eine Zeit, in der man quasi gezwungenermaßen verstehen musste, wie FHEM grundsätzlich funktioniert. Dieses Wissen macht auch heute noch vieles sehr viel einfacher und ist sehr viel nützlicher, als einfach per copy&paste irgendwas zusammenklauen zu wollen, von dem in vielen Fällen gar nicht verstanden wird, was da eigentlich passiert/passieren soll.
Richtig, und leider tue ich mir doch sehr schwehr mit den unterschiedlichen syntaxen. Mit Klammer ohne Klammer mit , getrennt mit ; getrennt und und und.
Fhem ist meiner Meinung nach immernoch die Mächtigste Home Automation Software aber auch mit die Schwerste.
Ich müßte eigentlich mein HAUPT System neu aufsetzen um auf Bullseye zu kommen aber weiß nicht ob ich dann alles wieder ans laufen bekomme.
Naja trotzdem oder Grade deswegen, vielen lieben dank nochmal
Zitat von: Tueftler1983 am 09 Juli 2023, 23:25:22Richtig, und leider tue ich mir doch sehr schwehr mit den unterschiedlichen syntaxen. Mit Klammer ohne Klammer mit , getrennt mit ; getrennt und und und.
Das Syntax- und Klammern-Chaos hast Du aber in dem extremen Ausmass nur in DOIF. In reinem perl, wie es in at und notify verwendet wird, ist die Klammersetzung eindeutig und nachvollziehbar geregelt.
Übrigens: bullseye ist inzwischen auch schon wieder veraltet 😀