Ich versuche, meine Speicherladepumpe erst nach erreichen einer bestimmten Kesseltemperatur einzuschalten. Leider scheitern meine Versuche in MyUtils:
sub
myUtils_WWLadepumpeein()
{
# WWLadepumpensteuerung
# Auslesung
my $Speicherist = ReadingsVal ("f3","state","");
my $Kesselist = ReadingsVal ("f0","state","");
# Berechnung und Ausgabe
while($Kesselist <= $Speicherist)
{
fhem("set s12 off");
}
until($Kesselist > $Speicherist)
{
fhem("set s12 on");
}
}
Kann mir jemand einen Tip geben, wie ich das lösen kann?
Vielen Dank
Gibt es einen besonderen deren Grund warum Du mit Schleifen arbeitest? Verstehe Deinen Code irgendwie nicht.
Würde nicht eine Bedingungsabfrage reichen?
Wie würdest Du das mit der Bedingungsabfrage in der MyUtils lösen? Ich habe da leider noch nicht mit gearbeitet.
Wieso machst du es nicht mit einem DOIF?
Wie kann man so etwas mit DoIf lösen?
Diese Funktion möchte ich mit einem anderen Doif aufrufen, wenn die Speichertemperatur gesunken ist. Die Kesseltemperatur wird in dieser Doif auch angehoben. Ich hätte gerne einfach eine Sub in der MyUtils aufgerufen, die die Pumpensteuerung erledigt.
Zitat von: Bobsonbob am 01 September 2017, 06:43:17
Wie würdest Du das mit der Bedingungsabfrage in der MyUtils lösen? Ich habe da leider noch nicht mit gearbeitet.
In einer myUtils wird mit Perl gearbeitet, Perl ist eine Programmiersprache.
Suche nach Perl Bedingungen/Abraten und schau es Dir an.
Gibt es einen Grund für die myUtils? Ansonsten DOIF wie schon erwähnt.
Zitat von: Bobsonbob am 01 September 2017, 07:02:44
Ich hätte gerne einfach eine Sub in der MyUtils aufgerufen, die die Pumpensteuerung erledigt.
Wenn Du das möchtest musst Du etwas Perl lernen.
Das versuche ich gerade und hätte, wie oben beschrieben gerne ein wenig Unterstützung ;)
Aber wenn Du mir bei der DOIF helfen könntest, wäre das doch super. Ich tappe seit Tagen im Dunkeln und komme mit Google und anderen Suchen leider nicht an mein Ziel. Vielen lieben Dank, das du mir helfen möchtest.
Zeige mal bitte was du bis jetzt hast.
Du hast mit deiner Lösung mehrere Probleme:
1. wenn du in den Schleifen $Kesselist und $Speicherist nicht erneut abfragst, wird sich deren Wert auch nicht ändern. D.h. du hängst dann in der jeweiligen Schleife fest (wird also zur Endlosschleife).
2. blockierst du dir damit FHEM.
Eigentlich musst du gar nicht perlen oder myUtilsen und schon gar nicht Doiffen, sondern einfach nur Thresholden (https://fhem.de/commandref_DE.html#THRESHOLD). ;)
Gruß
Frank
ZitatAber wenn Du mir bei der DOIF helfen könntest, wäre das doch super.
define diWWLadepumpe DOIF ([f0] > [f3]) (set s12 on) DOELSE (set s12 off)
und schon ist es erledigt.
Eine Hysterese wäre aber nicht schlecht, sonst schaltest Du permanent on/off, wenn f0 und f3 nah voneinander stehen.
define diWWLadepumpe DOIF ([f0] > ([f3] - 2.0)) (set s12 on) DOELSEIF ([f0] < [f3]) (set s12 off) DOELSE
Ich stimme Sabine zu. FHEM ist "Ereignisgesteuert" und nicht Prozess-orientiert. Schleifen blockieren nur das ganze. Du musst so denken:
- ein Ereignis löst ein Befehl aus
oder
- ein Ereignis löst ein/mehrere Befehl(e) unter bestimmten Bedingungen aus
und NICHT:
- ich schleife/warte bis irgendwelches Device in dem Zustand x ist. Das Kernel von FHEM wartet schon auf die Events
DOIF ist gruslig...
Sag es Damian ;)
meine Meinung kennt er.
Ich danke euch für die vielen Antworten. Im Perl habe ich erst mal aufgehört und habe es mit einer Kombination aus Doifs und Thresholdes zum laufen bekommen. An dem Feinschliff werde ich morgen weiter arbeiten. Ich hate den Tag über leider viel zu tun und keine Zeit, euch zu antworten. Ich bin aber begeistert, wie hilfsbereit die User in diesem Forum sind.
Vielen lieben Dank.