FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Fritz Muster am 23 April 2018, 11:07:21

Titel: [Gelöst] Befehl mit Mindestlaufzeit
Beitrag von: Fritz Muster am 23 April 2018, 11:07:21
Hallo in die Runde,

ich möchte gerne eine Mindestlaufzeit vom Befehl1 meines DOIFs realisieren. Das heißt Befehl1 soll solange laufen bis Bedingung2 eintritt, mindestens aber 1Stunde.

Meine Idee zur Umsetzung

define difTestPvExpWpTempErh DOIF ([dmyWegwerf:PvExportStf1] eq "1") (setreading dmyWegwerf PvExpWpTempErh 1) DOELSEIF ([dmyWegwerf:PvExportStf1] eq "0" and [difTestPvExpWpTempErh:Mindestlaufzeit] > 3600) (setreading dmyWegwerf PvExpWpTempErh 0)
attr userReadings difTestPvExpWpTempErh Mindestlaufzeit {ReadingsAge("dmyWegwerf","PvExpWpTempErh",0)}


funktioniert leider nicht. Was funktioniert ist wenn PvExportStf1 nach Ablauf von einer Stunde auf "0" geht. Aber es funktioniert nicht, wenn  PvExportStf1 vor Ablauf der Stunde auf "0" geht.

Hatte auch schonmal versucht in der Bedingung 2 mit ReadingAge zu arbeiten

define difTestPvExpWpTempErh DOIF ([dmyWegwerf:PvExportStf1] eq "1") (setreading dmyWegwerf PvExpWpTempErh 1) DOELSEIF ([dmyWegwerf:PvExportStf1] eq "0" and [{ReadingsAge("dmyWegwerf","PvExpWpTempErh",0)}] > 3600) (setreading dmyWegwerf PvExpWpTempErh 0)


Bekam dann aber im Log die Fehlermeldung

error: the function "ReadingsAge("dmyWegwerf","PvExpWpTempErh",0)" must return a timespec and not 204.

wobei die Zahl 204 immer varierte, je nachdem wann getriggert wurde.

Wäre dankbar für einen Denkanstoss.

Grüße Fritz
Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Damian am 23 April 2018, 11:25:36
define difTestPvExpWpTempErh DOIF ([dmyWegwerf:PvExportStf1] eq "1") (Befehl1)

attr difTestPvExpWpTempErh do always
attr difTestPvExpWpTempErh cmdpause 3600


sollte schon reichen.
Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Fritz Muster am 23 April 2018, 20:59:04
Hallo Damian,

danke für Deine Hilfe, aber mir scheint ich konnte mein Anliegen nicht verständlich rüberbringen. Ich versuche es nochmal.

Ich habe ein Reading [dmyWegwerf:PvExportStf1] welches den Zustand 0 oder 1 hat. Wenn das Reading den Zustand 1 hat, dann soll als Ereignis das Reading [dmyWegwerf:PvExpWpTempErh] unmittelbar auf 1 gehen. Zurückgesetzt ( auf 0) wird [dmyWegwerf:PvExpWpTempErh] wenn [dmyWegwerf:PvExportStf1] auf 0 geht. Das soll aber erst nach einer Mindestlaufzeit von 60 Sekunden passieren.

Also wenn [dmyWegwerf:PvExpWpTempErh] auf 1 gegangen ist und nach sagen wir mal 45 sek. geht [dmyWegwerf:PvExportStf1] wieder von 1 auf 0, so darf sich am Reading [dmyWegwerf:PvExpWpTempErh] nichts ändern. Erst wenn 60 sekunden rum sind und [dmyWegwerf:PvExportStf1] immer noch 0 ist soll [dmyWegwerf:PvExpWpTempErh] auf 0 gehen.

Das Ganze soll eine Mindestlaufzeit einer Wärmepumpe abbilden. Bei einem bestimmten Export Wert meiner PV Anlage soll die Pumpe einschalten. Damit die Pumpe aber bei Schwankungen der PV Anlage (Sonne/Wolken) nicht taktet soll die Wärmepumpe wenn sie einmal eingeschaltet wurde mindestens eine Stunde durchlaufen und erst dann wieder sofern kein Stromexport vorhanden ist abschalten.

Grüße Fritz
Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Fritz Muster am 23 April 2018, 21:51:39
Ich habe weiter probiert und nun einen Etappensieg errungen!!

Mit
([dmyWegwerf:PvExportStf1] eq "1") (setreading dmyWegwerf PvExpWpTempErh 1) DOELSE (setreading dmyWegwerf PvExpWpTempErh 0)
cmdpause 0:60
do always


klappt das Ganze bis auf

Zitat von: Fritz Muster am 23 April 2018, 20:59:04
Erst wenn 60 sekunden rum sind und [dmyWegwerf:PvExportStf1] immer noch 0 ist soll [dmyWegwerf:PvExpWpTempErh] auf 0 gehen.

Hat jemand eine Tipp für mich?

Danke und Grüße
Fritz
Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Damian am 23 April 2018, 22:54:00
Zitat von: Fritz Muster am 23 April 2018, 21:51:39
Ich habe weiter probiert und nun einen Etappensieg errungen!!

Mit
([dmyWegwerf:PvExportStf1] eq "1") (setreading dmyWegwerf PvExpWpTempErh 1) DOELSE (setreading dmyWegwerf PvExpWpTempErh 0)
cmdpause 0:60
do always


klappt das Ganze bis auf

Hat jemand eine Tipp für mich?

Danke und Grüße
Fritz

([dmyWegwerf:PvExportStf1] eq "1") (setreading dmyWegwerf PvExpWpTempErh 1) DOELSE (setreading dmyWegwerf PvExpWpTempErh 0)
attr wait 0:60
Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Fritz Muster am 24 April 2018, 18:22:03
Zitat von: Damian am 23 April 2018, 22:54:00
([dmyWegwerf:PvExportStf1] eq "1") (setreading dmyWegwerf PvExpWpTempErh 1) DOELSE (setreading dmyWegwerf PvExpWpTempErh 0)
attr wait 0:60


Danke, aber leider funktioniert das auch nicht wie ich mir das vorstelle.

Problem: Der wait timer schlägt ja zu jedem Zeitpunkt mit +60 Sekunden zu. Konkret wenn nach z.B 45 Sekunden das reading PvExpWpTempErh auf 1 geht wird der Befehl2 um 60 Sekunden verzögert. Er soll aber in diesem Fall dann nach 15 Sekunden (60=45+15) ausgeführt werden.

Grüße Fritz
Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Fritz Muster am 24 April 2018, 20:52:19
Ich habe mir jetzt eine Krücke gebaut. Ich setzte in dem ersten Befehl ein einmaliges at von 60 Sekunden. Nach Ablauf der 60 Sekunden wird dann ein weiteres reading gesetzt. Dieses Reading bildet dann in Kombination mit dem eigentlichen Reading PvExportStf1 die Voraussetzung für Befehl 2.

([dmyWegwerf:PvExportStf1] eq "1" and [dmyWegwerf:WpMindestlfz] eq "0") (setreading dmyWegwerf PvExpWpTempErh 1, define attmpWpMindestlfz at +00:01:00 setreading dmyWegwerf WpMindestlfz 1)
DOELSEIF ([dmyWegwerf:PvExportStf1] eq "0" and [dmyWegwerf:WpMindestlfz] eq "1") (setreading dmyWegwerf PvExpWpTempErh 0, setreading dmyWegwerf WpMindestlfz 0)


Leider etwas kompliziert. Daher wollte ich das ursprünglich mit ReadingAge machen. Vielleicht hat ja noch jemand eine Idee um das DOIF zu vereinfachen. Würde mich freuen!

Grüße Fritz
Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Damian am 24 April 2018, 21:31:36
Zitat von: Fritz Muster am 24 April 2018, 20:52:19
Ich habe mir jetzt eine Krücke gebaut. Ich setzte in dem ersten Befehl ein einmaliges at von 60 Sekunden. Nach Ablauf der 60 Sekunden wird dann ein weiteres reading gesetzt. Dieses Reading bildet dann in Kombination mit dem eigentlichen Reading PvExportStf1 die Voraussetzung für Befehl 2.

