FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: Bracew am 22 Juni 2019, 17:20:32

Titel: [gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 22 Juni 2019, 17:20:32
Hallo,

ich habe am Pool im Garten

1) zwei DS18B20 Temperaturfühler an einem ESP8266 (NodeMCU) mit ESP-Easy, welche per WLAN an FHEM die Wassertemperaturen im Pool senden. Klappt wunderbar. Temperatur wird angezeigt und in Logfile gespeichert.
# #################################################################
# Temperaturmessung PoolSensor 1 (DS18b20) OBEN mit NodeMCU
# #################################################################
#
define SensorPool1 ESPEasy 192.168.0.60 80 espBridge ESP_Easy_DS18b20_1
attr   SensorPool1 IODev espBridge
attr   SensorPool1 Interval 0
attr   SensorPool1 group Pool-Temperatur
attr   SensorPool1 presenceCheck 0
attr   SensorPool1 readingSwitchText 0
attr   SensorPool1 room Garten
attr   SensorPool1 setState 3
attr   SensorPool1 sortby 2
attr   SensorPool1 stateFormat <span style="color:red">Temperatur aktuell OBEN: temperature °C </span>
#
define LogfileSensorPool1 FileLog ./log/PiSensorPool1-%Y.log SensorPool1
attr   LogfileSensorPool1 group Pool-Temperatur
attr   LogfileSensorPool1 logtype temp4:window,text
attr   LogfileSensorPool1 room Garten
attr   LogfileSensorPool1 sortby 4
#
# #################################################################
# Temperaturmessung PoolSensor 2 (DS18b20) UNTEN mit NodeMCU
# #################################################################
#
define SensorPool2 ESPEasy 192.168.0.60 80 espBridge ESP_Easy_DS18b20_2
attr   SensorPool2 IODev espBridge
attr   SensorPool2 Interval 0
attr   SensorPool2 group Pool-Temperatur
attr   SensorPool2 presenceCheck 0
attr   SensorPool2 readingSwitchText 0
attr   SensorPool2 room Garten
attr   SensorPool2 setState 3
attr   SensorPool2 sortby 3
attr   SensorPool2 stateFormat <span style="color:blue">Temperatur aktuell UNTEN: temperature °C </span>
#
define LogfileSensorPool2 FileLog ./log/PiSensorPool2-%Y.log SensorPool2
attr   LogfileSensorPool2 group Pool-Temperatur
attr   LogfileSensorPool2 logtype temp4:window,text
attr   LogfileSensorPool2 room Garten
attr   LogfileSensorPool2 sortby 5
#
# #################################################################
# Temperaturanzeige PoolSensor 1+2 (DS18b20) OBEN+UNTEN als GRAPH
# #################################################################
#
define SVG_SensorPool3 SVG LogfileSensorPool1:WeBeTemp2x:CURRENT
attr   SVG_SensorPool3 group Pool-Temperatur
attr   SVG_SensorPool3 label "OBEN Max.=$data{max1}°C, Min.=$data{min1}°C, Letzte=$data{currval1}°C | UNTEN Max.=$data{max2}°C, Min.=$data{min2}°C, Letzte=$data{currval2}°C"
attr   SVG_SensorPool3 room Garten
attr   SVG_SensorPool3 sortby 1


2) ein Schaltsteckdose, welche die Poolpumpe an und ausschalten kann. Die Schaltsteckdose wird von FHEM per WeekdayTimer gesteuert.
# #################################################################
# Pool-Pumpe automatisch und per Hand schalten
# #################################################################
#
# In Weboberflaeche anklicken ob Automatik An oder Aus sein soll
#
define PoolpumpeAutomatik dummy
attr   PoolpumpeAutomatik devStateIcon ja:ampel_gruen:nein nein:ampel_rot:ja
attr   PoolpumpeAutomatik group Pool
attr   PoolpumpeAutomatik icon scene_swimming
attr   PoolpumpeAutomatik room Garten
attr   PoolpumpeAutomatik sortby 1
attr   PoolpumpeAutomatik webCmd ja:nein
#
# Zusammenfassung, welche Schalter fuer Pool geschaltet werden sollen
#
define Poolpumpe structure room Lampe_BS4
attr   Poolpumpe comment FunkSchalter für Poolpumpe
attr   Poolpumpe group Pool
attr   Poolpumpe room Garten
attr   Poolpumpe sortby 2
attr   Poolpumpe icon scene_swimming
#
define PoolpumpeAuto WeekdayTimer Poolpumpe 09:00:00|on 15:00:00|off (isPoolpumpeAutomatik())
attr   PoolpumpeAuto commandTemplate set $NAME  $EVENT
attr   PoolpumpeAuto group Pool
attr   PoolpumpeAuto room hidden
attr   PoolpumpeAuto icon scene_swimming


Die Poolpumpe wird zur Zeit fest um 9:00 Uhr ein und um 15:00 ausgeschaltet. Läuft also mit fester Lauflänge 6 Stunden pro Tag.
Soweit so gut.

Ich würde die Laufzeit der Pumpe jedoch gerne abhängig von der Temperatur schalten.
Je wärmer die Wassertemperatur desto länger sollte die Poolpumpe laufen.
Zum Beispiel 1 Stunde (=60 Minuten) Grundlaufzeit plus 12 Minuten je Grad Temperatur länger.
  Bei 20°C Wassertemperatur also 60+20*12=300 Minuten (=5 Stunden)
  Bei 25°C Wassertemperatur also 60+25*12=360 Minuten (=6 Stunden)
  Bei 30°C Wassertemperatur also 60+30*12=420 Minuten (=7 Stunden)

Wie muss ich den WeekdayTimer umbauen um das zu erreichen?
Ich bitte um Eure Hilfe.

Danke Bracew

Ergänzung vom 06.07.2019: Vorläufige Lösung, siehe Antwort #39
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 22 Juni 2019, 17:54:04
Der Spur nach:

isPoolpumpeAutomatik()

in ein disablecondition-Attribut packen

und dann hinten Perl-Code verwenden, der bei $EVENT eq "on" die Berechnung der Dauer macht und mit on-for-timer entsprechend lange einschaltet (und "off" durchreicht).

(Nebenbemerkung: direktes cfg-Editieren ist nicht mehr das empfohlene Vorgehen).
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 22 Juni 2019, 18:01:18
Vielen Dank für Deine Hilfe,
jedoch verstehe ich es nicht wie Du das meinst bzw. was ich ändern müsste
Wäre es dir möglich ein Beispiel zu geben?
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 22 Juni 2019, 18:14:05
Zum ersten Punkt: defmod rr_Kind1_Presence_Timer WeekdayTimer rr_Kind1 !$we|06:45|absent $we|10:00|awoken $we|10:30|home 56|23:00|gotosleep 56|23:30|asleep
attr rr_Kind1_Presence_Timer userattr HT_Devices
attr rr_Kind1_Presence_Timer commandTemplate set $NAME  $EVENT
attr rr_Kind1_Presence_Timer delayedExecutionCond {ReadingsVal($NAME,'smartphone','absent') eq 'present' and $EVENT eq 'absent'?1:0}
attr rr_Kind1_Presence_Timer disable 0
attr rr_Kind1_Presence_Timer icon status_automatic
attr rr_Kind1_Presence_Timer room Steuerung->Presence

Da wird dann nur geschaltet, wenn das Smartphone da ist.

Hier ein Beispiel für einen Perlcode-Aufruf:
defmod Timer_Umwaelzpumpe WeekdayTimer MYSENSOR_96 !$we|05:50|on $we|06:55|on 12:30|on {fhem ("set $NAME status1 $EVENT") if (ReadingsVal('MYSENSOR_96','temperature21',0) < 35 and ReadingsVal('Status_Urlaub','state',"off") ne "on")}
attr Timer_Umwaelzpumpe commandTemplate set $NAME  $EVENT
attr Timer_Umwaelzpumpe group Heizung
attr Timer_Umwaelzpumpe icon sani_water_cold
attr Timer_Umwaelzpumpe room Bad_EG,Heizung


Das mußt du dann ausbauen und beide $EVENT-Fälle unterscheiden mit (Perl-) if ... else .... So ähnlich wie beispielsweise in diesem (etwas komplizierteren) notify:
defmod Tuerkontakt_WZ_notify notify (Balkontuer|Terrassentuer_WZ):(open|closed).* {\
  if($EVENT eq "open" )\
    {fhem 'defmod at_Check_WZ at +00:01:30 {if (ReadingsVal("Heizperiode","state","off") eq "on" && (Value("Balkontuer") eq "open" or Value("Terrassentuer_WZ") eq "open") ) {fhem "set Virtueller_Tuerkontakt_WZ offen"}}';;\
  } else {\
    fhem "set Virtueller_Tuerkontakt_WZ geschlossen" if( Value("Virtueller_Tuerkontakt_WZ") ne "geschlossen" && Value("Balkontuer") eq "closed" && Value("Terrassentuer_WZ") eq "closed")\
  }\
}

Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 22 Juni 2019, 18:32:11
Sieht sehr kompliziert aus,
ich dachte es gäbe eher die Möglichkeit á la:

define PoolpumpeAuto WeekdayTimer Poolpumpe 09:00:00|on [Einschaltzeit+ReadingsVal("SensorPool1", "Temperature", "") *12)]|off (isPoolpumpeAutomatik())

oder

define PoolpumpeAuto WeekdayTimer Poolpumpe 09:00:00|on (10:00:00+ReadingsVal("SensorPool1", "Temperature", "") *12))|off (isPoolpumpeAutomatik())
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 22 Juni 2019, 18:41:22
Das zweite _könnte_ so ähnlich klappen, aber:
Es muß eine Perl-Anweisung als Zeitangabe da stehen. Siehe commandref zu WeekdayTimer und dort die Beispiele, z.B. {sunrise_abs_dat($date)}.
Du mußt als oder eine Formel finden, die da richtig rechnet. Dabei beachten: WDT rechnet die Zeiten nur zu Tagesbeginn aus, danach sind sie fix. Wenn du zum Einschaltzeitpunkt die Temp. berücksichtigen willst, mußt du dann rechnen (also "hinten").
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Byte09 am 22 Juni 2019, 18:45:27
wenn du nicht an dem 'wdt' festhalten willst/musst könnte ich dir ein entsprechendes 'MSwitch' zusammenbauen , ist damit relativ einfach zu machen .

sag einfach bescheid , wenn du es versuchen möchtest .

gruss Byte09
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 22 Juni 2019, 18:54:55
1.) wann die Laufzeit berechnet wird, z.B. nur zu Tagesbeginn, wäre ziemlich egal.
Ich habe mal
define PoolpumpeAuto WeekdayTimer Poolpumpe de 09:00:00|on {10:00:00+ReadingsVal("SensorPool1","Temperature",20)*12}|off (isPoolpumpeAutomatik())
in runden oder auch geschweiften Klammern eingesetzt:
Profil 0: Sonntag 00:00:00 off, 09:00:00 on
Profil 1: Montag 00:00:00 off, 09:00:00 on
Profil 2: Dienstag 00:00:00 off, 09:00:00 on
Profil 3: Mittwoch 00:00:00 off, 09:00:00 on
Profil 4: Donnerstag 00:00:00 off, 09:00:00 on
Profil 5: Freitag 00:00:00 off, 09:00:00 on
Profil 6: Samstag 00:00:00 off, 09:00:00 on

Off ist immer 00:00:00.
Wird das neu erst um Mitternacht berechnet? Muss ich darauf warten ob es funktionieren würde?

2.) MSwitch kenne ich noch gar nicht. Ist mir neu.
Aber es muss nicht WeekdayTimer sein, Hauptsache die Pumpe würde entsprechend laufen. Ob mit WdT oder MSwitch wäre mir egal.
Ich würde die Automatik nur gerne über die Ampel (isPoolpumpeAutomatik()) im Winter aus im im Sommer einschalten können.
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 22 Juni 2019, 19:14:46
Ich habe mir mal MSwitch im Wiki angelesen....sieht für einen Anfänger wie mich kompliziert aus. Falls es mit WdT realisierbar wäre, so würde ich diesen Weg bevorzugen.
Auch weil ich gewohnt bin in der fhem.cfg zu editieren (obwohl dies "...nicht mehr das empfohlene Vorgehen..." ist. Aber ich bin mit Fortran und Cobol und so groß geworden.)
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Byte09 am 22 Juni 2019, 19:21:18
Zitat von: Bracew am 22 Juni 2019, 19:14:46
Ich habe mir mal MSwitch im Wiki angelesen....sieht für einen Anfänger wie mich kompliziert aus.......

hmm ..... ist es eigentlich nicht , wenn man einmal etwas eingerichtet hat  ;) . Es ist wohl eher das wiki das es kompliziert erscheinen lässt  ???

gruss Byte09
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 22 Juni 2019, 19:26:38
Es geht, aber du mußt anders mit den Zeiten rechnen: nur Sekunden, ausgehend von "jetzt". 10:00:00 Uhr wäre also " jetzt" (um Mitternacht)+ 10*HOURSECONDS.
Den Teil kann man auch via Kommandozeile testen (mit Klammern eingeben).
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 22 Juni 2019, 19:27:51
bei meinem WdT:
define PoolpumpeAuto WeekdayTimer Poolpumpe de 09:00:00|on {10:00:00+ReadingsVal("SensorPool1","Temperature",20)*12}|off (isPoolpumpeAutomatik())

müsste ich ja nur den {10:00:00+ReadingsVal("SensorPool1","Temperature",20)*12} Teil noch klären, ob und wie es funktioniert.

Aber wie?
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 22 Juni 2019, 22:14:30
Zitat von: Beta-User am 22 Juni 2019, 19:26:38
Den Teil kann man auch via Kommandozeile testen (mit Klammern eingeben).

