Frage zu NotifyFn

Begonnen von zap, 10 September 2015, 20:06:42

Vorheriges Thema - Nächstes Thema

zap

Hallo,
leider darf ich im Entwicklerbereich keine Frage stellen (oder habe den Button nicht gefunden, dann sorry). Daher hier die Frage:

Ich habe in einem eigenen Modul eine NotifyFn Funktion implementiert. Die Funktion wird auch bei Änderungen von Readings aufgerufen, allerdings anscheinend nicht, wenn sich der STATE eines Devices ändert. Ich war bisher davon ausgegangen, dass STATE dem Reading 'state' entspricht. Folgender Code liefert keine Meldung im Logfile:


sub AggReadings_Notify ($$)
{
        my ($hash, $dev) = @_;
        my $name = $hash->{NAME};

        return "" if (IsDisabled ($name));

        my $dev_exp = '.*';
        my $devname = $dev->{NAME};

        if ($devname =~ /$dev_exp/) {
                my $ndev = int(@{$dev->{CHANGED}});

                for (my $i=0; $i<$ndev; $i++) {
                        my $s = $dev->{CHANGED}[$i];
                        next if (!defined ($s));
                        if ($s =~ /^state$/) {
                                Log 1, "AggReadings: $devname:state changed";
                        }
                }
        }


Wenn ich auf ein anderes Reading prüfe, funktioniert es. Nur mit state nicht.
2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)

justme1968

#1
STATE ist ein internal und erzeugt keine events.

wenn es ein reading state gibt wird es von fhem automatisch nach STATE kopiert so fern vom anwender nicht über stateFormat etwas anderes eingestellt wurde.

manche alten module ändern STATE direkt. das ist aber deprecated.

eventuell interessiert dich auch noch addStateEvent und deviceEvents() sowie NOTIFYDEV.

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

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

rudolfkoenig

Zitatleider darf ich im Entwicklerbereich keine Frage stellen
In einem dort angepinnten Beitrag ist beschrieben, wie man die Berechtigung bekommen kann.

zap

#3
Zitat von: justme1968 am 10 September 2015, 20:12:54
manche alten module ändern STATE direkt. das ist aber deprecated.

Und wie soll man stattdessen STATE setzen? Über das Reading state?

Zitat
eventuell interessiert dich auch noch addStateEvent und deviceEvents() sowie NOTIFYDEV.

addStateEvent scheint ein Attribut zu sein. Ist allerdings in keinem der stichprobenartig getesteten Module auswählbar, daher vermutlich kein Default-Attribut. Zu deviceEvents() habe ich per Suche leider gar nichts gefunden. Wird aber im Notify-Modul gemeinsam mit addStateEvent verwendet. Ist halt alles undokumentiert (wie so oft bei Open Source Software).

Ich suche nach einer Möglichkeit, mein Modul informieren zu lassen, sobald sich bei einem beliebigen (oder auch bestimmten) Device STATE ändert.

Ach ja BTW: Die Notify Funktion in einem Modul greift nicht nach einem reload des Moduls. Man muss fhem zwingend neu starten.

2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)

marvin78

Zitat von: zap am 11 September 2015, 15:33:07
Und wie soll man stattdessen STATE setzen? Über das Reading state?

Genau.

Zitat von: zap am 11 September 2015, 15:33:07
addStateEvent scheint ein Attribut zu sein. Ist allerdings in keinem der stichprobenartig getesteten Module auswählbar. Zu deviceEvents() habe ich per Suche leider gar nichts gefunden.

Nicht? Ich finde sofort etwas. Probiere mal deviceEvents ohne Klammern oder die google Suche mit site.

Zitat von: zap am 11 September 2015, 15:33:07

Ach ja BTW: Die Notify Funktion in einem Modul greift nicht nach einem reload des Moduls. Man muss fhem zwingend neu starten.



Das kann ich so nicht bestätigen. Es ist mir zumindest noch nicht aufgefallen und das wäre es sicher.

rudolfkoenig

ZitataddStateEvent scheint ein Attribut zu sein.
... wie man das unschwer aus der Doku entnehmen kann (http://fhem.de/commandref.html#addStateEvent)
Wenn man in 91_notify.pn nachschaut, und nach addStateEvent sucht, sieht man, was andre gemeint hat.

ZitatZu deviceEvents() habe ich per Suche leider gar nichts gefunden.
Da muss man vmtl. sich an alte Zeiten erinnern, wo es noch kein google gab:
fhem 9% grep -irl deviceEvents FHEM
FHEM/01_FHEMWEB.pm
FHEM/10_CUL_HM.pm
FHEM/16_STACKABLE_CC.pm
FHEM/31_MilightDevice.pm
FHEM/33_readingsGroup.pm
FHEM/33_readingsProxy.pm
FHEM/91_eventTypes.pm
FHEM/91_notify.pm
FHEM/91_watchdog.pm
FHEM/92_FileLog.pm
FHEM/98_cloneDummy.pm
FHEM/98_DOIF.pm


ZitatDie Notify Funktion in einem Modul greift nicht nach einem reload des Moduls
Kann ich so pauschal nicht nachvollziehen. CommandReload wird auch waehrend des startups aufgerufen, und ruft XXX_Initialize auf, nachdem die Datei mit "do" reingelesen wurde.

zap

#6
Ok, danke für die Hinweise.

Habe mit der Notify Funktion nun noch folgendes Problem: Ich tracke damit Änderungen der Readings eines PRESENCE Gerätes. Meine Notify Funktion teilt mir dann mit, dass sich das Reading "present" bzw. "absent" geändert hat. Problem ist nur, dass es diese Readings im PRESENCE Modul gar nicht gibt.

Bei meinem Beispielcode (myphone ist das PRESENCE Device):


if ($devname eq 'myphone') {
   my $ndev = int(@{$dev->{CHANGED}});

   for (my $i=0; $i<$ndev; $i++) {
      my $s = $dev->{CHANGED}[$i];

      Log 1, "Reading $devname:$s changed: " . ReadingsVal ($devname, $s, "_err_");
   }
}


Es wird im Log ausgegeben (ggf. statte absent eben present):

Reading myphone:absent changed: _err_

Daraus schließe ich, dass in $dev->{CHANGED} keine Readings stehen sondern die Notifications. Bedeutet das, wenn das Reading nicht existiert, dass es sich um eine Änderung von state handelt?

2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)

justme1968

#7
ZitatOk, danke für die Hinweise.
schade das es trotzdem nicht klar ist oder du sie scheinbar nicht befolgt hast.

absent und present sind nicht die reading namen.

$dev->{CHANGED}[$i] ist nicht das reading sondern das komplette event wie es z.b. auch im event monitor auftaucht. das ist normalerweise <reading>: <wert>. nur für state ist normalerweise es nur der wert ohne den reading namen. deshalb auch der hinweis auf addStateEvent.

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

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

zap

Danke, hab es jetzt kapiert. Du warst nur schneller, als ich meinen letzten Post ergänzen konnte.

Zitat von: justme1968 am 13 September 2015, 14:55:26
schade das es trotzdem nicht klar ist oder du sie scheinbar nicht befolgt hast.

absent und present sind nicht die reading namen.

$dev->{CHANGED}[$i] ist nicht das reading sondern das komplette event wie es z.b. auch im event monitor auftaucht. das ist normalerweise <reading>: <wert>. nur für state ist normalerweise es nur der wert ohne den reading namen. deshalb auch der hinweis auf addStateEvent.

gruss
  andre
2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)