Hauptmenü

Perl Problem

Begonnen von dt2510, 01 Dezember 2016, 19:37:07

Vorheriges Thema - Nächstes Thema

dt2510

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 ?

CoolTux

Mach mal die ganzen } weg nach den ; bei der fhem Zeile.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Benni

In Perl wird so ein einzeiliges if gerne auch umgekehrt gemacht:

fhem("set HUEGroup0 pct 5") if(($home eq "Away") && ($hue eq "off"));

dt2510

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 ...

CoolTux

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!
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Benni

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");
}

dt2510

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 ...

dt2510

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...

dev0

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.

dt2510

wer lesen kann ist klar im Vorteil ;)