Hallo,
ich nutze meine MAX! Geräte über den Cube (MAXLAN).
Mein Problem ist, Befehle zur Temperaturänderung werden bei geöffneten Fenster (FK) verworfen.
Dieses Problem habe ich versucht über einen notify der nach den schließen des Fensters ausgelöst wird zu kompensieren.
# MAX Heizungsthermostate beim schließen der Fenster auf verpasste Thermostatänderung überpüfen
define Hzg_pruefen_FK_zu notify .*_MAX_FK:.*closed { \
my $MAX_HT=$NAME ;; \
$MAX_HT =~ s/FK/HT/ ;; \
my $MAX_NAME = AttrVal($MAX_HT,"alias",$MAX_HT) ;; \
if ((Value("Whg_Heizungsmodus") eq "off")||(Value("Whg_Heizungsmodus") eq "10.0")) { \
if ((ReadingsVal($MAX_HT,"desiredTemperature", "") ne Value("Whg_Heizungsmodus"))||(ReadingsVal($MAX_HT,"mode", "") ne "manual")) { \
fhem("set " .$MAX_HT ." desiredTemperature " .Value("Whg_Heizungsmodus") ) ;; \
Log 3, "Durch offenes Fenster verhinderte Thermostatänderung am Gerät " .$MAX_NAME ." korrigiert:" ;; \
Log 3, "Von Modus: " .ReadingsVal($MAX_HT,"mode", "") .";; Temperatur: " .ReadingsVal($MAX_HT,"desiredTemperature", "") ;; \
Log 3, "Auf Modus: manual;; Temperatur: " .Value("Whg_Heizungsmodus") \
} \
} \
elsif (Value("Whg_Heizungsmodus") eq "eco") { \
if ((ReadingsVal($MAX_HT,"desiredTemperature", "") ne ReadingsVal($MAX_HT,"ecoTemperature", ""))||(ReadingsVal($MAX_HT,"mode", "") ne "manual")) { \
fhem("set " .$MAX_HT ." desiredTemperature eco") ;; \
Log 3, "Durch offenes Fenster verhinderte Thermostatänderung am Gerät " .$MAX_NAME ." korrigiert:" ;; \
Log 3, "Von Modus: " .ReadingsVal($MAX_HT,"mode", "") .";; Temperatur: " .ReadingsVal($MAX_HT,"desiredTemperature", "") ;; \
Log 3, "Auf Modus: manual;; Temperatur: eco " .ReadingsVal($MAX_HT,"ecoTemperature", "") \
} \
} \
elsif (Value("Whg_Heizungsmodus") eq "comfort") { \
if ((ReadingsVal($MAX_HT,"desiredTemperature", "") ne ReadingsVal($MAX_HT,"comfortTemperature", ""))||(ReadingsVal($MAX_HT,"mode", "") ne "manual")) { \
fhem("set " .$MAX_HT ." desiredTemperature comfort") ;; \
Log 3, "Durch offenes Fenster verhinderte Thermostatänderung am Gerät " .$MAX_NAME ." korrigiert:" ;; \
Log 3, "Von Modus: " .ReadingsVal($MAX_HT,"mode", "") .";; Temperatur: " .ReadingsVal($MAX_HT,"desiredTemperature", "") ;; \
Log 3, "Auf Modus: manual;; Temperatur: comfort " .ReadingsVal($MAX_HT,"comfortTemperature", "") \
} \
} \
elsif (Value("Whg_Heizungsmodus") eq "auto") { \
if (ReadingsVal($MAX_HT,"mode", "") ne "auto") { \
fhem("set " .$MAX_HT ." desiredTemperature auto") ;; \
Log 3, "Durch offenes Fenster verhinderte Thermostatänderung am Gerät " .$MAX_NAME ." korrigiert:";; \
Log 3, "Von Modus: " .ReadingsVal($MAX_HT,"mode", "") .";; Temperatur: " .ReadingsVal($MAX_HT,"desiredTemperature", "") ;; \
Log 3, "Auf Modus: " .Value("Whg_Heizungsmodus") \
} \
} \
}
attr Hzg_pruefen_FK_zu alias Heizkörperthermostate prüfen
attr Hzg_pruefen_FK_zu group Heizung
attr Hzg_pruefen_FK_zu icon my_Zahnrad_29px
attr Hzg_pruefen_FK_zu room Steuerung[/tt]
Der Code funktioniert auch, aber der Cube sendet oder MAXLAN empfängt die ,,desiredTemperature" teilweise etwas verspätet wie die anderen Readings.
Internals:
CHANGED
DEF HeatingThermostat 0c978f
IODev MAXCube
LASTInputDev MAXCube
MAXCube_MSGCNT 2080
MAXCube_TIME 2014-11-11 11:49:41
MSGCNT 2080
NAME Bad_MAX_HT
NR 379
STATE 15.0 °C
TYPE MAX
addr 0c978f
backend MAXCube
dstsetting 1
mode 1
rferror 0
serial KEQ0828278
type HeatingThermostat
Readings:
2014-11-11 11:49:41 MAXLAN_error 0
2014-11-11 11:49:41 MAXLAN_errorInCommand
2014-11-11 11:49:41 MAXLAN_initialized 1
2014-11-11 11:49:41 MAXLAN_isAnswer 0
2014-11-11 11:49:41 MAXLAN_valid 1
2014-11-11 11:49:41 battery ok
2014-11-11 11:49:39 boostDuration 5
2014-11-11 11:49:39 boostValveposition 80
2014-11-11 11:49:39 comfortTemperature 19.5
2014-11-11 11:49:39 decalcification Sun 12:00
2014-11-11 11:49:41 desiredTemperature 15.0
2014-11-11 11:49:39 ecoTemperature 15.0
2014-11-11 11:49:39 firmware 1.0
2014-11-11 11:49:39 groupid 2
2014-11-11 11:49:39 maxValveSetting 100
2014-11-11 11:49:39 maximumTemperature 24.5
2014-11-11 11:49:39 measurementOffset 0.0
2014-11-11 11:49:39 minimumTemperature off
2014-11-11 11:49:41 mode manual
2014-11-11 11:49:41 state 15.0 °C
2014-11-11 06:16:41 temperature 19.3
2014-11-11 11:49:39 testresult 160
2014-11-11 11:49:39 valveOffset 0
2014-11-11 11:49:41 valveposition 0
2014-11-11 11:49:39 weekprofile-0-Sat-temp 15.0 °C / 19.5 °C / 15.0 °C
2014-11-11 11:49:39 weekprofile-0-Sat-time 00:00-06:00 / 06:00-23:30 / 23:30-00:00
2014-11-11 11:49:39 weekprofile-1-Sun-temp 15.0 °C / 19.5 °C / 15.0 °C
2014-11-11 11:49:39 weekprofile-1-Sun-time 00:00-06:00 / 06:00-22:30 / 22:30-00:00
2014-11-11 11:49:39 weekprofile-2-Mon-temp 15.0 °C / 19.5 °C / 15.0 °C / 19.5 °C / 15.0 °C
2014-11-11 11:49:39 weekprofile-2-Mon-time 00:00-05:15 / 05:15-08:00 / 08:00-15:00 / 15:00-22:30 / 22:30-00:00
2014-11-11 11:49:39 weekprofile-3-Tue-temp 15.0 °C / 19.5 °C / 15.0 °C / 19.5 °C / 15.0 °C
2014-11-11 11:49:39 weekprofile-3-Tue-time 00:00-05:15 / 05:15-08:00 / 08:00-15:00 / 15:00-22:30 / 22:30-00:00
2014-11-11 11:49:39 weekprofile-4-Wed-temp 15.0 °C / 19.5 °C / 15.0 °C / 19.5 °C / 15.0 °C
2014-11-11 11:49:39 weekprofile-4-Wed-time 00:00-05:15 / 05:15-08:00 / 08:00-15:00 / 15:00-22:30 / 22:30-00:00
2014-11-11 11:49:39 weekprofile-5-Thu-temp 15.0 °C / 19.5 °C / 15.0 °C / 19.5 °C / 15.0 °C
2014-11-11 11:49:39 weekprofile-5-Thu-time 00:00-05:15 / 05:15-08:00 / 08:00-15:00 / 15:00-22:30 / 22:30-00:00
2014-11-11 11:49:39 weekprofile-6-Fri-temp 15.0 °C / 19.5 °C / 15.0 °C / 19.5 °C / 15.0 °C
2014-11-11 11:49:39 weekprofile-6-Fri-time 00:00-05:15 / 05:15-08:00 / 08:00-13:30 / 13:30-23:00 / 23:00-00:00
2014-11-11 11:49:39 windowOpenDuration 15
2014-11-11 11:49:39 windowOpenTemperature 5.0
Internals:
interfaces thermostat;battery;temperature
Attributes:
IODev MAXCube
alias Heizkörperthermostat Bad
event-min-interval valveposition:900,battery:86400
event-on-change-reading valveposition,battery,temperature,state
event-on-update-reading valveposition,temperature
group eQ-3-MAX!
icon my_MAX_Heizkoerperthermostat_29px
room Steuerung
Was zur Folge hat das FHEM durch den FK das notify auslöst und die if-Bedingungen sofort greifen bevor der richtige Wert für die "desiredTemperature" gesetzt wurde
und dadurch unnötige Funksignale an das Heizkörperthermostat sendet.
LOG-Auszug der auch unnötig war!
2014.11.11 00:58:33 3: Durch offenes Fenster verhinderte Thermostatänderung am Gerät Heizkörperthermostat+ Küche korrigiert:
2014.11.11 00:58:33 3: Von Modus: manual; Temperatur: 5.0
2014.11.11 00:58:33 3: Auf Modus: manual; Temperatur: eco 15.0
Möchte den Code ungern auseinanderreisen.
Hat jemand eine Idee wie ich das Lösen kann?
Mit freundlichen Gruß
Bernd
Du kannst nach dem Fensterkontakt Notify einen Timer starten, der deine Funktion z.B. 5 Sekunden später ausführt.
Hallo Matthias,
Danke für Deine Antwort.
Habe es so gemacht wie Du es mir geraten hast.
Auf eine andere Lösung bin ich auch nicht gekommen.
# MAX Heizungsthermostate beim schließen der Fenster auf verpasste Thermostatänderung überpüfen
# Zeitlich verzögern bis alle Readings übertragen worden
define Hzg_pruefen_FK_verzoegern notify .*_MAX_FK:.*closed sleep 30;; trigger Hzg_pruefen_FK_zu $NAME
attr Hzg_pruefen_FK_verzoegern alias Heizkörperthermostate prüfen verzögern
attr Hzg_pruefen_FK_verzoegern group Heizung
attr Hzg_pruefen_FK_verzoegern icon my_Zahnrad_29px
attr Hzg_pruefen_FK_verzoegern room Steuerung
# Einstellung der Thermostate überrüfen
define Hzg_pruefen_FK_zu notify Hzg_pruefen_FK_zu { \
my $MAX_HT=$EVENT ;; \
$MAX_HT =~ s/FK/HT/ ;; \
my $MAX_NAME = AttrVal($MAX_HT,"alias",$MAX_HT) ;; \
if ((Value("Whg_Heizungsmodus") eq "off")||(Value("Whg_Heizungsmodus") eq "10.0")) { \
if ((ReadingsVal($MAX_HT,"desiredTemperature", "") ne Value("Whg_Heizungsmodus"))||(ReadingsVal($MAX_HT,"mode", "") ne "manual")) { \
fhem("set " .$MAX_HT ." desiredTemperature " .Value("Whg_Heizungsmodus") ) ;; \
Log 3, "Durch offenes Fenster verhinderte Thermostatänderung am Gerät " .$MAX_NAME ." korrigiert:" ;; \
Log 3, "Von Modus: " .ReadingsVal($MAX_HT,"mode", "") .";; Temperatur: " .ReadingsVal($MAX_HT,"desiredTemperature", "") ;; \
Log 3, "Auf Modus: manual;; Temperatur: " .Value("Whg_Heizungsmodus") \
} \
} \
elsif (Value("Whg_Heizungsmodus") eq "eco") { \
if ((ReadingsVal($MAX_HT,"desiredTemperature", "") ne ReadingsVal($MAX_HT,"ecoTemperature", ""))||(ReadingsVal($MAX_HT,"mode", "") ne "manual")) { \
fhem("set " .$MAX_HT ." desiredTemperature eco") ;; \
Log 3, "Durch offenes Fenster verhinderte Thermostatänderung am Gerät " .$MAX_NAME ." korrigiert:" ;; \
Log 3, "Von Modus: " .ReadingsVal($MAX_HT,"mode", "") .";; Temperatur: " .ReadingsVal($MAX_HT,"desiredTemperature", "") ;; \
Log 3, "Auf Modus: manual;; Temperatur: eco " .ReadingsVal($MAX_HT,"ecoTemperature", "") \
} \
} \
elsif (Value("Whg_Heizungsmodus") eq "comfort") { \
if ((ReadingsVal($MAX_HT,"desiredTemperature", "") ne ReadingsVal($MAX_HT,"comfortTemperature", ""))||(ReadingsVal($MAX_HT,"mode", "") ne "manual")) { \
fhem("set " .$MAX_HT ." desiredTemperature comfort") ;; \
Log 3, "Durch offenes Fenster verhinderte Thermostatänderung am Gerät " .$MAX_NAME ." korrigiert:" ;; \
Log 3, "Von Modus: " .ReadingsVal($MAX_HT,"mode", "") .";; Temperatur: " .ReadingsVal($MAX_HT,"desiredTemperature", "") ;; \
Log 3, "Auf Modus: manual;; Temperatur: comfort " .ReadingsVal($MAX_HT,"comfortTemperature", "") \
} \
} \
elsif (Value("Whg_Heizungsmodus") eq "auto") { \
if (ReadingsVal($MAX_HT,"mode", "") ne "auto") { \
fhem("set " .$MAX_HT ." desiredTemperature auto") ;; \
Log 3, "Durch offenes Fenster verhinderte Thermostatänderung am Gerät " .$MAX_NAME ." korrigiert:";; \
Log 3, "Von Modus: " .ReadingsVal($MAX_HT,"mode", "") .";; Temperatur: " .ReadingsVal($MAX_HT,"desiredTemperature", "") ;; \
Log 3, "Auf Modus: " .Value("Whg_Heizungsmodus") \
} \
} \
}
attr Hzg_pruefen_FK_zu alias Heizkörperthermostate prüfen
attr Hzg_pruefen_FK_zu group Heizung
attr Hzg_pruefen_FK_zu icon my_Zahnrad_29px
attr Hzg_pruefen_FK_zu room Steuerung
Funktioniert bis auf Ausnahmen die ich noch nicht verstehe weil die sehr selten sporadisch auftreten.
Er liest gleiche Daten aus, aber beim Vergleich sind sie doch nicht gleich! :o
Logauszug
2014.11.16 16:49:35 3: Durch offenes Fenster verhinderte Thermostatänderung am Gerät Heizkörperthermostat+ Küche korrigiert:
2014.11.16 16:49:35 3: Von Modus: manual; Temperatur: 19.5
2014.11.16 16:49:35 3: Auf Modus: manual; Temperatur: comfort 19.5
2014.11.16 18:27:16 3: Durch offenes Fenster verhinderte Thermostatänderung am Gerät Heizkörperthermostat+ Küche korrigiert:
2014.11.16 18:27:16 3: Von Modus: manual; Temperatur: 19.5
2014.11.16 18:27:16 3: Auf Modus: manual; Temperatur: comfort 19.5
Mit dankenden Grüßen
Bernd