FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: netwalk am 17 August 2022, 10:38:51

Titel: Problem bei Berechnung im Ausführungsteil
Beitrag von: netwalk am 17 August 2022, 10:38:51
Hallo zusammen,

ich habe mir vor einiger Zeit eine Steuerung für meine Bewässerungsventile erstellt.

Nun wollte ich diese erweitern für den Fall einer Rasen-Neuanlage.
Zu diesem Zweck wähle ich über einen Dummy dm.au.Ventil.Neuanlage den Bewässerungsbereich 1 bis 4, aktuell Bereich 2.
In einem weiteren Dummy dm.au.Ventil.2.Menge wähle ich die gesamte auszubringende Menge Wasser für den Tag. In diesem Dummy sind über Userreadings unterschiedliche Mengen für den Tagesverlauf berechnet.

Mit diesen beiden Werten bestücke ich ein DOIF, in dem nach Zeitplan die anteilige Menge Wasser ausgebracht wird:


[...] DOIF [...]

({fhem("set ".ReadingsVal("dm.au.Ventil.Neuanlage","ventil","test")." on-for-timer [dm.au.Ventil.".ReadingsVal("dm.au.Ventil.Neuanlage","state","0").".Menge:02.vormittags]")})


Nun hätte ich gerne über einen weiteren Dummy ein Intervall festgelegt, um die anfängliche viertelstündliche Auslösung nach der Saat zeitlich zu strecken. Mir gelingt es jedoch nicht, den Sekundenwert für on-for-timer im Ausführungsteil berechnen zu lassen.

Versucht habe ich:
({fhem("set ".ReadingsVal("dm.au.Ventil.Neuanlage","ventil","test")." on-for-timer {(int([dm.au.Ventil.".ReadingsVal("dm.au.Ventil.Neuanlage","state","0").".Menge:02.vormittags] * ReadingsNum("dm.au.Ventil.Neuanlage.Intervall","state","1")/0.25))}")})

und:
({fhem("set ".ReadingsVal("dm.au.Ventil.Neuanlage","ventil","test")." on-for-timer {(int([dm.au.Ventil.".ReadingsVal("dm.au.Ventil.Neuanlage","state","0").".Menge:02.vormittags] * [dm.au.Ventil.Neuanlage.Intervall:state]/0.25))}")})

erhalte aber jeweils die Fehlermeldung:
syntax error at (eval 14894652) line 1, near "".ReadingsVal("dm"

Führe ich den ersten Befehl direkt aus, erhalte ich:
syntax error at (eval 14902424) line 1, near "".Menge:02.vormittags] * ReadingsNum("dm"

Die zweite Variante funktioniert beim direkten Ausführen hingegen einwandfrei!

Was habe ich übersehen?
Titel: Antw:Problem bei Berechnung im Ausführungsteil
Beitrag von: DetlefR am 17 August 2022, 21:06:46
Sinnvolle Verschachtelung ist hilfreich.
Auch bei Anführungszeichen.
Zitat" on-for-timer {(int([dm.au.Ventil."
Ist sicher nicht hilfreich.
Ein Editor der so etwas farblich hervorhebt, kann sehr hilfreich sein. 
Titel: Antw:Problem bei Berechnung im Ausführungsteil
Beitrag von: netwalk am 17 August 2022, 22:35:03
@DetlefR
Ich benutze den internen Editor, der mir bei den Klammern eine farbliche Unterstützung bietet, allerdings nicht bei den Anführungszeichen.


Probiert hatte ich auch bereits:
{fhem("set ".ReadingsVal("dm.au.Ventil.Neuanlage","ventil","test")." on-for-timer ".{(int([dm.au.Ventil.".ReadingsVal("dm.au.Ventil.Neuanlage","state","0").".Menge:05.abends] * [dm.au.Ventil.Neuanlage.Intervall:state]/0.25))})}
weil es mir logisch erschien, die berechneten Sekunden aus dem Segment mit Anführungszeichen herauszunehmen, allerdings erhalte ich dann die selbe Fehlermeldung und beim Direktaufruf in der Command-Zeile funktioniert es auch nicht.

Hilf mir bitte auf die Sprünge, wo steckt der Fehler?
Titel: Antw:Problem bei Berechnung im Ausführungsteil
Beitrag von: DetlefR am 17 August 2022, 22:58:31
ZitatIch benutze den internen Editor, der mir bei den Klammern eine farbliche Unterstützung bietet, allerdings nicht bei den Anführungszeichen.
Mein Favorit ist Notepad++

".ReadingsVal("
soll sicher nicht so sein.
Versuch mal{fhem("set ".ReadingsVal('dm.au.Ventil.Neuanlage','ventil','test')." on-for-timer ".{int([dm.au.Ventil."ReadingsVal('dm.au.Ventil.Neuanlage','state','0')".Menge:05.abends] * [dm.au.Ventil.Neuanlage.Intervall:state]/0.25)})}
Ich muss aber sagen, dass ich mit der DOIF Syntax nicht so vertraut bin.
Titel: Antw:Problem bei Berechnung im Ausführungsteil
Beitrag von: netwalk am 17 August 2022, 23:17:36
Das hier:
{fhem("set ".ReadingsVal('dm.au.Ventil.Neuanlage','ventil','test')." on-for-timer ".{int([dm.au.Ventil."ReadingsVal('dm.au.Ventil.Neuanlage','state','0')".Menge:05.abends] * [dm.au.Ventil.Neuanlage.Intervall:state]/0.25)})}

liefert die Fehlermeldung:
syntax error at (eval 15358874) line 1, near "Menge:"
in der Command-Zeile und:
{fhem("set ".ReadingsVal('dm.au.Ventil.Neuanlage','ventil','test')." on-for-timer ".{int([dm.au.Ventil."ReadingsVal('dm.au.Ventil.Neuanlage','state','0')".Menge:05.abends] * 0.5/0.25)})}: syntax error at (eval 15359674) line 1, near "Menge:"
im DOIF.

Ich stehe auf dem Schlauch...

Titel: Antw:Problem bei Berechnung im Ausführungsteil
Beitrag von: DetlefR am 18 August 2022, 13:24:34
Können wir uns darauf einigen, dass das ganze mal etwas aufgeteilt wird.
Das erhöht die Lesbarkeit ungemein.
{
#Ventil auslesen
my $ventil=ReadingsVal('dm.au.Ventil.Neuanlage','ventil','test');
#Ventilstatus auslesen
my $state=ReadingsVal('dm.au.Ventil.Neuanlage','state','0');
#Interval auslesen
my $interval=ReadingsVal('dm.au.Ventil.Neuanlage.Intervall','state','0')/0.25;
#Menge auslesen ?
my $menge=ReadingsVal("dm.au.Ventil.$state.Menge",'05.abends','0');
my $dauer=int($menge*interval);
fhem("set $ventil on-for-timer $dauer");
}

Es kann sein, dass ich inhaltlich etwas falsch verstanden habe. Aber es sollte erst mal ohne Fehler laufen.
Titel: Antw:Problem bei Berechnung im Ausführungsteil
Beitrag von: netwalk am 18 August 2022, 15:57:48
Danke für Deine Geduld,

vielleicht noch kurz zur Erklärung:

dm.au.Ventil.Neuanlage beinhaltet in der SetList die Nummer des Ventils (1 bis 4) und damit im UserReading
ventil {"sd.au.Ventil.Terrasse_Sw_0".ReadingsVal("dm.au.Ventil.Neuanlage","state","")}
den Namen des Homematic-Aktors

dm.au.Ventil.<Nummer>.Menge beinhaltet für die jeweiligen Ventile (Nummer 1 bis 4) die zu applizierende Wassermenge für den Tag, und in UserReadings anteilige Mengen für den Tagesverlauf (01.morgens, 02.vormittags,...)

dm.au.Ventil.Neuanlage.Intervall beinhaltet das Intervall in wählbaren Abstufungen.

Ich habe nun Deinen Rat befolgt und die einzelnen Schritte geteilt:
(
{
my $ventil=ReadingsVal('dm.au.Ventil.Neuanlage','ventil','test');
my $mengedummy="dm.au.Ventil.".ReadingsVal('dm.au.Ventil.Neuanlage','state','0').".Menge";
my $menge=ReadingsVal($mengedummy,'04.nachmittags','0');
my $dauer=int($menge*ReadingsVal('dm.au.Ventil.Neuanlage.Intervall','state','1')/0.25);
fhem("set $ventil on-for-timer $dauer");
}
)


Damit funktioniert es! Danke dafür. :)

Allerdings habe ich noch den Ehrgeiz, die ursprüngliche Version als Einzeiler hinzubekommen.
Titel: Antw:Problem bei Berechnung im Ausführungsteil
Beitrag von: DetlefR am 18 August 2022, 16:20:14
ZitatAllerdings habe ich noch den Ehrgeiz, die ursprüngliche Version als Einzeiler hinzubekommen.

Viel Spaß ;)