98_THRESHOLD.pm Fehlermeldung

Begonnen von wk, 20 Februar 2019, 11:43:07

Vorheriges Thema - Nächstes Thema

wk

Ich bekomme bei jedem Schalten von Threshold folgende Fehlermeldung im log:

2019.02.20 10:38:31 1: readingsUpdate(FThr,cmd,cmd1_gt) missed to call readingsBeginUpdate first.
2019.02.20 10:38:31 1: stacktrace:
2019.02.20 10:38:31 1:     main::readingsBulkUpdate            called by ./FHEM/98_THRESHOLD.pm (622)
2019.02.20 10:38:31 1:     main::THRESHOLD_setValue            called by ./FHEM/98_THRESHOLD.pm (506)
2019.02.20 10:38:31 1:     main::THRESHOLD_Check               called by ./FHEM/98_THRESHOLD.pm (399)
2019.02.20 10:38:31 1:     main::THRESHOLD_Notify              called by fhem.pl (3693)
2019.02.20 10:38:31 1:     main::CallFn                        called by fhem.pl (3613)
2019.02.20 10:38:31 1:     main::DoTrigger                     called by fhem.pl (3979)
2019.02.20 10:38:31 1:     main::Dispatch                      called by ./FHEM/00_CUL.pm (948)
2019.02.20 10:38:31 1:     main::CUL_Parse                     called by ./FHEM/00_CUL.pm (832)
2019.02.20 10:38:31 1:     main::CUL_Read                      called by fhem.pl (3693)
2019.02.20 10:38:31 1:     main::CallFn                        called by fhem.pl (742)


Was bedeutet das und was muss ich ändern?

defmod IThr THRESHOLD Prologue_144:temperature:0.2:IHz:Temp IHz|set IHz Ventil zu|set IHz Ventil auf|
attr IThr number_format %.1f
attr IThr room Heizung
attr IThr state_cmd1_gt off
attr IThr state_cmd2_lt on
attr IThr state_format _m _dv

setstate IThr external 21.0
setstate IThr 2019-02-19 21:45:38 cmd cmd2_lt
setstate IThr 2018-12-07 12:20:22 desired_value 21.0
setstate IThr 2019-02-19 12:32:55 mode external
setstate IThr 2019-02-20 11:18:09 sensor_value 20.3
setstate IThr 2019-01-24 17:38:12 state external 21.0
setstate IThr 2018-12-07 12:20:22 threshold_max 21
setstate IThr 2018-12-07 12:20:22 threshold_min 20.8

Damian

#1
Dazu müsste Rudi etwas sagen:

...
readingsBeginUpdate ($hash);
...
THRESHOLD_setValue($hash,1);
...
readingsEndUpdate   ($hash, 1);
...

und die Subroutine:

