Autor Thema: $hash->{NOTIFYDEV}  (Gelesen 1055 mal)

Offline Sailor

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1667
  • und es werden immer mehr...
$hash->{NOTIFYDEV}
« am: 12 April 2018, 06:14:18 »
Moinsen developer Gemeinde

ich habe von einem Nutzer meines GasCalculator´- Moduls den folgenden freundlichen Hinweis bekommen:

https://forum.fhem.de/index.php/topic,47909.msg792943.html#msg792943
Hallo Sailor,
über freezemon ist mir aufgefallen, dass der GasCalculator permanent im freezemon-Log auftaucht, wenn ein freeze aufgetreten ist.
Weil GasCalculator eigentlich relativ unverdächtig ist, habe ich mal mit verbose=5 geloggt und war überrascht, dass das Modul bei jedem event aufgerufen wird. Meines Erachtens liegt es an der fehlenden Definition von $hash->{NOTIFYDEV}.

Ich hab mal $hash->{NOTIFYDEV} = substr($RegEx,0,index($RegEx,":")); in der GasCalculator_Define eingebaut und nun ist Ruhe. Kann man mit mehr Perl-Wissen als ich es habe bestimmt eleganter machen.  :-[

Grüße Markus

Ich kann im Wiki und im Forum nichts spezifisches zum Nachlesen finden.

Kann mir Jemand von Euch Verweise zu Hintergrund-Informationen geben bzw. mir dies ggf. erklären?
  • Was ist der freezemon-Log und wann taucht dort was auf?
  • Was bewirkt der genannte Eintrag in der "define" ´- Sub?
  • Ist es ratsam den so zu verwenden oder gibt es eine elegantere Lösung?

DANKE!

Gruß
    Sailor
« Letzte Änderung: 12 April 2018, 06:18:48 von Sailor »
******************************
Man wird immer besser...

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 25955
Antw:$hash->{NOTIFYDEV}
« Antwort #1 am: 12 April 2018, 08:05:30 »
Im $hash->{NOTIFYDEV} legst Du fest auf welche Devicenamen Deine $hash->{NotifyFn} triggern soll.
Wenn Dein Modul statische Namen kennt, also im einfachsten Fall global und $hash->{NAME} kannst Du das in der Initialize gleich mit angeben.

Wenn sich aber die Devicenamen erst aus der DEF zum Beispiel ergeben, dann musst Du $hash->{NOTIFYDEV} innerhalb der DEF mit Werten versehen.

Mehr Infos findest Du hier
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#notifyRegexpChanged
und hier
https://wiki.fhem.de/wiki/DevelopmentModuleIntro#Internals
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://paypal.me/pools/c/8gULisr9BT
My FHEM Git: https://git.cooltux.net/FHEM/
Mein Dokuwiki:
https://www.cooltux.net

Offline Sailor

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1667
  • und es werden immer mehr...
Antw:$hash->{NOTIFYDEV}
« Antwort #2 am: 12 April 2018, 08:52:10 »
Hi CoolTux

Wenn sich aber die Devicenamen erst aus der DEF zum Beispiel ergeben, dann musst Du $hash->{NOTIFYDEV} innerhalb der DEF mit Werten versehen.

Mehr Infos findest Du hier
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#notifyRegexpChanged

Danke für die Info

Bezogen auf mein GasCalculator - Modul müsste ich also in meine Define

###START###### Activate module after module has been used via fhem command "define" ##########################START####
sub GasCalculator_Define($$$)
{
        my ($hash, $def)              = @_;
        my ($name, $type, $RegEx, $RegExst) = split("[ \t]+", $def, 4);
 

        ### Check whether regular expression has correct syntax
        if(!$RegEx || $RegExst) 
        {
                my $msg = "Wrong syntax: define <name> GasCalculator device[:event]";
                return $msg;
        }
 
        ### Check whether regular expression is misleading
        eval { "Hallo" =~ m/^$RegEx$/ };
        return "Bad regexp: $@" if($@);
        $hash->{REGEXP} = $RegEx;       
 
        ### Writing values to global hash
        $hash->{NAME}                                                   = $name;
        $hash->{STATE}                                  = "active";
        $hash->{REGEXP}                                 = $RegEx;
 
        if(defined($attr{$hash}{SiPrefixPower}))
        {
                if    ($attr{$hash}{SiPrefixPower} eq "W" ) {$hash->{system}{SiPrefixPowerFactor} = 1          ;}
                elsif ($attr{$hash}{SiPrefixPower} eq "kW") {$hash->{system}{SiPrefixPowerFactor} = 1000       ;}
                elsif ($attr{$hash}{SiPrefixPower} eq "MW") {$hash->{system}{SiPrefixPowerFactor} = 1000000    ;}
                elsif ($attr{$hash}{SiPrefixPower} eq "GW") {$hash->{system}{SiPrefixPowerFactor} = 1000000000 ;}
                else                                        {$hash->{system}{SiPrefixPowerFactor} = 1          ;}
        }
        else
        {
                                                     $hash->{system}{SiPrefixPowerFactor} = 1;
        }
         
        ### Writing log entry
        Log3 $name, 5, $name. " : GasCalculator - Starting to define module";
 
        return undef;
}
####END####### Activate module after module has been used via fhem command "define" ############################END#####


Müsste ich unter "  ### Writing values to global hash" folgende Zeile einfügen?
notifyRegexpChanged($hash, $RegEx);
Gruß
    Sailor
******************************
Man wird immer besser...