Alexas Wecker finden und ggf. eine Lampe damit steuern (FHEM, HUE Lab-Functions)

Begonnen von tschimi, 01 Dezember 2019, 22:06:19

Vorheriges Thema - Nächstes Thema

tschimi

Hi,
bin über das Thema mit Alexa, dem Wecker und Philips-HUE Leuchten gestolpert. Meine Lösung wollte ich mal hier posten:

In der 99_myUtils.pm folgendes einfügen:
#0 = Einmalig,P1D = Täglich,XXXX-WD = An Wochentagen,XXXX-WE = An Wochenenden,XXXX-WXX-1 = Jeden Montag,XXXX-WXX-2 = Jeden Dienstag...XXXX-WXX-7 = Jeden Sonntag
sub getNextAlarm($){
  my ($dev) = @_;
  my $cnt  = ReadingsNum($dev,"alarm_count","");
  my $name = "";
  my $nextWakeUp = "2090-01-01 10:00:00";
  my $recurring ="";
  my $Now = TimeNow();

  my $next_day;
  my $good_date;
  my $date = $nextWakeUp;
  my $amount;

  for (my $j=1; $j<=$cnt; $j++) {
    $name = "alarm_".sprintf("%02d",$j);
    if (ReadingsVal($dev,$name."_status","") eq "on") {
       $date = ReadingsVal($dev,$name."_originalDate","")." ".substr ReadingsVal($dev,$name."_originalTime",""),0,8 ;
$amount = 0;
$recurring = ReadingsVal($dev,$name."_recurring","");
       if ( $date lt $Now ) {
if ($recurring eq "0") {} #Only once -> do nothing
elsif ( $recurring eq "XXXX-WD" ) {
            until ($good_date) {
$amount += 86400;
$next_day = strftime("%a",localtime(time_str2num($date) + $amount));
if ($next_day ne "Sat" && $next_day ne "Sun") {
$good_date = 1;
   $date = strftime("%Y-%m-%d %H:%M:%S",localtime(time_str2num($date) + $amount));
}
}
}
elsif ( $recurring eq "XXXX-WE" ) {
            until ($good_date) {
$amount += 86400;
$next_day = strftime("%a",localtime(time_str2num($date) + $amount));
if ($next_day eq "Sat" && $next_day eq "Sun") {
$good_date = 1;
   $date = strftime("%Y-%m-%d %H:%M:%S",localtime(time_str2num($date) + $amount));
}
}
}
elsif ( $recurring eq "PID" ) { #every day->add 86400s
   $date = strftime("%Y-%m-%d %H:%M:%S",localtime(time_str2num($date) + 86400));
}
elsif ( (substr $recurring,5,3) eq "WXX" ) { #WeekDay -> add 604800s
   $date = strftime("%Y-%m-%d %H:%M:%S",localtime(time_str2num($date) + 604800));
}
}
if ($date lt $nextWakeUp)  {$nextWakeUp = $date;}
}
  }
  return $nextWakeUp;
}

sub HUEsunRise($$){ #device,delay (HUEGroup3,1)
my ($dev, $delay) = @_;
my $cmd;
my @ColCode = ('030100','0B0300','190601','230902','2F0D03','370F03','401204','481405','521806','591007','622108','6E2508','772809','7F2A09','882D0A','90300A','96320A','9D330A','A6360A','B0390A','B0450A','B9480B','C1580B','CB610B','D3650C','D6740C','DC770B','DC810B','E5860B','ED8E12','F2A113','F2B013','F5B51A','F9BA22','FBBD29','FEC232','FFC742','FECC55','FED166','FDD473','FDD880','FEDD8C','FDDF97','FDE4A7','FDEABC','FDEEC8','FDF0D1','FDF3DA','FCF4E2');
for(my $i = 0; $i < @ColCode; $i++) {
$cmd = "set ".$dev." rgb ".$ColCode[$i];
fhem($cmd);
sleep($delay);
}
}


Nun bekommt man immer den nächsten Wecker zurück.
Bei meinem AlexaSpot hab ich in Fhem folgendes Userreading hinzugefügt:
NextWakeUp {getNextAlarm("ECHO_xxxxx")},
NextSunRise {POSIX::strftime("%Y-%m-%dT%H:%M:%S",localtime(time_str2num(ReadingsVal($name,"NextWakeUp",""))-120))},
NextSunDown {POSIX::strftime("%Y-%m-%dT%H:%M:%S",localtime(time_str2num(ReadingsVal($name,"NextWakeUp",""))+300))},
dummy1 {if ((ReadingsVal($name,"NextSunDown","") lt TimeNow() && ReadingsVal($name,"NextSunRise","") ne OldReadingsVal($name,"NextSunRise","")) || !IsDevice("SunUp")) {my $cmd = 'defmod SunUp   at '.ReadingsVal($name,"NextSunRise","").' {HUEsunRise("HUEGroup3",1)}';fhem($cmd);}},
dummy2 {if ((ReadingsVal($name,"NextSunDown","") lt TimeNow() && ReadingsVal($name,"NextSunDown","") ne OldReadingsVal($name,"NextSunDown","")) || !IsDevice("SunDown")) {my $cmd = 'defmod SunDown at '.ReadingsVal($name,"NextSunDown","").' set HUEGroup3 off';fhem($cmd);}}


Ich hole mir den nächsten Alarm und lege ihn in NextWakeUp ab. Dann ziehe ich davon 2min ab und packe das Ergebnis in NextSunRise. 5min drauf für NextSunDown. Also der "Sonnenaufgang" soll 2 min vor der Weckzeit beginnen und nach 5min sollen die Lampen automatisch wieder ausgeschaltet werden.

dummy1 und dummy2 im Userreading erzeugen die Befehle, um den "Sonnenaufgang" zu starten bzw. die Lampen wieder auszuschalten.

Lg, tschimi



tschimi

#1
Hi,
ich habe jetzt noch eine zweite, in meinen Augen bessere, Variante gefunden, um den Sonnenaufgang hinzubekommen. Dieses Mal geht es mit dem Sonnenaufgang aus den HUE-Labfunctions. Der große Vorteil ist, das sich die HUE-Bridge um den Sonnenaufgang kümmert und damit keine loop FHEM "blockiert". Dort einfach einen Sonnenaufgang definieren und dann via FHEM steuern. In der FHEM-Bridge kann man über "get <BRIDGE-Name> schedules detail" schauen, ob alles geklappt hat ;-)

Hier das angepasste Coding

#0 = Einmalig,P1D = Täglich,XXXX-WD = An Wochentagen,XXXX-WE = An Wochenenden,XXXX-WXX-1 = Jeden Montag,XXXX-WXX-2 = Jeden Dienstag...XXXX-WXX-7 = Jeden Sonntag
sub getNextAlarm($$$$){
  my ($dev,$lamp,$idx,$delay) = @_;
  my $cnt  = ReadingsNum($dev,"alarm_count","");
  my $name = "";
  my $nextWakeUp = "2033-01-01 10:00:00";
  my $recurring ="";
  my $Now = TimeNow();

  my $next_day;
  my $good_date;
  my $date = $nextWakeUp;
  my $amount;
  my $cmd="---";

  for (my $j=1; $j<=$cnt; $j++) {
    $name = "alarm_".sprintf("%02d",$j);
    if (ReadingsVal($dev,$name."_status","") ne "off") {
       $date = ReadingsVal($dev,$name."_originalDate","")." ".substr ReadingsVal($dev,$name."_originalTime",""),0,8 ;
$amount = 0;
$recurring = ReadingsVal($dev,$name."_recurring","");
       if ( $date lt $Now ) {
if ($recurring eq "0") {} #Only once -> do nothing
elsif ( $recurring eq "XXXX-WD" ) {
            until ($good_date) {
$amount += 86400;
$next_day = strftime("%a",localtime(time_str2num($date) + $amount));
if ($next_day ne "Sa" && ( $next_day ne "Su" || $next_day ne "So")) {
$good_date = 1;
   $date = strftime("%Y-%m-%d %H:%M:%S",localtime(time_str2num($date) + $amount));
}
}
}
elsif ( $recurring eq "XXXX-WE" ) {
            until ($good_date) {
$amount += 86400;
$next_day = strftime("%a",localtime(time_str2num($date) + $amount));
if ($next_day eq "Sa" && ( $next_day ne "Su" || $next_day ne "So")) {
$good_date = 1;
   $date = strftime("%Y-%m-%d %H:%M:%S",localtime(time_str2num($date) + $amount));
}
}
}
elsif ( $recurring eq "PID" ) { #every day->add 86400s
   $date = strftime("%Y-%m-%d %H:%M:%S",localtime(time_str2num($date) + 86400));
}
elsif ( (substr $recurring,5,3) eq "WXX" ) { #WeekDay -> add 604800s
   $date = strftime("%Y-%m-%d %H:%M:%S",localtime(time_str2num($date) + 604800));
}
}
if ($date lt $nextWakeUp) {$nextWakeUp = $date;}
}
  }
  fhem('set '.$lamp.' disableschedule '.$idx);
  if ( ( time_str2num($date) - time_str2num(TimeNow()) ) < 604800  ) {
    fhem('set '.$lamp.' enableschedule '.$idx);
    $cmd = HUEsetTime($lamp,$idx,$date,$delay);
    fhem($cmd);
  }
  return $nextWakeUp;
}

sub HUEsetTime($$$$){
my ($HUEName,$ID,$WakeTime,$delay) = @_;
my $day =  strftime("%a",localtime(time_str2num($WakeTime) - $delay));
my $time = strftime("/T%H:%M:%S",localtime(time_str2num($WakeTime) - $delay));
my $txt="---";
my $cmd;

if ($day eq "Su" || $day eq "So") {$txt = "W001";}
if ($day eq "Sa")                 {$txt = "W002";}
if ($day eq "Fr")                 {$txt = "W004";}
if ($day eq "Th" || $day eq "Do") {$txt = "W008";}
if ($day eq "We" || $day eq "Mi") {$txt = "W016";}
if ($day eq "Tu" || $day eq "Di") {$txt = "W032";}
if ($day eq "Mo" || $day eq "So") {$txt = "W064";}
$cmd = 'set '.$HUEName.' updateschedule '.$ID.' {"localtime":"'. $txt . $time .'"}';
return $cmd;
}


Viel Spaß damit ;-)

Lg, Tschimi