[Gelöst] Befehl mit Mindestlaufzeit

Begonnen von Fritz Muster, 23 April 2018, 11:07:21

Vorheriges Thema - Nächstes Thema

Fritz Muster

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
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Damian

define difTestPvExpWpTempErh DOIF ([dmyWegwerf:PvExportStf1] eq "1") (Befehl1)

attr difTestPvExpWpTempErh do always
attr difTestPvExpWpTempErh cmdpause 3600


sollte schon reichen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Fritz Muster

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
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Fritz Muster

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
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Fritz Muster

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
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Fritz Muster

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
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Damian

#7
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"
  }
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Fritz Muster

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.
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Damian

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)

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Fritz Muster

My dear mister singing club. Respekt!

Es funktioniert.

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

Grüße Fritz
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus