MAXLAN - Zeiten der Readings

Begonnen von Bernd1608, 11 November 2014, 12:37:14

Vorheriges Thema - Nächstes Thema

Bernd1608

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

Matthias Gehre

Du kannst nach dem Fensterkontakt Notify einen Timer starten, der deine Funktion z.B. 5 Sekunden später ausführt.

Bernd1608

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