X_InitDone

Begonnen von SCMP77, 06 Februar 2016, 12:23:49

Vorheriges Thema - Nächstes Thema

SCMP77

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
Raspberry Pi 3 Model B mit Rasbian, SolvisMax, AVM DECT 200, Sonoff mit Tasmota geflasht

Thorsten Pferdekaemper

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
FUIP

justme1968

in der NotifyFn global:INITIALIZED auswerten.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Markus Bloch

#3
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

Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

herrmannj

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