FHEM Forum

FHEM => Automatisierung => Thema gestartet von: FHEm2005 am 19 August 2017, 16:51:53

Titel: [Gelöst] Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: FHEm2005 am 19 August 2017, 16:51:53
Bei meiner Heizungssteuerung wird einmal täglich die Ventilsteuerung in den Räumen auf "auto" gestellt, um tagsüber vorgenommene manuelle Einstellungen wieder zu "löschen". Während der Sommerpause sollen alle Heizkörper auf manuell und off geschaltet werden, aber jeden Tag werden die Heizkörper wieder auf "auto" gestellt. >:(

define at_Th_Wz_Ez_1 at *18:00:00 set Th_Wz_Ez_Climate controlMode auto

Also habe ich einen Dummy-Schalter "Heizperiode" eingeführt:
define Heizperiode dummy
attr Heizperiode eventMap on,off
attr Heizperiode room Heizung
attr Heizperiode webCmd on:off


Ich stehe momentan auf dem Schlauch, weil ich nicht weiß mit welchem Modul ich zustandsgesteuert und nicht ereignisgesteuert den Befehl "set Th_Wz_Ez_Climate controlMode auto" absetzen kann.

Schreibprogramm  ;): Wenn ReadingsVal("Heizperiode", "state", "on") dann "set Th_Wz_Ez_Climate controlMode auto"

Den Schalter Heizperoide betätige ich im Jahr normalerweise nur zweimal: einmal "on" und im Sommer einmal "off"
Gruß Eberhard
Titel: Antw:Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: rubbertail am 19 August 2017, 16:53:34
Vielleicht einfach Deaktivieren des at?
Titel: Antw:Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: FHEm2005 am 19 August 2017, 17:07:24
Sicher könnte man/frau den disable Bfehl über die Kommandozeile absetzen, aber wo bleibt der WAF?? :)
Nein es sollte schon über die WEB-UI passieren? Schalter mit dem disable 1/disable 0 -Befehl? Wie soll der aussehen?
Gruß Eberhard
Titel: Antw:Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: sash.sc am 19 August 2017, 17:30:34
Über devStateIcon als schalter
Titel: Antw:Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: FHEm2005 am 19 August 2017, 23:02:12
@ sash.sc: devStateIcon ist nicht in jedem Modul identisch, deshalb kam ich leider mit Deinem Hinweis weiter. Ich habe es mit DOIF realisiert. Zwar etwas umständlich, aber es scheint zu laufen.

dummy "Winterbetrieb" als Schalter ===> DOIF der den Dummy ausliest und 'at' aktiv/inaktiv schaltet.

Der Vollständigkeit halber:

Dummy Winterbetrieb:
define Winterbetrieb dummy
attr Winterbetrieb room Heizung
attr Winterbetrieb webCmd on:off

DOIF für den Winterbetrieb:
define di_Winterbetrieb DOIF ([Winterbetrieb:"on"]) (set at_Th_Wz_Ez_1 active) DOELSEIF ([Winterbetrieb:"off"]) (set at_Th_Wz_Ez_1 inactive)
attr di_Winterbetrieb room Heizung
attr di_Winterbetrieb webCmd on:off

Das 'at' welches den Thermostat um 18:00 Uhr auf auto zurückschaltet:
define at_Th_Wz_Ez_1 at *18:00:00 set Th_Wz_Ez_Climate controlMode auto
attr at_Th_Wz_Ez_1 disable 0
attr at_Th_Wz_Ez_1 room Heizung


Danke an alle, die mitgeholfen haben mein Problem zu lösen. Wer noch Verbesserungsvorschläge hat: Ich lerne gerne.
Viele Grüße
Eberhard
Titel: Antw:[Gelöst] Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: Beta-User am 19 August 2017, 23:29:23
Wenn Du schon unbedingt einen Dummy nehmen willst, um das an- und auszuschalten, warum nimmst Du dann nicht wenigstens nur ein Device für den Rest?

Also entweder darf das DOIF um 18:00 Uhr direkt den Schaltbefehl senden (natürlich nur im Winter, als Nicht-DOIF'ler geraten: "and [18:00]" im ersten Zweig), oder (für perl-Freunde oder IF-Anwender) Du machst im at einfach eine Abfrage, ob Winter ist und schaltest eben nur dann ein...

Ungetestet mit IF (als Kompromiss für perl-Skeptiker):

define at_Th_Wz_Ez_1 at *18:00:00 IF ([Winterbetrieb] eq "on") (set Th_Wz_Ez_Climate controlMode auto)
Titel: Antw:[Gelöst] Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: FHEm2005 am 19 August 2017, 23:39:10
Das sieht ja ganz gut aus, aber was mache ich mit ([Winterbetrieb] eq "off")? Gibt es ein ELSIF?
Titel: Antw:[Gelöst] Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: Beta-User am 19 August 2017, 23:46:10
Jein, es gibt kein ELSEIF, aber man kann es verschachteln, wie ein Blick in die commandref zu IF verrät:

define test notify lamp
IF ([lamp] eq "on") (
  IF ([outdoor:humidity] < 70)
(set lamp off)
ELSE
(set lamp on)
) ELSE
  (set switch on)

Mit perl ginge das natürlich genauso, es wären nur mehr "komische" Klammern, ";" und so weiter...
Da gibt's auch ein elsif (das "e" fehlt mit Absicht).

Gruß, Beta-User
Titel: Antw:[Gelöst] Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: Beta-User am 19 August 2017, 23:55:28
Noch ein Beispiel mit weekdayTimer statt at, dafür aber mit etwas perl (könnte auch mit else usw. sein und ohne die Übergabewerte aus dem weekdaytimer auskommen):

define Timer_Brunnen_Schildkroeten WeekdayTimer Wasser_Schildkroeten 10:45|1800 12:30|1800 14:00|1800 15:30|1800 17:00|1800 19:00|1800 { if (ReadingsVal("Aussentemperatur_Nord", "state", "no") > 8 && ReadingsVal("Heizung_Schildkroeten","state","active") eq "disabled") { fhem ("set $NAME on-for-timer $EVENT")}}

Das "Heizung_Schildkroeten" ist ein THRESHOLD, der verhindert, dass mir die Tierchen im Winter draußen bei extremem Frost erfrieren. Daran hängt im Winter halt ein Heizkabel statt der Brunnenpumpe...

Gruß, Beta-User
Titel: Antw:[Gelöst] Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: FHEm2005 am 20 August 2017, 07:52:12
Hallo Beta-User,
Deine Hinweise haben die gesamte Mimik vereinfacht. Das war genau das, was in eingangs wissen wollte. Also sieht meine Sommer/Winterumschaltung jetzt so aus:
define at_Th_Wz_Ez_1 at *23:00:00 IF ([Winterbetrieb] eq "on") (set Th_Wz_Ez_Climate controlMode auto) ELSE (set Th_Wz_Ez_Climate controlMode manual)

Dein Schildkrötenteich ist ein schönes Beispiel für Zustandsabfragen. Danke für Deine Hilfe.
Gruß Eberhard
Titel: Antw:[Gelöst] Heizungsumschaltung man/auto während der Sommerpause
Beitrag von: Beta-User am 20 August 2017, 11:11:49
Hallo Eberhard,

Danke für die Rückmeldung, schön, dass Dir das weitergeholfen hat.

Vielleicht noch ein Verbesserungsvorschlag (weiß aber nicht, ob das mit MAX Sinn macht, da die den Zustandswechsel ja nicht rückmelden (?)):
FILTER verwenden, um dann nur zu Schalten,  wenn der Zielzustand nicht schon erreicht ist (wg. 1%-Regel). Aus der commandref:
set room=kitchen:FILTER=STATE!=off off

Geht auch  bei nur einem Device, ist aber vom Effekt her natürlich nicht der Brüller, aber man sollte es im Hinterkopf behalten, wenn die Installation wächst und irgendwann ganze Gerätegruppen zu schalten sind.

Ich habe übrigens alle meine zu Beginn eingesetzten IF durch perl-if ersetzt. M.E. sollte man sich die Mühe machen, diese Sprache wenigstens in den Grundzügen zu erlernen. Es erleichtert vieles, da man dann längere Codeblöche einfacher in myUtils auslagern kann. Wenigstens mir kommt es für komplexe Fragen am Ende einfacher vor, als "andere" Lösungen.
Just m2ct ;) .

Gruß, Beta-User