while/until funktioniert in der myutil nicht

Begonnen von Bobsonbob, 01 September 2017, 05:15:45

Vorheriges Thema - Nächstes Thema

Bobsonbob

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

CoolTux

Gibt es einen besonderen deren Grund warum Du mit Schleifen arbeitest? Verstehe Deinen Code irgendwie nicht.
Würde nicht eine Bedingungsabfrage reichen?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Bobsonbob

Wie würdest Du das mit der Bedingungsabfrage in der MyUtils lösen? Ich habe da leider noch nicht mit gearbeitet.

gloob

Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

Bobsonbob

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.

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Bobsonbob

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.

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

SabineT

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.

fiedel

Eigentlich musst du gar nicht perlen oder myUtilsen und schon gar nicht Doiffen, sondern einfach nur Thresholden;)

Gruß
Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

amenomade

#11
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

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!