Hauptmenü

Kalenderwoche in FHEM

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

Vorheriges Thema - Nächstes Thema

papa

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
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Morius

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?

Prof. Dr. Peter Henning

Nein. Ich bin kein Auftragnehmer.

pah

andies

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
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

mumpitzstuff

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.

andies

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
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Das geht:

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



Gesendet von iPad mit Tapatalk Pro
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

fiedel

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

andies

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.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Benni

Ich verwende fiedels Lösung hier aus dem Thread

Liefert bei mir aktuell korrekt die Kalenderwoche 1 :)

gb#

andies

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.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Lichti

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 ?

andies

#42
Bei mir ist auch Woche null...

<edit> nach ISO 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.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

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.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Jamo

... bzw eine 11 und nicht 12 ..
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence