Hauptmenü

Kalenderwoche in FHEM

Begonnen von Freibeuter, 22 Mai 2015, 16:39:08

Vorheriges Thema - Nächstes Thema

fiedel

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...
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

betateilchen

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

Loetkolben

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
1x Pi3, 1x Pi4, CUL V3, miniCUL433+868, IKEA-Steckdosen, Sonoff, Shelly, Conbee II, div. Zigbee-Leuchten, Alexa, Homematic, Tablet UI

Prof. Dr. Peter Henning


Loetkolben

1x Pi3, 1x Pi4, CUL V3, miniCUL433+868, IKEA-Steckdosen, Sonoff, Shelly, Conbee II, div. Zigbee-Leuchten, Alexa, Homematic, Tablet UI

accessburn

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
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

fiedel

Hallo,

habe jetzt noch mal nach einer "perfekten" Lösung für die Berechnung der KW mit Perl gesucht und diese hier 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
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

papa

Das sieht aber kompliziert aus. Schau mal hier 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;
}
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

fiedel

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.
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

papa

Doch wird gemacht. Schau Dir doch mal die Webseite an. Dort steht alles erklärt.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Wzut

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 :)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

fiedel

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.  ;)
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

papa

In Antwort 9 hatte das Pah sogar schon als Perl gepostet. Was ist daran so schlecht ?
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

doman75

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

Wuppi68

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
FHEM unter Proxmox als VM