gelöst: DOIF triggert nicht immer auf eigenes Reading | selftrigger

Begonnen von abc2006, 18 Oktober 2020, 22:40:33

Vorheriges Thema - Nächstes Thema

abc2006

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?
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

abc2006

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.
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Ellert

#2
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.

abc2006

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
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX