Ich fange gerade an mich in Perl einzuarbeiten (kenne aber Java, C, php, Delphi...) und stoße immer wieder auf Probleme.
Ich habe zwei Dummy Devices FHEMMode (Day, Night) und HomeStatus (Home, Night, Away, Holiday), außerdem ein HUEDevice und eine HUEGroup.
Geschaltet werden soll HUEGroup0 nachts (FHEMMode Night) wenn das Licht aus ist (HUEDevice1 off)
- auf 5% wenn HomeStatus Away
- auf 100% wenn HomeStatus Home
Zu allen anderen Zeiten/Bedingungen auf 0%.
Hier mal mein Code (neben anderen - funtionierenden Routinen - in der Datei 99_myUtils.pm):
sub Licht() {
my ($mode) = ReadingsVal("FHEMMode","state","");
my ($home) = ReadingsVal("HomeStatus","state","");
my ($hue) = ReadingsVal("HUEDevice1","state","");
if ($mode eq "Night") {
if (($home eq "Away") && ($hue eq "off")) {fhem("set HUEGroup0 pct 5");}
if (($home eq "Home") && ($hue eq "off")) {fhem("set HUEGroup0 pct 100");}
} else {
{fhem("set HUEGroup0 pct 0");}
}
}
Lasse ich mir $mode, $home oder $hue per return zurückliefern, bekomme ich den korrekten Inhalt angezeigt. Es wird aber IMMER der else-Zweig ausgeführt. Kann mir jemand sagen wo mein Fehler liegt ?
Mach mal die ganzen } weg nach den ; bei der fhem Zeile.
In Perl wird so ein einzeiliges if gerne auch umgekehrt gemacht:
fhem("set HUEGroup0 pct 5") if(($home eq "Away") && ($hue eq "off"));
Ich hab' es jetzt folgendermaßen gelöst:
sub Licht() {
my ($mode) = ReadingsVal("FHEMMode","state","");
my ($home) = ReadingsVal("HomeStatus","state","");
my ($hue) = ReadingsVal("HUEDevice1","state","");
if (($mode eq "Night") && ($hue eq "off") && ($home eq "Away")) {
{fhem("set HUEGroup0 pct 5");}
}
if (($mode eq "Night") && ($hue eq "off") && ($home eq "Home")) {
{fhem("set HUEGroup0 pct 100");}
}
if ($mode eq "Day") {
{fhem("set HUEGroup0 pct 0");}
}
}
das funktioniert ...
Zitat von: dt2510 am 02 Dezember 2016, 10:00:56
Ich hab' es jetzt folgendermaßen gelöst:
sub Licht() {
my ($mode) = ReadingsVal("FHEMMode","state","");
my ($home) = ReadingsVal("HomeStatus","state","");
my ($hue) = ReadingsVal("HUEDevice1","state","");
if (($mode eq "Night") && ($hue eq "off") && ($home eq "Away")) {
{fhem("set HUEGroup0 pct 5");}
}
if (($mode eq "Night") && ($hue eq "off") && ($home eq "Home")) {
{fhem("set HUEGroup0 pct 100");}
}
if ($mode eq "Day") {
{fhem("set HUEGroup0 pct 0");}
}
}
das funktioniert ...
sub Licht() {
my ($mode) = ReadingsVal("FHEMMode","state","");
my ($home) = ReadingsVal("HomeStatus","state","");
my ($hue) = ReadingsVal("HUEDevice1","state","");
if ($mode eq "Night" && $hue eq "off" && $home eq "Away") {
fhem("set HUEGroup0 pct 5");
}
if ($mode eq "Night" && $hue eq "off" && $home eq "Home") {
fhem("set HUEGroup0 pct 100");
}
if ($mode eq "Day") {
fhem("set HUEGroup0 pct 0");
}
}
Geht auch und ist sauberer Code!
Ich darf auch noch ein wenig beim Aufräumen helfen? ;)
sub Licht() {
my ($mode) = ReadingsVal("FHEMMode","state","");
my ($home) = ReadingsVal("HomeStatus","state","");
my ($hue) = ReadingsVal("HUEDevice1","state","");
fhem("set HUEGroup0 pct 5") if (($mode eq "Night") && ($hue eq "off") && ($home eq "Away"));
fhem("set HUEGroup0 pct 100") if (($mode eq "Night") && ($hue eq "off") && ($home eq "Home"));
fhem("set HUEGroup0 pct 0") if ($mode eq "Day");
}
Je übersichtlicher desto besser, aber ich befürchte ich muss die Arbeitsweise meiner Anlage nochmal genauer durchdenken und Schritt für Schritt die 99_myUtils.pm neu aufbauen.
Mit jeder Funktion die ich - erfolgreich getestet - einbaue, funktioniert eine andere nicht mehr ...
Einen Fehler hab' ich wohl gerade gefunden. Kann es sein, daß es einen Unterschied zwischen fhem("set ... und fhem("setstate ... gibt ? Im Falle von setstate scheint das zugehörige notify in FHEM nicht ausgeführt zu werden...
commandref/setstate:
ZitatNo signals will be sent to the device, no events will be generated, and no eventMap or stateFormat translation will be done either.
wer lesen kann ist klar im Vorteil ;)