Hallo,
wie hier schon häufig in Forum besprochen wurde, sind bei der Ausführung der Define-Methode die Attribute, Readings etc. noch nicht gesetzt. Manchmal z.B. bei Polling ist es jedoch zum Starten eines Hintergrundprozesses sinnvoll beispielsweise die gelesenen Readings zu kennen.
Als Lösung für dieses Problem wird hier vorgeschlagen die Variable $init_done abzufragen.
Dazu muss dann jedes betroffene Modul einen Timer realisieren, der zyklisch diese Variable abfragt, bis $int_done gesetzt ist. Dann erst kann das Modul seine Bearbeitung fortsetzen.
Wäre es nicht sinnvoll das Modulinterface noch um die Methode X_InitDone($) zu erweitern, die dann aufgerufen wird, wenn $init_done auf 1 gesetzt wird?
Oder gibt es noch eine andere ähnliche schon existierende Lösung?
Gruß
SCMP77
Hi,
bei mir funktioniert das so:
InternalTimer(gettimeofday(), 'HM485_LAN_ConnectOrStartHM485d', $hash, 0);
Das steht in der X_Define und die Routine HM485_LAN_ConnectOrStartHM485d funktioniert nur mit gesetzten Attributen ordentlich.
Gruß,
Thorsten
in der NotifyFn global:INITIALIZED auswerten.
gruss
andre
Ich mach das mittels NotifyFn:
sub
FB_CALLMONITOR_Notify($$)
{
my ($hash,$dev) = @_;
return if($dev->{NAME} ne "global");
return if(!grep(m/^INITIALIZED|REREADCFG$/, @{$dev->{CHANGED}}));
FB_CALLMONITOR_readPhonebook($hash);
}
Falls du $hash->{NOTIFYDEV} verwendest um nur auf ein bestimmtes Device zu reagieren, kann man auch hier mehrere verwenden:
sub X_DefineFn($$)
{
...
$hash->{NOTIFYDEV} = "global,myDeviceName";
...
}
Gruß
Markus
ZitatIch mach das mittels NotifyFn:
yepp. Dito.
Ergänzend:
ich habe meist eine x_run().
Im define prüfe ich auf init_done
ZitatTechemHKV_Run($hash) if $init_done;
Dazu die x_notify
sub
TechemHKV_Notify (@) {
my ($hash, $ntfyDev) = @_;
return unless (($ntfyDev->{TYPE} eq 'CUL') || ($ntfyDev->{TYPE} eq 'Global'));
foreach my $event (@{$ntfyDev->{CHANGED}}) {
my @e = split(' ', $event);
next unless defined($e[0]);
TechemHKV_Run($hash) if ($e[0] eq 'INITIALIZED');
Damit wird x_run immer aufgerufen.
a: wenn fhem startet und alles eingelesen ist
b: wenn das device definiert wird und fhem bereits läuft. In diesem Fall würde es sonst das event nicht geben.
vg
joerg