FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Icinger am 13 Oktober 2015, 19:21:55

Titel: Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Icinger am 13 Oktober 2015, 19:21:55
Da ja die Adventzeit bald naht, hier mal ein kleines Schnippsel, welches ich mir voriges Jahr zusammengestellt habe:

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+22)*86400;
  $adv=1 if ($time<time)
}
    return $adv;
}


Gibt 1 oder 0 zurück, je nachdem ob schon Advent ist (1. Adventsamstag bis 6. Jänner).
Nutze ich, um die Weihnachtsbeleuchtung zur richtigen Zeit einzuschalten.

Wird bei mir zB so geschaltet:

define di_Weihnachtsbeleuchtung DOIF ([04:00-22:00] and [Umweltsensor_Aussen:luminosity] < AttrVal("Umweltsensor_Aussen","Dämmerung",undef) and Advent==1) (set Weihnachtsbeleuchtung on)
DOELSEIF ([04:00-22:00] and [Umweltsensor_Aussen:luminosity] > AttrVal("Umweltsensor_Aussen","Dämmerung",undef)+5 and Advent==1) (set Weihnachtsbeleuchtung off)
DOELSEIF ([22:00]) (set Weihnachtsbeleuchtung off)


lg, Ici

Edit: Neue Berechnung basierend auf betateilchens Code.
Bitte am Anfang den Moduls noch ein
use HTTP::Date;
hinzufügen.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: P.A.Trick am 13 Oktober 2015, 19:24:31
Vielen Dank dafür, aber kann ich das mit dem Kalender Modul nicht einfacher machen?
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: kb958291 am 02 November 2015, 13:43:34

Ist in "my $t = timelocal(0, 0, 0, 25, 12, $Jahr-$Dez);" nicht ein Fehler drinn?
$mon geht doch von 0 - 11, d.h. Dezember = 11 oder????
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: betateilchen am 02 November 2015, 14:15:43
Alternativ: http://forum.fhem.de/index.php/topic,43381.0.html
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: betateilchen am 02 November 2015, 14:16:35
Zitat von: kb958291 am 02 November 2015, 13:43:34
$mon geht doch von 0 - 11, d.h. Dezember = 11 oder????

aber nicht bei timelocal()
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: kb958291 am 03 November 2015, 17:28:59
Ich hatte versucht, den Advent wie oben beschrieben zu berechnen und bekomme immer folgende Meldung:
perl error in condition: DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and ReadingValDoIf('LichtWetter','twilight_weather','') < 70 and Advent==1: Undefined subroutine &main::timelocal called at ./FHEM/99_myUtils.pm line 65.

Zeile 65 ist bei mir:
my $t = timelocal(0, 0, 0, 25, 12, $Jahr-$Dez);

Deshalb vermutete ich den Fehler im Perlcode....  :-[

Bin noch am Anfang mit Fhem und komme in der Weihnachtsbeleuchtung bzw. Advent nicht weiter... :'(
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: raspklaus am 03 November 2015, 20:15:47
Ich versuche erstmal nur im Test das zu simulieren indem ich die Systemzeit auf dem Testsystem auf Dezember stelle und dann teste

define advent dummy
attr advent devStateIcon 0:FS20.off 1:FS20.on
define z_advent notify Advent==1 set advent on


bringt keine Veränderung
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: raspklaus am 04 November 2015, 10:33:03
Der zweite Test bringt auch nicht viel

define advent dummy
attr advent devStateIcon 0:FS20.off 1:FS20.on
attr advent setList 0 1
define z_advent DOIF ([06:00-22:00] and ReadingsVal( "BM_Bewegungsmelder", "brightness", "") <= 100 and Advent==1) { fhem ("set advent on") }
DOELSEIF ([06:00-22:00] and ReadingsVal( "BM_Bewegungsmelder", "brightness", "") > 100 and Advent==1) { fhem ("set advent off") }
DOELSEIF ([22:00]) (set advent off)


Kann jemand helfen ?
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: kumue am 04 November 2015, 10:56:10
Ich habe einen anderen Ansatz gewählt... holiday Datei http://fhem.de/commandref_DE.html#holiday (http://fhem.de/commandref_DE.html#holiday)


4 11-01 11-30 Nebenzeit
4 12-01 12-31 Hauptzeit
4 01-01 01-06 Hauptzeit
4 01-07 02-28 Nebenzeit


In einem DOIF werte ich dann aus, ob Haupt- oder Nebenzeit ist und schalte entsprechend.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: moonsorrox am 04 November 2015, 18:47:57
Zitat von: raspklaus am 04 November 2015, 10:33:03
Kann jemand helfen ?
du hast doch hier (http://forum.fhem.de/index.php/topic,43525.msg354642.html#msg354642) schon gefragt...! funktioniert das nicht..?
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: raspklaus am 04 November 2015, 19:41:31
moon,

das hatte ich später dort, da hier niemand geantwortet hat
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: raspklaus am 05 November 2015, 13:16:52
Ich verwende da folgende notify:

define z_advent DOIF ([06:00-22:00] and [BM_Bewegungsmelder:brightness] <= 100 and Advent==1) ("set advent on")
DOELSEIF ([06:00-22:00] and [BM_Bewegungsmelder:brightness] > 100 and Advent==1) ("set advent off")
DOELSEIF ([22:00]) (set advent off)


und erhalte folgenden Fehler:

perl error in condition: DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"") and ReadingValDoIf('BM_Bewegungsmelder','brightness','') > 100 and Advent==1: Month '12' out of range 0..11 at ./FHEM/99_myUtils.pm line 231.

und nun stecke ich fest

Die Zeile ist

my $t = timelocal(0, 0, 0, 25, 12, $Jahr-$Dez);

Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Icinger am 05 November 2015, 20:34:46
Hi Leute,

habe grad den erste Post angepasst, sorry, da war ein Fehler drinnen.

Nu sollte es klappen (zumindest bei mir gehts)

lg, Ici
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: raspklaus am 05 November 2015, 20:42:03
Was passiert bei Dir wenn Du {Advent} eingibst zur Ausgabe des Berechnungsergebnisses ?

Bei mir kommt:

Can't locate object method "new" via package "DateTime" (perhaps you forgot to load "DateTime"?) at ./FHEM/99_myUtils.pm line 235.

Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: kb958291 am 05 November 2015, 20:44:36
Zitat von: kb958291 am 02 November 2015, 13:43:34
Ist in "my $t = timelocal(0, 0, 0, 25, 12, $Jahr-$Dez);" nicht ein Fehler drinn?
$mon geht doch von 0 - 11, d.h. Dezember = 11 oder????

hatte ich dann etwa doch Recht??? Als Anfänger ist man ja schnell verunsichert....
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: raspklaus am 05 November 2015, 20:46:48
ok,
habe den Fehler gefunden

in die myUtils muss noch

use DateTime;

rein
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: raspklaus am 05 November 2015, 21:00:07
Es wird aber nur bei Dezember eine 1 ausgegeben

Eine Null 0 kommt nie
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: kb958291 am 05 November 2015, 22:20:09
Ich mache wohl immer noch etwas falsch:
ich bekomme nach wie vor die Fehlermeldung Undefined subroutine &main::timelocal called at ./FHEM/99_myUtils.pm line 66.

Zeile 66 ist bei mir:
my $t = timelocal(0, 0, 0, 25, 11, $Jahr-$Dez);

"use DateTime;" habe ich bereits installiert und Fhem neugestartet...

Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: betateilchen am 06 November 2015, 08:35:12
Zitat von: raspklaus am 05 November 2015, 21:00:07
Es wird aber nur bei Dezember eine 1 ausgegeben

Eine Null 0 kommt nie

Das ist normal. Eine 0 als Returnwert einer Funktion aus der myUtils.pm wird im fhem Frontend nicht dargestellt.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: betateilchen am 06 November 2015, 08:37:03
Zitat von: kb958291 am 05 November 2015, 22:20:09
"use DateTime;" habe ich bereits installiert und Fhem neugestartet...

Zeig doch mal Deine gesamte 99_myUtils.pm

"use DateTime;" wird übrigens nicht installiert, sondern in die 99_myUtils.pm geschrieben. Davor muss diese Modul natürlich auf Betriebssystemebene installiert sein.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: kb958291 am 06 November 2015, 10:58:27
Das habe ich ja mit "installiert" gemeint, im Raspi-Linux installiert und dann in 99_my... eingetragen:

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;
use DateTime;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.

# Schlafzimmer_Heizung Temperatur setzen per aufruf von: {SetTempList_HM_38F879()}
# Programmdatei erneut laden: Befehl der in das Befehls-Eingabefeld eingegeben wird, lautet: reload 99_myUtils.pm

sub
SetTempList_HM_38F879()
{
{ fhem ("set HM_38F879_Clima tempListMon prep 04:30 19.5 05:50 21.0 08:00 22.0 18:00 19.0 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F879_Clima tempListTue prep 04:30 19.5 05:50 21.0 08:00 22.0 18:00 19.0 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F879_Clima tempListWed prep 04:30 19.5 05:50 21.0 08:00 22.0 18:00 19.0 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F879_Clima tempListThu prep 04:30 19.5 05:50 21.0 08:00 22.0 18:00 19.0 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F879_Clima tempListFri prep 04:30 19.5 05:50 21.0 08:00 22.0 18:00 19.0 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F879_Clima tempListSat prep 04:30 19.5 05:50 21.0 09:00 22.0 18:00 19.0 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F879_Clima tempListSun exec 04:30 19.5 05:50 21.0 09:00 22.0 18:00 19.0 21:00 20.0 24:00 19.0")};
}

# Schlafzimmer_Heizung Temperatur setzen per aufruf von: {SetTempList_HM_38F7D0()}
# Programmdatei erneut laden: Befehl der in das Befehls-Eingabefeld eingegeben wird, lautet: reload 99_myUtils.pm

sub
SetTempList_HM_38F7D0()
{
{ fhem ("set HM_38F7D0_Clima tempListMon prep 04:30 20.0 05:50 22.0 08:00 23.0 18:00 19.5 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F7D0_Clima tempListTue prep 04:30 20.0 05:50 22.0 08:00 23.0 18:00 19.5 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F7D0_Clima tempListWed prep 04:30 20.0 05:50 22.0 08:00 23.0 18:00 19.5 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F7D0_Clima tempListThu prep 04:30 20.0 05:50 22.0 08:00 23.0 18:00 19.5 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F7D0_Clima tempListFri prep 04:30 20.0 05:50 22.0 08:00 23.0 18:00 19.5 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F7D0_Clima tempListSat prep 04:30 20.0 05:50 22.0 09:00 23.0 18:00 19.5 21:00 20.0 24:00 19.0")};
{ fhem ("set HM_38F7D0_Clima tempListSun exec 04:30 20.0 05:50 22.0 09:00 23.0 18:00 19.5 21:00 20.0 24:00 19.0")};
}

# Gibt 1 oder 0 zurück, je nachdem ob schon Advent ist (1. Adventsamstag bis 6. Januar).
# Nutze ich, um die Weihnachtsbeleuchtung zur richtigen Zeit einzuschalten.
# Zeile 53

sub Advent() {
   my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
    my $Dez=0;
    my $adv=0;
    $Jahr+=1900;
    if($Monat<1) {
     if ($Monatstag<7) {$adv=1;}
     $Dez=-1;
    }
    if($Monat>9) {
     my $t = timelocal(0, 0, 0, 25, 11, $Jahr-$Dez);
     my $wd = (localtime $t)[6];
     $t = timelocal(0, 0, 0, 25-$wd-1, 11, $Jahr-$Dez);
    my $dt2 = DateTime->new(
                       year   => $Jahr-$Dez,
                       month  => 11,
                       day    => 25-$wd-1
                     );
      $dt2->subtract(days => 28);
      if($dt2->month()==11) {
        if($dt2->days >= $Monatstag ) {$adv=1;}
      } else {
        if($Monat==11) {$adv=1;}
        else {if($Monatstag>=$dt2->month()) {$adv=1;}}
      }
    }
    readingsSingleUpdate($defs{"dmy_DateTime"},"Advent",$adv,1);
    return $adv;
}
1;
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: raspklaus am 07 November 2015, 13:39:35
Scheint doch noch nicht ganz zu laufen

Wenn ich {Advent} eingebe, bzw auch im laufenden Betrieb kommt im Log die Meldung:

2015.11.07 13:01:16 1: readingsUpdate(,Advent,0) missed to call readingsBeginUpdate first.

dürfte mit

readingsSingleUpdate($defs{"dmy_DateTime"},"Advent",$adv,1);

zusammenhängen. Wie kann man das abstellen ?
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Icinger am 07 November 2015, 14:30:47
Wahrscheinlich hast du kein Dummy, das "dmy_DateTime" heißt.

Das musst du entweder anlegen, damit da das Reading "Advent" reingeschrieben wird, oder du löschst diese Zeile raus und verwertest nur die Antwort der Sub.

lg, Ici
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: raspklaus am 07 November 2015, 14:32:38
Danke
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Spartacus am 20 November 2016, 16:24:58
Hallo,
der Thread ist zwar etwas älter, aber ich beschäftige mich gerade mit meiner Weihnachtsbeleuchtung, die ja i.d.R nach dem Totensonntag  eingeschaltet werden darf.

Ich verstehe aber die Berechnung der Adventszeit, die mit dem  1. Advent beginnt, nicht ganz. Aber m.E müsste diese Zeile angepasst werden, oder?

$time -= ($wday+27)*86400;

Also 5 Tage mehr, damit die Weihnachtszeit nach Totensonntag eingeläutet wird. Ist das so korrekt?

Spartacus
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Icinger am 20 November 2016, 19:49:35
Hi,

Hmm, Totensonntag kennen wir hier nicht.
Hab mal grad gegoogelt:
ZitatDer Totensonntag oder Ewigkeitssonntag ist in den evangelischen Kirchen in Deutschland und der Schweiz ein Gedenktag für die Verstorbenen.

Wann man die Weihnachtsbeleuchtung einschalten "darf", ist glaub ich nirgendwo wirklich geregelt, oder?
Jedenfalls gibts hier genügend Irre, die schon siet ein, zwei Wochen ein kleines Atomkraftwerk brauchen.

Für mich persönlich gilt die Weihnachtszeit halt ab dem ersten Adventsonntag, und zu diesem Datum hin hab ich auch meinen Schnippsel gemacht.
Ist ja aber jedem selbst überlassen, ob er's so übernimmt oder für seine eigenen Bedürfnisse anpasst.

lg, Stefan
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Spartacus am 21 November 2016, 08:22:00
Hi Stefan,
naja, hier ist es üblich, die Weihnachtsbeleuchtung erst nach dem Totensonntag einzuschalten. So ist es auch auf den Weihnachtsmärken. Und ja, es gibt genug irre, die die Beleuchtung schon seit Wochen am Start haben....

Aber um noch mal auf meine Frage zurückzukommen:
Ist meine Annahme richtig`Wie berechnest Du den 1. Advent relativ zum 25.12.? Und wie grenzt Du den 06.01. ab, damit die Funktion wieder den Wert 0 liefert? Da komme ich noch nicht ganz hinter-
Danke,
Spartacus
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Icinger am 21 November 2016, 22:07:01
Hi Spartacus,

ah, alles klar, ja.
Also, 6.1. wird hier geprüft:
    if($Monat<1) {
     if ($Monatstag<7) {$adv=1;}
    }

$Monat ist immer 0-11....

Und im else-Teil wird vom 25.12. auf den vorherigen Sonntag zurückgerechnet, und dann nochmal 22 Tage retour.

lg, Stefan
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Spartacus am 22 November 2016, 08:51:42
Hi Stefan,
ah! Alles klar! Danke für die Erklärung!

Spartacus.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Spartacus am 29 November 2016, 17:49:17
Hallo Stefan
ich muss noch mal nachhaken:

Du gehst vom 25.12 aus, rechnest auf den vorherigen Sonntag zurück und dann noch mal 22 Tage retour.
Das würde in diesem Jahr (2016) folgendes bedeuten:
25.12. ist ein Sonntag
18.12. der vorherige Sonntag
22 Tage retour wäre der 26.11. das ist aber der Samstag vor dem 1. Advent und nicht der 1. Advent.

Wo habe ich hier den Gedankenfehler?

Christian

Edit
wer lesen kann ist klar im Vorteil! Du gehst bewußt auf den Vorabend des 1. Advent. sorry!

Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Der_müde_Joe am 27 November 2017, 21:07:07
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
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: abc2006 am 04 Dezember 2017, 16:12:12
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
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag 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
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: JMC am 30 Dezember 2017, 15:52:38
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?
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Der_müde_Joe am 31 Dezember 2017, 18:35:11
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
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: JMC am 02 Januar 2018, 08:05:10
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?
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Der_müde_Joe am 04 Januar 2018, 17:37:30
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
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: misux am 22 August 2018, 15:01:56
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

Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: CoolTux am 22 August 2018, 15:09:15
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.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: misux am 22 August 2018, 15:33:03
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 ! ::)
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: misux am 01 November 2018, 20:11:48
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
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: CoolTux am 01 November 2018, 20:20:27
Lass use DateTime; mal weg. Sollte auch ohne gehen,
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag 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 (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");;\
}\
}\
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: misux am 01 November 2018, 20:46:55
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");;\
}\
}\

Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Damian am 01 November 2018, 20:49:05
Mein Code ist eine DOIF-Definition, es braucht keine myUtils.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: FHEM-User22 am 02 November 2018, 17:39:48
Hallo Damian,
ich habe die kürzere Definition mal getestet.

State ist:
STATE    ???

und bei den Readings:
block_init  condition c01: Undefined subroutine &DOIF::myseason called, line 12.  2018-11-02 17:22:07
mode  disabled    2018-11-02               17:26:44
timer_01_c02    03.11.2018                  00:00:00    2018-11-02 17:22:07


Ist da bei mir irgendwo ein Fehler?

Grüße FHEM-User22
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Damian am 02 November 2018, 19:47:01
Zitat von: FHEM-User22 am 02 November 2018, 17:39:48
Hallo Damian,
ich habe die kürzere Definition mal getestet.

State ist:
STATE    ???

und bei den Readings:
block_init  condition c01: Undefined subroutine &DOIF::myseason called, line 12.  2018-11-02 17:22:07
mode  disabled    2018-11-02               17:26:44
timer_01_c02    03.11.2018                  00:00:00    2018-11-02 17:22:07


Ist da bei mir irgendwo ein Fehler?

Grüße FHEM-User22

Hast du die aktuelle DOIF-Version vom 17.10 ?
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: FHEM-User22 am 03 November 2018, 09:35:06
Moin,
ich habe gestern geupdatet. Woran kann ich die Version erkennen?

Grüße
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Damian am 03 November 2018, 09:38:00
Das ist naheliegend:

In der Kommandozeile: Version DOIF
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: FHEM-User22 am 03 November 2018, 09:52:25
Stimmt, sorry,

98_DOIF.pm 17557 2018-10-17 21:06:30Z Damian
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Damian am 03 November 2018, 10:09:17
OK. Ich habe jetzt den Definitionsblock subs vorgezogen, damit sollte es jetzt auch bei dir funktionieren:

Edit: Definition herausgenommen, da mit aktueller DOIF-Version das Vorziehen von subs nicht mehr erforderlich ist.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: FHEM-User22 am 03 November 2018, 10:14:49
Supi, läuft.

Dankeschön
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Damian am 03 November 2018, 11:55:45
Zitat von: FHEM-User22 am 03 November 2018, 10:14:49
Supi, läuft.

Dankeschön

In der letzten Zeile war noch meine Testkonfiguration dir. Ich habe sie gerade angepasst:

{[00:00];;set_State(myseason(split("-",$ymd,2)),1)}\

Ab morgen gibt es ein DOIF-Update, damit wird auch die vorherige Definition (wo init zuerst vorkommt) immer funktionieren.  siehe https://forum.fhem.de/index.php/topic,84969.msg853348.html#msg853348
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Rewe2000 am 14 November 2018, 20:48:25
Hallo Damian,
irgendwie stehe ich auf dem Schlauch, an was kann das liegen, weshalb bei mir ein "Undefined subroutine" kommt?

State ist auch bei mir:
STATE ???

Und bei den Readings steht:

block_init   condition c01: Undefined subroutine &main::western_easter called, line 4.        2018-11-14 20:20:12
mode         disabled                                                                         2018-11-14 20:20:31
timer_01_c02 15.11.2018 00:00:00                                                              2018-11-14 20:20:12


Wo liegt der "Hund begraben"?

DOIF neueste Version: 98_DOIF.pm 17708 2018-11-08 19:42:20Z Damian
Auch im Log stehen keine Fehler.

Ich hoffe du kannst mir den etscheidenden Tipp geben, denn Weihnachten kommt schneller als einem lieb ist.

Gruß Reinhard
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Damian am 14 November 2018, 21:42:08
western_easter steckt in 95_holiday.pm. Sie wird wohl bei dir nicht gefunden, weil du offenbar das holiday-Modul nicht nutzt. "reload 95_holiday.pm" könnte helfen oder einmalig defmod <Bundesland> holiday.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Damian am 14 November 2018, 22:41:39
Ich habe hier: https://forum.fhem.de/index.php/topic,42209.msg852782.html#msg852782 noch weitere Feiertage eingefügt, dann muss man besondere Ereignisse nicht an zwei Stellen (holiday Modul) abfragen.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Rewe2000 am 15 November 2018, 18:57:36
Hallo Damian,

vielen Dank für die schnelle Hilfe, genau das war mein Problem, das holiday-Modul war nicht vorhanden.
Ich habe dieses nun mit "defmod by holiday" angelegt (für Bayern), jetzt komme ich genau eine Zeile weiter und die "Undefined subroutine" kommt bei "str2time".

Readings:

block_init       condition c01: Undefined subroutine &DOIF::str2time called, line 5.               2018-11-15 18:21:09
mode             enabled                                                                           2018-11-15 18:21:22
timer_01_c02     16.11.2018 00:00:00                                                               2018-11-15 18:21:09


Muss ich da noch etwas installieren?
An der 99_myUtils.pm muss ich doch nichts hinzufügen, da ja alles über das DOIF erledigt wird, wenn ich dich richtig verstanden habe.
Irgend etwas fehlt da noch bei mir, aber nur was. Die Suche nach "str2time" hat mich in Fhem und Google auch nicht den entscheidenden Schritt weiter gebracht.
Ich hoffe ihr habt noch einen Tipp für mich.

Gruß Reinhard

Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Damian am 15 November 2018, 19:15:15
siehe: https://forum.fhem.de/index.php/topic,43685.msg835411.html#msg835411

Edit: Ich habe es jetzt im Codeschnipsel hinzugefügt.
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Rewe2000 am 15 November 2018, 19:55:09
Danke Damian,

genau das war die Ursache. Jetzt läuft es auch bei mir.
Nochmals vielen Dank für deine großartige Arbeit.

Gruß Reinhard
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Cybers am 16 November 2018, 12:17:57
wenn ich folgendes in meiner Kommandozeile eingebe:
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");;\
}\
}\

dann bekomme ich folgenden Fehler:
SocialSeason2 DOIF: no right bracket: { 
Unknown command set_State(myseason(split("-",$ymd,2)),1)}\, try help.

Was mache ich falsch?

Gruß, Sascha
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: betateilchen am 16 November 2018, 15:13:03
Um mal zurück zum eigentlichen Thema dieses Threads

Advent-Schnippsel für die Weihnachtsbeleuchtung

zu kommen: Man kann die Adventssonntage jetzt auch vom holiday Modul selbst berechnen lassen.

https://forum.fhem.de/index.php/topic,93277.0.html
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: moonsorrox am 16 November 2018, 19:03:38
Zitat von: Cybers am 16 November 2018, 12:17:57
dann bekomme ich folgenden Fehler:
SocialSeason2 DOIF: no right bracket: { 
Unknown command set_State(myseason(split("-",$ymd,2)),1)}\, try help.

Was mache ich falsch?

Gruß, Sascha
hatte ich auch den Fehler da meckert er rum, da ich die Dateien alle einzeln habe und nicht alles in der fhem.cfg habe ich die Datei geöffnet und dort alles eingetragen, dann gespeichert und Fhem neu eingelesen dann nimmt er das.

Wie gesagt wenn du es in der fhem.cfg hast mußt du dir im klaren sein was du da machst.
oder eben betateilchen seine Variante
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: Damian am 16 November 2018, 19:20:51
ZitatWas mache ich falsch?

Es ist eine Raw-Definition.

Einfach in der Kommandozeile: defmod SocialSeason2 DOIF

Dann in das Device  SocialSeason2 gehen auf "Raw definition" unten klicken und den Code gegen das Codeschnipsel ersetzen und unten auf "Execute commands" bestätigen.

P. S. Für die holiday Erweiterung muss noch einer eine Funktion für Zeitintervalle abhängig vom 1. Adventsonntag bzw. Ostersonntag definieren, dann braucht man mein Codeschnipsel nicht mehr ;)
Titel: Fehler in der Berechnung?
Beitrag von: misux am 26 November 2018, 07:26:21
Hi! Irgendwie klappt hier was nicht... Bei mir ist seit heute Advent!

Ich nutze ######## Adventberechnung ############

use strict;
use warnings;
use POSIX;
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;
}


Was muss ich einstellen damit Advent ist wenn Advent ist... Also ab dem 01.Advent... 😂

Oder hat das Update von gestern die Berechnung zerschossen?

Weiß jemand Rat?

Vielen Dank

EDIT

Habs gefunden!

es ist die 27 im $time -= ($wday+27)*86400;

Die errechnet den Start auf den Montag nach dem Totensonntag. Ändert man das auf 22 sollte es mit dem ersten Advent klappen.

Steht in den Posts drin ... Man muss sich sich nur alle durchlesen... ::)
Titel: Antw:Fehler in der Berechnung?
Beitrag von: misux am 16 Dezember 2018, 11:35:27
Zitat von: misux am 26 November 2018, 07:26:21
######## Adventberechnung ############

use strict;
use warnings;
use POSIX;
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;
}




HI Leute! Ist es irgendwie möglich ein zweites ansprechDatum einzubinden? Als ausgabe zb. ADV2= 1 oder 0 ab dem 3 Advent?

Also 2 Daten in diesem Adventgeschnipsel..

Vielen Dank!
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: odie13690 am 02 Januar 2021, 07:38:21
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;
}


Wie ändere ich den Code ab, dass die Zeit schon am 31.12. endet?

odie13690
Titel: Antw:Advent-Schnippsel für die Weihnachtsbeleuchtung
Beitrag von: DetlefR am 23 März 2022, 20:50:56
Ich bin zufällig auf diesen Thread gestoßen. Er ist zwar schon etwas älter, aber vielleicht liest es ja noch jemand.
Ich hatte das gleiche Problem. Weihnachtsbeleuchtung erst nach Totensonntag. Aber sie soll Abends für ein paar Stunden und morgens vor Sonnenaufgang auch noch mal für "kurze" Zeit leuchten.
sub isXmas(){
#Der Totensonntag fällt immer auf einen Tag zwischen dem 20. Und 26. November.
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday());
$month=10;
$mday=20;
($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(timelocal($sec,$min,$hour,$mday,$month,$year));
if ($wday>0){
$mday+=7-$wday;
}
#Montag nach Totensontag
$mday+=1;
my $totensonntag=timelocal(0,0,0,$mday,$month,$year);
#Weihnachtsbeleuchtungsende ist am 12.Januar
my $weihnachtsende=timelocal(59,59,23,12,1,$year);
#War wenn vor dem 12.01 oder nach Totensonntag
return gettimeofday()<$weihnachtsende ? 1 : gettimeofday() > $totensonntag ? 1 : 0;
}

Das ganze steht in 99_myUtils mit use POSIX;. Getriggert wird es mittels Sunrise und Sunset. Ab Montag bis zum festgesetzten Datum liefert die Funktion eine 1 zurück.

Gruß Detlef