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?
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.
@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?
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.
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...
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.
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.
ZitatAllerdings habe ich noch den Ehrgeiz, die ursprüngliche Version als Einzeiler hinzubekommen.
Viel Spaß ;)