Das mit der "Kommandozeile"  kenne ich auch nicht. Ich weiß wo die "Kommandozeile" ist, aber wie muss ich das Eingeben zum testen?
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 22 Juni 2019, 22:24:29
Auch mit:
define PoolpumpeAuto WeekdayTimer Poolpumpe de 09:00:00|on {10*HOURSECONDS+ReadingsVal("SensorPool1","Temperature",20)*12*MINUTESECONDS}|off (isPoolpumpeAutomatik())

bekomme ich nur:
Profil 0: Sonntag 00:00:00 off, 09:00:00 on
Profil 1: Montag 00:00:00 off, 09:00:00 on
Profil 2: Dienstag 00:00:00 off, 09:00:00 on
Profil 3: Mittwoch 00:00:00 off, 09:00:00 on
Profil 4: Donnerstag 00:00:00 off, 09:00:00 on
Profil 5: Freitag 00:00:00 off, 09:00:00 on
Profil 6: Samstag 00:00:00 off, 09:00:00 on


Muss das nun noch in einen String umgewandelt werden?
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 23 Juni 2019, 08:28:40
Wie gesagt, du mußt die Zeit von "Mitternacht" dazurechnen. Das könnte "time" sein (müßte ich auch nachsehen). Und dann das ermittelte Sekundenergebnis wieder in das übliche Zeitformat formatieren, das gibt auch {sunrise_abs_dat($today)} zurück (in die Kommandozeile eingegeben).

Ich würde nochmal empfehlen, das ganze mit "on-for-timer" zu lösen, das sollte das Aktormodul doch können, oder? Dann berechnest du einfach die Einschaltdauer. Etwa so:

define PoolpumpeAuto WeekdayTimer Poolpumpe de 09:00:00|on { my $duration = 1*HOURSECONDS+ReadingsVal("SensorPool1","Temperature",20)*12*MINUTESECONDS;
fhem ("set $NAME on-for-timer $duration") if isPoolpumpeAutomatik()}

Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 23 Juni 2019, 10:14:44
in der Tat,
hatte ich gestern abend noch on-for-timer mal ausprobiert. Zunächst ganz einfach mit:
define PoolpumpeAuto WeekdayTimer Poolpumpe de 09:00:00|on-for-timer:21600 (isPoolpumpeAutomatik())
heute morgen hat FHEM die Poolpumpe an:
Profil 0: Sonntag 09:00:00 on-for-timer:21600
Profil 1: Montag 09:00:00 on-for-timer:21600
Profil 2: Dienstag 09:00:00 on-for-timer:21600
Profil 3: Mittwoch 09:00:00 on-for-timer:21600
Profil 4: Donnerstag 09:00:00 on-for-timer:21600
Profil 5: Freitag 09:00:00 on-for-timer:21600
Profil 6: Samstag 09:00:00 on-for-timer:21600
STATE on-for-timer:21600


Noch habe ich das richtige Aktormodul nicht. Es soll eine OBI-WLAN-Steckdose werden, welche hier schon liegt. Aber ich warte noch auf den FTDI USB zu Serial Wandler aus China um ESP-Easy drauf zu laden, so dass ich im Moment nur FHEM intern probiere. Ob die Obi-Steckdose on-for-timer kann, weiß ich nicht.

Bei:
define PoolpumpeAuto WeekdayTimer Poolpumpe de 09:00:00|on { my $duration = 1*HOURSECONDS+ReadingsVal("SensorPool1","Temperature",20)*12*MINUTESECONDS;
fhem ("set $NAME on-for-timer $duration") if isPoolpumpeAutomatik()}

bekomme ich die Antwort: Unknown command fhem, try help.

Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 23 Juni 2019, 12:36:26
Vermutlich geht dann mehrzeilig nicht, vielleicht liegt es an den Hochkommata; evtl. geht es z.B. so:
define PoolpumpeAuto WeekdayTimer Poolpumpe de 09:00:00|on { fhem ("set $NAME on-for-timer 1*HOURSECONDS+ReadingsVal('SensorPool1','Temperature',20)*12*MINUTESECONDS") if isPoolpumpeAutomatik()}

Was die Firmaware angeht: Sowohl ESPEasy wie MQTT2_DEVICE kennen SetExtensions; damit sollte on-for-timer kein Thema sein.
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 30 Juni 2019, 18:53:31
Hallo zusammen,

der FTDI USB zu Serial Wandler zum flashen der OBI-WLAN-Steckdose ist da. ESP-Easy ist drauf. Aber es war nicht leicht die richtigen Einstellungen zu finden und die OBI-WLAN-Steckdose halbwegs zu zähmen, aber nun geht es zumindestens mit festen Schaltzeiten und mit Klick auf der FHEM Oberfläche, siehe: https://forum.fhem.de/index.php/topic,84777.msg954059.html#msg954059

Bezüglich des WeekdayTimer habe ich noch keine Lösung gefunden.
Das mit dem "on-for-timer" möchte ich gerne verwerfen.
Viel lieber wäre es mir einen Tipp zu bekommen, wie ich die Ausschaltzeit berechnen kann, so dass je wärmer es wird je länger die Poolpumpe läuft.

Danke und mit lieben Grüßen Bracew
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 01 Juli 2019, 09:25:14
Zitat von: Bracew am 30 Juni 2019, 18:53:31
Bezüglich des WeekdayTimer habe ich noch keine Lösung gefunden.
Das mit dem "on-for-timer" möchte ich gerne verwerfen.
Viel lieber wäre es mir einen Tipp zu bekommen, wie ich die Ausschaltzeit berechnen kann, so dass je wärmer es wird je länger die Poolpumpe läuft.
Was spricht denn gegen die on-for-timer-Lösung?

Ansonsten hattest du einen Tipp: Das müßte mit einer Perl-Funktion klappen, die du als Uhrzeit angibst. Diese muß eine Uhrzeit (für den off-Befehl) zurückgeben... Diese Perl-Funktion wird dann (durch den WDT-Code automatisch) jeden Tag um 00:00 Uhr ausgeführt, was bedeutet, dass - anders als bei on-for-timer - die Temperatur im Einschaltzeitpunkt noch nicht bekannt ist.
Finde ich weniger elegant als on-for-timer und sehe auch sonst keinen Vorteil, da in beiden Fällen schlicht ein interner Timer in FHEM gesetzt und abgearbeitet wird (jedenfalls mit dieser Hardware als Empfänger des on-for-... Befehls).
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 01 Juli 2019, 17:16:45
Hallo Beta-User,

ZitatWas spricht denn gegen die on-for-timer-Lösung?

Sie hat im Test nicht funktioniert. Im Device stand der Text: 1*HOURSECONDS...  und keine Zeitangabe.
Ich hab den genauen Text nicht mehr in Erinnerung.

Aber da ich jetzt die richtige Schaltsteckdose habe, werde ich das nochmals am nächsten Wochenende ausprobieren.

Danke für Dein Engagement, mit lieben Grüßen
Bracew
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 01 Juli 2019, 17:24:02
Ah ok. Damit kann man was anfangen...

Das war erst mal auch nur Pseudocode (ich kann das nicht wirklich testen, aber das Fehlerfragment ist eigentlich logisch...), jetzt evtl. dann mal mit folgendem an den Start gehen:

{ if isPoolpumpeAutomatik() {my $duration = HOURSECONDS+ReadingsVal('SensorPool1','Temperature',20)*12*MINUTESECONDS; fhem ("set $NAME on-for-timer $duration") }}
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 01 Juli 2019, 17:27:16
Kann ich das irgendwie anders als mit einem Reellen Device testen (z.B.Dummy)?
Sonst wie gesagt am Wochenende.
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 01 Juli 2019, 17:40:58
Vermutlich schon; und du kannst die Perl-Sachen auch "isoliert" über die Kommandozeile eingeben (dann mit den geschweiften Klammern drumrum)...
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 01 Juli 2019, 17:51:42
{HOURSECONDS+ReadingsVal('SensorPool1','Temperature',20)*12*MINUTESECONDS} in der Kommandozeile ergibt: 19872,
sieht gut aus!

Wie könnte ich jetzt einen WeekdayTimer mit on-for-timer auf einen Dummy loslassen?
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 01 Juli 2019, 17:53:35
{ReadingsVal('SensorPool1','Temperature',20)} ergibt aber 22.1
obwohl der Pool im Moment über 30°C hat  :-\

Aahhh, falsche Schreibweise mit:
{ReadingsVal('SensorPool1','temperature',20)} ergibt es 30.3
das sieht gut aus!
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 01 Juli 2019, 18:00:22
Zitat von: Bracew am 01 Juli 2019, 17:51:42
Wie könnte ich jetzt einen WeekdayTimer mit on-for-timer auf einen Dummy loslassen?
Einfach das Zieldevice entsprechend wählen... (Statt Poolpumpe, oder wie auch immer das im Original hieß)
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 01 Juli 2019, 18:06:28
Mit:
define Poolpumpe1 structure room Lampe_BS4
attr   Poolpumpe1 comment FunkSchalter für Poolpumpe
attr   Poolpumpe1 group Pool1
attr   Poolpumpe1 room test
attr   Poolpumpe1 icon scene_swimming

define PoolpumpeAutoTest WeekdayTimer Poolpumpe1 de 09:00:00|on { if isPoolpumpeAutomatik() {my $duration = HOURSECONDS+ReadingsVal('SensorPool1','temperature',20)*12*MINUTESECONDS; fhem ("set $NAME on-for-timer $duration") }}
attr   PoolpumpeAutoTest commandTemplate set $NAME  $EVENT
attr   PoolpumpeAutoTest group Pool1
attr   PoolpumpeAutoTest room test
attr   PoolpumpeAutoTest icon scene_swimming

kommt:
ZitatERROR:
Unknown command fhem, try help.

Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 01 Juli 2019, 18:13:28
Ein Komma zuviel hinter MINUTESECONDS?

Hab's rausgenommen und kommt kein Fehler

list PoolpumpeAutoTest

Internals:
   COMMAND    { if isPoolpumpeAutomatik() {my $duration = HOURSECONDS+ReadingsVal('SensorPool1','temperature',20)*12*MINUTESECONDS fhem ("set $NAME on-for-timer $duration") }}
   CONDITION 
   DEF        Poolpumpe1 de 09:00:00|on { if isPoolpumpeAutomatik() {my $duration = HOURSECONDS+ReadingsVal('SensorPool1','temperature',20)*12*MINUTESECONDS fhem ("set $NAME on-for-timer $duration") }}
   DEVICE     Poolpumpe1
   FUUID      5d1a300e-f33f-8319-*
   GlobalDaylistSpec
   LANGUAGE   de
   NAME       PoolpumpeAutoTest
   NR         823
   Profil 0: Sonntag 09:00:00 on
   Profil 1: Montag 09:00:00 on
   Profil 2: Dienstag 09:00:00 on
   Profil 3: Mittwoch 09:00:00 on
   Profil 4: Donnerstag 09:00:00 on
   Profil 5: Freitag 09:00:00 on
   Profil 6: Samstag 09:00:00 on
   STATE      active
   STILLDONETIME 0
   TYPE       WeekdayTimer
   READINGS:
     2019-07-01 18:08:52   currValue       on
     2019-07-01 18:08:52   nextUpdate      2019-07-02 09:00:00
     2019-07-01 18:08:52   nextValue       on
     2019-07-01 18:08:52   state           active
   SWITCHINGTIMES:
     09:00:00|on
   TIMER:
     PoolpumpeAutoTest_SetTimerOfDay:
       HASH       PoolpumpeAutoTest
       MODIFIER   SetTimerOfDay
       NAME       PoolpumpeAutoTest_SetTimerOfDay
       SETTIMERATMIDNIGHT 1
   dayNumber:
     !$we       8
     $we        7
     di         2
     do         4
     fr         5
     mi         3
     mo         1
     sa         6
     so         0
   helper:
     daysRegExp (so|mo|di|mi|do|fr|sa|\$we|\!\$we)
     daysRegExpMessage (so|mo|di|mi|do|fr|sa|$we|!$we)
     SWITCHINGTIME:
       0:
         09:00:00   on
       1:
         09:00:00   on
       2:
         09:00:00   on
       3:
         09:00:00   on
       4:
         09:00:00   on
       5:
         09:00:00   on
       6:
         09:00:00   on
   longDays:
     de:
       Sonntag
       Montag
       Dienstag
       Mittwoch
       Donnerstag
       Freitag
       Samstag
       Wochenende
       Werktags
     en:
       Sunday
       Monday
       Tuesday
       Wednesday
       Thursday
       Friday
       Saturday
       weekend
       weekdays
     fr:
       Dimanche
       Lundi
       Mardi
       Mercredi
       Jeudi
       Vendredi
       Samedi
       weekend
       jours de la semaine
   profil:
     1:
       EPOCH      1561964400
       PARA       on
       TIME       09:00:00
       TAGE:
         0
         1
         2
         3
         4
         5
         6
   profile_IDX:
     0:
       09:00:00   1
     1:
       09:00:00   1
     2:
       09:00:00   1
     3:
       09:00:00   1
     4:
       09:00:00   1
     5:
       09:00:00   1
     6:
       09:00:00   1
   shortDays:
     de:
       so
       mo
       di
       mi
       do
       fr
       sa
       $we
       !$we
     en:
       su
       mo
       tu
       we
       th
       fr
       sa
       $we
       !$we
     fr:
       di
       lu
       ma
       me
       je
       ve
       sa
       $we
       !$we
Attributes:
   commandTemplate set $NAME  $EVENT
   group      Pool1
   icon       scene


Mal sehen, ob es heute Nacht um 0:00 richtig rechnet. Im Moment ist ja noch nichts drin, so wie ich es interpretiere.
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 01 Juli 2019, 18:22:33
...wenn, dann eher ein Semikolon zu wenig, aber definitiv nicht zuviel...

(das sind zwei Perl-Zeilen, die da getrennt werden. Wenn das mit den zwei Zeilen grundsätzlich nicht geht, geht evtl. ein myUtils-Aufruf, der die beiden Zeilen dann intern ausführt, aber aus WDT-Sicht eben eine Zeile ist. Viel mehr fällt mir grade nicht ein...
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 02 Juli 2019, 07:37:03
Habe grade nochmal einen Test gemacht: mit zwei ";;" scheint die Perl-Geschichte durchzulaufen. Ist die übliche "Escaperei", die man auch anderswo braucht. Also sollte das funktionieren:

define PoolpumpeAutoTest WeekdayTimer Poolpumpe1 de 09:00:00|on { if isPoolpumpeAutomatik() {my $duration = HOURSECONDS+ReadingsVal('SensorPool1','temperature',20)*12*MINUTESECONDS;; fhem ("set $NAME on-for-timer $duration") }}

oder (in der Art hatte ich es getestet, ist aber nur eine andere Schreibweise):
define PoolpumpeAutoTest WeekdayTimer Poolpumpe1 de 09:00:00|on { my $duration = HOURSECONDS+ReadingsVal('SensorPool1','temperature',20)*12*MINUTESECONDS;; fhem ("set $NAME on-for-timer $duration") if isPoolpumpeAutomatik() }
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 02 Juli 2019, 17:19:57
Ich habe mal beide Varianten bei meinem FHEM versucht. Heraus kommt immer, dass keine "off" Zeit im Device steht, siehe Bild (von der 2. Variante).

define Poolpumpe1 structure room Lampe_BS4
attr   Poolpumpe1 comment FunkSchalter für Poolpumpe
attr   Poolpumpe1 group Pool1
attr   Poolpumpe1 room test
attr   Poolpumpe1 icon scene_swimming

#define PoolpumpeAutoTest WeekdayTimer Poolpumpe1 de 09:00:00|on { if isPoolpumpeAutomatik() {my $duration = HOURSECONDS+ReadingsVal('SensorPool1','temperature',20)*12*MINUTESECONDS;; fhem ("set $NAME on-for-timer $duration") }}
define PoolpumpeAutoTest WeekdayTimer Poolpumpe1 de 09:00:00|on { my $duration = HOURSECONDS+ReadingsVal('SensorPool1','temperature',20)*12*MINUTESECONDS;; fhem ("set $NAME on-for-timer $duration") if isPoolpumpeAutomatik() }
attr   PoolpumpeAutoTest commandTemplate set $NAME  $EVENT
attr   PoolpumpeAutoTest group Pool1
attr   PoolpumpeAutoTest room test
attr   PoolpumpeAutoTest icon scene_swimming


Wie testest Du das? kannst Du unter des Tages eine Neuberechnung machen lassen? Ich dachte dies geschieht immer nur um Mitternacht.
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 02 Juli 2019, 17:29:34
ich sehe da nur ein ";" in DEF und command?

Wenn du die Berechnung in der Perl-Anweisung hinten machen läßt, wird das zur Ausführugnszeit berechnet.
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 02 Juli 2019, 17:31:25
Ich hatte unterdessen den Auszug aus der fhem.cfg noch zu vor eingefügt. Entschuldigung.
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 02 Juli 2019, 17:36:39
Hier in der DEF mit 2 Semikolon
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 02 Juli 2019, 17:40:09
Bitte möglichst cfg-editing unterlassen... Eine RAW-Def oder ein list tut es auch.

Was den screenshots angeht: Bitte sieh dir die Detailseite des Aktors an. MWn wird die Info auf der WDT-Seite nicht erneuert. (Alternativ: refreshen).

Du kannst zu Testzwecken auch das "SwitchInThePast" (oder so) setzen. Dann müßte eine Änderung auch direkt eine Neuberechnung der letzten Schaltanweisung erfolgen und diese ausgeführt werden (beim Neustart und wohl auch beim Ändern der DEF von 9:00 Uhr auf 9:01 Uhr).
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 02 Juli 2019, 17:50:55
Ich habe im DeviceOverview mit Klick auf DEF die Zeit auf 09:01:00 geändert, anschließend Save config und Restart, aber keine Änderung.

Wie muss ich das mit dem "SwitchInThePast" genau setzen. Übrigens, Google führt mich dazu auf Seiten für Brustvergrößerungen.
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 02 Juli 2019, 17:57:48
es gibt ein Attribut, das irgendwie so heißt (steht auch in der cref). Das auf 1 oder on setzten, was auch immer davon in FHEMWEB verfügbar ist...

Ohne das Attribut kannst du ändern und neustarten, wie du magst, 9:00 Uhr ist vorbei :) .
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 02 Juli 2019, 18:08:13
Also, hier die RAW-Def:
defmod PoolpumpeAutoTest WeekdayTimer Poolpumpe1 de 09:00:00|on { my $duration = HOURSECONDS+ReadingsVal('SensorPool1','temperature',20)*12*MINUTESECONDS;;;; fhem ("set $NAME on-for-timer $duration") if isPoolpumpeAutomatik() }
attr PoolpumpeAutoTest commandTemplate set $NAME  $EVENT
attr PoolpumpeAutoTest group Pool1
attr PoolpumpeAutoTest icon scene_swimming
attr PoolpumpeAutoTest room test
attr PoolpumpeAutoTest switchInThePast 1

setstate PoolpumpeAutoTest on
setstate PoolpumpeAutoTest 2019-07-02 18:03:08 currValue on
setstate PoolpumpeAutoTest 2019-07-02 18:03:08 nextUpdate 2019-07-03 09:00:00
setstate PoolpumpeAutoTest 2019-07-02 18:03:08 nextValue on
setstate PoolpumpeAutoTest 2019-07-02 18:03:08 state on


Mal sehen ob und ggf. wie es morgen funktioniert.
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 02 Juli 2019, 19:09:04
Vielleicht noch zwei Anmerkungen:
- das mit dem Attribut war eigentlich nur für Testzwecke gedacht. Im laufenden Betrieb braucht man das bei dieser Art Zieldevice m.E. nicht.
- Das mit der Berechnung ist so: "hinten" wir der Code (vereinfacht gesagt) dann ausgewertet, wenn einer der Schaltzeitpunkte erreicht ist. Man kann aber auch die Schaltzeitpunkte in Perl berechnen. Diese Codes werden dann um Mitternacht jeweils neu berechnet, der Rückgabewert der aufgerufenen Funktion muß aber eine gültige Uhrzeit zurückliefern (Format HH:MM o. HH:MM:SS)
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 06 Juli 2019, 17:03:46
Hallo an Alle,
hallo Beta-User,

