Advent-Schnippsel für die Weihnachtsbeleuchtung

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

Vorheriges Thema - Nächstes Thema

Icinger

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

P.A.Trick

Vielen Dank dafür, aber kann ich das mit dem Kalender Modul nicht einfacher machen?
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

kb958291


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

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

kb958291

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... :'(
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

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

raspklaus

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 ?

kumue

Ich habe einen anderen Ansatz gewählt... holiday Datei 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.

moonsorrox

Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

raspklaus

moon,

das hatte ich später dort, da hier niemand geantwortet hat

raspklaus

#11
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);


Icinger

Hi Leute,

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

Nu sollte es klappen (zumindest bei mir gehts)

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

raspklaus

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.


kb958291

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

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

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

FHEM-User22

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
FHEM auf Raspberry Pi und Proxmox und... und.... und....

Damian

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 ?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEM-User22

Moin,
ich habe gestern geupdatet. Woran kann ich die Version erkennen?

Grüße
FHEM auf Raspberry Pi und Proxmox und... und.... und....

Damian

Das ist naheliegend:

In der Kommandozeile: Version DOIF
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEM-User22

Stimmt, sorry,

98_DOIF.pm 17557 2018-10-17 21:06:30Z Damian
FHEM auf Raspberry Pi und Proxmox und... und.... und....

Damian

#50
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEM-User22

FHEM auf Raspberry Pi und Proxmox und... und.... und....

Damian

#52
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rewe2000

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
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#55
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rewe2000

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

Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Damian

#57
siehe: https://forum.fhem.de/index.php/topic,43685.msg835411.html#msg835411

Edit: Ich habe es jetzt im Codeschnipsel hinzugefügt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rewe2000

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
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Cybers

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
FHEM 6.2 auf Raspberry PI 4 / Smartvisu
Eltako Serie 14: FAM14, FGW14-USB, FSB14, FSR14-4x, FSR14-2x, FDG14, FTS14-EM in Kombination mit Jung F50 24V Tastern
1-Wire Temperatursensoren
aus alter Zeit:
Gott sei Dank nur noch 3 Homematic Jalousie- & Schaltaktoren! Wer sich mit Funk auskennt, legt Kabel

betateilchen

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

moonsorrox

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
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

#62
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 ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

misux

#63
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... ::)

misux

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!

odie13690

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

DetlefR

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