DOIF im Perl-Mode erzeugt nicht alle Readings/Events

Begonnen von WW, 01 März 2023, 17:50:06

Vorheriges Thema - Nächstes Thema

WW

Hallo,

ich versuche gerade meine gesamten Temperatur, Luftfeuchtigkeits- und Luftdrucksensoren über ein DOIF zentral zu verwalten. Dies funktioniert bei allen Sensoren, die den Taupunkt eigenständig betimmen (z.B. Tasmota mit AM2301-Sensoren). Wird der Taupunkt entweder über ein Userreading oder die Funktion "dewpoint" bestimmt, so wird das Dewpoint-Event des ursprünglichen Devices nicht vom DOIF ausgewertet. Allerdings nur, wenn im DOIF das Attribut "DOIF_Readings" oder "event_Readings" benutzt wird.

Zur Veranschaulichung folgendes vereinfachtes DOIF:
define doifTest DOIF DEF TPL_Test (\
Test_$3 {\
set_Reading("$3", [$1:$2,0], 1);;\
}\
)\
\
TPL_Test (AuHaustuerLacrosse,temperature,AuHaustuer1_T)\
TPL_Test (AuHaustuerLacrosse,humidity,AuHaustuer1_H)\
TPL_Test (AuHaustuerLacrosse,dewpoint,AuHaustuer1_D)\

attr doifTest DOIF_Readings mwAu_T: (\
[$SELF:AuHaustuer1_T] +\
0) / 1\
, \
mwAu_H: (\
[$SELF:AuHaustuer1_H] +\
0) / 1\
, \
mwAu_P: (\
0) / 1\
,\
mwAu_Text: [$SELF:mwAu_T:d1]."°C, ".[$SELF:mwAu_H:d1]."%, ".[$SELF:mwAu_P:d1]."hPa"\
\

attr doifTest DbLogExclude .*
#   .AttrList  disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiState:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
#   CFGFN     
#   DEF        DEF TPL_Test (
#Test_$3 {
# set_Reading("$3", [$1:$2,0], 1);
# }
#)
#
#TPL_Test (AuHaustuerLacrosse,temperature,AuHaustuer1_T)
#TPL_Test (AuHaustuerLacrosse,humidity,AuHaustuer1_H)
#TPL_Test (AuHaustuerLacrosse,dewpoint,AuHaustuer1_D)
#
#   FUUID      63ff265b-f33f-8792-7f4f-e6ba56dc95adc265
#   MODEL      Perl
#   NAME       doifTest
#   NOTIFYDEV  global,AuHaustuerLacrosse,doifTest
#   NR         513472
#   NTFY_ORDER 50-doifTest
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    27262 2023-02-21 19:36:39
#   eventCount 204
#   .attraggr:
#   .attrminint:
#   CHANGED:
#     mwAu_H: 50
#     mwAu_Text: 5.6°C, 50.0%, 0.0hPa
#   CHANGEDWITHSTATE:
#     mwAu_H: 50
#     mwAu_Text: 5.6°C, 50.0%, 0.0hPa
#   DOIF_Readings:
#     mwAu_H      ( ::ReadingValDoIf($hash,'doifTest','AuHaustuer1_H') + 0) / 1
#     mwAu_P      ( 0) / 1
#     mwAu_T      ( ::ReadingValDoIf($hash,'doifTest','AuHaustuer1_T') + 0) / 1
#     mwAu_Text   ::ReadingValDoIf($hash,'doifTest','mwAu_T','','d1')."°C, ".::ReadingValDoIf($hash,'doifTest','mwAu_H','','d1')."%, ".::ReadingValDoIf($hash,'doifTest','mwAu_P','','d1')."hPa" 
#   Helper:
#     DBLOG:
#       mode:
#         DBLogging:
#           TIME       1677665883.39521
#           VALUE      enabled
#   READINGS:
#     2023-03-01 11:42:37   AuHaustuer1_D   -3.1
#     2023-03-01 17:30:55   AuHaustuer1_H   50
#     2023-03-01 17:29:47   AuHaustuer1_T   5.6
#     2023-03-01 17:30:55   Device          AuHaustuerLacrosse
#     2023-03-01 11:42:37   block_Test_AuHaustuer1_D executed
#     2023-03-01 17:30:55   block_Test_AuHaustuer1_H executed
#     2023-03-01 17:29:47   block_Test_AuHaustuer1_T executed
#     2023-03-01 17:29:47   e_AuHaustuerLacrosse_dewpoint -4.3
#     2023-03-01 17:30:55   e_AuHaustuerLacrosse_humidity 50
#     2023-03-01 17:29:47   e_AuHaustuerLacrosse_temperature 5.6
#     2023-03-01 11:20:05   mode            enabled
#     2023-03-01 17:30:55   mwAu_H          50
#     2023-03-01 11:45:39   mwAu_P          0
#     2023-03-01 17:29:47   mwAu_T          5.6
#     2023-03-01 17:30:55   mwAu_Text       5.6°C, 50.0%, 0.0hPa
#     2023-03-01 11:20:05   state           initialized
#   Regex:
#     DOIF_Readings:
#       doifTest:
#         mwAu_H:
#           AuHaustuer1_H ^doifTest$:^AuHaustuer1_H:
#         mwAu_T:
#           AuHaustuer1_T ^doifTest$:^AuHaustuer1_T:
#         mwAu_Text:
#           mwAu_H     ^doifTest$:^mwAu_H:
#           mwAu_P     ^doifTest$:^mwAu_P:
#           mwAu_T     ^doifTest$:^mwAu_T:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       AuHaustuerLacrosse:
#         0:
#           temperature ^AuHaustuerLacrosse$:^temperature:
#         1:
#           humidity   ^AuHaustuerLacrosse$:^humidity:
#         2:
#           dewpoint   ^AuHaustuerLacrosse$:^dewpoint:
#   condition:
#     0         
# set_Reading("AuHaustuer1_T", ::ReadingValDoIf($hash,'AuHaustuerLacrosse','temperature','0'), 1);
#
#     1         
# set_Reading("AuHaustuer1_H", ::ReadingValDoIf($hash,'AuHaustuerLacrosse','humidity','0'), 1);
#
#     2         
# set_Reading("AuHaustuer1_D", ::ReadingValDoIf($hash,'AuHaustuerLacrosse','dewpoint','0'), 1);
#
#   defs:
#     tpl:
#       TPL_Test   
#Test_$3 {
# set_Reading("$3", [$1:$2,0], 1);
# }
#
#   helper:
#     NOTIFYDEV  global,AuHaustuerLacrosse,doifTest
#     event      mwAu_H: 50,mwAu_Text: 5.6°C, 50.0%, 0.0hPa
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#     triggerDev doifTest
#     triggerEvents:
#       mwAu_H: 50
#       mwAu_Text: 5.6°C, 50.0%, 0.0hPa
#     triggerEventsState:
#       mwAu_H: 50
#       mwAu_Text: 5.6°C, 50.0%, 0.0hPa
#   internals:
#   perlblock:
#     0          Test_AuHaustuer1_T
#     1          Test_AuHaustuer1_H
#     2          Test_AuHaustuer1_D
#   readings:
#     all         AuHaustuerLacrosse:temperature AuHaustuerLacrosse:humidity AuHaustuerLacrosse:dewpoint
#   trigger:
#   uiState:
#   uiTable:
#
setstate doifTest initialized
setstate doifTest 2023-03-01 11:42:37 AuHaustuer1_D -3.1
setstate doifTest 2023-03-01 17:30:55 AuHaustuer1_H 50
setstate doifTest 2023-03-01 17:29:47 AuHaustuer1_T 5.6
setstate doifTest 2023-03-01 17:30:55 Device AuHaustuerLacrosse
setstate doifTest 2023-03-01 11:42:37 block_Test_AuHaustuer1_D executed
setstate doifTest 2023-03-01 17:30:55 block_Test_AuHaustuer1_H executed
setstate doifTest 2023-03-01 17:29:47 block_Test_AuHaustuer1_T executed
setstate doifTest 2023-03-01 17:29:47 e_AuHaustuerLacrosse_dewpoint -4.3
setstate doifTest 2023-03-01 17:30:55 e_AuHaustuerLacrosse_humidity 50
setstate doifTest 2023-03-01 17:29:47 e_AuHaustuerLacrosse_temperature 5.6
setstate doifTest 2023-03-01 11:20:05 mode enabled
setstate doifTest 2023-03-01 17:30:55 mwAu_H 50
setstate doifTest 2023-03-01 11:45:39 mwAu_P 0
setstate doifTest 2023-03-01 17:29:47 mwAu_T 5.6
setstate doifTest 2023-03-01 17:30:55 mwAu_Text 5.6°C, 50.0%, 0.0hPa
setstate doifTest 2023-03-01 11:20:05 state initialized


Und hier der Temperatursensor:
define AuHaustuerLacrosse LaCrosse 02
attr AuHaustuerLacrosse DbLogExclude .*
attr AuHaustuerLacrosse IODev FHEM2myJeelink868
attr AuHaustuerLacrosse alias AU-Haustür: aussen
attr AuHaustuerLacrosse devStateStyle style="text-align:left"
attr AuHaustuerLacrosse event-min-interval dewpoint:50000,temperature:50000,humidity:50000
attr AuHaustuerLacrosse event-on-change-reading dewpoint:0.5,battery,temperature:0.5,humidity
attr AuHaustuerLacrosse group Au: Haustür
attr AuHaustuerLacrosse icon temperature_humidity
attr AuHaustuerLacrosse readingsWatcher 7200,,temperature,humidity
attr AuHaustuerLacrosse room Klima,System->LaCrosse
attr AuHaustuerLacrosse sortby 150
attr AuHaustuerLacrosse stateFormat temperature °C, humidity %, (dewpoint °C)
attr AuHaustuerLacrosse userReadings dewpoint:(temperature.*|humidity.*) {urDewpoint($name)}
#   .FhemMetaInternals 1
#   .attreocr-thresholddewpoint -4.3
#   .attreocr-thresholdhumidity 64
#   .attreocr-thresholdtemperature 5.6
#   .lastTimebattery 1677426573.02315
#   .lastTimedewpoint 1677688187.14017
#   .lastTimehumidity 1677688255.42924
#   .lastTimetemperature 1677688187.14017
#   DEF        02
#   FUUID      5d08f42a-f33f-8792-63de-0950c31a6666a5de
#   FVERSION   36_LaCrosse.pm:0.255370/2022-01-21
#   IODev      myLaCrosseGateway99
#   LASTInputDev myLaCrosseGateway99
#   LaCrosse_lastRcv 2023-03-01 17:32:27
#   MSGCNT     67068
#   NAME       AuHaustuerLacrosse
#   NR         144
#   STATE      5.6 °C, 50 %, (-4.0 °C)
#   TYPE       LaCrosse
#   addr       02
#   battery_new 0
#   bufferedH 
#   bufferedT 
#   corr1      0
#   corr2      0
#   eventCount 925
#   myJeelink868_MSGCNT 61955
#   myJeelink868_RAWMSG OK 9 2 1 4 32 50
#   myJeelink868_TIME 2023-03-01 17:32:11
#   myLaCrosseGateway98_MSGCNT 33237
#   myLaCrosseGateway98_TIME 2023-03-01 17:31:55
#   myLaCrosseGateway99_MSGCNT 33162
#   myLaCrosseGateway99_TIME 2023-03-01 17:32:27
#   previousH  50
#   previousT  5.6
#   sensorType 0=T(H)
#   .attraggr:
#   .attreocr:
#     dewpoint:0.5
#     battery
#     temperature:0.5
#     humidity
#   .attrminint:
#     dewpoint:50000
#     temperature:50000
#     humidity:50000
#   .userReadings:
#     HASH(0x55f310c665d8)
#   Helper:
#     DBLOG:
#       battery:
#         DBLogging:
#           TIME       1677426573.02424
#           VALUE      ok
#       dewpoint:
#         DBLogging:
#           TIME       1677498290.40376
#           VALUE      -2.0
#       humidity:
#         DBLogging:
#           TIME       1677502539.09827
#           VALUE      56
#       temperature:
#         DBLogging:
#           TIME       1677501117.43756
#           VALUE      5.5
#   OLDREADINGS:
#   READINGS:
#     2023-03-01 17:32:27   battery         ok
#     2023-03-01 17:30:55   dewpoint        -4.0
#     2023-03-01 17:32:27   humidity        50
#     2023-03-01 17:31:37   readingActivity alive
#     2023-03-01 17:32:27   state           T: 5.6 H: 50
#     2023-03-01 17:32:27   temperature     5.6
#
setstate AuHaustuerLacrosse 5.6 °C, 50 %, (-4.0 °C)
setstate AuHaustuerLacrosse 2023-03-01 17:32:27 battery ok
setstate AuHaustuerLacrosse 2023-03-01 17:30:55 dewpoint -4.0
setstate AuHaustuerLacrosse 2023-03-01 17:32:27 humidity 50
setstate AuHaustuerLacrosse 2023-03-01 17:31:37 readingActivity alive
setstate AuHaustuerLacrosse 2023-03-01 17:32:27 state T: 5.6 H: 50
setstate AuHaustuerLacrosse 2023-03-01 17:32:27 temperature 5.6


Ändere ich nun den Temperaturwert manuell, so werden folgende folgende Events erzeugt:

2023-03-01 17:36:07.709 DOIF doifTest AuHaustuer1_T: 0
2023-03-01 17:36:07.709 DOIF doifTest mwAu_T: 0
2023-03-01 17:36:07.709 DOIF doifTest mwAu_Text: 0.0°C, 50.0%, 0.0hPa
2023-03-01 17:36:07.759 LaCrosse AuHaustuerLacrosse temperature: 0
2023-03-01 17:36:07.759 LaCrosse AuHaustuerLacrosse dewpoint: -10.2
2023-03-01 17:36:12.636 DOIF doifTest AuHaustuer1_T: 5.6
2023-03-01 17:36:12.636 DOIF doifTest mwAu_T: 5.6
2023-03-01 17:36:12.636 DOIF doifTest mwAu_Text: 5.6°C, 50.0%, 0.0hPa
2023-03-01 17:36:12.684 LaCrosse AuHaustuerLacrosse temperature: 5.6
2023-03-01 17:36:12.684 LaCrosse AuHaustuerLacrosse dewpoint: -4.0


Das Lacrosse-Device erzeugt Events für Temperatur und Taupunkt, das DOIF verarbeitet lediglich den Temperaturwert "AuHaustuer1_T" und nicht den Taupunkt "AuHaustuer1_D".

Löscht man im DOIF das DOIF_Reading, also:
define doifTest DOIF DEF TPL_Test (\
Test_$3 {\
set_Reading("$3", [$1:$2,0], 1);;\
}\
)\
\
TPL_Test (AuHaustuerLacrosse,temperature,AuHaustuer1_T)\
TPL_Test (AuHaustuerLacrosse,humidity,AuHaustuer1_H)\
TPL_Test (AuHaustuerLacrosse,dewpoint,AuHaustuer1_D)\

attr doifTest DbLogExclude .*
#   .AttrList  disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiState:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
#   CFGFN     
#   DEF        DEF TPL_Test (
#Test_$3 {
# set_Reading("$3", [$1:$2,0], 1);
# }
#)
#
#TPL_Test (AuHaustuerLacrosse,temperature,AuHaustuer1_T)
#TPL_Test (AuHaustuerLacrosse,humidity,AuHaustuer1_H)
#TPL_Test (AuHaustuerLacrosse,dewpoint,AuHaustuer1_D)
#
#   FUUID      63ff265b-f33f-8792-7f4f-e6ba56dc95adc265
#   MODEL      Perl
#   NAME       doifTest
#   NOTIFYDEV  AuHaustuerLacrosse,global
#   NR         513472
#   NTFY_ORDER 50-doifTest
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    27262 2023-02-21 19:36:39
#   eventCount 206
#   .attraggr:
#   .attrminint:
#   CHANGED:
#     mwAu_T: 5.6
#     mwAu_Text: 5.6°C, 50.0%, 0.0hPa
#   CHANGEDWITHSTATE:
#     mwAu_T: 5.6
#     mwAu_Text: 5.6°C, 50.0%, 0.0hPa
#   Helper:
#     DBLOG:
#       mode:
#         DBLogging:
#           TIME       1677665883.39521
#           VALUE      enabled
#   READINGS:
#     2023-03-01 11:42:37   AuHaustuer1_D   -3.1
#     2023-03-01 17:30:55   AuHaustuer1_H   50
#     2023-03-01 17:36:12   AuHaustuer1_T   5.6
#     2023-03-01 17:36:12   Device          AuHaustuerLacrosse
#     2023-03-01 11:42:37   block_Test_AuHaustuer1_D executed
#     2023-03-01 17:30:55   block_Test_AuHaustuer1_H executed
#     2023-03-01 17:36:12   block_Test_AuHaustuer1_T executed
#     2023-03-01 17:36:12   e_AuHaustuerLacrosse_dewpoint -4.0
#     2023-03-01 17:30:55   e_AuHaustuerLacrosse_humidity 50
#     2023-03-01 17:36:12   e_AuHaustuerLacrosse_temperature 5.6
#     2023-03-01 11:20:05   mode            enabled
#     2023-03-01 17:30:55   mwAu_H          50
#     2023-03-01 11:45:39   mwAu_P          0
#     2023-03-01 17:36:12   mwAu_T          5.6
#     2023-03-01 17:36:12   mwAu_Text       5.6°C, 50.0%, 0.0hPa
#     2023-03-01 11:20:05   state           initialized
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       AuHaustuerLacrosse:
#         0:
#           temperature ^AuHaustuerLacrosse$:^temperature:
#         1:
#           humidity   ^AuHaustuerLacrosse$:^humidity:
#         2:
#           dewpoint   ^AuHaustuerLacrosse$:^dewpoint:
#   condition:
#     0         
# set_Reading("AuHaustuer1_T", ::ReadingValDoIf($hash,'AuHaustuerLacrosse','temperature','0'), 1);
#
#     1         
# set_Reading("AuHaustuer1_H", ::ReadingValDoIf($hash,'AuHaustuerLacrosse','humidity','0'), 1);
#
#     2         
# set_Reading("AuHaustuer1_D", ::ReadingValDoIf($hash,'AuHaustuerLacrosse','dewpoint','0'), 1);
#
#   defs:
#     tpl:
#       TPL_Test   
#Test_$3 {
# set_Reading("$3", [$1:$2,0], 1);
# }
#
#   helper:
#     NOTIFYDEV  AuHaustuerLacrosse,global
#     event      mwAu_T: 5.6,mwAu_Text: 5.6°C, 50.0%, 0.0hPa
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#     triggerDev doifTest
#     triggerEvents:
#       mwAu_T: 5.6
#       mwAu_Text: 5.6°C, 50.0%, 0.0hPa
#     triggerEventsState:
#       mwAu_T: 5.6
#       mwAu_Text: 5.6°C, 50.0%, 0.0hPa
#   internals:
#   perlblock:
#     0          Test_AuHaustuer1_T
#     1          Test_AuHaustuer1_H
#     2          Test_AuHaustuer1_D
#   readings:
#     all         AuHaustuerLacrosse:temperature AuHaustuerLacrosse:humidity AuHaustuerLacrosse:dewpoint
#   trigger:
#   uiState:
#   uiTable:
#
setstate doifTest initialized
setstate doifTest 2023-03-01 11:42:37 AuHaustuer1_D -3.1
setstate doifTest 2023-03-01 17:30:55 AuHaustuer1_H 50
setstate doifTest 2023-03-01 17:36:12 AuHaustuer1_T 5.6
setstate doifTest 2023-03-01 17:36:12 Device AuHaustuerLacrosse
setstate doifTest 2023-03-01 11:42:37 block_Test_AuHaustuer1_D executed
setstate doifTest 2023-03-01 17:30:55 block_Test_AuHaustuer1_H executed
setstate doifTest 2023-03-01 17:36:12 block_Test_AuHaustuer1_T executed
setstate doifTest 2023-03-01 17:36:12 e_AuHaustuerLacrosse_dewpoint -4.0
setstate doifTest 2023-03-01 17:30:55 e_AuHaustuerLacrosse_humidity 50
setstate doifTest 2023-03-01 17:36:12 e_AuHaustuerLacrosse_temperature 5.6
setstate doifTest 2023-03-01 11:20:05 mode enabled
setstate doifTest 2023-03-01 17:30:55 mwAu_H 50
setstate doifTest 2023-03-01 11:45:39 mwAu_P 0
setstate doifTest 2023-03-01 17:36:12 mwAu_T 5.6
setstate doifTest 2023-03-01 17:36:12 mwAu_Text 5.6°C, 50.0%, 0.0hPa
setstate doifTest 2023-03-01 11:20:05 state initialized


und ändert wieder den Temperaturwert, so ergibt sich:

2023-03-01 17:40:55.072 DOIF doifTest AuHaustuer1_T: 0
2023-03-01 17:40:55.078 DOIF doifTest AuHaustuer1_D: -10.2
2023-03-01 17:40:55.125 LaCrosse AuHaustuerLacrosse temperature: 0
2023-03-01 17:40:55.125 LaCrosse AuHaustuerLacrosse dewpoint: -10.2
2023-03-01 17:40:57.798 DOIF doifTest AuHaustuer1_T: 5.5
2023-03-01 17:40:57.804 DOIF doifTest AuHaustuer1_D: -4.1
2023-03-01 17:40:57.862 LaCrosse AuHaustuerLacrosse temperature: 5.5
2023-03-01 17:40:57.862 LaCrosse AuHaustuerLacrosse dewpoint: -4.1


Das Lacrosse-Device erzeugt Events für Temperatur und Taupunkt, das DOIF-Device reagiert jetzt wie erwartet und erzeugt ebenfalls Events für Temperatur und Taupunkt.

Reproduzierbar funktioniert es bei mir immer dann nicht, wenn

  • 1. im DOIF "DOIF_Readings" oder "event_Readings" benutzt wird und
  • 2. im erzeugenden Device das benutzte Reading nicht direkt erstellt wird, sondern über Userreadings oder auch über das externe Modul "Dewpoint"

Für Hilfestellungen im voraus vielen Dank
Willi
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

Damian

Du hast die Idee von DOIF_Readings andersherum angewandt.

Gedacht ist, in DOIF_Reading externe Readings anzugeben und im DOIF auf die eigenen DOIF_Readings zu reagieren und nicht umgekehrt. So ist intern die Abarbeitungsreihenfolge programmiert.

Es sollte dann funktionieren, wenn du die Lacrosse-Readings in DOIF_Readings definierst und im DOIF selbst nur noch auf die definierten DOIF_Readings triggerst - sonst beißt sich die Katze in den Schwanz :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

WW

Zitat von: Damian am 01 März 2023, 19:13:03
Du hast die Idee von DOIF_Readings andersherum angewandt.

Gedacht ist, in DOIF_Reading externe Readings anzugeben und im DOIF auf die eigenen DOIF_Readings zu reagieren und nicht umgekehrt. So ist intern die Abarbeitungsreihenfolge programmiert.

Es sollte dann funktionieren, wenn du die Lacrosse-Readings in DOIF_Readings definierst und im DOIF selbst nur noch auf die definierten DOIF_Readings triggerst - sonst beißt sich die Katze in den Schwanz :)

Warum funktionieren dann Temperatur und Luftfeuchtigkeit und nicht der über Userreading erstellte Taupunkt? Ist doch die gleiche Logik, oder?
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

Damian

Zitat von: WW am 01 März 2023, 19:44:19
Warum funktionieren dann Temperatur und Luftfeuchtigkeit und nicht der über Userreading erstellte Taupunkt? Ist doch die gleiche Logik, oder?

Dass es überhaupt funktioniert, ist schon eher Zufall, denn die erzeugten Events im DOIF werden erst beim nächsten Durchlauf von DOIF ausgewertet, da triggert sich das Modul selbst. Offenbar sind da die userReadings nicht dabei, diese werden ja nicht vom jeweiligen Device erzeugt, sondern von fhem selbst. Genaue Aussage dazu kann aber nur der Chefentwickler dazu machen - da stecke ich nicht drin.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

WW

Zitat von: Damian am 01 März 2023, 19:13:03
Du hast die Idee von DOIF_Readings andersherum angewandt. ....
den Schwanz :)