nachdem nun diese Woche der neue Lötkolben zusammen mit einem Sonoff S20 (https://www.amazon.de/Komforthaus-Schaltsteckdose-deutsche-Version-Android/dp/B07BRZ7JDX/ref=sr_1_6?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&keywords=sonoff+s20&qid=1562423547&s=gateway&sr=8-6 (https://www.amazon.de/Komforthaus-Schaltsteckdose-deutsche-Version-Android/dp/B07BRZ7JDX/ref=sr_1_6?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&keywords=sonoff+s20&qid=1562423547&s=gateway&sr=8-6)) eingetroffen ist, habe ich den Sonoff S20 auf Tasmota geflasht (https://github.com/arendst/Sonoff-Tasmota/wiki (https://github.com/arendst/Sonoff-Tasmota/wiki)).

Den Sonoff S20 konnte ich in FHEM via MQTT einbinden:
# #################################################################
# FHEM eigenen MQTT Broker anlegen - FHEM als MQTT-Server
# https://wiki.fhem.de/wiki/MQTT#MQTT2_CLIENT
# #################################################################
define myBroker MQTT2_SERVER 1883 global
setuuid myBroker 5d1e4efa-f33f-8****

# #################################################################
# Pool-Pumpe automatisch und per Hand schalten
# #################################################################
#
# Welcher Schalter fuer Pool mit Handschaltung: Sonoff-S20 via MQTT2
#
define Poolpumpe MQTT2_DEVICE DVES_B0B3EB
setuuid Poolpumpe 5d1f3d1b-***
attr Poolpumpe IODev myBroker
attr Poolpumpe autocreate 0
attr Poolpumpe model A_01a_tasmota_basic_state_power1
attr Poolpumpe readingList tele/sonoff/LWT:.* LWT\
  tele/sonoff/STATE:.* { json2nameValue($EVENT) }\
  tele/sonoff/SENSOR:.* { json2nameValue($EVENT) }\
  tele/sonoff/INFO.:.* { json2nameValue($EVENT) }\
  stat/sonoff/RESULT:.* { json2nameValue($EVENT) }
attr Poolpumpe room Garten
attr Poolpumpe group Pool
attr Poolpumpe setList off:noArg    cmnd/sonoff/POWER1 0\
  on:noArg     cmnd/sonoff/POWER1 1\
  toggle:noArg cmnd/sonoff/POWER1 2
attr Poolpumpe setStateList on off toggle
attr Poolpumpe stateFormat POWER1
attr Poolpumpe icon scene_swimming
#
# In Weboberflaeche anklicken ob Automatik An oder Aus sein soll
#
define PoolpumpeAutomatik dummy
attr   PoolpumpeAutomatik devStateIcon ja:ampel_gruen:nein nein:ampel_rot:ja
attr   PoolpumpeAutomatik group Pool
attr   PoolpumpeAutomatik icon scene_swimming
attr   PoolpumpeAutomatik room Garten
attr   PoolpumpeAutomatik sortby 1
attr   PoolpumpeAutomatik webCmd ja:nein
#
# Automatische Schaltung wenn Automatik an mit variabler Endzeit
# berechnet aus Temperatur
# https://forum.fhem.de/index.php/topic,101687.msg951463.html#msg951463
#
define PoolpumpeAuto WeekdayTimer Poolpumpe 09:00:00|on { my $duration = HOURSECONDS*2+ReadingsVal('SensorPool2','temperature',20)*12*MINUTESECONDS;;;; fhem ("set $NAME on-for-timer $duration") if isPoolpumpeAutomatik() }
attr   PoolpumpeAuto commandTemplate set $NAME  $EVENT
attr   PoolpumpeAuto group Pool
attr   PoolpumpeAuto room hidden
attr   PoolpumpeAuto icon scene_swimming
#


Heute habe ich beobachten können, dass um 9:00 Uhr die Pumpe pünktlich anging und nach Ablauf der berechneten Zeit von 7 Std. und 2 Min. um 16:02 Uhr wieder ausging.  ;D

Ende Gut, alles Gut, aber mit Sonoff S20 statt OBI-Steckdose und mit MQTT statt Esp-Easy.
Hätte vielleicht auch in der OBI-ESPEasy Kombination funktioniert, wenn ich den "Richtigen" .bin File auf die OBI-Steckdose geflasht hätte. Grundfehler war meiner Vermutung nach, dass ich den *normal_ESP8266_4M.bin statt den *normal_ESP8266_1M.bin genommen hatte.

Na ja, jedenfalls freue ich mich.
An dieser Stelle vielen, vielen Dank an Beta-User für seine geduldige Hilfe.

Gruß Bracew

P.S.: Gibt es eine Möglichkeit die An- und Ausschaltzeit auf der FHEM Oberfläche anzuzeigen, zur Kontrolle?
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 06 Juli 2019, 17:22:24
Schön, dass es jetzt läuft, wie du das gerne hättest :) .

Bei laufenden on-for-timer-Anweisungen (&Co) gibt es eine Teilstruktur bei den Internals des geschalteten Geräts, in denen was dazu drinsteht; einfach mal ein "list" machen und jeweils testen (die aktualisierten Daten werden aber nur sichtbar, wenn du die Seite dann jeweils neu lädst).

Ansonsten:
-jeweils RAW-Definitionen wären besser als der cfg-Auszug (weniger wegen dir selbst, sondern mehr wegen eventueller Nachahmer, die sich damit evtl. ein Bein stellen, weil sie den falschen Editor benutzen oder whatever...)
- [gelöst]? (ersten Beitrag editieren)

Schönes WE noch,

Beta-User
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 06 Juli 2019, 17:28:22
Mit "Anzeigen" meinte ich: auf der Weboberfläche, also zum Beispiel in der Gruppe Pool.

Zum Beispiel, wie beigefügter manipulierter Screenshot:
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 06 Juli 2019, 17:39:16
Es steht in einem Internal bzw. man kann auch laufende Timer auswerten/sich listen lassen (siehe cancel).
Ergo kann man das auch mit viel Aufwand in STATE bringen via stateFormat (Perl, InternalVal...).

Etwas einfacher (aber auch vereinfacht) müßte es gehen, wenn du dir die Attribute zu MQTT2_DEVICE mal näher ansiehst: Da hat Rudi was in MQTT2_DEVICE eingebaut, dass man zumindest die Frage, ob ein Timer läuft, per Symbol angezeigt bekommt. Das dürfte in der Regel ausreichen, oder? Wenn du kontrollieren willst, wie lange der Timer läuft, mußt du dann eben in die list-Anzeige oder (wenn das geht, ich nutze dafür ggf. erweiterten eigenen code) läßt dir mit cancel anzeigen, was so alles ansteht...
Titel: Antw:Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 06 Juli 2019, 17:47:57
Zitat...auch mit viel Aufwand...

Ah ok, dann hat sich die Frage erübrigt.
Schönes Wochenende wünscht
Bracew
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 06 Juli 2019, 18:05:50
Na ja, du könntest  einiges dabei lernen...

Jedenfalls: "setExtensionsEvent" auf "1" zu setzen, ist nicht ganz so aufwändig, und sollte schon mal eine Basisinfo liefern ;) .
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 06 Juli 2019, 18:10:08
Ok, gerne, aber vielleicht ein anderes Mal. Nun muss ich mich um die Familie kümmern.

"setExtensionsEvent" auf "1" zu setzen --> Aber wie und wo?
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 06 Juli 2019, 18:12:25
Am jeweiligen MQTT2_DEVICE ;) .
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 06 Juli 2019, 18:37:49
Da ist kein Attribut setExtensionsEvent am MQTT2_DEVICE Poolpumpe?
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 06 Juli 2019, 19:35:52
FHEM ist aktuell?
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 06 Juli 2019, 19:39:35
Ok, jetzt ist FHEM aktuell und jetzt habe ich setExtensionsEvent gefunden  ::)

Und wo finde ich jetzt "Basisinfo"?
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 06 Juli 2019, 19:51:43
"Basisinfo" zu?

Soweit ich das in Erinnerung habe, ist das nicht besonders kompliziert... Das Attribut setzen, dann sollten  via SetExtensions gesetzten on/off-for/till-timer einfach eine andere/erweiterte Info in den STATE (oder vorgelagert state) schreiben. Kann sein, dass du dann ggf. noch devStateIcon anpassen mußt (ich habe grad nur ein paar Lampen am Start, da macht das {zigbee2mqtt_devStateIcon255($name,'hex',1)}. Das dürfte hier (ohne hex) auch gehen, also {zigbee2mqtt_devStateIcon255($name,'',1)}, wenn's nicht so schon paßt.

Grade beim Nachdenken in mysensors.template gefunden:
attr DEVICE devStateIcon .*on:on .*off:off on.(for.timer|till.*):on-for-timer:off off.(for.timer|till.*):off-for-timer:on blink.*:light_toggle:off
Müßte eigentlich hier auch passen...
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 07 Juli 2019, 11:27:49
Was ich jetzt sehe ist, dass im DeviceOverview von Poolpumpe steht:  state  set_on-for-timer 24768
Aus diesen 24768 Sekunden kann ich mir händische errechnen 6 Std.+52 Min.+blabla Sek.

im DeviceOverview steht: state  on  2019-07-07 09:00:00

Ich kann mir somit zusammenreimen, dass die Pumpe von 9:00 Uhr bis 15:52 Uhr läuft.
Das hat allerdings einen schlechten WAF (Woman acceptance factor).

Für einen besseren WAF müsste ich es hinkriegen, dass auf der FHEM Weboberfläche im Raum Garten in der Gruppe Pool irgendwo sinngemäß steht:
"Poolpumpe läuft heute von 9:00 Uhr bis 15:52 Uhr" oder
"Poolpumpe An: 9:00 Uhr Aus: 15:52 Uhr" oder nur
"An: 9:00 Uhr   Aus: 15:52 Uhr" in der Gruppe Pool wäre das noch selbsterklärend.

Nur wie?
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 08 Juli 2019, 18:42:16
Ich bin der Sache ein wenig näher gekommen. Mit:
define PoolpumpeAn weblink htmlCode { '<b>Poolpumpe an:</b> ' . ReadingsVal("PoolpumpeAuto", "nextUpdate", "") . '<br>'}
attr PoolpumpeAn group Pool
attr PoolpumpeAn room Garten

define PoolpumpeAus weblink htmlCode { '<b>Poolpumpe aus:</b> ' . secs2hms(ReadingsVal('SensorPool2','temperature',20)*12*MINUTESECONDS+HOURSECONDS*2+HOURSECONDS*9) . '<br>'}
attr PoolpumpeAus group Pool
attr PoolpumpeAus room Garten

zeigt FHEM in der Weboberfläche wie beigefügtes Bild an.

Hat aber das Problem, dass die Aus-Zeit bei jedem Refresh neu abhängig von der Temperatur berechnet wird. Ändert sich im Laufe des Tages die Temperatur (was normal ist), ändert sich auch die Ausschaltzeit. >:(

Eigentlich dürfte PoolpumpeAus nur einmal am Tag um 9:00 Uhr gefüllt werden. Aber wie?
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 09 Juli 2019, 11:55:05
Hmmm,

mit weblink kenne ich mich nicht aus, denke aber, das ist nicht der optimale Weg.
Wie bereits ausgeführt, gibt es ein paar Internals im Zieldevice, die ggf. auf einen laufenden Timer hinweisen. Das kannst du (an diesem Device jeweils) für ein Perl-devStateIcon oder (mehrzeiliges) Perl-stateFormat nutzen, um denselben Effekt zu erzielen.

Ganz egal, wie du es letztlich löst vielleicht noch ein Tipp: Nutze den WDT-Perl-Code, um die errechnete Einschaltdauer _auch_ in ein (zusätzliches) _Reading_ des Zieldevices zu schreiben ;) .
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 13 Juli 2019, 09:41:44
Hallo Beta-User,

danke für Deine Hinweise, jedoch bin ich leider nicht auf Deinem Level und habe nicht Deine Erfahrung. Ich habe lange gesucht aber letztendlich nicht verstanden, was Du mit
  mit: "Das kannst du (an diesem Device jeweils) für ein Perl-devStateIcon oder (mehrzeiliges) Perl-stateFormat nutzen, um denselben Effekt zu erzielen."
  bzw. "Einschaltdauer _auch_ in ein (zusätzliches) _Reading_ des Zieldevices zu schreiben "
sagen willst

Aber, ich habe es jetzt für mich halbwegs zufriedenstellend gelöst. FHEM schaltet über den WDT die Pumpe automatisch Ein- und Aus, wie in Antwort #39 am: 06 Juli 2019, 17:03:46 dargestellt.

Aus dem ReadingsVal("PoolpumpeAuto", "nextUpdate", "") lasse ich über den Weblink die nächste ANschaltzeit in der Weboberfläche ausgeben. Andere Wege wie dies funktionieren könnte (Dein Kommentar:"...das ist nicht der optimale Weg.") kenne ich bisher leider nicht.

Wenn um 9:00 Uhr die Pumpe vom WDT eingeschaltet wird lasse ich FHEM kurz danach die selbe Berechnung nochmals machen, addiere die Zeit von 0:00 Uhr bis 9:00 Uhr noch oben drauf (+HOURSECONDS*9) und lasse dies in einem Dummy (PoolpumpeAusDummy) speichern.

Danach wieder, wie bei AN: Aus dem ReadingsVal("PoolpumpeAusDummy", "state", "") lasse ich über den Weblink die AUSschaltzeit ausgeben.

Danke für die vielen Hilfen, einen schönen Sommer und
liebe Grüße von
Bracew
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 13 Juli 2019, 11:47:45
Es tut mir leid, wenn dir meine Hinweise nicht detailliert genug waren, und schön, dass es dir gelungen ist, das auf eine für dich zufriedenstellende Weise zu lösen.

Wie immer, führen viele Wege zum Ziel.

Kurz ein paar Anmerkungen, zu meinen "kryptischen" Anregungen:

Mit "Zieldevice" ist das Device gemeint, das du eigentlich schalten willst, also "Poolpumpe".

Ein zusätzliches Reading kann man dort z.B. mit "setreading Poolpumpe bla 12345" setzen. Das ginge auch direkt im WDT als weitere "Zeile" in dem vorhandenen Perl-Code. Also einfach hinten ein weiteres ";;", und dann die Anweisung, das ganze (da Perl direkt) wieder verpackt in "fhem (..." und unter Verwendung der bereits errechneten Variable für die Einschaltdauer ("$duration"). Du kannst da natürlich aber vorneweg auch die Ausschaltzeit errechnen, indem du die aktuelle Zeit addierst, das ganze schon formatierst...
(Für solche Aktionen muß ich auch nachsehen, wie das woanders gelöst ist.)

Du erreichst damit, dass erst mal alle relevanten Infos direkt bei dem Device stehen, um das es geht.

Dann kannst du dort das Attribut stateFormat nutzen, um die Dinge zu formatieren. Dort ist Perl-Code zulässig, so dass du da alles mögliche in diesem Code abfragen und verarbeiten kannst (ganz ähnlich wie in dem WDT, um den es ursprünglich ging); man kann auch eigene myUtils-Funktionen aufrufen.
Ist die Ausgabe mehrzeilig, kann man das nutzen, um z.B. auch mehrere Icons zum aufhübschen zu verwenden. Es gibt nicht soooo viele Beispiele dazu, aber zum einen muß das auch nicht "auf einen Rutsch" fertig sein, und zum anderen kann man dann ja wieder fragen, wenn man einen Schritt weiter ist.

Die Grundlagen zum "Aufhübschen" des DeviceOverview sind im Wiki zu finden: https://wiki.fhem.de/wiki/DeviceOverview_anpassen, da sind auch ein paar Links drin.

Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 15 Juli 2019, 15:56:05
Hallo Beta-User,

so, nun habe ich alle Info's in die Readings des Zieldevice geschrieben (siehe Bild) und ohne Dummy die Auszeit angezeigt:
#
# Automatische Schaltung wenn Automatik an mit variabler Endzeit
#
define PoolpumpeAuto WeekdayTimer Poolpumpe 09:00:00|on { my $duration = HOURSECONDS*2+ReadingsVal('SensorPool2','temperature',20)*12*MINUTESECONDS;;;; fhem ("set $NAME on-for-timer $duration");;;; fhem ("setreading Poolpumpe PoolpumpeOnForTimer $duration");;;; fhem ("setreading Poolpumpe PoolpumpeLaufZeit " .secs2hms($duration));;;; fhem ("setreading Poolpumpe PoolpumpeAusZeit " .secs2ymdhms($duration+HOURSECONDS*9)) }
setuuid PoolpumpeAuto 5d20d493-****
attr   PoolpumpeAuto commandTemplate set $NAME  $EVENT
attr   PoolpumpeAuto group Pool
attr   PoolpumpeAuto icon scene_swimming
attr   PoolpumpeAuto room hidden
#
# In Weboberflaeche ansehen wann Automatik AN schaltet
#
define PoolpumpeAn weblink htmlCode { '<b>Poolpumpe &nbsp an:</b> ' . ReadingsVal("PoolpumpeAuto", "nextUpdate", "") . '<br>'}
attr   PoolpumpeAn group Pool
attr   PoolpumpeAn room Garten
#
# In Weboberflaeche ansehen wann Automatik AUS schaltet
#
define PoolpumpeAus weblink htmlCode { '<b>Poolpumpe aus:</b> ' . ReadingsVal("Poolpumpe", "PoolpumpeAusZeit", "") . '<br>'}
attr   PoolpumpeAus group Pool
attr   PoolpumpeAus room Garten
#

Die Berechnung der PoolpumpeAusZeit habe ich in 99_myUtils ausgelagert.

Einen Nachteil des "On-for-Timer" im WDT habe ich nun rausgefunden. Wenn, während des (mehrstündigen) on-for-timer Laufes, FHEM aus welchen Gründen auch immer z.B. einen Restart hat, schaltet die Pumpe nicht mehr aus bzw. nicht mehr zur gewünschten Zeit aus. Irgendwie ist dann die AUSschaltzeit durcheinander.

In so fern wäre der "normale" WDT mit ANschaltzeit und berechneter AUSschaltzeit ohne on-for-timer, z.B. ähnlich
  define PoolpumpeAuto WeekdayTimer Poolpumpe 09:00:00|on 17:00:00|off (isPoolpumpeAutomatik())
(nur statt 17:00:00 eine berechnete Zeit) besser vor Fehlern während der Laufzeit des on-for-timer gesichert.
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Beta-User am 15 Juli 2019, 16:20:52
 :)
Wenn es jetzt drum geht, die weblinks noch durch ein stateFormat "wegzuformatieren", sollten wir einen Blick auf ein "list" der Poolpumpe werfen ;) .

"Extra für dich" habe ich im WDT die Option eingebaut, die Timer neu errechnen lassen zu können, nicht nur um Mitternacht. Das macht "set <wdt> enable" jetzt auch zur Laufzeit.
Das könntest du nutzen, um z.B. bei einem Einschaltbefehl die Timer nochmal neu zu berechnen (ungetesteter Pseudo-Code, bitte Zeilenumbrüche und ";" ggf. Checken, ebenso den Kommandotrenner in der ersten fhem-Anweisung; weiter gehe ich davon aus, dass secs2hms irgend ein Zeitformat zurückliefert; das hat aber uU. das Problem, dass es jeweils ausgehend von der aktuellen Uhrzeit ist):

define PoolpumpeAuto WeekdayTimer Poolpumpe 09:00:00|on {secs2hms(HOURSECONDS*2+ReadingsVal('SensorPool2','temperature',20)*12*MINUTESECONDS )}|off
{return unless isPoolpumpeAutomatik();;\
  if($EVENT eq "on" ){\
    fhem ("set $NAME on; set PoolpumpeAuto enable")};;\
  } else {\
    fhem ("set $NAME off");;\
  }\
}

Bitte kein Switchinthepast, sonst kann das eine Endlosschleife geben...

Und eigentlich sollte ein on-for-timer ein InternalTimer sein, der mit (in fhem.save) abgespeichert wird (oder anders gesagt: wenn, dann ist das ein generelles on-for-timer-Problem mit allen per SetExtensions gesetzten on/off-for/till-Anweisungen).
Titel: Antw:[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten
Beitrag von: Bracew am 12 August 2019, 20:19:36
Hallo,

die Lösung des Problems per WeekdayTimer mit on-for-timer war mir nicht stabil genug. Bei Handeingriffen während on-for-timer hat die Pumpe Nachmittags manchmal nicht mehr ausgeschaltet.

Ich habe umgestellt auf doif. Damit wird zuverlässig die Poolpumpe an- und abgeschaltet.

Danke für Eure Hilfen
Gruß Bracew