FHEM Forum

FHEM => Automatisierung => Thema gestartet von: dt2510 am 01 Dezember 2016, 19:37:07

Titel: Perl Problem
Beitrag von: dt2510 am 01 Dezember 2016, 19:37:07
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 ?
Titel: Antw:Perl Problem
Beitrag von: CoolTux am 01 Dezember 2016, 19:41:56
Mach mal die ganzen } weg nach den ; bei der fhem Zeile.
Titel: Antw:Perl Problem
Beitrag von: Benni am 01 Dezember 2016, 20:02:40
In Perl wird so ein einzeiliges if gerne auch umgekehrt gemacht:

fhem("set HUEGroup0 pct 5") if(($home eq "Away") && ($hue eq "off"));
Titel: Antw:Perl Problem
Beitrag 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 ...
Titel: Antw:Perl Problem
Beitrag von: CoolTux am 02 Dezember 2016, 10:10:10
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!
Titel: Antw:Perl Problem
Beitrag von: Benni am 02 Dezember 2016, 11:28:52
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");
}
Titel: Antw:Perl Problem
Beitrag von: dt2510 am 02 Dezember 2016, 12:26:38
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 ...
Titel: Antw:Perl Problem
Beitrag von: dt2510 am 02 Dezember 2016, 13:01:46
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...
Titel: Antw:Perl Problem
Beitrag von: dev0 am 02 Dezember 2016, 13:14:00
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.
Titel: Antw:Perl Problem
Beitrag von: dt2510 am 02 Dezember 2016, 13:37:23
wer lesen kann ist klar im Vorteil ;)