FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Sidey am 17 November 2016, 08:05:46

Titel: Zwei Temperaturwerte vergleichen
Beitrag von: Sidey am 17 November 2016, 08:05:46
Moin allerseits,

Ich bin mit meinem Latein am Ende.

Folgender Fall:
Ich habe ein HomeMatic Heizkörper Thermostat und einen externen Sensor.

Der Sensor misst die Raumtemperatur und generiert höchsten alle 280 Sekunden einen Event.

Mit einem DOIF wollte ich auf das Event reagieren und den Temperatur Wert in einen virtuellen HomeMatic schreiben.

Der Wert im virtuellen Temp Sensor soll immer dann aktualisiert werden, wenn er von Wert des Raum Sensors abweicht.

Mittels Filelog habe ich verifiziert, dass der Raumsensor Events erzeugt.
Das Doif löst aber sehr unzuverlässig aus. Wie im List zu sehen ist, wurde das letzte Mal um 0:33 Uhr ausgelöst.

Das letzte Event ist von 7:52.





Internals:
   DEF        ([MYSENSOR_106:wz.temperature] != [wz.vTmp1_Sensor1:temperature]) (set wz.vTmp1_Sensor1 virtTemp [MYSENSOR_106:wz.temperature])
   NAME       wz.Tmp_upd
   NR         343
   NTFY_ORDER 50-wz.Tmp_upd
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-11-17 07:52:42   Device          MYSENSOR_106
     2016-11-17 00:33:45   cmd             1
     2016-11-17 00:33:45   cmd_event       MYSENSOR_106
     2016-11-17 00:33:45   cmd_nr          1
     2016-11-17 07:52:42   e_MYSENSOR_106_wz.temperature 20.5
     2016-11-17 00:33:45   state           cmd_1
   Condition:
     0          ReadingValDoIf($hash,'MYSENSOR_106','wz.temperature','','',AttrVal($hash->{NAME},'notexist',undef)) != ReadingValDoIf($hash,'wz.vTmp1_Sensor1','temperature','','',AttrVal($hash->{NAME},'notexist',undef))
   Devices:
     0           MYSENSOR_106 wz.vTmp1_Sensor1
     all         MYSENSOR_106 wz.vTmp1_Sensor1
   Do:
     0:
       0          set wz.vTmp1_Sensor1 virtTemp [MYSENSOR_106:wz.temperature]
     1:
   Helper:
     event      wz.temperature: 20.5
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   MYSENSOR_106
     timerevent wz.temperature: 20.5
     triggerDev MYSENSOR_106
     Bm:
       Doif_notify:
         cnt        8496
         dmx        0
         max        349
         tot        11660
         mAr:
           HASH(wz.Tmp_upd)
           HASH(MYSENSOR_106)
       Doif_set:
         cnt        10
         dmx        0
         mAr
         max        0
         tot        0
     timerevents:
       wz.temperature: 20.5
     timereventsState:
       wz.temperature: 20.5
     triggerEvents:
       wz.temperature: 20.5
     triggerEventsState:
       wz.temperature: 20.5
   Internals:
   Itimer:
   Readings:
     0           MYSENSOR_106:wz.temperature wz.vTmp1_Sensor1:temperature
     all         MYSENSOR_106:wz.temperature wz.vTmp1_Sensor1:temperature
   Regexp:
     0:
     All:
   State:
   Trigger:
Attributes:
   notexist   20
   room       Wohnzimmer
   verbose    5


Wenn ich das Doif definiere oder die Definition ändere, dann läuft es. Gefühlt immer bis zum Datumswechsel.

Ich habe nun schon mehrere Tage versucht den Fehler zu finden, war aber nicht erfolgreich.
Wird hier z.B. der Wert 21.1 vielleicht als Datum Interpretiert?

Grüße Sidey
Titel: Antw:Zwei Temperaturwerte vergleichen
Beitrag von: Brockmann am 17 November 2016, 08:28:34
Ich würde das Attribut do always ergänzen.
Im Moment klappt es nur, wenn die beiden Temperaturen zwischendurch immer mal wieder identisch sind, da das DOIF nur bei Zustandswechsel ausgeführt wird.
Mit do always wird es jedes Mal ausgeführt (wenn es getriggert wird und die Bedingung erfüllt ist).
Aber dann solltest Du vielleicht besser mit
([MYSENSOR_106:wz.temperature] != [?wz.vTmp1_Sensor1:temperature])
die zweite Temperatur nicht triggern lassen, sonst spielt das DOIF irgendwann Ping Pong mit sich selbst...
Titel: Antw:Zwei Temperaturwerte vergleichen
Beitrag von: Sidey am 17 November 2016, 08:59:36
Danke... Ich hatte Tomaten auf den Augen.

Das mit do always leuchtet ein... Das mit dem Triggern natürlich auch.

Ich werde es beobachten, nehme aber an dass es jetzt funktionieren wird.

Grüße Sidey