([dmyWegwerf:PvExportStf1] eq "1" and [dmyWegwerf:WpMindestlfz] eq "0") (setreading dmyWegwerf PvExpWpTempErh 1, define attmpWpMindestlfz at +00:01:00 setreading dmyWegwerf WpMindestlfz 1)
DOELSEIF ([dmyWegwerf:PvExportStf1] eq "0" and [dmyWegwerf:WpMindestlfz] eq "1") (setreading dmyWegwerf PvExpWpTempErh 0, setreading dmyWegwerf WpMindestlfz 0)


Leider etwas kompliziert. Daher wollte ich das ursprünglich mit ReadingAge machen. Vielleicht hat ja noch jemand eine Idee um das DOIF zu vereinfachen. Würde mich freuen!

Grüße Fritz

Na gut, dann hier die "elegante Lösung"

DOIF {
  if ([dmyWegwerf:PvExportStf1] eq "1" and get_Timer("Timer")==0) {  #wenn Timer nicht läuft
    set_Timer("Timer",60);
    fhem"setreading dmyWegwerf PvExpWpTempErh 1"
  }
}
{ if ([dmyWegwerf:PvExportStf1] eq "0" and get_Timer("Timer")==0) { #wenn Timer nicht läuft
     fhem"setreading dmyWegwerf PvExpWpTempErh 0"
  }
}
Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Damian am 24 April 2018, 21:55:13
oder wenn´s dir besser gefällt

DOIF ([dmyWegwerf:PvExportStf1] eq "1") (setreading dmyWegwerf PvExpWpTempErh 1)()
DOELSEIF ([dmyWegwerf:PvExportStf1] eq "0" and [?$SELF:cmd] != 1.1) (setreading dmyWegwerf PvExpWpTempErh 0)

attr wait 0,60
attr do always
Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Fritz Muster am 25 April 2018, 18:51:13
Zitat von: Damian am 24 April 2018, 21:55:13
oder wenn´s dir besser gefällt

DOIF ([dmyWegwerf:PvExportStf1] eq "1") (setreading dmyWegwerf PvExpWpTempErh 1)()
DOELSEIF ([dmyWegwerf:PvExportStf1] eq "0" and [?$SELF:cmd] != 1.1) (setreading dmyWegwerf PvExpWpTempErh 0)

attr wait 0,60
attr do always


Funktioniert leider nicht. Aber genau nach so einer Lösung habe ich gesucht!!

Nach Ablauf der 60 Sek. springt das DOIF immer in cmd 1.2. Egal ob PvExportStf1 vorher auf 0 gegangen ist oder nicht.
Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Damian am 25 April 2018, 19:38:00
Zitat von: Fritz Muster am 25 April 2018, 18:51:13
Funktioniert leider nicht. Aber genau nach so einer Lösung habe ich gesucht!!

Nach Ablauf der 60 Sek. springt das DOIF immer in cmd 1.2. Egal ob PvExportStf1 vorher auf 0 gegangen ist oder nicht.

ok, dann musst du einfach im cmd1_2 den Zustand abfragen und dein Reading setzen:

DOIF ([dmyWegwerf:PvExportStf1] eq "1") (setreading dmyWegwerf PvExpWpTempErh 1) (IF ([dmyWegwerf:PvExportStf1] eq "0") (setreading dmyWegwerf PvExpWpTempErh 0))
DOELSEIF ([dmyWegwerf:PvExportStf1] eq "0" and [?$SELF:cmd] != 1.1) (setreading dmyWegwerf PvExpWpTempErh 0)

Titel: Antw:Befehl mit Mindestlaufzeit
Beitrag von: Fritz Muster am 25 April 2018, 20:34:41
My dear mister singing club. Respekt!

Es funktioniert.

Vielen Dank das Du meinen Horizont wieder ein Stück erweitert hast.

Grüße Fritz