Advent-Schnippsel für die Weihnachtsbeleuchtung

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

Vorheriges Thema - Nächstes Thema

raspklaus

ok,
habe den Fehler gefunden

in die myUtils muss noch

use DateTime;

rein

raspklaus

Es wird aber nur bei Dezember eine 1 ausgegeben

Eine Null 0 kommt nie

kb958291

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...

FHEM@ASUS-PN40, HM-CFG-LAN, CUL868, CUL433, HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-LC-Bl1PBU-FM, IT1500, Elero, Tasmota

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

kb958291

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;
FHEM@ASUS-PN40, HM-CFG-LAN, CUL868, CUL433, HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-LC-Bl1PBU-FM, IT1500, Elero, Tasmota

raspklaus

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 ?

Icinger

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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho


Spartacus

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
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Icinger

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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Spartacus

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
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Icinger

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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Spartacus

Hi Stefan,
ah! Alles klar! Danke für die Erklärung!

Spartacus.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Spartacus

#29
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!

Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R