Randomize an und ausschalt Uhr

785 views
Skip to first unread message

Johan van der Kolk

unread,
Dec 26, 2012, 5:07:53 AM12/26/12
to fhem-...@googlegroups.com

Problemstellung:
Im Urlaub werden einige Lampen und Rollo's automatisch an und aus geschaltet.
Die Zeiten sind fest oder mit sunset/sunrise verbunden.

Nachteil: mit sunset offset kan Ich Lampen anschalten abhängig vom sunset, mit eine bestimmte Distanz zwischen die verschiedene Anschaltzeiten. Ist schon in Ordnung.
Abschalten mach Ich auch in einer bestimmte Sequenz, aber diese Sequenz ist jetzt manuell festgelegt.

Ich möchte die Abschaltzeiten innerhalb eines gewissen window random machen, um zu simulieren das Ich nicht jeden Tag um 23:33 schlafen gehe, aber irgendwo zwischen 22:33 und 00:33, jeder Tag anders.
Dabei soll es natürlich so bleiben das erst im Wohnzimmer das licht aus geht, und dann im Schlafzimmer die lichte an und nachher die rollo runter. Also dieser Sequenz soll bleiben.

Denke als Loesung an eine random Zeit innerhalb -30 +30 minuten die addiert wird zu den original Schaltzeit. Schaffe das noch nicht um das in Perl um zu setzen.

Jemand das schon mal gemacht, oder ein Vorschlag?

m.f.g.

Johan




--
send via http://forum.fhem.de

Rudolf Koenig

unread,
Dec 26, 2012, 6:41:22 AM12/26/12
to fhem-...@googlegroups.com
> Schaffe das noch nicht um das in Perl um zu setzen.

Schade. Vielleicht ist fhem/contrib/98_HOL.pm oder
fhem/contrib/fs20_holidays.sh einen kurzen Blick wert.

rahom

unread,
Dec 26, 2012, 10:29:01 AM12/26/12
to fhem-...@googlegroups.com
Hallo Johannk,
 
wenn noch nicht geschehen, erstelle zB. eine 99_myUtils (siehe hierzu in das Wiki wie das geht) und kopiere den unteren Abschnitt dort hinein.
 
Damit kannst Du so etwas gestalten:
 
define irgendeinname at *{TimeRnd("22:33 ","23:59")}  {\
  fhem ("set lampe1 off");;\
}
 
Aber Achtung bei Übergang auf den nächsten Tag bei 00:00:00 Uhr! 
Dort gibt es ein Problem.
 
----------------- Schnipp ---------------------
 

 ######## TimeRnd Zeit Zufall von bis #############################
# Aufrufbeschreibung: TimeRnd("vzeit","bzeit") 
# vzeit = Startzeitpunkt zB. "07:00:00" oder "07:00"
# bzeit = Endzeitpunkt zB. "07:10:00" oder "07:10"
# TimeRnd = keine 24 Stunden aufaddiert
#
sub TimeRnd($$) {
  my ($h1,$m1,$s1) = split(":", shift);
  my ($h2,$m2,$s2) = split(":", shift);
  $s1 = 0 if(!$s1);
  $s2 = 0 if(!$s2);
  my $t1 = 3600*$h1+60*$m1+$s1;
  my $t2 = 3600*$h2+60*$m2+$s2;
  my $er = int(rand($t2-$t1)+$t1);
 
  return sprintf("%02d:%02d:%02d", $er/3600, ($er/60)%60, $er%60) if($s1);
  return sprintf("%02d:%02d", $er/3600, ($er/60)%60);
}
#

------------------Schnapp ------------------- 
 
 
LG
rahom

Johan van der Kolk

unread,
Dec 26, 2012, 11:47:14 AM12/26/12
to fhem-...@googlegroups.com
Danke, war schon so unterwegs.
bis jetzt hatte ich das gebasteld:

sub randomizetime($)
{
  my $randomizeActive = AttrVal("global", "Away", "False");
  my ($h,$m,$s) = split(":", shift);
  if ($randomizeActive eq "True")
  {
    my $wincenter_inseconds = 3600*$h+60*$m+$s;
    my $offset = (int(rand(3600))-1800);
    my $newswitchtime = $wincenter_inseconds + $offset;
    return sprintf("%02d:%02d:%02d", $newswitchtime/3600, ($newswitchtime/60)%60, $newswitchtime%60)
  }
  else
  {
   return sprintf("%02d:%02d:%02d", $h,$m,$s)
  }

}

Und in prizip macht es eigentlich was Ich wollte. Moechte dazu eigentlich nur ein mal pro tag ein random offset generieren, und nicht jedes mal, und das resultat in ein dummy abspeichern und wieder benuetzen.
Deine loesung ist auch gut, bin jetzt aber neugierig wie man ein Perl Resultat: my $offset = (int(rand(3600))-1800) in ein dummy abspeichert.
Den commandref erklaert das nicht so. {(int(rand(3600))-1800)} klappt auf die commandzeile, aber wen ich versuch das Resultat ab zu speichern, wird der Formul abgespeichert.
Um 24:00 hat auch mein sub ein problem :)

--Johan


2012/12/26 rahom <r.hom...@gmail.com>

--
To unsubscribe from this group, send email to
fhem-users+...@googlegroups.com

rahom

unread,
Dec 26, 2012, 2:03:50 PM12/26/12
to fhem-...@googlegroups.com

Du musst voher ein Dummy defenieren.

zB.:
define myOffset dummy

dann kannst du mit

set myOffset $offset

deine Variable in ein dummy Namens "myOffset" speichern und ist somit weiterhin verfügbar.

LG
rahom

Johan van der Kolk

unread,
Dec 26, 2012, 3:02:17 PM12/26/12
to fhem-...@googlegroups.com
danke, aber das gibt das gleiche, die wert von mein dummy wird "$offset" und nicht wert die im $offset gespeichert ist.
Ubrichens steht mein code in 99_Utils und nicht in einem oneliner, macht das den Unterschied?


--Johan


Johan van der Kolk

unread,
Dec 26, 2012, 4:04:10 PM12/26/12
to fhem-...@googlegroups.com
oke funktioniert, danke!
--Johan


2012/12/26 Johan van der Kolk <johan.va...@gmail.com>
Reply all
Reply to author
Forward
0 new messages