FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Fixel2012 am 17 Dezember 2017, 16:56:52

Titel: MyUtils.pm Zahlen wert Berechnen und in at ausführen
Beitrag von: Fixel2012 am 17 Dezember 2017, 16:56:52
Guten Abend,

ich habe vorhin im Haus in einem at, was du Rollläden herunterfährt, alle fixen Prozent zahlen auf "{Rollladen_Winter_Sommer}". Dies ist eine Subroutine, die entweder die Zahl "0" oder "35" ausgibt.

Somit will ich erreichen, dass im Winter die Rollläden ganz herunter fahren und im Sommer nur auf 35%.

Im Log wird mir gesagt, dass es keine dezimal zahl ist. Anscheinend wird die Subroutine nicht aufgerufen und berechnet, sondern nur als string genommen?!

Zitatset EG.Esszimmer dim {Rollladen_Winter_Sommer} : Error: {Rollladen_Winter_Sommer} is not a decimal number

Meine at definition:


Internals:
   COMMAND    set UG.Schlafzimmer dim {Rollladen_Winter_Sommer};set 1OG.Bad dim {Rollladen_Winter_Sommer};sleep 3 quiet;set 1OG.Flur dim {Rollladen_Winter_Sommer};set 1OG.Martina dim {Rollladen_Winter_Sommer};sleep 4 quiet;set 1OG.Rolf_Links dim {Rollladen_Winter_Sommer};set 1OG.Rolf_Rechts dim {Rollladen_Winter_Sommer};sleep 3 quiet;set EG.Wohnzimmer_Rechts dim {Rollladen_Winter_Sommer};set EG.Wohnzimmer_Mitte_Rechts dim {Rollladen_Winter_Sommer};sleep 3 quiet;set EG.Wohnzimmer_Mitte_Links dim {Rollladen_Winter_Sommer};set EG.Wohnzimmer_Links dim {Rollladen_Winter_Sommer};sleep 4 quiet;set EG.Kueche dim {Rollladen_Winter_Sommer};set EG.Bad dim {Rollladen_Winter_Sommer};set EG.Flur dim {Rollladen_Winter_Sommer};sleep 60 quiet;{ if (((ReadingsVal("FDGK_Wohnzimmer","state","") eq "closed") || (ReadingsVal("FDGK_Wohnzimmer","state","") eq "tilted")) && (ReadingsVal("Esszimmer_Rollladen_dummy","state","") eq "on")) {fhem ("set EG.Esszimmer dim {Rollladen_Winter_Sommer}") }};set Markise_Links rein;set Markise_Rechts rein
   DEF        *{sunset(-1200)} set UG.Schlafzimmer dim {Rollladen_Winter_Sommer};set 1OG.Bad dim {Rollladen_Winter_Sommer};sleep 3 quiet;set 1OG.Flur dim {Rollladen_Winter_Sommer};set 1OG.Martina dim {Rollladen_Winter_Sommer};sleep 4 quiet;set 1OG.Rolf_Links dim {Rollladen_Winter_Sommer};set 1OG.Rolf_Rechts dim {Rollladen_Winter_Sommer};sleep 3 quiet;set EG.Wohnzimmer_Rechts dim {Rollladen_Winter_Sommer};set EG.Wohnzimmer_Mitte_Rechts dim {Rollladen_Winter_Sommer};sleep 3 quiet;set EG.Wohnzimmer_Mitte_Links dim {Rollladen_Winter_Sommer};set EG.Wohnzimmer_Links dim {Rollladen_Winter_Sommer};sleep 4 quiet;set EG.Kueche dim {Rollladen_Winter_Sommer};set EG.Bad dim {Rollladen_Winter_Sommer};set EG.Flur dim {Rollladen_Winter_Sommer};sleep 60 quiet;{ if (((ReadingsVal("FDGK_Wohnzimmer","state","") eq "closed") || (ReadingsVal("FDGK_Wohnzimmer","state","") eq "tilted")) && (ReadingsVal("Esszimmer_Rollladen_dummy","state","") eq "on")) {fhem ("set EG.Esszimmer dim {Rollladen_Winter_Sommer}") }};set Markise_Links rein;set Markise_Rechts rein
   NAME       Sonnenuntergang
   NR         142
   NTM        16:41:51
   PERIODIC   yes
   RELATIVE   no
   REP        -1
   STATE      Next: 16:41:51
   TIMESPEC   {sunset(-1200)}
   TRIGGERTIME 1513611711
   TRIGGERTIME_FMT 2017-12-18 16:41:51
   TYPE       at
   READINGS:
     2017-07-14 13:05:41   Uhrzeit         sunset()
     2017-12-17 16:41:32   state           Next: 16:41:51
Attributes:
   room       ZWave


und meine Subroutine in MyUtils.pm:

sub Rollladen_Winter_Sommer(){

use Time::Local;

my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat,
    $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);

$Jahr += 1900;
$Monat +=1;

my $temperature = ReadingsVal("Aussen_Thermometer", "temperature", "");
my $Winter_Sommer = 0; #0 ist Winter, Sommer ist 1
my $Rollladenhoehe = "";

if ($Monat == 9 || $Monat == 10 || $Monat == 11 || $Monat == 12 || $Monat == 1 || $Monat == 2 || $Monat == 3 || $Monat == 4 || $Monat == 5) {

$Winter_Sommer = 0;

}

elsif ($Monat == 2 || $Monat == 3 || $Monat == 4 || $Monat == 5 || $Monat == 6 || $Monat == 7 || $Monat == 8 || $Monat == 9 || $Monat == 10) {

$Winter_Sommer = 1;

}

if ($temperature <= 10 && $Winter_Sommer == 0) {

$Rollladenhoehe = "0";

}

if ($temperature >= 10 && $Winter_Sommer == 1) {

$Rollladenhoehe = "35";

}

return $Rollladenhoehe;



}


War ehrlich gesagt recht stolz auf mich, dass diese Berechnung an sich klappt. Wenn ich "{Rollladen_Winter_Sommer}" in die FHEM command line eingebe, bekomme ich auch die richtige Rückmeldung.

Wieso geht das bei dem at nicht?

Würde mich freuen, wenn mir das jemand etwas näher bringen könnte.  :o

Danke und Gruß,

Fixel
Titel: Antw:MyUtils.pm Zahlen wert Berechnen und in at ausführen
Beitrag von: Otto123 am 17 Dezember 2017, 17:09:07
Hallo Fixel,

ganz schnell geschaut, das hier
$Rollladenhoehe = "35"
Wird ein String! "<Zahl>"

Zitatis not a decimal number
$Bla = <Zahl>
$Rollladenhoehe = 35
wäre eine Zahl -> decimal number  8)


Gruß Otto
Titel: Antw:MyUtils.pm Zahlen wert Berechnen und in at ausführen
Beitrag von: betateilchen am 17 Dezember 2017, 17:15:06
Du versuchst, einen fhem Befehl und perl Code zu vermischen. So einfach geht das aber nicht.


{fhem(,,set EG.Esszimmer dim".Rolladen_Winter_Sommer())}


sollte funktionieren. Die Hochkomma müssen immer oben stehen, das hat mein ipad grade vermurkstö
Titel: Antw:MyUtils.pm Zahlen wert Berechnen und in at ausführen
Beitrag von: betateilchen am 17 Dezember 2017, 17:16:51
@Otto du liegst mal wieder komplett falsch. Schau doch nochmal die Fehlermeldung genau an, es geht doch gar nicht um die Zahl. Und perl wäre es an dieser Stelle völlig egal, ob da 35 oder ,,35" steht.
Titel: Antw:MyUtils.pm Zahlen wert Berechnen und in at ausführen
Beitrag von: Damian am 17 Dezember 2017, 17:45:05
Du musst den Perlteil bei set zusätzlich in runde Klammern setzen, damit er als solcher erkannt wird, also:

set UG.Schlafzimmer dim {(Rollladen_Winter_Sommer)}...
Titel: Antw:MyUtils.pm Zahlen wert Berechnen und in at ausführen
Beitrag von: betateilchen am 17 Dezember 2017, 18:07:33
Das ist obskure FHEM Syntax...
Titel: Antw:MyUtils.pm Zahlen wert Berechnen und in at ausführen
Beitrag von: Fixel2012 am 17 Dezember 2017, 20:18:26
Vielem Dank an alle!

Damians Lösung konnte ich am besten in mein bestehenden Code einarbeiten. Funktioniert nun super!

Danke und Gruß,

Fixel