Moin, schon wieder ich:)
Ganz kurz zum Hintergrund:
Ich bastel viel an meinen Geräten und bin es leid, die Namen immer an tausend stellen im FHEM zu ändern. Deshalb habe ich mir ein paar DOIFs erstellt, welche eine Zwischenschicht übernehmen. Anstatt "set KNX30.O01_Leuchte_Kueche on" habe ich jetzt die Möglichkeit "set gendev_Leuchte_Kueche on" zu schicken. Da es allerdings auch vorkommt, dass ich ein "on-for-timer" oder ähnlich schicken will, hatte ich mir überlegt, das über ein Reading des DOIF zu lösen.
Der Befehl hieße dann "setreading gendev_Leuchte_Kueche steuern on" und würde dann in
"set KNX30.O01_Leuchte_Kueche steuern [$SELF:steuern]" übersetzt.
tl;dr:
Wenn ich "setreading gendev_Leuchte_Kueche steuern on" abschicke, führt das DOIF den Zweig DOELSEIF([$SELF:steuern]) nicht zuverlässig aus. Manchmal gehts, meist wenn ich den Befehl zwei oder dreimal direkt hintereinander abschicke.
In einem kleinen Testszenario funktioniert es einwandfrei - also hab ich was falsch programmiert.
Leider kann ich keinen Fehler feststellen und wäre für einen Tipp dankbar.
Hier noch das doif, welches mit "setreading gendev_Counter_PV10k steuern on" aufgerufen wird:
Internals:
DEF (reset)
(
setreading $SELF active_work_yesterday [$SELF:all_daily_work]
)
(
set KNX50.O01_Aktor_PV_out_L1 active_work_reset on,
set KNX50.O02_Aktor_PV_out_L2 active_work_reset on,
set KNX50.O03_Aktor_PV_out_L3 active_work_reset on
)
DOELSEIF([$SELF:steuern])
(
set Pushover msg WR TEST steuern [$SELF:steuern] title=PV priority=0
)
DOELSEIF(on)
(
set KNX50.O01_Aktor_PV_out_L1 steuern on,
set KNX50.O02_Aktor_PV_out_L2 steuern on,
set KNX50.O03_Aktor_PV_out_L3 steuern on
)
DOELSEIF(off)
(
set KNX50.O01_Aktor_PV_out_L1 steuern off,
set KNX50.O02_Aktor_PV_out_L2 steuern off,
set KNX50.O03_Aktor_PV_out_L3 steuern off
)
DOELSEIF(maep)
(
##set KNX50.O01_Aktor_PV_out_L1 steuern [$SELF:steuern],
##set KNX50.O02_Aktor_PV_out_L2 steuern [$SELF:steuern],
##set KNX50.O03_Aktor_PV_out_L3 steuern [$SELF:steuern]
)
FUUID 5f671d2e-f33f-4040-8e84-f0e2abdaf906fe98
MODEL FHEM
NAME gendev_Counter_PV10k
NOTIFYDEV KNX50.O01_Aktor_PV_out_L1,KNX50.O03_Aktor_PV_out_L3,global,KNX50.O02_Aktor_PV_out_L2,gendev_Counter_PV10k
NR 572
NTFY_ORDER 50-gendev_Counter_PV10k
STATE 9.500 kWh on on on
TYPE DOIF
VERSION 22834 2020-09-23 17:50:00
CHANGED:
all_daily_work: 9.500 kWh
CHANGEDWITHSTATE:
all_daily_work: 9.500 kWh
DOIF_Readings:
all_daily_work { sprintf("%.3f kWh", (::ReadingValDoIf($hash,'KNX50.O01_Aktor_PV_out_L1','active_work','','d')+ ::ReadingValDoIf($hash,'KNX50.O02_Aktor_PV_out_L2','active_work','','d')+ ::ReadingValDoIf($hash,'KNX50.O03_Aktor_PV_out_L3','active_work','','d'))/1000) }
all_power_input { sprintf("%d W", ::ReadingValDoIf($hash,'KNX50.O01_Aktor_PV_out_L1','active_power','','d')+ ::ReadingValDoIf($hash,'KNX50.O02_Aktor_PV_out_L2','active_power','','d')+ ::ReadingValDoIf($hash,'KNX50.O03_Aktor_PV_out_L3','active_power','','d')) }
all_status { sprintf("%s %s %s", ::ReadingValDoIf($hash,'KNX50.O01_Aktor_PV_out_L1','status'), ::ReadingValDoIf($hash,'KNX50.O02_Aktor_PV_out_L2','status'), ::ReadingValDoIf($hash,'KNX50.O03_Aktor_PV_out_L3','status')) }
OLDREADINGS:
READINGS:
2020-10-18 00:01:00 active_work_yesterday 8.02 kWh
2020-10-18 22:34:46 all_daily_work 9.500 kWh
2020-10-18 22:34:39 all_power_input 774 W
2020-10-18 20:36:22 all_status on on on
2020-10-18 22:27:50 cmd 2
2020-10-18 22:27:50 cmd_event gendev_Counter_PV10k
2020-10-18 22:27:50 cmd_nr 2
2020-10-18 22:27:50 e_gendev_Counter_PV10k_steuern on
2020-10-18 22:26:40 mode enabled
2020-10-18 22:27:50 state cmd_2
2020-10-18 22:28:13 steuern on
Regex:
DOIF_Readings:
KNX50.O01_Aktor_PV_out_L1:
all_daily_work:
active_work ^KNX50.O01_Aktor_PV_out_L1$:^active_work:
all_power_input:
active_power ^KNX50.O01_Aktor_PV_out_L1$:^active_power:
all_status:
status ^KNX50.O01_Aktor_PV_out_L1$:^status:
KNX50.O02_Aktor_PV_out_L2:
all_daily_work:
active_work ^KNX50.O02_Aktor_PV_out_L2$:^active_work:
all_power_input:
active_power ^KNX50.O02_Aktor_PV_out_L2$:^active_power:
all_status:
status ^KNX50.O02_Aktor_PV_out_L2$:^status:
KNX50.O03_Aktor_PV_out_L3:
all_daily_work:
active_work ^KNX50.O03_Aktor_PV_out_L3$:^active_work:
all_power_input:
active_power ^KNX50.O03_Aktor_PV_out_L3$:^active_power:
all_status:
status ^KNX50.O03_Aktor_PV_out_L3$:^status:
gendev_Counter_PV10k:
accu:
cond:
gendev_Counter_PV10k:
0:
1:
steuern ^gendev_Counter_PV10k$:^steuern:
attr:
cmdState:
wait:
waitdel:
condition:
0 reset
1 ::ReadingValDoIf($hash,'gendev_Counter_PV10k','steuern')
2 on
3 off
4 maep
do:
0:
0 setreading gendev_Counter_PV10k active_work_yesterday [gendev_Counter_PV10k:all_daily_work]
1 set KNX50.O01_Aktor_PV_out_L1 active_work_reset on, set KNX50.O02_Aktor_PV_out_L2 active_work_reset on, set KNX50.O03_Aktor_PV_out_L3 active_work_reset on
1:
0 set Pushover msg WR TEST steuern [gendev_Counter_PV10k:steuern] title=PV priority=0
2:
0 set KNX50.O01_Aktor_PV_out_L1 steuern on, set KNX50.O02_Aktor_PV_out_L2 steuern on, set KNX50.O03_Aktor_PV_out_L3 steuern on
3:
0 set KNX50.O01_Aktor_PV_out_L1 steuern off, set KNX50.O02_Aktor_PV_out_L2 steuern off, set KNX50.O03_Aktor_PV_out_L3 steuern off
4:
0
5:
helper:
DEVFILTER ^global$|^gendev_Counter_PV10k$|^KNX50.O01_Aktor_PV_out_L1$|^KNX50.O03_Aktor_PV_out_L3$|^KNX50.O02_Aktor_PV_out_L2$
NOTIFYDEV global|gendev_Counter_PV10k|KNX50.O01_Aktor_PV_out_L1|KNX50.O03_Aktor_PV_out_L3|KNX50.O02_Aktor_PV_out_L2
event active_work: 3270 Wh,3270 Wh
globalinit 1
last_timer 0
sleeptimer -1
timerdev gendev_Counter_PV10k
timerevent steuern: on
triggerDev KNX50.O03_Aktor_PV_out_L3
timerevents:
steuern: on
e_gendev_Counter_PV10k_steuern: on
cmd_nr: 2
cmd: 2
cmd_event: gendev_Counter_PV10k
cmd_2
timereventsState:
steuern: on
e_gendev_Counter_PV10k_steuern: on
cmd_nr: 2
cmd: 2
cmd_event: gendev_Counter_PV10k
cmd_2
triggerEvents:
active_work: 3270 Wh
3270 Wh
triggerEventsState:
active_work: 3270 Wh
state: 3270 Wh
internals:
readings:
all gendev_Counter_PV10k:steuern
trigger:
uiState:
uiTable:
Attributes:
DOIF_Readings all_status:
{
sprintf("%s %s %s",
[KNX50.O01_Aktor_PV_out_L1:status],
[KNX50.O02_Aktor_PV_out_L2:status],
[KNX50.O03_Aktor_PV_out_L3:status])
},
all_power_input:
{
sprintf("%d W",
[KNX50.O01_Aktor_PV_out_L1:active_power:d]+
[KNX50.O02_Aktor_PV_out_L2:active_power:d]+
[KNX50.O03_Aktor_PV_out_L3:active_power:d])
},
all_daily_work:
{
sprintf("%.3f kWh",
([KNX50.O01_Aktor_PV_out_L1:active_work:d]+
[KNX50.O02_Aktor_PV_out_L2:active_work:d]+
[KNX50.O03_Aktor_PV_out_L3:active_work:d])/1000)
}
do always
eventMap cmd_1:reset cmd_3:on cmd_4:off
room Counter,Generic Devices,KNX,_doif
selftrigger all
stateFormat all_daily_work all_status
webCmd :
Hab auch noch ein Event-Log dazu:
Wenns funktioniert, siehts so aus:
2020-10-18 22:27:50.897 DOIF gendev_Counter_PV10k steuern: on
2020-10-18 22:27:50.897 DOIF gendev_Counter_PV10k e_gendev_Counter_PV10k_steuern: on
2020-10-18 22:27:50.897 DOIF gendev_Counter_PV10k cmd_nr: 2
2020-10-18 22:27:50.897 DOIF gendev_Counter_PV10k cmd: 2
2020-10-18 22:27:50.897 DOIF gendev_Counter_PV10k cmd_event: gendev_Counter_PV10k
2020-10-18 22:27:50.897 DOIF gendev_Counter_PV10k cmd_2
Und wenns nicht funktioniert, dann so:
2020-10-18 22:28:08.547 DOIF gendev_Counter_PV10k all_daily_work: 9.400 kWh
2020-10-18 22:28:08.547 DOIF gendev_Counter_PV10k steuern: off
PS: (aber nur ganz am Rande): Das DOIF_Reading kann ich nicht mit DbLog loggen, weil es keine Events erzeugt, richtig? Gibts da ne einfache Alternative?
Gut, grad ist mir eingefallen, für diesen speziellen Fall das direkte on/off (cmd_3 und cmd_4) zu verwenden.
Trotzdem wäre es schön, herauszufinden, warum es nicht funktioniert.
ZitatGibts da ne einfache Alternative?
event_Readings
ZitatLeider kann ich keinen Fehler feststellen und wäre für einen Tipp dankbar.
Mal mit selftrigger wait exprimentieren und den Befehl in dem Zweig verzögern.
Evtl. ist selftrigger nicht notwendig, da das Reading steuern nicht durch eine Befehlsausführung im selben DOIF gesetzt wird.
Zitat von: Ellert am 19 Oktober 2020, 00:35:56
Evtl. ist selftrigger nicht notwendig, da das Reading steuern nicht durch eine Befehlsausführung im selben DOIF gesetzt wird.
ja, es geht ohne. Hatte ich in meinem minimal-experiment auch vergessen, funktioniert trotzdem. Wieder was gelernt, danke.
In dem Minimal-Aufbau gehts ja auch ohne. Ich lösch das selftrigger mal raus, vielleicht lags ja schon daran.
gesagt, getan: jetzt läufts. Allerdings auch noch, wenn ich selftrigger wieder rein tue. Ich kann das Problem nicht mehr reproduzieren.
Zitat von: Ellert am 19 Oktober 2020, 00:35:56
event_Readings
Oh, steht tatsächlich in der commandref direkt unter den doif_readings...
Da hatte ich gestern wohl Tomaten auf den Augen beim scrollen... Danke!
Danke für die Anregungen,
Stephan