[gelöst]Poolpumpe mit WeekdayTimer abhängig von Pooltemperatur ausschalten

Begonnen von Bracew, 22 Juni 2019, 17:20:32

Vorheriges Thema - Nächstes Thema

Bracew

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?
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Bracew

Da ist kein Attribut setExtensionsEvent am MQTT2_DEVICE Poolpumpe?
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Bracew

Ok, jetzt ist FHEM aktuell und jetzt habe ich setExtensionsEvent gefunden  ::)

Und wo finde ich jetzt "Basisinfo"?
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Beta-User

"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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Bracew

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?
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Bracew

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?
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Beta-User

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 ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Bracew

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
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Beta-User

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.

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Bracew

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.
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Beta-User

 :)
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).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Bracew

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
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe