FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ripper am 30 März 2017, 14:25:56

Titel: [Gelöst] Rückgabewert aus Sub kommt in anderer Sub falsch an
Beitrag von: ripper am 30 März 2017, 14:25:56
Hi,

ich habe ein Problem und komme nicht weiter. Ich will meine Rollos morgens abhängig von unseren Weckern, dem Sonnenaufgang oder aber zu einer fixen Zeit öffnen. Soweit so gut dass klappt auch alles. Code kommt gleich.
Jetzt will meine Frau, dass wenn der Rollo zu ihrem Wecker öffnet das ganze schon 5 Minuten vorher passiert. Dafür habe ich hier (https://forum.fhem.de/index.php/topic,57519.msg489463.html#msg489463) im Forum eig. auch schon eine Lösung gefunden.
Ich rufe also aus meiner Sub eine zweite Sub auf und will dann mit dem Rückgabewert aus der zweiten Sub in der ersten weitermachen. Leider hakt es genau hier.
Aber hier erst mal was ich habe.
Zum Rollos öffnen:
sub rollooeffnen($) {
my ($wday) = @_;
my @Wochentage = qw(So Mo Di Mi Do Fr Sa);
my $day = sprintf("%s",
    $Wochentage[$wday],
    );
my $sunrise = sunrise_abs("HORIZON=4");
my $alarmTimeFlo = ReadingsVal('FloHandy','nextAlarmTime','');
my $alarmDayFlo = ReadingsVal('FloHandy','nextAlarmDay','');
my $alarmTimeNessy = ReadingsVal('NessyHandy','nextAlarmTime','');
my $alarmDayNessy = ReadingsVal('NessyHandy','nextAlarmDay','');
my $maxzeit = "10:00:00";
my $zwischenzeit1 = 0;
my $offset = "-600";
my $fahrzeit = 0;
#Wecker Flo stellen
if($day eq $alarmDayFlo) {fhem ("set d_weckerFlo $alarmTimeFlo");
}
else {fhem ("set d_weckerFlo undefined");
}
#Wecker Nessy stellen
if($day eq $alarmDayNessy) {fhem ("set d_weckerNessy $alarmTimeNessy");
}
else {fhem ("set d_weckerNessy undefined");
}
#Zeiten vergleichen
if((ReadingsVal('d_weckerFlo','state','') ne "undefined") and (ReadingsVal('d_weckerFlo','state','') ge $maxzeit)){
   $zwischenzeit1 = $maxzeit;
}
elsif((ReadingsVal('d_weckerFlo','state','') ne "undefined") and (ReadingsVal('d_weckerFlo','state','') ge $sunrise)){
    $zwischenzeit1 = ReadingsVal('d_weckerFlo','state','');
}
else {$zwischenzeit1 = $sunrise}


if((ReadingsVal('d_weckerNessy','state','') ne "undefined") and (ReadingsVal('d_weckerNessy','state','') ge $maxzeit)){
   $fahrzeit = $maxzeit;
}
elsif((ReadingsVal('d_weckerNessy','state','') ne "undefined") and (ReadingsVal('d_weckerNessy','state','') ge $zwischenzeit1)){
    $fahrzeit = ReadingsVal('d_weckerNessy','state','');
}
else {$fahrzeit = $zwischenzeit1}
{Log 3, "[rollooeffnen] -test vorher $fahrzeit "};


$fahrzeit = {timeAdd($fahrzeit,-600)};
{Log 3, "[rollooeffnen] -test nacher $fahrzeit"};


{fhem ("set d_test $fahrzeit")};
#{fhem ("define a_rollooeffnenFahrtzeit at $fahrzeit set TYPE=CUL_HM:FILTER=subType=blindActuator:FILTER=STATE!=auf on");
#}
}                   


und um den offset zu berechnen:


sub timeAdd($$){
   my ($t,$offset) = @_;
   my $rueckgabe = 0;
   my @t = split(/:/,$t);
      $t[2] //= 0;
   my $s = $t[0]*3600 + $t[1]*60 + $t[2] + $offset;


   $rueckgabe = sprintf("%02d:%02d:%02d", $s/3600, ($s/60)%60, $s%60);
   {Log 3, "[timeAdd] $rueckgabe"}
   return($rueckgabe);
}



Hier kommen noch die Logeinträge die ich eingebaut habe:
2017.03.30 13:53:01 3: [rollooeffnen] -test vorher 07:34:13
2017.03.30 13:53:01 3: [timeAdd] 07:24:13
2017.03.30 13:53:01 3: [rollooeffnen] -test nacher HASH(0x3c4ac08)


Der übergebene Wert passt, auch in der "timeAdd" Sub stimmt der Wert. Erst wenn es in der ersten Sub weiter gehen soll passt es nicht mehr.
Ich hab vom Programmieren leider wenig Ahnung und wäre sehr froh über eine kurze Erklärung was hier schief läuft, da ichs gern verstehen würde.

Vielen Dank schon mal für eure Hilfe. Wenn ich noch irgendwelche Infos liefern soll bitte einfach sagen!
Viele Grüße
Flo
Titel: Antw:Rückgabewert aus Sub kommt in anderer Sub falsch an
Beitrag von: DeeSPe am 30 März 2017, 15:39:56
Zitat$fahrzeit = {timeAdd($fahrzeit,-600)};

Das passt nicht!
Sollte so:
$fahrzeit = timeAdd($fahrzeit,-600);

Ob das schon die Lösung des Problems ist kannst Du dann berichten.
Ich denke das ist es.

Gruß
Dan
Titel: Antw:Rückgabewert aus Sub kommt in anderer Sub falsch an
Beitrag von: ripper am 30 März 2017, 15:43:36
mega  ;D

es geht!!
Vielen Dank für die schnelle Hilfe!!

Gruß
Flo