Problem bei Berechnung im Ausführungsteil

Begonnen von netwalk, 17 August 2022, 10:38:51

Vorheriges Thema - Nächstes Thema

netwalk

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?
live long and prosper
netwalk
_______________________________________________
INTEL NUC7CJYH, Homematic mit 3x HMLGW, JEELINK mit 18x TX29-DTH-IT, DUOFERNSTICK, FB7690 mit FBDECT, NETATMO, Philips HUE, RFXtrx433, 4x Reolink RLC-81MA

DetlefR

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. 

netwalk

@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?
live long and prosper
netwalk
_______________________________________________
INTEL NUC7CJYH, Homematic mit 3x HMLGW, JEELINK mit 18x TX29-DTH-IT, DUOFERNSTICK, FB7690 mit FBDECT, NETATMO, Philips HUE, RFXtrx433, 4x Reolink RLC-81MA

DetlefR

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.

netwalk

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...

live long and prosper
netwalk
_______________________________________________
INTEL NUC7CJYH, Homematic mit 3x HMLGW, JEELINK mit 18x TX29-DTH-IT, DUOFERNSTICK, FB7690 mit FBDECT, NETATMO, Philips HUE, RFXtrx433, 4x Reolink RLC-81MA

DetlefR

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.

netwalk

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.
live long and prosper
netwalk
_______________________________________________
INTEL NUC7CJYH, Homematic mit 3x HMLGW, JEELINK mit 18x TX29-DTH-IT, DUOFERNSTICK, FB7690 mit FBDECT, NETATMO, Philips HUE, RFXtrx433, 4x Reolink RLC-81MA

DetlefR

ZitatAllerdings habe ich noch den Ehrgeiz, die ursprüngliche Version als Einzeiler hinzubekommen.

Viel Spaß ;)