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
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.
Kann ich dazu etwas beitragen?
Zitat von: wk am 20 Februar 2019, 17:26:40
Kann ich dazu etwas beitragen?
Der Stacktrace reicht schon aus.
Teste mal die angehängte Version
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.
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
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.
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.