Habe ich das jetzt richtig verstanden?
define doifTest DOIF DEF {\
\
my $x = 0;;\
\
$x = (\
[$SELF:AuHaustuer1_T] +\
0) / 1;;\
set_Reading("mwAu_T",$x,1);;\
\
$x = (\
[$SELF:AuHaustuer1_H] +\
0) / 1;;\
set_Reading("mwAu_H",$x,1);;\
\
$x = (\
[$SELF:AuHaustuer1_D] +\
0) / 1;;\
set_Reading("mwAu_D",$x,1);;\
\
$x = (\
# [$SELF:AuHaustuer1_P] +\
0) / 1;;\
set_Reading("mwAu_P",$x,1);;\
\
}
attr doifTest DbLogExclude .*
attr doifTest event_Readings AuHaustuer1_T: [AuHaustuerLacrosse:temperature],\
AuHaustuer1_H: [AuHaustuerLacrosse:humidity],\
AuHaustuer1_D: [AuHaustuerLacrosse:dewpoint]
#   .AttrList  disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiState:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
#   CFGFN     
#   DEF        DEF {
#
#my $x = 0;
#
#$x = (
# [$SELF:AuHaustuer1_T] +
# 0) / 1;
#set_Reading("mwAu_T",$x,1);
#
#$x = (
# [$SELF:AuHaustuer1_H] +
# 0) / 1;
#set_Reading("mwAu_H",$x,1);
#
#$x = (
# [$SELF:AuHaustuer1_D] +
# 0) / 1;
#set_Reading("mwAu_D",$x,1);
#
#$x = (
## [$SELF:AuHaustuer1_P] +
# 0) / 1;
#set_Reading("mwAu_P",$x,1);
#
#}
#   FUUID      63ff265b-f33f-8792-7f4f-e6ba56dc95adc265
#   MODEL      Perl
#   NAME       doifTest
#   NOTIFYDEV  doifTest,AuHaustuerLacrosse,global
#   NR         513472
#   NTFY_ORDER 50-doifTest
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    27262 2023-02-21 19:36:39
#   eventCount 339
#   .attraggr:
#   .attrminint:
#   Helper:
#     DBLOG:
#       mode:
#         DBLogging:
#           TIME       1677665883.39521
#           VALUE      enabled
#   OLDREADINGS:
#   READINGS:
#     2023-03-01 20:20:19   AuHaustuer1_D   -5.0
#     2023-03-01 20:20:05   AuHaustuer1_H   58
#     2023-03-01 20:20:19   AuHaustuer1_T   2.4
#     2023-03-01 20:20:19   block_DEF       executed
#     2023-03-01 20:20:19   e_doifTest_AuHaustuer1_D -5.0
#     2023-03-01 20:20:05   e_doifTest_AuHaustuer1_H 58
#     2023-03-01 20:20:19   e_doifTest_AuHaustuer1_T 2.4
#     2023-03-01 20:20:05   mode            enabled
#     2023-03-01 20:20:19   mwAu_D          -5
#     2023-03-01 20:20:19   mwAu_H          58
#     2023-03-01 20:20:19   mwAu_P          0
#     2023-03-01 20:20:19   mwAu_T          2.4
#     2023-03-01 20:20:05   state           initialized
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       doifTest:
#         0:
#           AuHaustuer1_D ^doifTest$:^AuHaustuer1_D:
#           AuHaustuer1_H ^doifTest$:^AuHaustuer1_H:
#           AuHaustuer1_P ^doifTest$:^AuHaustuer1_P:
#           AuHaustuer1_T ^doifTest$:^AuHaustuer1_T:
#     event_Readings:
#       AuHaustuerLacrosse:
#         AuHaustuer1_D:
#           dewpoint   ^AuHaustuerLacrosse$:^dewpoint:
#         AuHaustuer1_H:
#           humidity   ^AuHaustuerLacrosse$:^humidity:
#         AuHaustuer1_T:
#           temperature ^AuHaustuerLacrosse$:^temperature:
#   condition:
#     0         
#
#my $x = 0;
#
#$x = (
# ::ReadingValDoIf($hash,'doifTest','AuHaustuer1_T') +
# 0) / 1;
#set_Reading("mwAu_T",$x,1);
#
#$x = (
# ::ReadingValDoIf($hash,'doifTest','AuHaustuer1_H') +
# 0) / 1;
#set_Reading("mwAu_H",$x,1);
#
#$x = (
# ::ReadingValDoIf($hash,'doifTest','AuHaustuer1_D') +
# 0) / 1;
#set_Reading("mwAu_D",$x,1);
#
#$x = (
## ::ReadingValDoIf($hash,'doifTest','AuHaustuer1_P') +
# 0) / 1;
#set_Reading("mwAu_P",$x,1);
#
#
#   event_Readings:
#     AuHaustuer1_D  ::ReadingValDoIf($hash,'AuHaustuerLacrosse','dewpoint')
#     AuHaustuer1_H  ::ReadingValDoIf($hash,'AuHaustuerLacrosse','humidity')
#     AuHaustuer1_T  ::ReadingValDoIf($hash,'AuHaustuerLacrosse','temperature')
#   helper:
#     NOTIFYDEV  doifTest,AuHaustuerLacrosse,global
#     event      AuHaustuer1_T: 2.4
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#     triggerDev doifTest
#     triggerEvents:
#       AuHaustuer1_T: 2.4
#       e_doifTest_AuHaustuer1_T: 2.4
#       mwAu_T: 2.4
#       mwAu_H: 58
#       mwAu_D: -5
#       mwAu_P: 0
#       block_DEF: executed
#     triggerEventsState:
#       AuHaustuer1_T: 2.4
#       e_doifTest_AuHaustuer1_T: 2.4
#       mwAu_T: 2.4
#       mwAu_H: 58
#       mwAu_D: -5
#       mwAu_P: 0
#       block_DEF: executed
#   internals:
#   perlblock:
#     0          DEF
#   readings:
#     all         doifTest:AuHaustuer1_T doifTest:AuHaustuer1_H doifTest:AuHaustuer1_D doifTest:AuHaustuer1_P
#   trigger:
#   uiState:
#   uiTable:
#
setstate doifTest initialized
setstate doifTest 2023-03-01 20:20:19 AuHaustuer1_D -5.0
setstate doifTest 2023-03-01 20:20:05 AuHaustuer1_H 58
setstate doifTest 2023-03-01 20:20:19 AuHaustuer1_T 2.4
setstate doifTest 2023-03-01 20:20:19 block_DEF executed
setstate doifTest 2023-03-01 20:20:19 e_doifTest_AuHaustuer1_D -5.0
setstate doifTest 2023-03-01 20:20:05 e_doifTest_AuHaustuer1_H 58
setstate doifTest 2023-03-01 20:20:19 e_doifTest_AuHaustuer1_T 2.4
setstate doifTest 2023-03-01 20:20:05 mode enabled
setstate doifTest 2023-03-01 20:20:19 mwAu_D -5
setstate doifTest 2023-03-01 20:20:19 mwAu_H 58
setstate doifTest 2023-03-01 20:20:19 mwAu_P 0
setstate doifTest 2023-03-01 20:20:19 mwAu_T 2.4
setstate doifTest 2023-03-01 20:20:05 state initialized
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

Damian

ja, allerdings würde ich für "Events" des eigenen Moduls nicht event_Readings, sondern DOIF_Readings nutzen, denn event_Readings führen ja auch zu Selbsttriggerung, DOIF_Readings dagegen erzeugen keine "echten" Events, sondern führen zum rekursiven Aufruf des eigenen Devices - was wesentlich effizienter ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

WW

Zitat von: Damian am 01 März 2023, 20:30:04
ja, allerdings würde ich für "Events" des eigenen Moduls nicht event_Readings, sondern DOIF_Readings nutzen, denn event_Readings führen ja auch zu Selbsttriggerung, DOIF_Readings dagegen erzeugen keine "echten" Events, sondern führen zum rekursiven Aufruf des eigenen Devices - was wesentlich effizienter ist.

Wenn ich "DOIF_Readings" benutze, kann ich dann überhaupt die erzeugten Readings speichern, d.h, funktioniert auf diesen Readings dann z.B. "event-on-change-reading". Ich hatte gedacht, ich brauche Events von den erzeugten Readings, um die neu erstellten Readings speichern zu können.

FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

Damian

Zitat von: WW am 01 März 2023, 21:09:32
Wenn ich "DOIF_Readings" benutze, kann ich dann überhaupt die erzeugten Readings speichern, d.h, funktioniert auf diesen Readings dann z.B. "event-on-change-reading". Ich hatte gedacht, ich brauche Events von den erzeugten Readings, um die neu erstellten Readings speichern zu können.

Warum gehst du überhaupt den Umweg über event- oder DOIF-Readings und triggerst nicht direkt auf die originalen Readings des jeweiligen Devices?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

WW

Zitat von: Damian am 01 März 2023, 21:27:35
Warum gehst du überhaupt den Umweg über event- oder DOIF-Readings und triggerst nicht direkt auf die originalen Readings des jeweiligen Devices?

Die Triggerung auf die originalen Readings hatte ich bisher. Die hatte aber diverse Nachteile bei Änderungen im Systemaufbau. Ich habe zur Zeit mehr als 25 Klimasensoren unterschiedlichster Bauart.
Daher der Wunsch nach einer "logischen Zwischenschicht". Ich würde gerne die Namensgebung und die Abspeicherung zentralisieren, damit ich beim Austausch von Geräten oder Sensoren einfach nur im DOIF einmal den Namen ändern muss. Bisher muss ich mühsam von Hand die Datenbankeinträge ändern, die Plot-Files anpassen, die Mittelwertberechnungen über Notify ändern, die versendeten Telegramtexte mit Statusmeldungen, ... anpassen und mir dabei merken, was ich alles tun muss. Das DOIF mit seinen genialen Möglichkeiten vereinfacht mir das ungemein.

LG
Willi
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

Damian

Du kannst ja grundsätzlich mit event_Readings arbeiten. Nur denke ich, egal wie deine Zwischenschicht aussieht, irgendwo innerhalb des DOIFs musst du deine originalen Readings angeben. Ob man sie jetzt in event_Readings angibt oder über ein Template in DOIF-Blöcken dürfe keinen Unterschied ausmachen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF