Einfacher Wecker mit vielen Möglichkeiten - jetzt auch aufgepimpt

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

Vorheriges Thema - Nächstes Thema

sasquuatch

#30
ich habe mir mal die notify von blueberry angeschaut und angepasst, damit bekomme ich ein at noZschaltuhr unter unsorted.

define noZschaltuhr notify Wecker_Uhrzeit {\
if (Value("Zschaltuhr_zeit") eq "AUS")\
  { fhem("delete atZschaltuhr");;;;\
  } else {\
  fhem("delete atZschaltuhr");;;;\
  fhem("define atZschaltuhr at ".Value("Wecker_Uhrzeit").":00 set ".Value("Kaffeemaschine")." on");;;;\
  }\
}


mal schauen ob er gleich auch schaltet.

jetzt noch eine frage, wie schaffe ich es noch ein 2. dummy einzubinden?
define Wecker_Wochentag dummy
attr Wecker_Wochentag alias Wecker Wochentag stellen
attr Wecker_Wochentag devStateIcon Aus:general_aus@red
attr Wecker_Wochentag room Wecker
attr Wecker_Wochentag setList state:AUS,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag,Montag-Freitag,Samstag-Sonntag
attr Wecker_Wochentag webCmd state:Aus

docb

Viele Wege führen nach Rom  ;)
Also wenn du zwei Dummys machst, brauchst du zwei Notifys. Da würde ich dann beide auf die 99_myUtils.pm umlenken. Um die wirst du eh nicht drum rum kommen, das ist wirklich die beste Lösung für mehr Code. Also quasi
define noUhrzeit notify Wecker_Uhrzeit { Weckfunktion_aktivieren(); }
define noWochentag notify Wecker_Wochentag { Weckfunktion_aktivieren(); }


und dann in der 99myUtils.pm

sub
Weckfunktion_aktivieren()
{
  Und hier deinen Code also
schauen ob Tag UND Uhrzeit gesetzt sind, wenn ja, dann define at, wenn nein, dann lösch die ats
}


Verständlich?
I love FHEM!

sasquuatch

also die kaffeemaachine ist erst angegangen nachdem ich folgendes umgeschrieben habe
fhem("define atZschaltuhr at *".Value("Wecker_Uhrzeit").":00 set Kaffeemaschine on");;\ 

mit den 99myUtils.pm möchte ich mich auf jedenfall noch auseinandersetzen, weil ich deinen gepimpten Wecker optisch toll finde, dass man sieht welcher Dummy wann aktiv ist und wann aus. was du erklärt hast verstehe ich soweit, muss es nur mal die tage irgendwie umsetzen. ich wollte halt erst klein anfangen. aber muss das nicht enthalten sein?
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}
1;

zumindest stand es in dem link den mir dazu gepostet hast, wie man die 99myUtils.pm erstellt :S

docb

Moin!
Na super, du näherst dich dem Ziel  ;) Bei der folgenden Zeile kannst ud auch noch den \ am Ende weglassen.

fhem("define atZschaltuhr at *".Value("Wecker_Uhrzeit").":00 set Kaffeemaschine on");;\

Wichtig: bei Perl-Code, den du innerhalb von notifys oder ats machst, müssen die Zeilen immer mit ;; enden, in der 99myUtils.pm enden die gleichen Zeilen mit einem ;

Und ja - der Code muss mit rein, insgesamt schaut das in der 99myUtils so aus:

package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

sub
Weckfunktion_aktivieren()
{
  Und hier deinen Code also
schauen ob Tag UND Uhrzeit gesetzt sind, wenn ja, dann define at, wenn nein, dann lösch die ats
}

sub
ne_andereFunktion()
{
  bra bra;
}
etc.
1;


