DevelopmentState: Unterschied zwischen den Versionen

Aus FHEMWiki
(Kurze Einführung in die STATE-Variable)
 
K (Rechtschreibfehler korrigiert, Link zur CommandRef durch Vorlage Link2CmdRef ersetzt)
 
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Der Default-Status eines Gerätes wird in FHEM durch die interne Variable ''STATE'' dargestellt. Dieser wird beispielsweise von [[FHEMWEB]] oder von dem ''list''-Befehl angezeigt.
Der Default-Status eines Gerätes wird in FHEM durch die interne Variable '''''STATE''''' dargestellt. Diese wird beispielsweise von [[FHEMWEB]] oder von dem [[list]]-Befehl angezeigt.


Dieser sollte jedoch von Modulautoren nicht direkt gesetzt werden. Stattdessen ermittelt FHEM den Wert folgendermaßen:
Der ''STATE'' sollte jedoch von Modulautoren nicht direkt gesetzt werden. Stattdessen ermittelt FHEM den Wert folgendermaßen:
# Falls das Attribut ''stateFormat'' gesetzt ist, wird dieses ausgewertet und das Ergebnis in den ''STATE'' geschrieben. (Siehe [http://fhem.de/commandref.html#readingFnAttributes commandref.html#readingFnAttributes])
# Falls das Attribut ''stateFormat'' gesetzt ist, wird dieses ausgewertet und das Ergebnis in den ''STATE'' geschrieben. (siehe {{Link2CmdRef|Anker=readingFnAttributes|Lang=de|Label=readingFnAttributes}} in der CommandRef)
# Falls das Reading ''state'' existiert, wird diesen in ''STATE'' übernommen.
# Falls das Reading ''state'' existiert, wird dessen Wert in ''STATE'' übernommen.


Wenn ein Modulautor ein bestimmtes Reading in ''STATE'' vorgelegen möchte so kann er dies mit dem ''stateFormat''-Attribut tun.
Wenn ein Modulautor ein bestimmtes Reading in ''STATE'' vorbelegen möchte, so kann er dies mit dem ''stateFormat''-Attribut tun.
Dies sollte aber nur in der ''define'' Funktion des Moduls geschehen, damit der User die Möglichkeit hat, das Attribut anschließend anzupassen.
Dies sollte aber nur in der ''define'' Funktion des Moduls geschehen, damit der User die Möglichkeit hat, das Attribut anschließend anzupassen.


Beispiel:  
Beispiel:  


sub MYMODULE_Define($$)
<syntaxhighlight lang="perl">
{
sub MYMODULE_Define($$)
my ($hash, $def) = @_;
{
my @args = split("[ \t]+", $def);
my ($hash, $def) = @_;
my ($name, $type) = @args;
my @args = split("[ \t]+", $def);
[...];
my ($name, $type) = @args;
'''$attr{$name}{"stateFormat"} = "power";'''
[...];
  [...];
  }
# prüfen, ob eine neue Definition angelegt wird
if($init_done && !defined($hash->{OLDDEF}))
sub MYMODULE_Call($$)
{
{
# setzen von stateFormat
[...];
$attr{$name}{"stateFormat"} = "power";
my $power = [...];
}
readingsBeginUpdate($hash);
'''readingsBulkUpdate($hash,"power",$power);'''
[...];
readingsEndUpdate($hash, 1);
}
[...];
}


sub MYMODULE_Call($$)
{
[...];
my $power = [...];
readingsBeginUpdate($hash);
readingsBulkUpdate($hash,"power",$power);
readingsEndUpdate($hash, 1);
[...];
}
</syntaxhighlight>


[[Kategorie:Development]]
[[Kategorie:Development]]

Aktuelle Version vom 14. Juni 2018, 12:32 Uhr

Der Default-Status eines Gerätes wird in FHEM durch die interne Variable STATE dargestellt. Diese wird beispielsweise von FHEMWEB oder von dem list-Befehl angezeigt.

Der STATE sollte jedoch von Modulautoren nicht direkt gesetzt werden. Stattdessen ermittelt FHEM den Wert folgendermaßen:

  1. Falls das Attribut stateFormat gesetzt ist, wird dieses ausgewertet und das Ergebnis in den STATE geschrieben. (siehe readingFnAttributes in der CommandRef)
  2. Falls das Reading state existiert, wird dessen Wert in STATE übernommen.

Wenn ein Modulautor ein bestimmtes Reading in STATE vorbelegen möchte, so kann er dies mit dem stateFormat-Attribut tun. Dies sollte aber nur in der define Funktion des Moduls geschehen, damit der User die Möglichkeit hat, das Attribut anschließend anzupassen.

Beispiel:

sub MYMODULE_Define($$)
{
	my ($hash, $def) = @_;
	my @args = split("[ \t]+", $def);
	my ($name, $type) = @args;
	[...];
	
	# prüfen, ob eine neue Definition angelegt wird 
	if($init_done && !defined($hash->{OLDDEF}))
	{
		# setzen von stateFormat
	 	$attr{$name}{"stateFormat"} = "power";
 	}
	
	[...];
}

sub MYMODULE_Call($$)
{
	[...];
	my $power = [...];
	readingsBeginUpdate($hash);
	readingsBulkUpdate($hash,"power",$power);
	readingsEndUpdate($hash, 1);
	[...];
}