FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ujaudio am 24 Februar 2015, 18:38:29

Titel: perl code in FHEM: globale Variable und Unterprogramme
Beitrag von: ujaudio am 24 Februar 2015, 18:38:29
Ich habe eine grundsätzliche Verständnisfrage und bislang nichts gefunden, was mir eine Antwort gibt: wenn ich z.B. in einem notify perl code schreibe, dann muss ich eine Variable deklarieren, d.h. am Anfang z.B. schreiben
my $var = 0;
Im weiteren Verlauf kann ich dann die Variable nutzen, wie ich es benötige. Soweit klar. Aber was ist wenn das notify komplett durchlaufen ist? Welchen Wert hat dann die Variable? Ist sie überhaupt noch definiert?
Mein Verständnis: die Variable ist am Ende des notify nicht mehr existent (also nur eine lokale Variable).

Daraus ergibt sich meine erste Frage: Wie definiere ich aber eine globale Variable?

Wenn ich nun im notify einen länglichen Code schreibe, dann kann ich doch auch statt dessen eine Funktion aufrufen:
define mycall notify {myfunction ("$NAME","$EVENT)}
was ich dann in 99_myUtils.pm schreiben muss ist mir noch nicht ganz klar:
sub
myfunction {
# $_[0] enthält den Wert des Geräts
# $_[1] enthält das Ereignis
# Damit kann ich nun meine Funktion schreiben
}

Mein Verständnis: in myfunction kann ich die Funktion fhem(...) nutzen und somit meine Homematic-Komponenten steuern

Damit die 2. (zweiteilige) Frage: Ist meine Auffassung korrekt? Gibt die Funktion einen Wert zurück?

Gruß
Jürgen
Titel: Antw:perl code in FHEM: globale Variable und Unterprogramme
Beitrag von: krikan am 24 Februar 2015, 18:42:27
Schau mal http://www.fhemwiki.de/wiki/99_myUtils_anlegen dort hinein wegen 2.Frage. Denke, dass erläutert einiges
Titel: Antw:perl code in FHEM: globale Variable und Unterprogramme
Beitrag von: ujaudio am 24 Februar 2015, 19:01:53
Damit sind Unterprogramme klar und ich habe endlich meinen Fehler mit den Übergabeparametern erkannt. Danke!

Bleibt noch die Frage nach den globalen Variablen. Für einen einzelnen Wert kann ich mir behelfsweise ja ein "dummy" definieren, aber was mache ich, wenn ich ein Array benötige?
Titel: Antw:perl code in FHEM: globale Variable und Unterprogramme
Beitrag von: schka17 am 24 Februar 2015, 19:02:19
Hallo Jürgen,

Ich glaube du hast das schon ganz richtig verstanden, ich oute mich jetzt auch als myUtils verweigerer, ich habe ausser den übernommenen Codeschnipsel noch nichts gefunden dass ich dort sinnvoll nutzen kann. Ich verwende nur notifies, das für mich auch den schönen Effekt dass FHEM immer schön dokumentiert welche Geräte oder Sensoren von einem Notify gesteuert werden. Wenn ich "globale Variablen " brauche dann verwende ich einen dummy und readings.

Übrigens ist Tapatalk eine sehr grausliche Ipad App fürs Forum

Gruß
Karl


Sent from my iPad using Tapatalk
Titel: Antw:perl code in FHEM: globale Variable und Unterprogramme
Beitrag von: ujaudio am 24 Februar 2015, 19:07:22
Ich brauche nur einen Tipp für globale Arrays. Den Rest frickel ich mir schon zurecht.

Oder kann man in einem dummy ein reading als Array definieren??!? Und dann dort indiziert zugreifen?
Titel: Antw:perl code in FHEM: globale Variable und Unterprogramme
Beitrag von: nesges am 24 Februar 2015, 19:39:04
Generell: http://perldoc.perl.org/functions/our.html
Titel: Antw:perl code in FHEM: globale Variable und Unterprogramme
Beitrag von: schka17 am 24 Februar 2015, 19:46:24
Das übersteigt definitv meine Programmierkenntnisse, daher denke ich wahrscheinlich komplett anders als die meisten Entwickler hier, ich verwende dummy oder reale Devices schon auf eine Art wie man Arrays verwenden kann. Z.b. Telefonnummern oder email adressen für Benachrichtigungen habe ich als readings in den residents instanzen hinterlegt und lese sie dann dort bei Bedarf aus. Genauso gut könnte man in einem dummy beliebige Readings setzen und als Name/wert paare verwenden



Sent from my iPad using Tapatalk
Titel: Antw:perl code in FHEM: globale Variable und Unterprogramme
Beitrag von: Dietmar63 am 24 Februar 2015, 19:53:52
je nachdem wie weit du gehen willst, ist in einem solchen Fall das Erstellen eines Moduls das Richtige.
Module sind so etwas wie Klassen mit vielen Methoden/Funktionen. 

Sämtliche Funktionen eines Moduls bekommen das Gerätegedächtnis per  $hash übergeben. Das Gedächtnis wird global von fhem zur Verfügung gestellt. Ein HASH ist so etwas wie ein Dictionary  in Smalltalk oder eine Hashmap in Java: Assoziatives Array.

Bei Ihnen kann der Index ein String oder eine andere Variable sein - sehr flexibel und nirgends so einfach zu verwenden wie in Perl. Hashs kann man beliebig schachteln.

http://www.perlboard.de/perlguide/Kap05.html (http://www.perlboard.de/perlguide/Kap05.html)

anbei der Code des einfachsten Moduls "dummy"

##############################################
# $Id: 98_dummy.pm 4934 2014-02-15 08:23:12Z rudolfkoenig $
package main;

use strict;
use warnings;

sub
dummy_Initialize($)
{
  my ($hash) = @_;

  $hash->{SetFn}     = "dummy_Set";
  $hash->{DefFn}     = "dummy_Define";
  $hash->{AttrList}  = "setList ". $readingFnAttributes;
}

###################################
sub
dummy_Set($@)
{
  my ($hash, @a) = @_;
  my $name = shift @a;

  return "no set value specified" if(int(@a) < 1);
  my $setList = AttrVal($name, "setList", " ");
  return "Unknown argument ?, choose one of $setList" if($a[0] eq "?");

  my $v = join(" ", @a);
  Log3 $name, 4, "dummy set $name $v";

  readingsSingleUpdate($hash,"state",$v,1);
  return undef;
}

sub
dummy_Define($$)
{
  my ($hash, $def) = @_;
  my @a = split("[ \t][ \t]*", $def);

  return "Wrong syntax: use define <name> dummy" if(int(@a) != 2);
  return undef;
}