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 ?
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));}
}
Zitat von: dt2510 am 21 Februar 2017, 11:58:24
könnte das in etwa so gehen ?
Probier's doch einfach aus...
Gruß,
Thorsten
Scheint zu funktionieren :)
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.
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.
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 !?
Hi,
my ($myNewMode) = @_;
Die Klammern werden hier gebraucht. Warum das so ist überlasse ich dem geneigten Leser als Übung. :P
Gruß,
Thorsten
- fehlende perl Grundlagen - Du hast Klammern auch da entfernt, wo sie sein müssen
- Groß-/Kleinschreibung beachten
sub SetFHEMMode($) {
my ($NewMode) = @_;
if ($NewMode eq "Auto") { $NewMode = isday("CIVIL") ? "Day" : "Night"; }
fhem("set FHEMMode $NewMode");
}
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 ?
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
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)
Es geht übrigens noch kürzer:
sub SetFHEMMode {
my $NewMode = shift;
fhem("set FHEMMode ".($NewMode ne 'Auto') ? $NewMode : isday("CIVIL") ? "Day" : "Night");
}
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
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.
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
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.
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 ?
Zitat von: dt2510 am 21 Februar 2017, 14:12:32
Aber fehlt da nicht das ($) bei der Funktion ?
Nein.
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