Einfacher Wecker mit vielen Möglichkeiten - jetzt auch aufgepimpt

Begonnen von docb, 20 Dezember 2014, 18:13:39

Vorheriges Thema - Nächstes Thema

docb

Hallo zusammen,
ich habe mir einen kleinen aber feinen Wecker gebastelt. Man kann eine Uhrzeit einstellen und dann werden zum eingestellten Zeitpunkt beliebige Aktionen ausgeführt (z.B. Radio an, etc.). Hier der Code - Verbesserungsvorschläge gerne posten.
Zunächst einen dummy anlegen
define Wecker dummy
attr Wecker alias Wecker stellen
attr Wecker devStateIcon AUS:general_aus@red
attr Wecker group Wecker
attr Wecker icon ring
attr Wecker room Wecker
attr Wecker setList state:AUS,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45,05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45
attr Wecker webCmd state:AUS


Dann noch ein kleines Notify, das nach belieben erweitert werden kann (z.B. durch ein zweites at eine Stunde früher zum Einschalten der Fußbodenheizung u.v.m)

define noWecker notify Wecker {
if (Value("Wecker") eq "AUS")
  { fhem("delete atWecker");;
} else {
  fhem("delete atWecker");;
  fhem("define atWecker at ".Value("Wecker").":00 {Wecken()}");;
  fhem("attr atWecker room Wecker");;
  fhem("attr atWecker group Wecker");;
  fhem("attr atWecker alias Nächster aktiver Wecker:");;
  fhem("attr atWecker icon ring\@@red");;
  }
}


Und zu guter letzt noch in die 99_myUtils.pm, was denn beim "Wecken()" passieren soll (natürlich ebenfalls erweiterbar):
sub
Wecken()
{
  fhem("set Gong_Mp3 playTone 001");
}


Wer in brauchen kann -viel Spaß damit!
Viele Grüße
doc
I love FHEM!

docb

Hallo zusammen,
ich habe den Wecker noch einmal ordentlich aufgepimpt.
Der Wecker kann jetzt folgendes:
- Weckzeit einstellen
- Weckton einstellen (oder mute)
- Fußbodenheizung und Heizung im Bad steuern (als Beispiele, was man so alles machen kann).

Wichtig: damit das addieren und subtrahieren von Zeiten funktioniert (TU_Get_Decrement und TU_Get_Increment), braucht ihr die 99_TimeUtils.pm von hier (http://forum.fhem.de/index.php/topic,14449.msg91796.html#msg91796).

Also erstmal die Dummies:


define Wecker dummy
attr Wecker alias Wecker stellen
attr Wecker devStateIcon Aus:general_aus@red
attr Wecker group Wecker
attr Wecker icon ring
attr Wecker room Wecker
attr Wecker setList state:Aus,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45,05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45
attr Wecker sortby 1
attr Wecker webCmd state:Aus
define Weckton dummy
attr Weckton devStateIcon Lautlos-nur_Heizung:audio_volume_mute@red
attr Weckton eventMap Fliang:201 Hearst_as_net:202 Here_I_am:203 Youll_be_in_my_heart:204 Barefoot:205 Hallelujah:206 Ich_mag:207
attr Weckton group Wecker
attr Weckton icon audio_sound
attr Weckton room Wecker
attr Weckton setList state:Lautlos-nur_Heizung,Fliang,Hearst_as_net,Here_I_am,Youll_be_in_my_heart,Barefoot,Hallelujah,Ich_mag
attr Weckton sortby 2
attr Weckton webCmd state:Lautlos-nur_Heizung
define Wecken_FuBoHe dummy
attr Wecken_FuBoHe alias Fußbodenheizung vor Weckzeit aktivieren
attr Wecken_FuBoHe devStateIcon An:sani_floor_heating@green Aus:general_aus@red
attr Wecken_FuBoHe group Wecker
attr Wecken_FuBoHe icon sani_floor_heating
attr Wecken_FuBoHe room Wecker
attr Wecken_FuBoHe setList state:An,Aus
attr Wecken_FuBoHe sortby 3
attr Wecken_FuBoHe webCmd state:Aus
define Wecken_Bad_Heizen dummy
attr Wecken_Bad_Heizen alias Bad Heizung vor Weckzeit hochfahren
attr Wecken_Bad_Heizen devStateIcon Aus:general_aus@red
attr Wecken_Bad_Heizen group Wecker
attr Wecken_Bad_Heizen icon max_heizungsthermostat
attr Wecken_Bad_Heizen room Wecker
attr Wecken_Bad_Heizen setList state:Aus,19.0,19.5,20.0,20.5,21.0,21.5,22.0
attr Wecken_Bad_Heizen sortby 4
attr Wecken_Bad_Heizen webCmd state:Aus
define HZ_BA_val dummy
attr HZ_BA_val group Variablen
attr HZ_BA_val room Z_Virtual


Hier die Notifys:

define noWecker notify Wecker { WeckerStellen();;}
attr noWecker group Wecker
attr noWecker icon ring
attr noWecker room Z_Notify
define noWecken_FuBoHe notify Wecken_FuBoHe { Wecken_FuBoHe_aktivieren();;;; }
attr noWecken_FuBoHe group Wecker
attr noWecken_FuBoHe icon ring
attr noWecken_FuBoHe room Z_Notify
define noWecken_Bad_Heizen notify Wecken_Bad_Heizen { Wecken_BaHe_aktivieren();; }
attr noWecken_Bad_Heizen group Wecker
attr noWecken_Bad_Heizen icon ring
attr noWecken_Bad_Heizen room Z_Notify
define noWeckton notify Weckton {Wecken_Musik_aktivieren();;;;}
attr noWeckton group Wecker
attr noWeckton icon ring
attr noWeckton room Z_Notify


Und letztlich noch der zugehörige Code aus meiner 99_myUtils.pm (das geht vermutlich noch eleganter, aber ich bin absoluter Perl-Anfänger - und es funktioniert!)


sub
WeckerStellen()
{
if (Value("Wecker") eq "Aus")
{
  fhem("delete atWecker");
  fhem("set Wecken_Bad_Heizen Aus");
  fhem("set Wecken_FuBoHe Aus");
  fhem("delete atWeckerBAHEe");
  fhem("delete atWeckerBAHEs");
  fhem("delete atWeckerBAFUe");
  fhem("delete atWeckerBAFUs");
  fhem("delete atWeckerMusik");
}
else #Wecker wurde aktiviert
{
  my $weckzeit = Value("Wecker").":00";
  fhem("delete atWecker");
  fhem("define atWecker at ".$weckzeit." {Wecken()};");
  fhem("attr atWecker room Wecker");
  fhem("attr atWecker group Aktiv");
  fhem("attr atWecker sortby 1");
  fhem("attr atWecker alias Nächster aktiver Wecker");
  fhem("attr atWecker icon ring\@green");
  Wecken_Musik_aktivieren();
}
}

############Fußbodenheizung
sub
Wecken_FuBoHe_aktivieren()
{
if(Value("Wecken_FuBoHe") eq "Aus") # Fußbodenheizung auf Aus
{
  fhem("delete atWeckerBAFUs");
  fhem("delete atWeckerBAFUe");
}
else                                #Fußbodenheizung auf An 
{
  if(Value("Wecker") eq "Aus")
  {
   fhem("set Wecken_FuBoHe Aus");
   fhem("delete atWeckerBAFUs");
   fhem("delete atWeckerBAFUe");
   return ("Zuerst den Wecker aktivieren");
  }
  else #Wecker an
  {
   my $weckzeit = Value("Wecker").":00";
   my $heizzeit_beginn = TU_Get_Decrement($weckzeit,"01:00:00");
   my $heizzeit_ende = TU_Get_Increment($weckzeit,"00:15:00");
   fhem("define atWeckerBAFUs at ".$heizzeit_beginn." set BA_Fussbodenheizung on");
   fhem("attr atWeckerBAFUs room Wecker");
   fhem("attr atWeckerBAFUs group Aktiv");
   fhem("attr atWeckerBAFUs sortby 3");
   fhem("attr atWeckerBAFUs alias Die Fußbodenheizung startet um");
   fhem("attr atWeckerBAFUs icon sani_floor_heating\@green"); 
   fhem("define atWeckerBAFUe at ".$heizzeit_ende." set BA_Fussbodenheizung off");
   fhem("attr atWeckerBAFUe room Wecker");
   fhem("attr atWeckerBAFUe group Aktiv");
   fhem("attr atWeckerBAFUe sortby 5");
   fhem("attr atWeckerBAFUe alias Heizphase der Fußbodenheizung endet um");
   fhem("attr atWeckerBAFUe icon sani_floor_heating\@green");
  # return ("Ich bin sdfda");
  }
}
}

sub
Wecken_BaHe_aktivieren()
{
if(Value("Wecken_Bad_Heizen") eq "Aus") # Heizen auf Aus
{
  fhem("delete atWeckerBAHEs");
  fhem("delete atWeckerBAHEe");
}
else                                #Heizen auf An 
{
  if(Value("Wecker") eq "Aus")
  {
   fhem("set Wecken_Bad_Heizen Aus");
   fhem("delete atWeckerBAHEs");
   fhem("delete atWeckerBAHEe");
   return ("Zuerst den Wecker aktivieren");
  }
  else #Wecker an
  {
   my $weckzeit = Value("Wecker").":00";
   my $heizzeit_beginn = TU_Get_Decrement($weckzeit,"00:10:00");
   my $heizzeit_ende = TU_Get_Increment($weckzeit,"00:15:00");
   fhem("define atWeckerBAHEs at ".$heizzeit_beginn." {fhem(\"set HZ_BA_val \".ReadingsVal(\"BA_Heizung\",\"state\",\"17.0\"));;;; fhem(\"set BA_Heizung desiredTemperature \".Value(\"Wecker_Bad_Heizen\"));;;;}");
   fhem("attr atWeckerBAHEs room Wecker");
   fhem("attr atWeckerBAHEs group Aktiv");
   fhem("attr atWeckerBAHEs sortby 4");
   fhem("attr atWeckerBAHEs alias Vorheizen des Bades auf ".Value("Wecken_Bad_Heizen")." Grad um");
   fhem("attr atWeckerBAHEs icon max_heizungsthermostat\@green"); 
   fhem("define atWeckerBAHEe at ".$heizzeit_ende." {fhem(\"set BA_Heizung desiredTemperature \".ReadingsVal(\"HZ_BA_val\",\"state\",\"17.0\"));;;;}");
   fhem("attr atWeckerBAHEe room Wecker");
   fhem("attr atWeckerBAHEe group Aktiv");
   fhem("attr atWeckerBAHEs sortby 6");
   fhem("attr atWeckerBAHEe alias Heizphase des Bades endet um");
   fhem("attr atWeckerBAHEe icon max_heizungsthermostat\@green"); 
  }
}
}

####Musik aktivieren
sub
Wecken_Musik_aktivieren()
{
if (Value("Weckton") eq "Lautlos-nur_Heizung") # Musik auf Lautlos
{
  fhem("delete atWeckerMusik");
}
else                                #Musik auf An 
{
  if(Value("Wecker") eq "Aus")
  {
   fhem("delete atWeckerMusik");
  }
  else #Wecker an
  {
   my $weckzeit = Value("Wecker").":00";
   fhem("define atWeckerMusik at ".$weckzeit." set Gong_Mp3 playTone ".Value("Weckton"));
   fhem("attr atWeckerMusik room Wecker");
   fhem("attr atWeckerMusik group Aktiv");
   fhem("attr atWeckerMusik sortby 2");
   fhem("attr atWeckerMusik alias Wecken mit: ".ReadingsVal("Weckton","state", "Fehler"));
   fhem("attr atWeckerMusik icon audio_volume_mid\@green"); 
  }
}
}


Anbei noch zwei Screenshots...
Viele Grüße
doc
I love FHEM!

Rince

Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

m311331

Hi docb,

wollte deinen Wecker die einfache variante übernehmen
aber bekomme im log

2015.01.05 12:32:46 1: PERL WARNING: Subroutine Wecken redefined at ./FHEM/99_myUtils.pm line 36.
2015.01.05 12:34:46 3: delete atWecker : Please define atWecker first
2015.01.05 12:35:55 3: delete atWecker : Please define atWecker first


meine fhem.cfg

################################################# Wecker #################################################################

define Wecker dummy
attr Wecker alias Wecker stellen
attr Wecker devStateIcon AUS:general_aus@red
attr Wecker group Wecker
attr Wecker room Wecker
attr Wecker setList state:AUS,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45,05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45
attr Wecker webCmd state:AUS


define noWecker notify Wecker {\
if (Value("Wecker") eq "AUS")\
  { fhem("delete atWecker");;;;\
} else {\
  fhem("delete atWecker");;;;\
  fhem("define atWecker at ".Value("Wecker").":00 {Wecken()};;");;;;\
  fhem("attr atWecker room Wecker");;;;\
  fhem("attr atWecker group Wecker");;;;\
  fhem("attr atWecker alias Nächster aktiver Wecker:");;;;\
  fhem("attr atWecker icon ring\@@red");;;;\
  }\
}


und in der 99myUtils
sub
Wecken()
{
  fhem("set Sonos_Schlafzimmer PlayURITemp \\\192.168.0.93\\SonosSpeak\\orientwecker.mp3");
}


irgendwas mache ich falsch  :-[
wer kann mir helfen ?


mfg. m311331

docb

Hi,
also die erste Fehlermeldung kommt eigentlich immer, wenn man die 99_myUtils.pm neu lädt (da kommt bei mir eine ganze Latte an subs die ich da definiert habe).
Die anderen Fehlermeldungen kannst du auch getrost ignorieren - die kommen deshalb, weil das notify immer das atWecker löscht ohne zu überprüfen, ob das at wecker überhaupt exisitert.
Fazit: Die Fehlermeldungen sind völlig normal und beeinträchtigen die Funktion in keinster Weise ;-)
Viele Grüße
doc
I love FHEM!

m311331

Hi docb,

erstmal danke für die info
es will noch nicht  :(

bekomme keinen Ton aus meinem Lautsprecher
und im log wird auch nicht mehr angezeigt


mfg. m311331

docb

Ok,
dann tipp doch mal folgendes ins Kommandozeilenfenster ein:
{Wecken();;}

Passiert da etwas?
I love FHEM!

m311331

Hi docb,

es passiert leider nix  ???
im log steht auch nix

mfg. m311331

docb

ok - funktioniert diese Zeile?
set Sonos_Schlafzimmer PlayURITemp \\192.168.0.93\SonosSpeak\orientwecker.mp3
I love FHEM!

Icinger

Wenn ihr das Wecker-Notify so umbaut:

define noWecker notify Wecker {\
if (Value("Wecker") eq "AUS")\
  { fhem("delete atWecker") if (defined($defs{'atWecker'}));;;;\
} else {\
  fhem("delete atWecker") if (defined($defs{'atWecker'}));;;;\
  fhem("define atWecker at ".Value("Wecker").":00 {Wecken()};;");;;;\
  fhem("attr atWecker room Wecker");;;;\
  fhem("attr atWecker group Wecker");;;;\
  fhem("attr atWecker alias Nächster aktiver Wecker:");;;;\
  fhem("attr atWecker icon ring\@@red");;;;\
  }\
}


bekommt ihr auch keine Fehlermeldung mehr.

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

m311331

#10
Hi docb,

ja geht !

-edit-

ein neustart hat geholfen ;D


mfg. m311331

docb

@Icinger, danke für den Tipp, müssten die if-Zeilen nicht so lauten: 
if (defined($defs{'atWecker'})){ fhem("delete atWecker")};;;;

@m311331:
das ist komisch. Wie sieht denn deine 99_myUtils.pm aus - hast du die jetzt neu erstellt für meinen Codeschnipsel? Falls ja, hast du das beachtet: http://www.fhemwiki.de/wiki/99_myUtils_anlegen
Anscheinend funktioniert bei dir der Aufruf der sub "Wecken()" nicht, daher tippe ich mal darauf...
Viele Grüße
doc
I love FHEM!

Icinger

Das ist das gute an Perl.....Das kannst du schreiben, wie du willst, funktonieren tut beides
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Icinger

sub
Wecken()
{
  fhem("set Sonos_Schlafzimmer PlayURITemp \\\192.168.0.93\\SonosSpeak\\orientwecker.mp3");
}


set Sonos_Schlafzimmer PlayURITemp \\192.168.0.93\SonosSpeak\orientwecker.mp3

Finde den Unterschied :p
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

docb

I love FHEM!