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
Vielleicht einfach Deaktivieren des at?
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
Über devStateIcon als schalter
@ 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
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)
Das sieht ja ganz gut aus, aber was mache ich mit ([Winterbetrieb] eq "off")? Gibt es ein ELSIF?
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
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
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
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