Noch ein Tipp, schau mal, dass deine Emailfunktion läuft (http://www.fhemwiki.de/wiki/E-Mail_senden).
Dann kannst du dir in deine Funktionen ab und zu mal eine Email einbauen und an dich selbst schicken lassen, um zu testen, ob er in die If-Bedingung reingehüpft ist. Das hilft manchmal, wenn nix passiert. Die löscht du natürlich wieder raus, wenn alles klappt. Ist nur ein kleiner Debugger.
I love FHEM!

kasslerks

#34
Hallo docb

Muss das Thema mal wieder herbei holen.

Ich hab vor längerer Zeit dein Wecker hier übernommen klappt auch alles wunder bar.
Nur hab ich mir noch eine Sache eingebaut da ich meist schwer aus dem Bett komme

sub
Wecken_Licht_aktivieren()
{
if (Value("Gemein") eq "Aus") # Licht aus
{
  fhem("delete atWeckerGemein") if (defined($defs{'atWeckerGemein'}));
}
else                                #Licht An 
{
  if(Value("Wecker") eq "Aus")
  {
   fhem("delete atWeckerGemein") if (defined($defs{'atWeckerGemein'}));
  }
  else #Wecker an
  {
   my $weckzeit = Value("Wecker").":00";
   my $Licht_an = TU_Get_Increment($weckzeit,"00:05:00");
   fhem("define atWeckerGemein at ".$Licht_an." set SZ.Licht on;sleep 0.5;set SZ.Licht off;sleep 0.5;set SZ.Licht on;sleep 0.5;set SZ.Licht off;sleep 0.5;set SZ.Licht on");
   fhem("attr atWeckerGemein room Wecker");
   fhem("attr atWeckerGemein group Aktiv");
   fhem("attr atWeckerGemein alias Wecken mit Licht: ".ReadingsVal("Gemein","state", "Fehler")); 
  }
}
}


das ganze klappt auch ohne größere Probleme nur das er das Licht auch beim einstellen des Weckers gleich startet.

Das heißt ich Stelle z.B den Wecker auf 12 Uhr dann schaltet er das Licht gleich ein so wie es im at steht.
Und um 12:05 Uhr geht es dann auch wie gewünscht an.
Aber wie kann ich das jetzt verhindern das er das Licht beim Programmieren des Weckers einschaltet?

LG

docb

Hi,
also ehrlich gesagt kann ich mir nicht erklären, wieso das Licht gleich angeht. Ich finde keine Zeile, die das Licht sofort schalten würde. Auch deine Zeichen scheinen zu passen. Sorry, ich bin ratlos
viele Grüße
doc
I love FHEM!

sasquuatch

#36
Ich mal wieder. Leider habe ich das Projekt etwas auf Eis gelegt, da sich mein Kater Anfang des Jahres das Bein gebrochen hat. Danach hat es lange gedauert bis ich mich wieder an den Wecker bzw. Dummys mit notifys und der 99 utils versucht habe. Ich habe inzwischen einige einfache Dummys zum laufen bekommen (ohne Weckfunktion), komme momentan aber mit dem Wecker nicht weiter.

Ich möchte, dass das Radio nach 70 min nach beginn der Weckzeit, wieder ausgeht. An geht es, aber ich weis nicht wie der richtige Befehl für ausgehen ist.
Hier ein Auszug aus meiner 99_myUtils.pm

sub
WeckerDummyNotifyUtils()
{
if (Value("WeckerDummy") eq "Aus")
{
fhem("delete atWeckerStellenDummyOn");
fhem("delete atWeckerStellenDummyOff");
}
else
{
fhem("define atWeckerStellenDummyOn at ".Value("WeckerDummy").":00 set Marantz on");
fhem("attr atWeckerStellenDummyOn room Wecker");
###
fhem("define atWeckerStellenDummyOff at ".Value("WeckerDummy")."+01:10:00 set Marantz off");
fhem("attr atWeckerStellenDummyOff room Wecker");
}}


Was ich auch gerne integrieren möchte sind die Tage, sprich den Befehl (!$we) oder ($we) oder ($wday == 3), nur wie und wo????
Ich habe leider auch keinen Ansatz wie ich das mit einem 2. Dummy mit notify regeln könnte.

Komisch ist auch, dass manchmal der definierte at Befehl z.b. atWeckerStellenDummyOn in keinem Raum auftaucht. Dann ist er mal unter Unsorted obwohl der room Wecker festgelegt ist, man bekommt den dann auch in keinen anderen Raum. Und nur ganz selten ist der mal im richtigen Raum :(


docb

Servus,
also um das Radio nach 70 Min. auszuschalten musst du mit den Uhrzeiten rechnen.

Ich mache das so:
1. die 99_TimeUtils.pm von hier http://forum.fhem.de/index.php/topic,14449.msg101224.html#msg101224 einbinden
2. die Auszeit berechnen, z.B. so:

my $weckzeit = Value("WeckerDummy").":00";
my $radio_auszeit = TU_Get_Increment($weckzeit,"01:10:00");

3. und dann einfach ähnlich wie du es versucht, nur mit der berechneten Variable:

fhem("define atWeckerStellenDummyOff at ".$radio_auszeit." set Marantz off");
fhem("attr atWeckerStellenDummyOff room Wecker");


Wenn du Tage einbauen willst, baue einfach eine if-abfrage um die entsprechende fhem("tue dies")-Zeile(n),
z.B.
if ($wday == 3)
{
fhem("define atWeckerStellenDummyOff at ".$radio_auszeit." set Marantz off");
fhem("attr atWeckerStellenDummyOff room Wecker");
}

Und warum das manchmal in keinem Raum auftaucht kann ich dir nicht sagen - das klappt bei mir immer.
Viele Grüße
doc
I love FHEM!

sasquuatch

Erst mal ein riesen Danke schön das du mir nicht nur gezeigt hast wie es geht, sondern auch so schnell geantwortet hast. Jetzt habe ich endlich verstanden, was du in deinem 2. Post geschrieben hast. Manchmal stehe ich ganz schön auf dem Schlauch.

Was nicht zu gehen scheint, ist aber die ($we) Sachen in die 99_myutils.pm zu schreiben, dass hängt irgendwie mit perl zusammen, siehe http://forum.fhem.de/index.php?topic=14982.0

Ich habe mir jetzt gedacht, dass ich es einfach in die Notify einbaue. Ich muss es mal die Woche testen, ob das wirklich so klappt. Das erste schalten schien zu klappen, aber ob er wirklich rücksicht auf das WE genommen hat oder nicht, kann ich noch nicht 100% beurteilen. Sehe ich dann morgen.

define WeckerWochenendeDummyNotify notify WeckerWochenendeDummy { if ($we) {WeckerWochenendeDummyNotifyUtils();}}

docb

Denk dir nichts, ich stehe auch oft auf dem Schlauch. Ist bei mir viel Try-and-Error und Sachen kopieren und dann versuchen(!) zu verstehen. Gelingt mir nicht immer ;-)
Wenn das mit dem $we nicht geht, mach doch einfach if ($wday == 1 || $wday== 2 etc.), das müsste gehen. Wenn nicht, weil er $wday nicht erkennt, versuch mal folgendes, ist auch so eine "Generalfunktion", damit man auf alle Zeitvariablen Zugriff hat (geht bestimmt auch eleganter, aber wie gesagt, ich lerne auch an Beispielen):

my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;

Ich weiß nicht wie es funktioniert, aber es funktioniert ;-)
I love FHEM!

sasquuatch

Mit meiner Änderung der notify lag ich natürlich voll daneben. Das einzige was damit passiert ist, wenn ich den Wecker stelle, dann prüft er welcher Tag ist und je nachdem wird der Wecker definiert oder nicht :(
define WeckerWochenendeDummyNotify notify WeckerWochenendeDummy { if ($we) {WeckerWochenendeDummyNotifyUtils();}}

Das nimmt er leider auch nicht an :(
$wday == 1

Mal abgesehen davon, dass es mega kompliziert aussieht, ist die Frage ob der dann auch meine rlp.holiday.pm versteht und an Feiertagen und Urlaubstagen den Wecker nicht einschaltet. Werde mich damit nochmal beschäftigen, aber das dauert wahrscheinlich richig lange bis ich da was verstehe :(
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;

Was ich mir inzwischen überlegt habe, wäre ein 2. Notify. Wird der Wecker  erstellt,
define atWeckerStellenDummyOn :00 set Marantz on
fügt er noch ein
if ($we)
an entsprechende Stelle ein. Dann bekomme ich für jeden device, dummy, etc. zwar 2 notifys zusammen, das ist eine unnötige Belastung, würde ich aber in Kauf nehmen. Leider fehlt mir der Einfallsreichtum wie dieser notify aussieht, vielleicht komme ich ja irgendwann noch drauf, wenn ich mich damit länger beschäftige.




docb

Tja, die Feiertage RLP kann dir meine Lösung nicht bieten. Da kannst du nur nach Wochentagen sortieren - also Wochenenden ausschließen. Deine Lösung mit ins notfiy einbauen könnte schwierig werden, da fällt mir auf anhieb auch keine Lösung ein. Ich stelle den Wecker manuell wenn ich ihn brauche, da ich jeden Tag anders aufstehen muss (teilweise auch an Wochenenden/Feiertagen). Aber es sollte gehen, ich denke du brauchst nur die richtige Anzahl an geschweiften Klammern und Hochkommas ;-) Frag doch mal im Anfängerthread ob dir jemand erklären kann, wie du aus der Utils.pm heraus einen fhem("xxx"); befehl starten kannst und in den befehl wiederrum eine perl-Anweisung einbauen kannst. Die Jungs sind da echt fit und so ein Perl-Crack sollte das hinbekommen (im Gegensatz zu mir).  Ich würde mich jetzt da stundenlang hinsetzen und alle Varianten ausprobieren, vermutlich scheitern und dann eben auch im Anfängerthread posten ;-)

I love FHEM!


sasquuatch

#43
kleiner zwischenbericht, falls es noch jemand anderen interssiert, wie ein $we oder $wday integriert werden kann.
hatte meine frage nochmal hier gestellt, da bettateilchen auch eine antwort gegeben hat, wie es aussehen könnte mit ($we), leider habe ich keine antwort erhalten.
danach habe ich mich selbst nochmal daran gewagt, mit Teilerfolg, den es kam keine Fehlermeldung mehr in der 99_utils, wenn ich $we integriert habe. leider wurde auch kein define erstellt.

heute habe ich mich mal an einem WeekdayTimer versucht. was insofern klappt, dass ich bestimmte Tage integrieren kann. leider geht (!$we) grunsätzlich nicht, egal ob WeekdayTimer oder at und dann wird natürlich auch meine rlp.holiday nicht erkannt. im weekdaytimer habe ich dann wday integriert, ledier wird wday im define des Weekdaytimer verschluckt.
habe mich dann wieder auf dieser grundlage am at wecker probiert und versucht ($wday == 1) bzw. ($we) zu integrieren. ich habe es endlich hinebkomme, dass ein define des wecker mit ($we) bzw ($wday) erstellt wird, leider wird auch hier im define des at wecker der code ($wday) bzw. ($we) verschluckt. es ist so langsam zum verrückt werden.

jetzt habe ich während des tippen hiers noch etwas interessantes in der FHEM Referenz zum WeekdayTimer gefunden, wenn man den Tag 7 für wochenende nimmt bzw. 8 für das wochentage, scheint er automatisch den ($we) bzw. (!$we) integriert zu haben. ich werde mal dieses wochenende den WeekdayTimer testen und berichten.


#########################################################
###########-----Wecker Notify WeekdayTimer-----############
#########################################################
sub
WeckerWeekdayTimerDummyNotifyUtils()
{
if (Value("WeckerWeekdayTimerDummy") eq "Aus")
{
fhem("delete atMarantzWeekdayTimerAn");
fhem("delete atMarantzWeekdayTimerAus");
}
else
{
my $weckzeit = Value("WeckerWeekdayTimerDummy").":00";
my $MarantzWeekdayTimer_aus = TU_Get_Increment($weckzeit,"01:10:00");
fhem("delete atMarantzWeekdayTimerAn");
fhem("define atMarantzWeekdayTimerAn WeekdayTimer Marantz 7|".Value("WeckerWeekdayTimerDummy").":00|on 7|".$MarantzWeekdayTimer_aus."|off");
fhem("attr atMarantzWeekdayTimerAn room Wecker");
fhem("attr atMarantzWeekdayTimerAn group Aktiv");
}}



##########################################################################################
###########-----Wecker Notify Werktage  -----############
#########################################################
sub
WeckerWerktageDummyNotifyUtils()
{
if (Value("WeckerWerktageDummy") eq "Aus")
{
fhem("delete atMarantzWerktageAn");
fhem("delete atMarantzWerktageAus");
}
else
{
my ($wday) = @_;
fhem("delete atMarantzWerktageAn");
fhem("define atMarantzWerktageAn at *".Value("WeckerWerktageDummy").":00 {if (($wday == 1) || ($wday == 2) || ($wday == 3) || ($wday == 4) || ($wday == 5)) {set Marantz on}}");
fhem("sleep 1");
fhem("attr atMarantzWerktageAn room Wecker");
fhem("attr atMarantzWerktageAn group Aktiv");
#######
#######--hier kommt der Timer, der nach X min. alles ausschaltet--############
#######
my ($wday) = @_;
my $weckzeit = Value("WeckerWerktageDummy").":00";
my $Marantz_aus = TU_Get_Increment($weckzeit,"01:10:00");
fhem("delete atMarantzWerktageAus");
fhem("define atMarantzWerktageAus at *".$Marantz_aus." {if (($wday == 1) || ($wday == 2) || ($wday == 3) || ($wday == 4) || ($wday == 5)) {set Marantz off}}");
fhem("sleep 1");
fhem("attr atMarantzWerktageAus room Wecker");
fhem("attr atMarantzWerktageAus group Aktiv");
}}
#########################################################
###########-----Wecker Notify Wochenende-----############
#########################################################
sub
WeckerWochenendeDummyNotifyUtils()
{
if (Value("WeckerWochenendeDummy") eq "Aus")
{
fhem("delete atMarantzWEAn");
fhem("delete atMarantzWEAus");
}
else
{
my ($we) = @_;
fhem("delete atMarantzWEAn");
fhem("define atMarantzWEAn at *".Value("WeckerWochenendeDummy").":00 {if ($we) {set Marantz on}}");
fhem("sleep 1");
fhem("attr atMarantzWEAn room Wecker");
fhem("attr atMarantzWEAn group Aktiv");
#######
#######--hier kommt der Timer, der nach X min. alles ausschaltet--############
#######
my ($we) = @_;
my $weckzeit = Value("WeckerWochenendeDummy").":00";
my $MarantzWochenende_aus = TU_Get_Increment($weckzeit,"01:10:00");
fhem("delete atMarantzWEAus");
fhem("define atMarantzWEAus at *".$MarantzWochenende_aus." {if ($we) {set Marantz off}}");
fhem("sleep 1");
fhem("attr atMarantzWEAus room Wecker");
fhem("attr atMarantzWEAus group Aktiv");
}}

Loredo

Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER