Advent-Schnippsel für die Weihnachtsbeleuchtung

Begonnen von Icinger, 13 Oktober 2015, 19:21:55

Vorheriges Thema - Nächstes Thema

Der_müde_Joe

#30
Hallo,

auch ich versuche mich an der Adventsfunktion. Leider klappt das noch nicht so richtig und ich bräuchte mal wieder Hilfe.
Meine myutils schaut folgendermaßen aus:

use DateTime;

sub Advent() {
my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
    my $adv=0;
    $Jahr+=1900;
    if($Monat<1) {
     if ($Monatstag<7) {$adv=1;}
    }
else
{      my $time = str2time("$Jahr-12-25");
  my $wday = (localtime($time))[6];
  $wday = $wday ? $wday : 7;
  $time -= ($wday+27)*86400;
  $adv=1 if ($time<time)
}
    return $adv;
}


Leider bekomme ich folgende Fehlermeldung:
Undefined subroutine &main::str2time called at ./FHEM/99_myUtils.pm line 94.

In Line 94 steht folgendes:
{      my $time = str2time("$Jahr-12-25");

ich habe keinen Schimmer, was ich mit dem str2time mache, damit das dann doch mal geht. Kann mir da einer einen Gedankenanstoß geben? Danke schonmal.

Lieben Gruß
Joe

abc2006

Hi, könnte es daran liegen?:
Zitat von: Icinger am 13 Oktober 2015, 19:21:55
Bitte am Anfang den Moduls noch ein
use HTTP::Date;
hinzufügen.

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Der_müde_Joe

#32
Moin,

so meine Weihnachtsbeleuchtung ist dieses Jahr nun erfolgreich gelaufen und da diese auch auf diesem Schnipsel basiert, möchte ich euch die ganzen Snipsel geben, damit jeder das nachbauen kann.

In die 99_myUtils.pm habe ich folgendes gepackt:
use strict;
use warnings;
use POSIX;
use DateTime;
use HTTP::Date;

sub Advent() {
my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
    my $adv=0;
    $Jahr+=1900;
    if($Monat<1) {
     if ($Monatstag<7) {$adv=1;}
    }
else
{      my $time = str2time("$Jahr-12-25");
  my $wday = (localtime($time))[6];
  $wday = $wday ? $wday : 7;
  $time -= ($wday+27)*86400;
  $adv=1 if ($time<time)
}
    return $adv;
}


Dies berechnet ob Advent ist oder nicht. Beginnt am Montag nach Totensonntag und endet am 6. Januar.

Und in die fhem.cfg habe ich folgendes gepackt als Logik:

define Weihnachtsbeleuchtung_Morgens DOIF ([06:15] and Advent==1) ({fhem "set Weihnachtsbeleuchtung on-till ".sunrise("HORIZON=-1")},{fhem "set Weihnachtsbaum_Out on-till ".sunrise("HORIZON=-1")})
attr Weihnachtsbeleuchtung_Morgens do always
attr Weihnachtsbeleuchtung_Morgens room Weihnachten
define Weihnachtsbeleuchtung_Abends DOIF ([{sunset("HORIZON=-2",0,"12:00","22:14")}] and Advent==1) (set Weihnachtsbeleuchtung on-till 22:15:00,set Weihnachtsbaum_Out on-till 22:15:00)
attr Weihnachtsbeleuchtung_Abends do always
attr Weihnachtsbeleuchtung_Abends room Weihnachten


Funktion ist folgende:
Morgens um 6:15 Uhr geht die Beleuchtung an, sofern Advent ist, und brennt bis zum Sonenaufgang. Die genaue Zeit lässt sich hier mit der Gradzahl unter/über dem Horizont einstellen. Bei mir ist das im Moment -1 Grad also ein Grad unter dem Horizont. Das Ausschalten wird gleich als Zeit beim Einschalten mit an die Aktoren übergeben, da so das Ausschalten auch funktioniert wenn der FHEM Server nicht laufen sollte. Mir ist es wichtig, dass das Ausschalten in jedem Fall umgesetzt wird.
Abends läuft das Spiel genau anders herum, die Beleuchtung schaltet sich mit Sonnenuntergang, und sofern Advent ist, ein und brennt dann bis 22:15 Uhr. Auch hier wird das Ausschalten gleich wieder mit gegeben, damit das sicher gestellt ist.
Das Attribut do always ist sehr wichtig, da es kein else gibt, würde sonst die Schaltung nur einmal ausgeführt. Das do always sagt hier, dass jedes Mal wenn die Bedingung erfüllt ist, auch wirklich der Schaltvorgang ausgelöst wird. Ich hoffe dem ein oder anderen dies für die eigene Beleuchtung.

Lieben Gruß
Jens

JMC

Zitat von: Der_müde_Joe am 30 Dezember 2017, 11:29:06
Das Ausschalten wird gleich als Zeit beim Einschalten mit an die Aktoren übergeben, da so das Ausschalten auch funktioniert wenn der FHEM Server nicht laufen sollte. Mir ist es wichtig, dass das Ausschalten in jedem Fall umgesetzt wird.

Ich hab hier mitgelesen und bin darüber gestolpert: Aber ist on-till nicht nur eine Instanz die dann ein at erzeugt? So steht es jedenfalls in der commandref
Zitaton-till <timedet>
Das Gerät wird per "on" eingeschaltet, und ein at Instanz wird definiert, um es um <timedet> (Format: HH:MM[:SS]) per off auszuschalten. Diese at Instanz ist sichtbar unter dem Namen geräteName+"_till". Um das Ausschalten zu deaktivieren löscht man diese at Definition. Achtung: das Ein/Ausschalten wird nicht durchgeführt, falls die aktuelle Uhrzeit nach der spezifizierten Zeit ist, um folgende Szenarien zu vereinfachen:
define morningLight at *06:00 set Lamp on-till {sunrise()}

Somit wäre das ja nicht richtig, dass es auch funktioniert wenn der FHEM Server nicht läuft?
Viele Grüße
JMC

Der_müde_Joe

Moin,

also ich kann das gerade an der Weihnachtsbeleuchtung nicht testen aber ich habe den selben Befehl auch bei einer Tischlampe Ganzjährig im Einsatz und da blinkt dann am Homematic Schaltaktor die Lampe im ein Sekunden Takt, was laut Anleitung für eine bestehende Ausschaltverzögerung stehen soll. Für mich macht es keinen Sinn, dass der Aktor blinkt wenn letztlich doch der Ausschaltbefehl vom Server kommt. Wenn ich wieder zu Hause bin, werde ich einfach mal den Server pünktlich zu ausschalten abschalten und dann schauen, ob die Beleuchtung trotzdem ausgeht.
Vielleicht kann aber auch einer der etwas fiteren User was zu der Thematik sagen.

Lieben Gruß
Jens

JMC

Vielleicht hängt das ja auch vom Aktor ab ob er das kann oder nicht? Dann stimmt der Eintrag im Wiki ja auch vielleicht einfach nicht mehr?
Viele Grüße
JMC

Der_müde_Joe

#36
Ich habe es leider immer noch nicht getestet, aber so schaut mein Logfile von heute Morgen aus:


2018.01.04 06:15:00 3: CUL_HM set Weihnachtsbeleuchtung on-till 08:31:00
2018.01.04 06:15:00 3: CUL_HM set Weihnachtsbaum_Out on-till 08:31:00
2018.01.04 06:15:00 3: CUL_HM set K1_Tischlampe on-till 08:31:00
2018.01.04 08:03:03 3: CUL_HM set K2_Fenster_02 level 100 ignore 20
2018.01.04 08:03:03 3: CUL_HM set K2_Entfeuchter_Sw off
2018.01.04 08:32:45 3: CUL_HM set K2_Fenster_02 level 0 0 20
2018.01.04 08:32:45 3: CUL_HM set K2_Entfeuchter_Sw off


Wie unschwer zu erkennen ist, wird die Weihnachtsbeleuchtung eingeschaltet bis 8:31 Uhr. Allerdings wird um 8:31 wird kein ausschalten gesendet. Und wenn es gesendet würde, müsste es doch im Log stehen oder irre ich mich?

Ich habe nun nochmal im Anfängerforum nachgefragt und das at wird nur definiert, dass der Aktor es nicht selber kann. In meinem Fall können die Homematic Komponenten die Funktion und denn wird es komplett an den Aktor übergeben, also würde es auch gehen, wenn der Server beim Ausschalten nicht mehr läuft.
Hier der Tread: https://forum.fhem.de/index.php/topic,82176.0.html

misux

HI! Ich möchte die Adventsteuerung in meine vorhandene DOIF einbauen... Welche Werte werden bei "Advent==" beachtet?


DOIF
([06:15] and Advent==[b]1[/b]) ({fhem "set Weihnachtsbeleuchtung on-till ".sunrise("HORIZON=-1")},{fhem "set Weihnachtsbaum_Out on-till ".sunrise("HORIZON=-1")})


Also mir geht es um das dick geschriebene...

kann ich auch eine 0 verwenden? also (Advent==1 licht an) und (Advent==0 Licht aus) oder schaltet er das Licht nur ein wenn Advent==1 ist und bei "nicht ==1" schaltet er es auch nicht ein?

Würde mich über eine kurze Erklärung freuen weil ich das ja nicht vor dem Advent testen kann... ;D


CoolTux

Du weist das Advent eine 99_myUtils Funktion ist? Du weist das 1 ja und 0 nein bedeutet? Also 1 es ist Advent und 0 es ist nicht Advent. Schau Dir am besten weiter oben noch mal die Funktion an.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

misux

Ach du kacke...  :o vielleicht hätte ich mir nicht die letzten Posts durchlesen sollen sondern den ersten... ;D

Ok, in diesem FAll: Wer lesen kann ist klar im Vorteil! Vielen Dank ! ::)

misux

#40
HI!

Ich versuche nun endlich mal das Adventgeschipsel vorzubereiten... Habe aber nach dem einfügen des Codes eine fette Fehlermeldung bekommen... Wie muss ich denn das Date Modul installieren?

Kann mir bitte jemand helfen?


ZitatERROR:
Can't locate DateTime.pm in @INC (you may need to install the DateTime module) (@INC contains: ./FHEM/lib ./lib . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.24.1 /usr/local/share/perl/5.24.1 /usr/lib/arm-linux-gnueabihf/perl5/5.24 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.24 /usr/share/perl/5.24 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base ./FHEM) at ./FHEM/99_myUtils.pm line 76. BEGIN failed--compilation aborted at ./FHEM/99_myUtils.pm line 76.

Vielen Dank!

Diese Anleitung habe ich verwendet:
Zitat
Zitat von: Der_müde_Joe am 30 Dezember 2017, 11:29:06
Moin,

so meine Weihnachtsbeleuchtung ist dieses Jahr nun erfolgreich gelaufen und da diese auch auf diesem Schnipsel basiert, möchte ich euch die ganzen Snipsel geben, damit jeder das nachbauen kann.

In die 99_myUtils.pm habe ich folgendes gepackt:
use strict;
use warnings;
use POSIX;
use DateTime;
use HTTP::Date;

sub Advent() {
my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
    my $adv=0;
    $Jahr+=1900;
    if($Monat<1) {
     if ($Monatstag<7) {$adv=1;}
    }
else
{      my $time = str2time("$Jahr-12-25");
  my $wday = (localtime($time))[6];
  $wday = $wday ? $wday : 7;
  $time -= ($wday+27)*86400;
  $adv=1 if ($time<time)
}
    return $adv;
}


Dies berechnet ob Advent ist oder nicht. Beginnt am Montag nach Totensonntag und endet am 6. Januar.

Und in die fhem.cfg habe ich folgendes gepackt als Logik:

define Weihnachtsbeleuchtung_Morgens DOIF ([06:15] and Advent==1) ({fhem "set Weihnachtsbeleuchtung on-till ".sunrise("HORIZON=-1")},{fhem "set Weihnachtsbaum_Out on-till ".sunrise("HORIZON=-1")})
attr Weihnachtsbeleuchtung_Morgens do always
attr Weihnachtsbeleuchtung_Morgens room Weihnachten
define Weihnachtsbeleuchtung_Abends DOIF ([{sunset("HORIZON=-2",0,"12:00","22:14")}] and Advent==1) (set Weihnachtsbeleuchtung on-till 22:15:00,set Weihnachtsbaum_Out on-till 22:15:00)
attr Weihnachtsbeleuchtung_Abends do always
attr Weihnachtsbeleuchtung_Abends room Weihnachten


Funktion ist folgende:
Morgens um 6:15 Uhr geht die Beleuchtung an, sofern Advent ist, und brennt bis zum Sonenaufgang. Die genaue Zeit lässt sich hier mit der Gradzahl unter/über dem Horizont einstellen. Bei mir ist das im Moment -1 Grad also ein Grad unter dem Horizont. Das Ausschalten wird gleich als Zeit beim Einschalten mit an die Aktoren übergeben, da so das Ausschalten auch funktioniert wenn der FHEM Server nicht laufen sollte. Mir ist es wichtig, dass das Ausschalten in jedem Fall umgesetzt wird.
Abends läuft das Spiel genau anders herum, die Beleuchtung schaltet sich mit Sonnenuntergang, und sofern Advent ist, ein und brennt dann bis 22:15 Uhr. Auch hier wird das Ausschalten gleich wieder mit gegeben, damit das sicher gestellt ist.
Das Attribut do always ist sehr wichtig, da es kein else gibt, würde sonst die Schaltung nur einmal ausgeführt. Das do always sagt hier, dass jedes Mal wenn die Bedingung erfüllt ist, auch wirklich der Schaltvorgang ausgelöst wird. Ich hoffe dem ein oder anderen dies für die eigene Beleuchtung.

Lieben Gruß
Jens

CoolTux

Lass use DateTime; mal weg. Sollte auch ohne gehen,
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

#42
Der Countdown für Weihnachts-Codeschnipsel beginn :)

Ich habe da mal was gebastelt: https://forum.fhem.de/index.php/topic,43685.msg835314.html#msg835314

Damit kann man relativ einfach Adventstage aber auch alles, was mit Ostern zu tun hat, selbst definieren - auch die 5. Jahreszeit - Karneval :)

Edit: Hier eine kürzere Version (kleine Korrekturen, weitere Feiertage eingefügt):

defmod SocialSeason2 DOIF init { ## Syntax <MM-DD>, Ereignis oder <von> <bis>, Ereignis, statt MM-DD kann auch E+/-<Zahl> und A+/-<Zahl>, E entspricht Ostersonntag, A erster Adventsonntag \
$_season="\
E+0 E+1,     Ostern\
E-51 E-46,   Karneval\
05-01,       Tag der Arbeit\
E+39,        Chisti Himmelfahrt\
E+49 E+50,   Pfingsten\
E+60,        Fronleichnam\
10-03,       Tag der deutschen Einheit\
11-01,       Allerheiligen\
12-24,       Heiligabend\
12-25 12-26, Weihnachten\
A+0 A+6,     1. Advent\
A+7 A+13,    2. Advent\
A+14 A+20,   3. Advent\
A+21 12-23,  4. Advent\
12-31,       Silvester\
01-01,       Neujahr\
";;\
set_State(myseason(split("-",$ymd,2)),1)\
}\
\
{[00:00];set_State(myseason(split("-",$ymd,2)),1)}\
\
subs {\
sub myseason {\
use Date::Parse qw(str2time);;\
my ($year,$md)=@_;;\
my ( $monEaster, $mdayEaster) = ::western_easter($year);;\
my $christmas = str2time("$year-12-25");;\
my ( $secC, $minC, $hourC, $mdayC, $monC, $yearC, $wdayC, $ydayC, $isdstC ) = localtime($christmas);;\
$wdayC = $wdayC ? $wdayC : 7;;\
my $adventBegin = $christmas - ($wdayC+21)*86400;;\
my $easter=str2time("$year-$monEaster-$mdayEaster");;\
my @s=split ('\n',$_season);;\
foreach (@s) {\
  next if ($_ eq "");;\
  my ($date,$token)=split (',\s*',$_);;\
  my @d=split (' ',$date);;\
  foreach (@d) {\
    if (defined ($_)) {\
      if ($_ =~ /E((\+|\-)\d+)/) {\
        my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime ($easter + $1*86400);;   \
        $_=sprintf("%02d-%02d",$mon+1,$mday);;\
      } elsif ($_ =~ /A((\+|\-)\d+)/) {\
        my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime ($adventBegin + $1*86400);;   \
        $_=sprintf("%02d-%02d",$mon+1,$mday);;\
      }\
    }\
  }\
  if (!defined ($d[1]) and $d[0] eq $md or (defined ($d[1]) and $md ge $d[0] and $md le $d[1])) {\
    return ($token);;\
  }\
}\
return ("none");;\
}\
}\
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

misux

Habe deinen Code mal getestet... Nun so eine Meldung: :-\

ZitatERROR:
Experimental aliasing via reference not enabled at ./FHEM/99_myUtils.pm line 99.


Zitat von: Damian am 01 November 2018, 20:21:53
Der Countdown für Weihnachts-Codeschnipsel beginn :)

Ich habe da mal was gebastelt: https://forum.fhem.de/index.php/topic,43685.msg835314.html#msg835314

Damit kann man relativ einfach Adventstage aber auch alles, was mit Ostern zu tun hat, selbst definieren - auch die 5. Jahreszeit - Karneval :)

Edit: Hier eine kürzere Version:

defmod SocialSeason2 DOIF init { ## Syntax <MM-DD>, Ereignis oder <von> <bis>, Ereignis, statt MM-DD kann auch E+/-<Zahl> und A+/-<Zahl>, E entspricht Ostersonntag, A erster Adventsonntag \
$_season="\
E-10 E+1,    Ostern\
E-51 E-46,   Karneval\
05-01,       1. Mai\
12-24,       Heiligabend\
12-25 12-26, Weihnachten\
A+0 A+6,     1. Advent\
A+7 A+13,    2. Advent\
A+14 A+20,   3. Advent\
A+21 12-23,  4. Advent\
";;\
set_State(myseason(split("-",$ymd,2)),1)\
}\
\
{[00:00];set_State(myseason(split("-",$ymd,2)),1)}\
\
subs {\
sub myseason {\
my ($year,$md)=@_;;\
my ( $monEaster, $mdayEaster) = ::western_easter($year);;\
my $christmas = str2time("$year-12-25");;\
my ( $secC, $minC, $hourC, $mdayC, $monC, $yearC, $wdayC, $ydayC, $isdstC ) = localtime($christmas);;\
$wdayC = $wdayC ? $wdayC : 7;;\
my $adventBegin = $christmas - ($wdayC+21)*86400;;\
my $easter=str2time("$year-$monEaster-$mdayEaster");;\
my @s=split ('\n',$_season);;\
foreach (@s) {\
  next if ($_ eq "");;\
  my ($date,$token)=split (',\s*',$_);;\
  my @d=split (' ',$date);;\
  foreach (@d) {\
    if (defined ($_)) {\
      if ($_ =~ /E((\+|\-)\d+)/) {\
        my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime ($easter + $1*86400);;   \
        $_=sprintf("%02d-%02d",$mon+1,$mday);;\
      } elsif ($_ =~ /A((\+|\-)\d+)/) {\
        my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime ($adventBegin + $1*86400);;   \
        $_=sprintf("%02d-%02d",$mon+1,$mday);;\
      }\
    }\
  }\
  if (!defined ($d[1]) and $d[0] eq $md or (defined ($d[1]) and $md ge $d[0] and $md le $d[1])) {\
    return ($token);;\
  }\
}\
return ("none");;\
}\
}\


Damian

Mein Code ist eine DOIF-Definition, es braucht keine myUtils.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF