FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Freibeuter am 22 Mai 2015, 16:39:08

Titel: Kalenderwoche in FHEM
Beitrag von: Freibeuter am 22 Mai 2015, 16:39:08
Hallo,
folgende Variablen habe ich gefunden:
$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst
Gibt es auch etwas für Kalenderwoche?
Gruß Peter F.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Hans Franz am 22 Mai 2015, 18:10:38
Hallo,

Nimm doch $yday/7.

Gruß
Hans
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Wzut am 22 Mai 2015, 19:20:35
sieht zwar gut aus ist aber nach DIN 1355 bzw. ISO 8601 leider falsch :( , siehe -> http://de.wikipedia.org/wiki/Woche
Vorschlag :
das Modul Date:Calc verwenden und sich in der 99_myUtils eine Funktion bauen


use Date::Calc qw(:all);
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
my $week =  Week_of_Year($year+1900,$month+1,$mday);


Date::Calc entweder aus CPAN installieren oder unter Debian mit  apt-get install libdate-calc-perl
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Freibeuter am 23 Mai 2015, 10:58:07
Hall und vielen Dank für die Info,
dann hat FHEM das nicht mit an Bord was ?

Nachinstallieren auf der Fritzbox ist ja so eine Sache.

Gruß
Peter F.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Thoffi1978 am 02 Juni 2015, 10:26:00
Hallo,
ich habe verucht das use Date::Calc qw(:all);
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
my $week =  Week_of_Year($year,$month+1,$mday);
mit einzubinden.
Ich bekomme nun aber folgende Fehlermeldung:
2015.06.01 17:08:20 1: reload: Error:Modul 99_myUtils deactivated:
Can't locate Date/Calc.pm in @INC (@INC contains: /var/InternerSpeicher/fhem/lib/perl5/site_perl/5.12.2/mips-linux /var/InternerSpeicher/fhem/lib/perl5/site_perl/5.12.2/mips-linux /var/InternerSpeicher/fhem/lib/perl5/site_perl/5.12.2 /var/InternerSpeicher/fhem/lib/perl5/5.12.2/mips-linux /var/InternerSpeicher/fhem/lib/perl5/5.12.2/mips-linux /var/InternerSpeicher/fhem/lib/perl5/5.12.2 /opt/lib/perl5/site_perl/5.12.2/mips-linux /opt/lib/perl5/site_perl/5.12.2 /opt/lib/perl5/5.12.2/mips-linux /opt/lib/perl5/5.12.2 . ./FHEM) at ./FHEM/99_myUtils.pm line 122, <$fh> line 7.
BEGIN failed--compilation aborted at ./FHEM/99_myUtils.pm line 122, <$fh> line 7.


Ist die Funktion bei Betrieb auf der Fritzbox überhaupt möglich?
Lieben Gruß
Hoffi
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: FranzB94 am 02 Juni 2015, 13:14:49
Zitat von: Wzut am 22 Mai 2015, 19:20:35

Date::Calc entweder aus CPAN installieren oder unter Debian mit  apt-get install libdate-calc-perl

FHEM mit der FRITZ!Box ist es schwierig geworden.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: joesy am 02 Juni 2015, 13:49:39
Im Code von Wzut ist noch ein kleiner Fehler. Beim Jahr muss noch 1900 addiert werden.


use Date::Calc qw(:all);
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
my $week =  Week_of_Year($year+1900,$month+1,$mday);


Gruß
joesy
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Prof. Dr. Peter Henning am 02 Juni 2015, 13:57:44
Das kann man in ein paar Zeilen auch ohne das zusätzliche Modul machen, hier ein Pseudocode:

http://www.salesianer.de/util/kalwoch.html

Und hier in Perl


use POSIX;
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
my $donthisweek = $yday+5-$wday;
my $donfirst    = $donthisweek % 7;
my $kw          = ($donthisweek - $donfirst)/7 + 1;


LG

pah
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: fiedel am 03 Juli 2016, 16:16:26
Hallo Peter,
um meine Entsorgungserinnerung endlich mal zu automatisieren brauche ich die aktuelle KW. Nun habe ich deinen Code mal mit der KW aus dem Internet und einem Webdienst verglichen und bekomme heute von dir 28 und vom Webdienst 26. Wo ist da bei mir der Denkfehler?


sub
calweek() {
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
my $donthisweek = $yday+5-$wday;
my $donfirst    = $donthisweek % 7;
my $kw          = ($donthisweek - $donfirst)/7 + 1;
return "$kw" ;
}

sub
calweek2() {
use LWP::Simple;
my $url = "http://kalenderwoche.celll.net?api=1";
my $api = get $url;
return "$api" ;
}


Vielen Dank und Gruß
Frank
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Prof. Dr. Peter Henning am 03 Juli 2016, 19:27:18
Öh, stimmt.

Die o.a. Perl-Implementation hat sogar zwei Fehler - das habe ich eindeutig zu schnell hingeschrieben: Erstens wird die erste Kalenderwoche als nullte Woche eingesetzt, und zweitens beginnt danach die Kalenderwoche schon Sonntags.

Korrekte Formulierung:
use POSIX;
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
my $donthisweek = $yday+5-$wday;
my $donfirst    = ($donthisweek % 7) + 1;
my $kw          = floor(($donthisweek - $donfirst)/7);
$kw += ($wday == 0) ? 0:1;


LG

pah
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: gloob am 03 Juli 2016, 19:38:51
Hat jemand bitte noch einen Tipp wie ich das ganze dann in einen Dummy schreiben kann.

Ich habe jetzt folgende Perl-Funktion:

sub kalenderwoche() {
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
my $donthisweek = $yday+5-$wday;
my $donfirst    = ($donthisweek % 7) + 1;
my $kw          = floor(($donthisweek - $donfirst)/7);
$kw += ($wday == 0) ? 0:1;
return $kw ;
}


Zusätzlich ein at:

*02:00:00 {my $s = {kalenderwoche()}; fhem("set Dummy_Kalenderwoche $s");}

allerdings landet im Dummy_Kalenderwoche nur:


HASH(0x4352568)


Wenn ich allerdings {kalenderwoche()} aufrufe, bekomme ich die korrekte Zahl zurück
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Benni am 03 Juli 2016, 20:30:01
Irgendwie sind mir das zuviele geschweifte Klammern ;D

Versuch es mal so in deinem at



*02:00:00 {fhem("set Dummy_Kalenderwoche ".kalenderwoche());}
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: gloob am 03 Juli 2016, 20:49:32
So funktioniert es. Vielen Dank.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: fiedel am 10 Juli 2016, 10:31:18
Von mir auch noch mal vielen Dank fürs überarbeiten! Es ist schon immer besser eine Information direkt berechen zu können, als auf einen Webdienst angewiesen zu sein. Wer weiß wie lange es den gibt...

Gruß
Frank
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: betateilchen am 28 Juli 2016, 20:10:28
Dass Google irgendwann seinen Kalenderdienst einstellt, glaube ich eher nicht.

Warum also den ganzen Mist selbst ausrechnen?


define wochen Calendar ical url https://calendar.google.com/calendar/ical/e_2_de%23weeknum%40group.v.calendar.google.com/public/basic.ics 86400
attr wochen hideLaterThan 0
attr wochen hideOlderThan 7d


Dann liefert ein

get wochen text all

als Ergebnis

25.07.16 00:00 Week 30 of 2016

Das heißt, aktuell befinden wir uns in Woche 30 :)

Zum Testen in der fhem-Kommandozeile:

{ (split(/ /,CommandGet(undef,'wochen text all')))[3] }
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: fiedel am 28 Juli 2016, 20:16:40
Zitat von: betateilchen am 28 Juli 2016, 20:10:28
Dass Google irgendwann seinen Kalenderdienst einstellt, glaube ich eher nicht.

Gerade google hat schon vieles eingestellt, von dem die Nutzer es nie erwartet hätten. Oder sie schaffen die API ab. Ich nutze so wenig google wie möglich...
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: betateilchen am 28 Juli 2016, 20:19:29
Bei den APIs gebe ich Dir recht.
Aber der Google Kalender ist integraler Bestandteil der Google Office Suite, da habe ich wenig Bedenken.

Der Link zum Google-Wochenkalender ist ja auch nur ein Beispiel für die Vorgehensweise, solche ics Dateien gibt es von unzähligen Anbietern, nicht nur von google.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Loetkolben am 02 September 2017, 11:51:20
Hallo,

Zitat von: betateilchen am 28 Juli 2016, 20:10:28
Dass Google irgendwann seinen Kalenderdienst einstellt, glaube ich eher nicht.

Warum also den ganzen Mist selbst ausrechnen?


define wochen Calendar ical url
...
...


...
...
Zum Testen in der fhem-Kommandozeile:

{ (split(/ /,CommandGet(undef,'wochen text all')))[3] }

bis hierhin funktioniert das bestens, es wird die aktuelle Woche angezeigt.
Aber - wie bekomme ich jetzt die Woche, bzw. die Zahl z.B. in einen Dummy geschrieben um sie hinterher auszuwerten?
Hintergrund: Ich möchte in Abhängigkeit einer geraden oder ungeraden Kalenderwoche, unterschiedliche Stundenpläne in Tablet UI anzeigen.


   Andreas
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Prof. Dr. Peter Henning am 02 September 2017, 16:35:48
Tipp: Perl lernen.

LG

pah
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Loetkolben am 04 September 2017, 15:54:28
... hat geholfen.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: accessburn am 04 September 2017, 16:28:29
Zitat von: betateilchen am 28 Juli 2016, 20:10:28

define wochen Calendar ical url https://calendar.google.com/calendar/ical/e_2_de%23weeknum%40group.v.calendar.google.com/public/basic.ics 86400
attr wochen hideLaterThan 0
attr wochen hideOlderThan 7d


Liebes betateilchen,
woooooo haste denn das ics her?  8) ;D
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: fiedel am 08 September 2017, 12:51:43
Hallo,

habe jetzt noch mal nach einer "perfekten" Lösung für die Berechnung der KW mit Perl gesucht und diese hier (https://github.com/OpenAutomationProject/Wiregate/blob/master/plugin/generic/schaltuhr.pl) gefunden. Ich habe sie noch "FHEM- kompatibel" gemacht und aktuell zeigt sie die richtige Woche an. Wichtig für diesen Codeschnipsel ist die Definition von use Time::Local; oben in der MyUtils, bei den anderen "uses". Die Woche bekommt man testweise per {getWeekNumber()} in der Befehlszeile. Und nun noch der Code (kommt in die MyUtils):

sub getWeekNumber
{
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
my $weekNumber = checkWeekNumber($year, $month, $dayn);
# wenn Wochennummer gleich 0, dann ist das aktuelle Datum
# in der Woche vor dem 4. Januar
# also in der letzten Woche des letzten Jahres
if ($weekNumber == 0)
{
   # Wochennummer des letzten Woche des letzten Jahres suchen
   $weekNumber = checkWeekNumber(($year - 1), 12, 31);
   # wenn die Wochennummer größer als 52 ist
   # dann prüfen ob diese Wochennummer korrekt ist oder
   # sie bereits die erste Woche des aktuellen Jahres ist
   if ($weekNumber > 52)
   {
     $weekNumber = checkWeekNumber($year, 1, 1);
     # wenn der 1. Januar des aktuellen Jahres in der Woche 0 liegt
     # dann ist es die Woche 53
     if ($weekNumber == 0)
     {
       $weekNumber = 53;
     }
   }
}
# wenn die Wochennummer größer als 52 ist
# dann prüfen ob diese Wochennummer korrekt ist oder
# sie bereits die erste Woche des nächsten Jahres ist
elsif ($weekNumber > 52)
{
   $weekNumber = checkWeekNumber(($year + 1), 1, 1);
   # wenn der 1. Januar des nächsten Jahres in der Woche 0 liegt
   # dann ist es die Woche 53
   if ($weekNumber == 0)
   {
     $weekNumber = 53;
   }
}
return ($weekNumber);
}

sub checkWeekNumber {
my ($year, $month, $day) = @_;
# 4. Januar als erste Woche erstellen
my $firstDateTime = timelocal(0, 0, 12, 4, 0, $year);
# Wochentag des 4. Januar ermitteln
my $dayOfWeek = (localtime($firstDateTime))[6];
$dayOfWeek = abs((($dayOfWeek + 6) % 7));
# geh zu Wochenanfang (Montag) zurück
$firstDateTime -= ($dayOfWeek * 3600 * 24);
# aktuelles Datum erstellen
my $currentDateTime = timelocal(0, 0, 14, $day, $month, $year);
# Differenz in Tagen berechnen
my $diffInDay = ($currentDateTime - $firstDateTime) / 3600 / 24;
# Anzahl der Wochen zwischen aktuellem Datum und 4. Januar berechnen
my $weekNumber = floor($diffInDay / 7) + 1;
return ($weekNumber);
}


Gruß
Frank
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: papa am 08 September 2017, 13:03:35
Das sieht aber kompliziert aus. Schau mal hier (http://www.salesianer.de/util/kalwoch.html) gibt es eine Implementierung in Javascript. Die braucht nur ein paar Zeilen. Das sollte doch auch mit perl gehen.


Datum=new Date(j,m-1,t); // Anm. 1
DoDat=donnerstag(Datum);
kwjahr=DoDat.getFullYear();
DoKW1=donnerstag(new Date(kwjahr,0,4)); // Anm. 2
kw=Math.floor(1.5+(DoDat.getTime()-DoKW1.getTime())/86400000/7) // Anm. 3, 4

function donnerstag(datum) { // Anm. 5
  var Do=new Date();
  Do.setTime(datum.getTime() + (3-((datum.getDay()+6) % 7)) * 86400000); // Anm. 3
  return Do;
}
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: fiedel am 08 September 2017, 13:08:52
Das Problem mit diesen "einfachen" Versionen ist, dass sie nicht die Verschiebungen beim Jahreswechsel berücksichtigen und deshalb nicht in jedem Jahr die richtige Woche zurückliefern.
Die Ermittlung der KW ist leider sehr komplex.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: papa am 08 September 2017, 13:32:12
Doch wird gemacht. Schau Dir doch mal die Webseite an. Dort steht alles erklärt.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Wzut am 08 September 2017, 13:45:17
Zitat von: fiedel am 08 September 2017, 13:08:52
Die Ermittlung der KW ist leider sehr komplex.
Stimmt, darum hat mein Vorschlag auf Seite 1 Antwort #2 auch nur drei Zeilen :)
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: fiedel am 08 September 2017, 13:49:37
Zitat von: Wzut am 08 September 2017, 13:45:17
Stimmt, darum hat mein Vorschlag auf Seite 1 Antwort #2 auch nur drei Zeilen :)
Naja, das war mir zu einfach und ich wollte den Wasserkopf von DateCalc nicht haben.  ;)
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: papa am 08 September 2017, 13:52:29
In Antwort 9 hatte das Pah sogar schon als Perl gepostet. Was ist daran so schlecht ?
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: doman75 am 08 September 2017, 14:47:11
der code aus antwort 9 liefert aber eine falsche KW, nämlich die KW35 , der neue Code liefert die korrekte KW nämlich 36

Grüße
Swen
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Wuppi68 am 08 September 2017, 15:13:43
um mal ein wenig über den Tellerrand zu schauen :-)

Excel rechnet auch falsch ;-)

nach diversen Recherchen bin ich auf folgende Formel gestossen die auch nach ISO Norm korrekt sein soll:

=WENN(WOCHENTAG(Datum;2)=1;KÜRZEN((TestDatum-DATUM(JAHR(TestDatum+3-REST(TestDatum-2;7));1;REST(TestDatum-2;7)-9))/7);"")

Vielleicht kann man Funktion DOW zentral zur Verfügung stellen?

Grüße

Ralf

DOW = Day Of Week
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: papa am 08 September 2017, 15:33:20
Zitat von: doman75 am 08 September 2017, 14:47:11
der code aus antwort 9 liefert aber eine falsche KW, nämlich die KW35 , der neue Code liefert die korrekte KW nämlich 36

Ups - das ist natürlich ein Grund
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Morius am 13 Mai 2018, 21:35:34
Zitat von: Prof. Dr. Peter Henning am 03 Juli 2016, 19:27:18
Öh, stimmt.

Die o.a. Perl-Implementation hat sogar zwei Fehler - das habe ich eindeutig zu schnell hingeschrieben: Erstens wird die erste Kalenderwoche als nullte Woche eingesetzt, und zweitens beginnt danach die Kalenderwoche schon Sonntags.

Korrekte Formulierung:
use POSIX;
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
my $donthisweek = $yday+5-$wday;
my $donfirst    = ($donthisweek % 7) + 1;
my $kw          = floor(($donthisweek - $donfirst)/7);
$kw += ($wday == 0) ? 0:1;


LG

pah

Mir gefällt diese Lösung sehr gut (da keine Verwendung von Date::Calc); sie hatte damals auch korrekte Ergebnisse produziert. Seit dem Schaltjahr?? liegt diese Berechnung aber um eine Woche daneben. D.h. sie ermittelt für heute die Woche 18 anstelle von 19.

Können Sie diese Lösung evtl. aktualisieren?
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Prof. Dr. Peter Henning am 14 Mai 2018, 07:12:24
Nein. Ich bin kein Auftragnehmer.

pah
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: andies am 14 Mai 2018, 08:41:55
Zitat von: Morius am 13 Mai 2018, 21:35:34
Können Sie diese Lösung evtl. aktualisieren?
Nimm doch fiedels Lösung oben. Wie viele Zeilen man in die myutils kopiert ist doch irrelevant.


Gesendet von iPhone mit Tapatalk Pro
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: mumpitzstuff am 14 Mai 2018, 21:37:18
https://stackoverflow.com/questions/25245927/get-week-number-with-posixstrftime-in-perl (https://stackoverflow.com/questions/25245927/get-week-number-with-posixstrftime-in-perl)

Versuchs mal mit der Lösung ganz unten. Sollte laut Kommentar ab Perl 5.10 funktionieren.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: andies am 14 Mai 2018, 21:52:43
Das klingt zu gut um wahr zu sein ;-)

Bei mir klappt das nicht. Ich habe Time::Piece in myutils ausgelagert.

.(https://uploads.tapatalk-cdn.com/20180514/2b569f160910914d4b799b9835a207c5.jpg)


Gesendet von iPad mit Tapatalk Pro
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: andies am 14 Mai 2018, 22:14:37
Das geht:

defmod Kalenderwoche dummy
attr Kalenderwoche stateFormat { localtime->week}



Gesendet von iPad mit Tapatalk Pro
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: fiedel am 14 Mai 2018, 23:02:29
Eigentlich mag ich es ja auch gern unabhängig (von Webdiensten) aber wer simpel und schnell die KW will, kann auch die 2. Sub aus diesem Post (https://forum.fhem.de/index.php/topic,37427.msg468817.html#msg468817) nutzen.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: andies am 05 Januar 2019, 09:10:04
Zitat von: Prof. Dr. Peter Henning am 03 Juli 2016, 19:27:18
Korrekte Formulierung:
use POSIX;
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
my $donthisweek = $yday+5-$wday;
my $donfirst    = ($donthisweek % 7) + 1;
my $kw          = floor(($donthisweek - $donfirst)/7);
$kw += ($wday == 0) ? 0:1;

Diese Lösung zeigt mir diese Woche als nullte Woche - oder mache ich da was falsch? Ich sehe den Fehler nicht.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Benni am 05 Januar 2019, 10:42:15
Ich verwende fiedels Lösung hier aus dem Thread (https://forum.fhem.de/index.php/topic,37427.msg682632.html#msg682632)

Liefert bei mir aktuell korrekt die Kalenderwoche 1 :)

gb#
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: andies am 05 Januar 2019, 14:04:54
Danke, habe nun (weil ich nicht abonniert hatte) mir selbst nach diesem ISO 8601-Eintrag eine zusammengebastelt und ich vermute, dass ist exakt fiedels Lösung:
sub plain_calweek($){
my ($datediff) = @_;
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time+$datediff*24*60*60);
$wday = $wday % 7;
return floor(($yday-$wday+10)/7);
}

sub calweek() {
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
# siehe https://en.wikipedia.org/wiki/ISO_week_date
my $kw=plain_calweek(0);
my $n_kw=0;
my $daysdiff=0;
# wenn null, Wochennummer letzte Woche des Vorjahres
if ($kw==0){
do {
$daysdiff -= 1;
$n_kw = plain_calweek($daysdiff);
}
until ($n_kw !=0)
} elsif ($kw == 53) {
do {
$daysdiff += 1;
$n_kw = plain_calweek($daysdiff);
}
until ($n_kw !=53);
if ($n_kw == 1) {$kw=$n_kw}
}
return $kw;
}

Verrückt, wie eine auf den ersten Blick so einfache Sache doch so komplex ist.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Lichti am 01 Januar 2021, 10:49:58
Nachdem der Code von fiedel bisher super fumktioniert hat, gbt es heute ein Problem:

Error evaluating astro userReading kw: Month '12' out of range 0..11 at ./FHEM/99_myUtils.pm line 159

Ich komme da nicht weiter. Kann mir jemand helfen ?
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: andies am 01 Januar 2021, 12:03:45
Bei mir ist auch Woche null...

<edit> nach ISO  https://en.wikipedia.org/wiki/ISO_week_date (https://en.wikipedia.org/wiki/ISO_week_date) haben wir momentan noch Woche 53. Also muss ich an meinem Code arbeiten.

<edit2> und jetzt sehe ich den Fehler. Nach der Zeile
until ($n_kw != 0)
wird die neu errechnete Kalenderwoche nicht zurückgegeben, sondern links liegen gelassen.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: andies am 01 Januar 2021, 12:26:17
Zitat von: Lichti am 01 Januar 2021, 10:49:58
Error evaluating astro userReading kw: Month '12' out of range 0..11 at ./FHEM/99_myUtils.pm line 159

Ich komme da nicht weiter. Kann mir jemand helfen ?
Ich nehme an, in Zeile 159 steht bei dir
  $weekNumber = checkWeekNumber($year, 1, 1);
und nach $year muss eine null, keine eins stehen. In Perl ist der Januar der nullte Monat.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Jamo am 01 Januar 2021, 13:58:55
... bzw eine 11 und nicht 12 ..
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Lichti am 01 Januar 2021, 14:46:24
Entschuldigung. Hatte vergessen den Inhalt der Zeile 159 mitzuschicken.
Da steht bei mir:
my $currentDateTime = timelocal(0, 0, 14, $day, $month, $year);

Der Ausdruck
$weekNumber = checkWeekNumber($year, 1, 1);
steht bei mir in Zeile 124
Habe das au
$weekNumber = checkWeekNumber($year, 0, 1);
geändert.

Aber immer noch die Fehlermeldung:
Error evaluating astro userReading kw: Month '12' out of range 0..11 at ./FHEM/99_myUtils.pm line 159

Hier nochmal der ganze Code:
#########################
# Kalenderwoche berechnen
sub getWeekNumber
{
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
my $weekNumber = checkWeekNumber($year, $month, $dayn);
# wenn Wochennummer gleich 0, dann ist das aktuelle Datum
# in der Woche vor dem 4. Januar
# also in der letzten Woche des letzten Jahres
if ($weekNumber == 0)
{
   # Wochennummer des letzten Woche des letzten Jahres suchen
   $weekNumber = checkWeekNumber(($year - 1), 12, 31);
   # wenn die Wochennummer größer als 52 ist
   # dann prüfen ob diese Wochennummer korrekt ist oder
   # sie bereits die erste Woche des aktuellen Jahres ist
   if ($weekNumber > 52)
   {
     $weekNumber = checkWeekNumber($year, 0, 1);
     # wenn der 1. Januar des aktuellen Jahres in der Woche 0 liegt
     # dann ist es die Woche 53
     if ($weekNumber == 0)
     {
       $weekNumber = 53;
     }
   }
}
# wenn die Wochennummer größer als 52 ist
# dann prüfen ob diese Wochennummer korrekt ist oder
# sie bereits die erste Woche des nächsten Jahres ist
elsif ($weekNumber > 52)
{
   $weekNumber = checkWeekNumber(($year + 1), 1, 1);
   # wenn der 1. Januar des nächsten Jahres in der Woche 0 liegt
   # dann ist es die Woche 53
   if ($weekNumber == 0)
   {
     $weekNumber = 53;
   }
}
return ($weekNumber);
}

sub checkWeekNumber {
my ($year, $month, $day) = @_;
# 4. Januar als erste Woche erstellen
my $firstDateTime = timelocal(0, 0, 12, 4, 0, $year);
# Wochentag des 4. Januar ermitteln
my $dayOfWeek = (localtime($firstDateTime))[6];
$dayOfWeek = abs((($dayOfWeek + 6) % 7));
# geh zu Wochenanfang (Montag) zurück
$firstDateTime -= ($dayOfWeek * 3600 * 24);
# aktuelles Datum erstellen
my $currentDateTime = timelocal(0, 0, 14, $day, $month, $year);
# Differenz in Tagen berechnen
my $diffInDay = ($currentDateTime - $firstDateTime) / 3600 / 24;
# Anzahl der Wochen zwischen aktuellem Datum und 4. Januar berechnen
my $weekNumber = floor($diffInDay / 7) + 1;
return ($weekNumber);
}
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Jamo am 01 Januar 2021, 14:59:50
In der Zeile ,    $weekNumber = checkWeekNumber(($year - 1), 12, 31);'
die 12 gegen 11 tauschen.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Christoph Morrison am 01 Januar 2021, 15:17:16
Vielleicht übersehe ich etwas, aber:


$ perl -MPOSIX -e 'print strftime(q(%V), localtime)'
53

$ corelist POSIX
Data for 2018-11-29
POSIX was first released with perl 5


Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Lichti am 01 Januar 2021, 15:47:30
In der Zeile ,    $weekNumber = checkWeekNumber(($year - 1), 12, 31);'
die 12 gegen 11 tauschen.


Das war's.

Vielen Dank !
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Damian am 01 Januar 2021, 15:59:12
Zitat von: Christoph Morrison am 01 Januar 2021, 15:17:16
Vielleicht übersehe ich etwas, aber:


$ perl -MPOSIX -e 'print strftime(q(%V), localtime)'
53

$ corelist POSIX
Data for 2018-11-29
POSIX was first released with perl 5


Das ist korrekt, siehe https://www.aktuelle-kalenderwoche.com/

daher hat der Einzeiler im Status auch immer die korrekte Wochenzahl:

defmod di_week DOIF init{[00:00];;set_State($week)}
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: andies am 01 Januar 2021, 17:34:38
Wir wollten halt auch mal programmieren  8)
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Damian am 01 Januar 2021, 18:12:19
Zitat von: andies am 01 Januar 2021, 17:34:38
Wir wollten halt auch mal programmieren  8)

Klar kann man machen, aber ich habe auch nicht im DOIF intern programmiert, sondern habe einfach den Parameter %V von strftime benutzt. Da haben sich bestimmt schon einige Programmierer Gedanken zur Korrektheit des Codes der Funktion strftime gemacht.  ;)
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: fiedel am 01 Januar 2021, 20:15:25
Zitat von: Christoph Morrison am 01 Januar 2021, 15:17:16
Vielleicht übersehe ich etwas, aber:


$ perl -MPOSIX -e 'print strftime(q(%V), localtime)'
53

$ corelist POSIX
Data for 2018-11-29
POSIX was first released with perl 5


Genial! Konkurrenzlos wenig Code. Hab ich sofort übernommen.  :)

Gesundes Neues Euch!

Edit: In der myUtils sieht das dann z.B. so aus:sub getWeekNumber{strftime(q(%V), localtime)}
oder als Variable innerhalb einer Sub:
my $kw = strftime(q(%V), localtime);
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: andies am 02 Januar 2021, 11:01:53
Bitte nicht falsch verstehen: aber hatte Richard nicht empfohlen, POSIX aus dem Code zu werfen,  https://forum.fhem.de/index.php/topic,109509.msg1034932.html#msg1034932 (https://forum.fhem.de/index.php/topic,109509.msg1034932.html#msg1034932)? Sonst würde ich nämlich Euren Code nehmen, der ist in der Tat schön kurz und ich muss ja nicht programmieren, was wahrscheinlich schon an anderer Stelle erreicht wurde.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Damian am 02 Januar 2021, 12:08:08
Zitat von: andies am 02 Januar 2021, 11:01:53
Bitte nicht falsch verstehen: aber hatte Richard nicht empfohlen, POSIX aus dem Code zu werfen,  https://forum.fhem.de/index.php/topic,109509.msg1034932.html#msg1034932 (https://forum.fhem.de/index.php/topic,109509.msg1034932.html#msg1034932)? Sonst würde ich nämlich Euren Code nehmen, der ist in der Tat schön kurz und ich muss ja nicht programmieren, was wahrscheinlich schon an anderer Stelle erreicht wurde.

Im DOIF wurde POSIX nicht explizit angezogen, es wird lediglich package main verwendet.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Christoph Morrison am 02 Januar 2021, 13:35:53
Zitat von: andies am 02 Januar 2021, 11:01:53
Bitte nicht falsch verstehen: aber hatte Richard nicht empfohlen, POSIX aus dem Code zu werfen,  https://forum.fhem.de/index.php/topic,109509.msg1034932.html#msg1034932 (https://forum.fhem.de/index.php/topic,109509.msg1034932.html#msg1034932)? Sonst würde ich nämlich Euren Code nehmen, der ist in der Tat schön kurz und ich muss ja nicht programmieren, was wahrscheinlich schon an anderer Stelle erreicht wurde.

Nein, das hat er nicht und das wäre auch Unfug. Richard hat darauf hingewiesen, dass

use POSIX;

aus kompatibilitätsgründen jede Menge Zeug in main:: importiert. Ich zitiere mal perldoc (https://perldoc.perl.org/POSIX):

Zitat
Everything is exported by default (with a handful of exceptions). This is an unfortunate backwards compatibility feature and its use is strongly discouraged. You should either prevent the exporting (by saying use POSIX ();, as usual) and then use fully qualified names (e.g. POSIX::SEEK_END), or give an explicit import list. If you do neither and opt for the default (as in use POSIX;), you will import hundreds and hundreds of symbols into your namespace.

D.h. du machst einfach:

use POSIX ();  # nix aus POSIX:: nach main:: importieren


und später dann


POSIX::strftime() # explizit strftime aus POSIX aufrufen


und alle sind glücklich.



Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Christoph Morrison am 02 Januar 2021, 13:44:08
Zitat von: Damian am 02 Januar 2021, 12:08:08
Im DOIF wurde POSIX nicht explizit angezogen, es wird lediglich package main verwendet.

Jein, denn Rudolf erledigt (https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L32) das schon für dich - nur früher. D.h. du benutzt bereits das von POSIX exportierte strftime aus fhem.pl und würde Rudolf das (hoffentlich) umstellen, hätte DOIF ein Problem, denn strftime gibt es in main nicht (ist ja aus POSIX).


$ perl -e 'print strftime(q(%V), localtime)'
Undefined subroutine &main::strftime called at -e line 1.

$ perl -MPOSIX -e 'print strftime(q(%V), localtime)'
53


Die Tatsache, dass du das nicht wusstest, zeigt gut, was das Problem mit dem vollgemüllten main-Namespace ist.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Damian am 02 Januar 2021, 14:49:57
ZitatJein, denn Rudolf erledigt das schon für dich - nur früher. D.h. du benutzt bereits das von POSIX exportierte strftime aus fhem.pl und würde Rudolf das (hoffentlich) umstellen, hätte DOIF ein Problem, denn strftime gibt es in main nicht (ist ja aus POSIX).

Naja, immerhin wird strftime offenbar in 65! Modulen benutzt, dann viel Spaß beim Umstellen ;)
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Christoph Morrison am 02 Januar 2021, 15:04:58
Zitat von: Damian am 02 Januar 2021, 14:49:57
Naja, immerhin wird strftime offenbar in 65! Modulen benutzt, dann viel Spaß beim Umstellen ;)

Macht nix, denn jedes davon bindet POSIX ja noch mal ein und importiert wieder alles nach main ;-)
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Wzut am 02 Januar 2021, 19:01:52
Jedes , sicher ? Ich war der Meinung damals als Richard das Thema erklärt hat und ich eh dabei war meine Module auf package umzubauen,
das  jetzt use POSIX qw(strftime) im eigenen Modul der richtige Weg sei.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Christoph Morrison am 02 Januar 2021, 19:21:48
Zitat von: Wzut am 02 Januar 2021, 19:01:52
Jedes , sicher ? Ich war der Meinung damals als Richard das Thema erklärt hat und ich eh dabei war meine Module auf package umzubauen,
das  jetzt use POSIX qw(strftime) im eigenen Modul der richtige Weg sei.

Tut mir leid wenn ich dich verunsichert habe, aber wie du das machst ist es schon ok (deshalb der ;-) dahinter). Das war mehr eine sarkastische Anmerkung zum Allgemeinzustand - aktuell finde ich use POSIX; in etwa 100 Fällen im trunk.
Titel: Antw:Kalenderwoche in FHEM
Beitrag von: Wzut am 03 Januar 2021, 07:17:04
Ahhhh THX :)