DOIF mit Berechnung aber Text in Reading *Gelöst* in Post#2 bessere Lösung Post8

Begonnen von Tueftler1983, 07 Juli 2023, 23:18:46

Vorheriges Thema - Nächstes Thema

Tueftler1983

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.

Nobbynews

#1
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

xenos1984

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])})

betateilchen

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.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Tueftler1983

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.

Tueftler1983

Wie muss die at_ultimo() Definition im DOIF denn aussehen?.
Im Wiki habe ich dazu leider nix gefunden oder war blind.

LG holger

Nobbynews

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

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.

Tueftler1983

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?

Tueftler1983

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])}

Nobbynews

#9
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:

Nobbynews

#10
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

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");
....
}


betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Tueftler1983

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

RalfRog

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...
FHEM auf Proxmox VM Bookworm (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen