Hauptmenü

DOIF und Kalenderwoche erstellen

Begonnen von moonsorrox, 26 Februar 2018, 19:00:40

Vorheriges Thema - Nächstes Thema

moonsorrox

Ich möchte gern mit DOIF die Kalenderwoche anzeigen lassen in der 99_myUtils habe ich dafür ein Perlcode.
Jetzt dachte ich ich kann das so machen, funktioniert aber nicht, hat jemand ein Tipp was da falsch ist..?

defmod di_kalenderwoche DOIF ([18:51])
attr di_kalenderwoche room System
attr di_kalenderwoche state {getWeekNumber()}

setstate di_kalenderwoche {getWeekNumber()}
setstate di_kalenderwoche 2018-02-26 18:51:00 cmd 1
setstate di_kalenderwoche 2018-02-26 18:51:00 cmd_event timer_1
setstate di_kalenderwoche 2018-02-26 18:51:00 cmd_nr 1
setstate di_kalenderwoche 2018-02-26 18:49:56 mode enabled
setstate di_kalenderwoche 2018-02-26 18:51:00 state {getWeekNumber()}
setstate di_kalenderwoche 2018-02-26 18:51:00 timer_01_c01 27.02.2018 18:51:00
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

kumue

denke so müsste es gehen...
defmod di_kalenderwoche DOIF ([18:51]) ({getWeekNumber()})
attr di_kalenderwoche room System

Ellert

#2
Zitat von: moonsorrox am 26 Februar 2018, 19:00:40
Ich möchte gern mit DOIF die Kalenderwoche anzeigen lassen in der 99_myUtils habe ich dafür ein Perlcode.
Jetzt dachte ich ich kann das so machen, funktioniert aber nicht, hat jemand ein Tipp was da falsch ist..?

defmod di_kalenderwoche DOIF ([18:51])
attr di_kalenderwoche room System
attr di_kalenderwoche state {getWeekNumber()}

setstate di_kalenderwoche {getWeekNumber()}
setstate di_kalenderwoche 2018-02-26 18:51:00 cmd 1
setstate di_kalenderwoche 2018-02-26 18:51:00 cmd_event timer_1
setstate di_kalenderwoche 2018-02-26 18:51:00 cmd_nr 1
setstate di_kalenderwoche 2018-02-26 18:49:56 mode enabled
setstate di_kalenderwoche 2018-02-26 18:51:00 state {getWeekNumber()}
setstate di_kalenderwoche 2018-02-26 18:51:00 timer_01_c01 27.02.2018 18:51:00

Du benötigst einen Auslöser, der die Berechnung anstösst.

([00:01]) (setreading $SELF state {(getWeekNumber())})

und do always

Falls die Berechnung kompliziert ist, ginge auch
{(POSIX::strftime('%U', localtime))}

moonsorrox

Die (setreading $SELF state {(getWeekNumber())})
Variante Code funktioniert leider nicht hier steht im "state" nur "cmd_1"

Dieser Fehler erscheint mit "{(POSIX::strftime('%U', localtime))}"
error {(POSIX::strftime('%U', localtime))}: 08

Gebe ich aber in die Statuszeile von fhem {(getWeekNumber())} ein, erscheint die 9, also die Perlvariable ist OK

Gebe ich {(POSIX::strftime('%U', localtime))} erscheint 08, ist also nicht richtig..!
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

Ellert

#4
%U ist nur ein Beispiel Parameter, Du kannst %U,%V oder %W angeben, dann ist die Zählung jeweils anders, siehe http://search.cpan.org/~dexter/POSIX-strftime-GNU-0.02/lib/POSIX/strftime/GNU.pm

error siehe https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche , Punkt 2.3. oder spiele mit den Klammern.

ZitatVariante Code funktioniert leider nicht hier steht im "state" nur "cmd_1"
Dann nimm eine andere Variante mit Trigger, berechne ein Reading und nutze es in stateFormat.
Vielleicht funktionieren auch Zeittrigger im Attribut state.

Die Kernaussage bleibt: "Du benötigst einen Auslöser, der die Berechnung anstösst."

Damian

Zitat von: moonsorrox am 27 Februar 2018, 00:29:47
Die (setreading $SELF state {(getWeekNumber())})
Variante Code funktioniert leider nicht hier steht im "state" nur "cmd_1"

Dieser Fehler erscheint mit "{(POSIX::strftime('%U', localtime))}"
error {(POSIX::strftime('%U', localtime))}: 08

Gebe ich aber in die Statuszeile von fhem {(getWeekNumber())} ein, erscheint die 9, also die Perlvariable ist OK

Gebe ich {(POSIX::strftime('%U', localtime))} erscheint 08, ist also nicht richtig..!

In der Bedingung von DOIF (aber nur dort) gibt es die Variable $week, sie wird mit strftime('%W',...) bestimmt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

Da ich gerade etwas verwirrt bin und so gar nicht durchsehe...muss ich mich mal mit beschäftigen  :-\ hatte nicht gedacht das es so schwierig ist... :-\
mit dem DOIFtools habe ich noch nie gearbeitet...!

folgendes ich habe ein sogenannten Countdown mit DOIF realisiert und daher kommt also mein erster Code und Gedanke mit den Perlvariablen (wovon ich keine Ahnung habe, dass habe ich mir zusammen gesucht)

In dem DOIF habe ich eigentlich nur eine Zeit eingetragen eben da 0 Uhr und im state steht
{(int((time_str2num("2018-03-02")-time())/86400))}
Das zählt die Tage runter bis zum eingetragenem Datum und da habe ich eben versucht das mit der Kalenderwoche umzusetzen.

ZitatDie Kernaussage bleibt: "Du benötigst einen Auslöser, der die Berechnung anstösst."
ich dachte der Auslöser ist die Zeit..?
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

rabehd

ZitatIch möchte gern mit DOIF die Kalenderwoche anzeigen lassen
Ich frage mich, wozu?
Ja, wenn da Dummy stände, aber wozu doe KW als state eines DOIF?
Auch funktionierende Lösungen kann man hinterfragen.

Ellert

ZitatDOIFtools habe ich noch nie gearbeitet
Habe auf Punkt 2.3 hingewiesen nicht auf DOIFtools.
Zitatden Perlvariablen
Perlvariablen sehe ich bei Dir nicht, Du meinst bestimmt die Perlfunktion getWeekNumber():
Zitatich dachte der Auslöser ist die Zeit..?
Das Attribut state wird unabhängig von den DOIF-Bedingungen berechnet,daher muss dort ein Trigger angegeben werden. Es kann irgend ein tägliches Ereignis sein, z.B. die Aktualisierung eine holiday-Datei. In den Beispielen der Commandref ist das auch so angegeben.

Ellert

Zitat von: rabehd am 27 Februar 2018, 16:28:39
Ich frage mich, wozu?
Ja, wenn da Dummy stände, aber wozu doe KW als state eines DOIF?
Gegenfrage: "Wie würdest Du es im Dummy berechnen?"

rabehd

Laut Google so: ($xweek,$xyear) = Week_of_Year($year,$month,$day);
Auch funktionierende Lösungen kann man hinterfragen.

Ellert

Zitat von: rabehd am 27 Februar 2018, 17:49:33
Laut Google so: ($xweek,$xyear) = Week_of_Year($year,$month,$day);

Wenn Du weisst, wie es mit einem Dummy funktioniert, dann poste doch mal eine funktionierende Raw definition für die Leser, zum ausprobieren.

Damian

Wie wäre es mit:

defmod di_week DOIF ([00:00])
attr di_week do always
attr di_week state {(strftime ('%W', localtime))}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

#13
Ich hatte auf eine Dummy-Lösung gehofft, musste ich jetzt selbst machen ;)

defmod weeknr dummy
attr weeknr setList on off
attr weeknr stateFormat {POSIX::strftime('%W',localtime)}
attr weeknr useSetExtensions 1
set weeknr blink 9999999 86400


Klarer Vorteil für DOIF: Ein Attribut und ein set-Befehl werden eingespart.

Damian

wie wäre es mit einem Einzeiler:

neuer DOIF im Perlmode:


define week DOIF {if ([00:00]) {set_Reading ("state",strftime ('%W', localtime),1)}}


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF