FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Bobsonbob am 01 September 2017, 05:15:45

Titel: while/until funktioniert in der myutil nicht
Beitrag von: Bobsonbob am 01 September 2017, 05:15:45
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
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: CoolTux am 01 September 2017, 06:34:59
Gibt es einen besonderen deren Grund warum Du mit Schleifen arbeitest? Verstehe Deinen Code irgendwie nicht.
Würde nicht eine Bedingungsabfrage reichen?
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag 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.
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: gloob am 01 September 2017, 06:52:16
Wieso machst du es nicht mit einem DOIF?
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: Bobsonbob am 01 September 2017, 07:02:44
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.
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: CoolTux am 01 September 2017, 07:03:25
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.
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: CoolTux am 01 September 2017, 07:04:28
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.
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: Bobsonbob am 01 September 2017, 07:12:30
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.
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: CoolTux am 01 September 2017, 07:15:48
Zeige mal bitte was du bis jetzt hast.
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: SabineT am 01 September 2017, 07:22:54
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.
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: fiedel am 01 September 2017, 07:48:06
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
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: amenomade am 01 September 2017, 12:41:29
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

Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: betateilchen am 01 September 2017, 13:14:29
DOIF ist gruslig...
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: amenomade am 01 September 2017, 14:55:56
Sag es Damian ;)
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: betateilchen am 01 September 2017, 17:32:39
meine Meinung kennt er.
Titel: Antw:while/until funktioniert in der myutil nicht
Beitrag von: Bobsonbob am 01 September 2017, 18:47:54
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.