FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: dt2510 am 21 Februar 2017, 11:18:06

Titel: richtige Perl Syntax
Beitrag von: dt2510 am 21 Februar 2017, 11:18:06
Als Neuling in Perl hab' ich immer noch das ein oder andere Problem.
Ich habe zu meinen Lampen/Rolläden noch zusätzliche Steuerinformationen in Dummies gespeichert. Um nicht für jeden Aktor den Quelltext kopieren zu müssen,
würde ich gerne einer Funktion den Namen des Aktors übergeben und mir die Dummy-Namen daraus zusammenbauen.

Beispiel:

Schalter Definition
define FGS212_ID10 ZWave xxxxxxxx 10

Dummies
define FGS212_ID10_AwayDay dummy
define FGS212_ID10_AwayNight dummy
define FGS212_ID10_AwayAuto dummy
...
define HomeStatus dummy
attr HomeStatus setlist Home Bed Away Holiday


Parameter: FGS212_ID10
HomeStatus: "Away"
isday("Civil") ist TRUE (also Tag)

Variable 1: FGS212_ID10_ + HomeStatus + Auto => FGS212_ID10_AwayAuto
Variable 2: FGS212_ID10_ + HomeStatus + Day => FGS212_ID10_AwayDay
Variable 3: FGS212_ID10_ + HomeStatus + Night => FGS212_ID10_AwayNight

wenn Variable 1 jetzt "on" ist (also automatisch geschaltet werden soll) soll der Aktor im Parameter auf den Inhalt von Variable 2 bzw. 3 gesetzt werden je nach Tageszeit (hier: Variable 2)

Wie kann ich die Variablennamen in Perl zusammensetzen ?
Titel: Antw:richtige Perl Syntax
Beitrag von: dt2510 am 21 Februar 2017, 11:58:24
könnte das in etwa so gehen ?

sub SetDevice($) {
  my ($device) = @_;
  my ($home) = Value("HomeStatus");
  my ($auto) = $device."_".$home."Auto";
  my ($day) = $device."_".$home."Day";
  my ($night) = $device."_".$home."Night";
  if (isday("CIVIL") && (Value($auto) eq "on")) {fhem("set $device ".Value($day));}
  if (!isday("CIVIL") && (Value($auto) eq "on")) {fhem("set $device ".Value($night));}
}
Titel: Antw:richtige Perl Syntax
Beitrag von: Thorsten Pferdekaemper am 21 Februar 2017, 11:59:30
Zitat von: dt2510 am 21 Februar 2017, 11:58:24
könnte das in etwa so gehen ?
Probier's doch einfach aus...
Gruß,
   Thorsten
Titel: Antw:richtige Perl Syntax
Beitrag von: dt2510 am 21 Februar 2017, 12:25:29
Scheint zu funktionieren :)
Titel: Antw:richtige Perl Syntax
Beitrag von: betateilchen am 21 Februar 2017, 12:38:29
Trotzdem sind in Deinem Konstrukt viel zu viele Klammern, wo keine hingehören und die in anderen Szenarien durchaus zu Problemen führen können.

Tipp: Beschäftige Dich mit den absoluten perl Grundlagen - denn die sind nicht FHEM-spezifisch.

Titel: Antw:richtige Perl Syntax
Beitrag von: dt2510 am 21 Februar 2017, 12:54:46
Ich hab' es mal angepasst. Der Dummy "FHEMMode" enthält schon "Day" bzw. "Night", kann also dierekt ausgewertet werden.

sub SetDevice($) {
  my $myDevice = @_;
  my $myHomeStatus = Value("HomeStatus");
  my $myFHEMMode = Value("FHEMMode");
  my $myAuto = $myDevice."_".$myHomeStatus."Auto";
  my $myDefault = $myDevice."_".$myHomeStatus.$myFHEMMode;
  if (Value($myAuto) eq "on") {fhem("set $myDevice ".Value($myDefault));}
}


Ich wüsste nicht, wo ich jetzt noch Klammern einsparen könnte (ich komme ursprünglich von Pascal/Delphi und programmiere hauptsächlich IBM/370 Assembler ;) ). Falls doch wäre ich für einen Hinweis dankbar.
Titel: Antw:richtige Perl Syntax
Beitrag von: dt2510 am 21 Februar 2017, 13:28:56
Noch eine Frage ... wo liegt hier der Fehler ?

sub SetFHEMMode($) {
  my $myNewMode = @_;
  my $myAutoMode = "Day";
  if (!isday("Civil")) {$myAutoMode = "Night";}
  if ($myNewMode eq "Auto") {$myNewMode = $myAutoMode;}
  fhem("set FHEMMode $myNewMode");
}


Es wird "Day", "Night" oder "Auto" übergeben. Im Falle von "Auto" soll der Wert entsprechend der Tageszeit in "Day" oder "Night" geändert werden.
FHEMMode hat nach Aufruf der Funktion aber nicht den Wert "Day" sondern 1 !?
Titel: Antw:richtige Perl Syntax
Beitrag von: Thorsten Pferdekaemper am 21 Februar 2017, 13:35:20
Hi,

my ($myNewMode) = @_;

Die Klammern werden hier gebraucht. Warum das so ist überlasse ich dem geneigten Leser als Übung.  :P
Gruß,
  Thorsten
Titel: Antw:richtige Perl Syntax
Beitrag von: betateilchen am 21 Februar 2017, 13:39:14


sub SetFHEMMode($) {
  my ($NewMode) = @_;
  if ($NewMode eq "Auto") { $NewMode = isday("CIVIL") ? "Day" : "Night"; }
  fhem("set FHEMMode $NewMode");
}

Titel: Antw:richtige Perl Syntax
Beitrag von: dt2510 am 21 Februar 2017, 13:41:17
Hat funktioniert ...

Also ich bin seit 26 Jahren Programmierer (angefangen hab' ich vor über 30 Jahren) , aber Perl ist im Vergleich zum Rest alles andere als logisch.
In meinem Beispiel von oben müsste es dann analog
my ($myDevice) = @_;
sein oder ?

Titel: Antw:richtige Perl Syntax
Beitrag von: Thorsten Pferdekaemper am 21 Februar 2017, 13:47:22
Zitat von: dt2510 am 21 Februar 2017, 13:41:17aber Perl ist im Vergleich zum Rest alles andere als logisch.
Im Prinzip gebe ich Dir Recht, aber nicht in diesem Fall.

Zitat
In meinem Beispiel von oben müsste es dann analog
my ($myDevice) = @_;
sein oder ?
Ja.
Gruß,
   Thorsten
Titel: Antw:richtige Perl Syntax
Beitrag von: betateilchen am 21 Februar 2017, 13:47:42
Zitat von: dt2510 am 21 Februar 2017, 13:41:17
aber Perl ist im Vergleich zum Rest alles andere als logisch.

Ich programmiere auch seit über 30 Jahren und bin zu folgender Erkenntnis gelangt:

perl ist nicht unlogisch, es ist einfach nur "anders" - aber in vielen Fällen sehr viel flexibler als andere Programmiersprachen.




Ich habe auch mal Finnisch gelernt. Das ist auch eine Sprache, in der alles "anders" ist - aber sicher nicht unlogisch 8)
Titel: Antw:richtige Perl Syntax
Beitrag von: betateilchen am 21 Februar 2017, 13:54:12
Es geht übrigens noch kürzer:



sub SetFHEMMode {
  my $NewMode = shift;
  fhem("set FHEMMode ".($NewMode ne 'Auto') ? $NewMode : isday("CIVIL") ? "Day" : "Night");
}


Titel: Antw:richtige Perl Syntax
Beitrag von: Thorsten Pferdekaemper am 21 Februar 2017, 14:00:12
Hi,
wenn man jetzt noch die Variablennamen kürzt, dann wird es noch weniger...
Zu dem Teil hier:

sub SetFHEMMode {
  my $NewMode = shift;

Da ist mir doch etwas zu viel "implizit".
Gruß,
   Thorsten
Titel: Antw:richtige Perl Syntax
Beitrag von: betateilchen am 21 Februar 2017, 14:05:23
Zitat von: Thorsten Pferdekaemper am 21 Februar 2017, 14:00:12
wenn man jetzt noch die Variablennamen kürzt, dann wird es noch weniger...

Hab ich doch schon längst gemacht.

Zitat von: Thorsten Pferdekaemper am 21 Februar 2017, 14:00:12
Da ist mir doch etwas zu viel "implizit".

Aber es ist korrekte Syntax.
Titel: Antw:richtige Perl Syntax
Beitrag von: Thorsten Pferdekaemper am 21 Februar 2017, 14:09:02
Zitat von: betateilchen am 21 Februar 2017, 14:05:23
Hab ich doch schon längst gemacht.
Ich meinte so:

sub SetFHEMMode {
  my $m = shift;
  fhem("set FHEMMode ".($m ne 'Auto') ? $m : isday("CIVIL") ? "Day" : "Night");
}

Gruß,
   Thorsten
Titel: Antw:richtige Perl Syntax
Beitrag von: betateilchen am 21 Februar 2017, 14:11:30
Es geht auch noch performanter... ganz ohne fhem():



sub SetFHEMMode {
  my $m = shift;
  CommandSet(undef,"FHEMMode ".($m ne 'Auto') ? $m : isday("CIVIL") ? "Day" : "Night");
}



und selbst die Zuweisung zu $m könnte man noch weglassen, wenn man mit $_ arbeitet.
Titel: Antw:richtige Perl Syntax
Beitrag von: dt2510 am 21 Februar 2017, 14:12:32
Also meine komplette 99_myUtils.pm passt (noch) auf 2 Bildschirmseiten. Soo kurz muss es dann nicht sein. Ich will schließlich in 1-2 Jahren noch wissen, was ich da wieso gemacht habe :)

Aber fehlt da nicht das ($) bei der Funktion ? Also
sub SetFHEMMode($) {...
Oder kann ich das mit "shift" weglassen ?
Titel: Antw:richtige Perl Syntax
Beitrag von: betateilchen am 21 Februar 2017, 14:17:53
Zitat von: dt2510 am 21 Februar 2017, 14:12:32
Aber fehlt da nicht das ($) bei der Funktion ?

Nein.
Titel: Antw:richtige Perl Syntax
Beitrag von: Thorsten Pferdekaemper am 21 Februar 2017, 17:19:11
Zitat von: dt2510 am 21 Februar 2017, 14:12:32Oder kann ich das mit "shift" weglassen ?
Ich würde mal sagen: Ja, aber ohne shift auch.
SCNR