FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Yil am 10 März 2016, 14:45:47

Titel: Sonos Alarmliste auslesen und Alarmzeiten speichern
Beitrag von: Yil am 10 März 2016, 14:45:47
Hallo zusammen,

hat jemand schonmal die Alarmliste einer Sonos-Box derart auslesen können, dass in einer Dummy-Variablen die Alarmzeiten gespeichert werden, um von dort aus weitere Aktionen wie "Licht an", "Heizung an" etc. zu steuern? Soweit ich das gelesen habe, braucht es hier Know-How mit Perl-Hash-Kommandos.

Konkretes Szenario bei mir:

Alarmzeit - 30 Minuten: Heizung hochsetzen
Alarmzeit: Sonos-Box an, Licht leise hochdimmen

Danke für jede Inspriration,

VG Yil
Titel: Antw:Sonos Alarmliste auslesen und Alarmzeiten speichern
Beitrag von: rapster am 10 März 2016, 15:33:51
Schau dir das hier mal an, nutze ich bei mir um jeweils einige MInuten vor dem nächsten Alarm das licht hochzudimmen.
https://forum.fhem.de/index.php/topic,44682.msg365016.html#msg365016
Titel: Antw:Sonos Alarmliste auslesen und Alarmzeiten speichern
Beitrag von: MarcoE am 10 März 2016, 15:38:56
Hallo,
mein Szenario war ein klein wenig anders. Ich verwende immer den ersten Alarm der Sonos um mich morgens wecken zu lassen und wollte die Kaffeemaschine 40min vorher einschalten lassen. Ebenso sollte bei jeder Änderung dieses Alarms der DOIF/at angepasst werden. Weitere Randbedingung: Kaffeemaschine bitte nur einschalten falls ich tatsächlich zuhause bin (vergesse manchmal den Wecker zu deaktivieren ebenso wie sie wieder auszuschalten- das passiert nach 2h dann auch wieder)
Zuerst ein notify für die Alarmänderung (119 ist bei mir der erste Alarm):
define alarm_update notify Sonos_Wohnzimmer:AlarmListVersion.* {Alarm_Sonos(119)}

Dann hier noch der Perl Code der das DOIF bzw. bei Alarm once das at anlegt und auch löscht:

sub Alarm_Sonos($)
{
  my($alarmId) = @_;
  my $dayList="";
   my $origStartTime= eval(ReadingsVal("Sonos_Wohnzimmer","AlarmList","{}"))->{$alarmId}->{StartTime};
  my $StartTime ="";
  my $tmp ="true";
  my $EndTime="";

  fhem("delete KaffeeAnOnce_$alarmId");
  fhem("delete KaffeeAnDoIf$alarmId");

  my $enabled= eval(ReadingsVal("Sonos_Wohnzimmer","AlarmList","{}"))->{$alarmId}->{Enabled};
  my $once= eval(ReadingsVal("Sonos_Wohnzimmer","AlarmList","{}"))->{$alarmId}->{Recurrence_Once}; 
  my $mon= eval(ReadingsVal("Sonos_Wohnzimmer","AlarmList","{}"))->{$alarmId}->{Recurrence_Monday};
  my $tue= eval(ReadingsVal("Sonos_Wohnzimmer","AlarmList","{}"))->{$alarmId}->{Recurrence_Tuesday};
  my $wed= eval(ReadingsVal("Sonos_Wohnzimmer","AlarmList","{}"))->{$alarmId}->{Recurrence_Wednesday};
  my $thu= eval(ReadingsVal("Sonos_Wohnzimmer","AlarmList","{}"))->{$alarmId}->{Recurrence_Thursday};
  my $fri= eval(ReadingsVal("Sonos_Wohnzimmer","AlarmList","{}"))->{$alarmId}->{Recurrence_Friday};
  my $sat= eval(ReadingsVal("Sonos_Wohnzimmer","AlarmList","{}"))->{$alarmId}->{Recurrence_Saturday};
  my $sun= eval(ReadingsVal("Sonos_Wohnzimmer","AlarmList","{}"))->{$alarmId}->{Recurrence_Sunday};

  ($tmp, $StartTime) = TU_Get_Decrement( $origStartTime, "00:40:00" );
  ($tmp, $EndTime) = TU_Get_Increment( $StartTime, "02:00:00" );
  if ($enabled eq 1)
  {
    if ($once eq 1) {fhem("define KaffeeAnOnce_$alarmId at $StartTime set Kaffeemaschine on-till $EndTime");}
    else
    {
      if ($sun eq 1) {$dayList .="0";}
      if ($mon eq 1) {$dayList .="1";}
      if ($tue eq 1) {$dayList .="2";}
      if ($wed eq 1) {$dayList .="3";}
      if ($thu eq 1) {$dayList .="4";}
      if ($fri eq 1) {$dayList .="5";}
      if ($sat eq 1) {$dayList .="6";}
      fhem("define KaffeeAnDoIf$alarmId DOIF ([$StartTime-$EndTime|$dayList] and [HomeStatus] eq \"1\") (set Kaffeemaschine on) DOELSE (set Kaffeemaschine off)");
    }
  }
}


Vielleicht nicht elegant aber funktioniert. Hatte bisher auch mit Perl noch nichts am Hut. Daher bin auch offen für Verbesserungen...

Viele Grüsse,
Marco
Titel: Antw:Sonos Alarmliste auslesen und Alarmzeiten speichern
Beitrag von: Yil am 10 März 2016, 18:07:54
Super und danke!

@Claudiu: ich hab das mal übernommen, und es wird auch alles soweit angelegt. Das ist ja schon die hohe Kunst der fhem-Programmierung! Kompliment.  :)

Theoretisch könnte man das ganze nicht nur auf die dunkle, sondern auch auf die kalte Jahreszeit beziehen und eigene Temp.Messungen einbauen, aufgrund derer dann z.B. im Bad geheizt wird. 

VG Yil