[Gelöst] Rückgabewert aus Sub kommt in anderer Sub falsch an

Begonnen von ripper, 30 März 2017, 14:25:56

Vorheriges Thema - Nächstes Thema

ripper

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

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

ripper

mega  ;D

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

Gruß
Flo