sub
THRESHOLD_setValue($$)
{
...
($ret = AnalyzeCommandChain(undef, $cmd_now)
...
readingsBulkUpdate  ($hash, "cmd",$cmd_sym_now); <--- hier kommt der Fehler, dass readingsBeginUpdate nicht abgesetzt wurde
}


Die Frage ist, ob AnalyzeCommandChain zum Beenden von readingsBeginUpdate führen kann.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

wk


Damian

Zitat von: wk am 20 Februar 2019, 17:26:40
Kann ich dazu etwas beitragen?

Der Stacktrace reicht schon aus.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Teste mal die angehängte Version
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

wk

ich habe die Version eingespielt und bekomme keine Fehlermeldung mehr.
Trotz verbose=5 bekomme ich gar keine Meldung mehr in das log.
Soweit ich das bis jetzt beurteilen kann, reagieren auch die daran hängenden doifs nicht auf die Zustandsänderung.

Damian

Bei mir funktioniert alles, wie bisher, es werden auch alle bisherigen Events erzeugt.

Wenn etwas nicht funktioniert, dann bitte mit Nachweise (Event-Log, list vom THRESHOLD)

P.S. ohne Fehler wird auch nicht geloggt
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

wk

Ich versuch einmal die Informationen zusammenzutragen.

defmod FThr THRESHOLD Rubicson_95:temperature:0.2:FHz:Temp FHz|set FHz Ventil zu|set FHz Ventil auf|
attr FThr number_format %.1f
attr FThr room Heizung
attr FThr state_cmd1_gt off
attr FThr state_cmd2_lt on
attr FThr state_format _m _dv

setstate FThr external 25.0
setstate FThr 2019-02-22 16:37:35 cmd cmd2_lt
setstate FThr 2019-02-22 16:37:35 desired_value 25.0
setstate FThr 2019-02-22 10:43:27 mode external
setstate FThr 2019-02-22 16:34:19 sensor_value 22.0
setstate FThr 2019-02-22 16:37:35 state external 25.0
setstate FThr 2019-02-22 16:37:35 threshold_max 25
setstate FThr 2019-02-22 16:37:35 threshold_min 24.8



dieses Threshold arbeitet zusammen mit dem folgenden doif:

defmod FHz DOIF (([[$SELF:HAn]-[$SELF:HEn]])\
and\
([$SELF:Ventil] eq "auf"))\
## Wenn zwischen Anfangs- und Endzeit die Temperatur unter den \
## Vorgabewert sinkt, wird die Heizung eingeschaltet.\
(set We_Kf event Hz4An)\
(IF ([$SELF:Hzstat]  ne "an") (set telebot send Kinderzimmerheizung (Frank) ist nicht an !!!))\
DOELSE\
## Wenn die Endzeit erreicht wird oder die Vorgabetemperatur\
## überschritten wird die Heizung ausgeschaltet.\
(set We_Kf event Hz4Aus)\
(IF ([$SELF:Hzstat]  ne "aus") (set telebot send Kinderzimmerheizung (Frank) ist nicht aus !!!))
attr FHz alias Frank
attr FHz devStateIcon an:sani_heating@red:cmd_2 aus:sani_heating@blue:cmd_1
attr FHz readingList HAn HEn Temp Hzstat Ventil
attr FHz room ESPEasy,Heizung,Telegram
attr FHz setList HAn:time HEn:time Temp:slider,18,0.1,25,1
attr FHz stateFormat Hzstat
attr FHz wait 0,10:0,10
attr FHz webCmd HAn:HEn:Temp
attr FHz webCmdLabel Anfang:Ende:Temperatur
attr FHz widgetOverride devStateIcon:textField-long

setstate FHz aus
setstate FHz 2018-10-27 18:04:04 HAn 07:00
setstate FHz 2018-10-27 17:56:49 HEn 22:45
setstate FHz 2019-02-22 08:54:29 Hzstat aus
setstate FHz 2019-02-22 16:37:35 Temp 25.0
setstate FHz 2019-02-22 16:37:35 Ventil auf
setstate FHz 2019-02-22 08:54:39 cmd 2.2
setstate FHz 2019-02-22 08:54:39 cmd_event FHz
setstate FHz 2019-02-22 08:54:39 cmd_nr 2
setstate FHz 2019-02-22 08:54:39 cmd_seqnr 2
setstate FHz 2019-02-22 10:43:44 e_FHz_Ventil zu
setstate FHz 2019-02-17 12:04:24 mode enabled
setstate FHz 2019-02-22 08:54:39 state cmd_2
setstate FHz 2019-02-22 10:43:27 timer_01_c01 23.02.2019 07:00:00
setstate FHz 2019-02-22 10:43:27 timer_02_c01 22.02.2019 22:45:00
setstate FHz 2019-02-22 08:54:39 wait_timer no timer



Wie man sieht, ist die erste Bedingung erfüllt:
defmod FHz DOIF (([[$SELF:HAn]-[$SELF:HEn]])\
and\
([$SELF:Ventil] eq "auf"))


Es ist zwischen Anfangs- und Endzeit und das Ventilreading wurde auf "auf" gesetzt.
Es wurde jedoch das doif nicht getriggert. Der state ist immer noch cmd_2 und die Heizung noch aus.

Das hat bis gestern trotz Fehlermeldung im log gut funktioniert. Mit dem geänderten Modul gibt es keine Fehlermeldung im log, aber keine richtige Funktion.

Wenn ich noch etwas genauer zeigen soll, bitte melden.

Damian

Mit list kann man mehr Informationen bekommen.

Aber man kann so schon sehen, dass "setstate FThr 2019-02-22 16:37:35 cmd cmd2_lt" ausgeführt wurde und dass "setstate FHz 2019-02-22 16:37:35 Ventil auf" gesetzt wurde, damit funktioniert THRESHOLD korrekt. Mit dem Befehl "set" werden immer Events erzeugt, das ist eine Sache von FHEM und nicht vom THRESHOLD.

Der Rest ist DOIF, wie gesagt ohne list kann ich nicht viel dazu sagen.

Ich habe es bei mir nachgestellt:

Internals:
   CFGFN     
   DEF        T_Kueche bla|set di_th bla on|set di_th bla off
   NAME       TH_Test
   NR         1701
   NTFY_ORDER 50-TH_Test
   STATE      active 13.0
   TYPE       THRESHOLD
   cmd1_gt    set di_th bla on
   cmd2_lt    set di_th bla off
   cmd_default 0
   hysteresis 1
   offset     0
   sensor     T_Kueche
   sensor_reading temperature
   READINGS:
     2019-02-22 17:46:58   cmd             cmd1_gt
     2019-02-22 17:46:58   desired_value   13
     2019-02-22 17:46:58   mode            active
     2019-02-22 17:44:35   sensor_value    21.5625
     2019-02-22 17:46:58   state           active 13.0
     2019-02-22 17:46:58   threshold_max   13
     2019-02-22 17:46:58   threshold_min   12
Attributes:
   number_format %.1f
   state_cmd1_gt off
   state_cmd2_lt on
   state_format _m _dv

und

Internals:
   CFGFN     
   DEF        ([$SELF:bla] eq "on") (set bla on)
   MODEL      FHEM
   NAME       di_th
   NR         1713
   NTFY_ORDER 50-di_th
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2019-02-22 17:46:58   bla             on
     2019-02-22 17:46:58   cmd             1
     2019-02-22 17:46:58   cmd_event       di_th
     2019-02-22 17:46:58   cmd_nr          1
     2019-02-22 17:46:58   e_di_th_bla     on
     2019-02-22 17:38:52   mode            enabled
     2019-02-22 17:46:58   state           cmd_1
   Regex:
     accu:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'di_th','bla') eq "on"
   devices:
     0           di_th
     all         di_th
   do:
     0:
       0          set bla on
     1:
   helper:
     event      bla: on
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   di_th
     timerevent bla: on
     triggerDev di_th
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: di_th
       state: cmd_1
     timerevents:
       bla: on
       e_di_th_bla: on
       cmd_nr: 1
       cmd: 1
       cmd_event: di_th
       cmd_1
     timereventsState:
       bla: on
       e_di_th_bla: on
       cmd_nr: 1
       cmd: 1
       cmd_event: di_th
       cmd_1
     triggerEvents:
       bla: on
       e_di_th_bla: on
       cmd_nr: 1
       cmd: 1
       cmd_event: di_th
       cmd_1
     triggerEventsState:
       bla: on
       e_di_th_bla: on
       cmd_nr: 1
       cmd: 1
       cmd_event: di_th
       cmd_1
   internals:
   itimer:
   readings:
     0           di_th:bla
     all         di_th:bla
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   readingList bla


Es funktioniert wie erwartet. Ich nehme an, dass du das System nach dem Einspielen durchgestartet hast.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF