Hauptmenü

Kalenderwoche in FHEM

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

Vorheriges Thema - Nächstes Thema

Freibeuter

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.

Hans Franz

Hallo,

Nimm doch $yday/7.

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Wzut

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

Freibeuter

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.

Thoffi1978

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

FranzB94

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.

joesy

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

Prof. Dr. Peter Henning

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

fiedel

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

Prof. Dr. Peter Henning

Ö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

gloob

#10
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
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

Benni

Irgendwie sind mir das zuviele geschweifte Klammern ;D

Versuch es mal so in deinem at



*02:00:00 {fhem("set Dummy_Kalenderwoche ".kalenderwoche());}

gloob

So funktioniert es. Vielen Dank.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

fiedel

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

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