Hallo zusammen,
ich lasse aus einer mysql Datenbank per PHP eine .ICS Datei mit meinem Dienstplan generieren sobald mein Chef eine Änderung für mich vornimmt.
Diese .ics Datei wird im Anschluß automatisch auf meinen Privaten Server verschoben, da ich von ausserhalb nicht an den Firmenrechner komme.
Soweit so gut.
Die einzelnen Blöcke der .ics Dateien sehen wie folgt aus:
BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
PRODID:Steini
BEGIN:VEVENT
CREATED:20180912T111201Z
LAST-MODIFIED:20180912T111201Z
DTSTAMP:20180911T111201Z
SUMMARY:Früh
DTSTART;VALUE=DATE:20180911T054500Z
DTEND;VALUE=DATE:20180911T124500Z
DESCRIPTION:Früh
TRANSP:TRANSPARENT
UID:0_Früh
END:VEVENT
BEGIN:VEVENT
CREATED:20180912T111201Z
LAST-MODIFIED:20180912T111201Z
DTSTAMP:20180912T111201Z
SUMMARY:Spät
DTSTART;VALUE=DATE:20180912T124500Z
DTEND;VALUE=DATE:20180912T200000Z
DESCRIPTION:Spät
TRANSP:TRANSPARENT
UID:1_Spät
END:VEVENT
BEGIN:VEVENT
CREATED:20180912T111201Z
LAST-MODIFIED:20180912T111201Z
DTSTAMP:20180915T111201Z
SUMMARY:A-Nacht
DTSTART;VALUE=DATE:20180915T180000Z
DTEND;VALUE=DATE:20180916T054500Z
DESCRIPTION:A-Nacht
TRANSP:TRANSPARENT
UID:2_Nacht
END:VEVENT
.
.
.
usw.
END:VCALENDAR
Wenn ich dann unter Fhem, "get events" eingebe erhalte ich so etwas:
156: VEVENT @5 [known]
CREATED: 20180912T111201Z
DESCRIPTION: Früh
DTEND: 20180911T124500Z
DTSTAMP: 20180911T111201Z
DTSTART: 20180911T054500Z
LAST-MODIFIED: 20180912T111201Z
SUMMARY: Früh
TRANSP: TRANSPARENT
UID: 0_Früh
>>> Events:
0_Frh end 11.09.2018 07:45-11.09.2018 14:45 Früh
>>> Skipped events:
.
.
.
160: VEVENT @49 [known]
CREATED: 20180912T111201Z
DESCRIPTION: Nacht
DTEND: 20180918T054500Z
DTSTAMP: 20180917T111201Z
DTSTART: 20180917T200000Z
LAST-MODIFIED: 20180912T111201Z
SUMMARY: Nacht
TRANSP: TRANSPARENT
UID: 4_Nacht
>>> Events:
4_Nacht upcoming 17.09.2018 22:00-18.09.2018 07:45 Nacht
>>> Skipped events:
Hier sieht man das die Uhrzeiten PLUS 2 STUNDEN ausgegeben werden.
Kann mir bitte jemand sagen was ich tun muss damit die 2 Stunden nicht addiert werden.
Weiterhin möchte ich, das die Rollos im Schlafzimmer erst um 13:30 Uhr hoch gehen wenn ich Nachtdienst hatte
nur leider ist das Event um 05:45 Uhr beendet wenn der Wert "DTEND:" auf 054500 also (05:45:00) steht.
Die Abfrage "Nachtdienst - Ja oder Nein" erfolgt über ein userReadings
N_schicht {ReadingsVal("Schichtdienst", "modeStart", "") =~ "_Nacht" ? "Ja":"Nein"},
welches dann natürlich "Nein" ausgibt.
Ich habe sonst keine weiteren Ideen wie ich das lösen könnte.
Über Anregungen, Vorschläge oder Lösungen würde ich mich sehr freuen.
Besten Dank und schonmal ein schöne Wochenende
Klingt nach einem Zeitzonen-Problem. Der eine Rechner in UTC, der andere in Sommerzeit?
Ciao, -MN
ZitatHier sieht man das die Uhrzeiten PLUS 2 STUNDEN ausgegeben werden.
Hi,
ich würde sagen da fehlt die Zeitzonen Information und es wird UTC angenommen?
Ich habe mir hier (https://heinz-otto.blogspot.com/2018/07/kalender-in-fhem-einbinden.html)mal etwas aufgeschrieben, vielleicht ist das für Dich verwendbar.
Ich frage die Termine zu einem bestimmten Zeitpunkt ab und setze dann damit etwas, kannst Du auch machen, sozusagen früh um 5 die Schicht abfragen und damit setzen das die Rollos erst 13:30 hochgehen.
Gruß Otto
Zitat von: Morgennebel am 12 September 2018, 15:19:13
Klingt nach einem Zeitzonen-Problem. Der eine Rechner in UTC, der andere in Sommerzeit?
Ciao, -MN
Der Hinweis war gut, ich habe sogar etwas gefunden wie man die Zeitzone direkt in der .ics Datei angeben kann.
z.B.
DTSTART;TZID=Europe/Berlin:20100922T073000
DTEND;TZID=Europe/Berlin:20100922T081500
@Otto123
Dein Hinweis hätte mich aber auch weitergebracht.
So, bleibt aber noch das Rollo im Schlafzimmer
mache ich ein DoIf auf das userReading N_schicht, steht das userReading ab 05:45 Uhr auf "NEIN" und das Rollo würde auf gehen.
Habt ihr dazu vieleicht auch noch so einen guten Hinweis oder Tipp ??
Vielen Dank nochmal
PS. hatte ich vergessen zu erwähnen. Ich möchte das nach Möglichkeit OHNE notify machen, NUR mit userReadings..... und einem DoIf
Dann frag in deinem DOIF den Calendar um 5:00 Uhr ab und schreibe das Ergebnis in ein Reading des DOIF welches Du dann als Bedingung für das Rollo abfragst.
notify ist Schweinskram? ;D ;D ;D
Gruß Otto
Ja das geht schon, ich habe mir, (warum auch immer) in den Kopf gesetzt das direkt im Kalender mit userReadings zu machen...
N_schicht {ReadingsVal("Schichtdienst", "modeStart", "") =~ "_Nacht" ? "Ja":"Nein"},
S_schicht {ReadingsVal("Schichtdienst", "modeStart", "") =~ "_Spaet" ? "Ja":"Nein"},
F_schicht {ReadingsVal("Schichtdienst", "modeStart", "") =~ "_Frueh" ? "Ja":"Nein"}
aber das ist ja nur die halbe Miete, ist der Termin um z.B. 13 Uhr zu Ende, dann hat das reading ein "NEIN"
Ich fummel mal weiter, vieleicht finde ich ja noch den passenden Anstoss...
Trotzdem vielen lieben Dank
UserReadings aktualisieren sich immer dann wenn etwas im Device "passiert"
Wenn Du mit Terminen die zum Zeitpunkt x liegen, etwas zum späteren Zeitpunkt y beeinflussen willst, musst Du zum Zeitpunkt x einen Merker setzen der zum späteren Zeitpunkt y noch vorhanden ist.
Du kannst ja mit dem UserReading etwas triggern was den Merker setzt.
Wie gesagt, da sich dein Schichtzustand nur einmal am Tag ändert, würde ich zu einem Zeitpunkt die Schicht abfragen und alles andere danach ausrichten.
Evtl. ReadingsAge() aus das userreading nutzen?
Kurz, da mobil.
ZitatDie Funktion ReadingsAge() gibt die Dauer in Sekunden seit der letzten Aktualisierung des Readings $reading der Definition $name zurück.
Mh, im Moment weiß ich damit noch nichts anzufangen, bin mir nicht sicher ob mir die Sekunden seit der letzten Aktualisierung hier weiterhelfen können.
Muß ich mal nachdenken... und ggf. auch mal etwas rumtesten.
Danke
Na ja, zuerst solltest du prüfen, ob der Zeitstempel des Readings auch aktualisiert wird, wenn sich was anderes an dem Device ändert (z.B. wg. Spätschicht). Wenn nein, könnte es in etwa so gehen:
Zum Ausführungszeitpunkt für den Öffnen-Befehl vergleichst du, ob das Reading alt genug ist, also ReadingsAge() einen bestimmten Schwellwert überschritten hat. Soll das Ende der Nachtschicht also mind. 8 Stunden her sein, muß der Wert größer als 8*60*60 sein.
Ist eine einfache if-Abfrage. Wenn ja: Öffnen, wenn nein: später nochmal machen (temporäres at definieren, z.B.).
Viel Erfolg, Beta-User
@Beta-User
das hört sich gut an, das werde ich so mal angehen.
Sorry, aber ich habe schon das nächste Problem.
Wenn z.b. Heute um 20 Uhr mein Nachtdienst beginnt, wie frage ich das denn ab, der Nachtdienst der Heute um 20 Uhr beginnt steht ja nur unter "upcomming" und würde frühestens
um 20 Uhr angezeigt.
Ich möchte aber im TabletUi eine tägliche Übersicht die anzeigt welchen Dienst ich aktuel an diesem Tag habe (für meine Frau und die Kinder).
ZitatSorry, aber ich habe schon das nächste Problem.
Hast Du mal meinen Link durchgelesen?
Ich frage am Vortag den Termin für den darauffolgende Tag ab. Es ist kein Problem!
oh sorry, den Link habe ich wohl übersehen...
Das ist ja super beschrieben, ich denke damit sollte ich klar kommen. "tolle Anleitung" Daumen hoch!
Besten Dank
mh, ich habe einfach mal so wie beschrieben ein Dummy erstellt:
define Tonne dummy
und dann ein AT:
define a_Tonne at *14:45:00 set Tonne {(my $evt=fhem('get Schichtplan events format:custom="$S" limit:from=1d,to=1d');;;;$evt?$evt:"0")}
und eigendlich sollte doch jetzt der Termin für morgen im Dummy stehen, es steht aber leider nur die 0 drin.
Im Kalender Schichtplan ist für morgen (start) 18:00 Uhr ein Termin drin... was mache ich falsch ?
Du kannst die Abfrage direkt in der Kommandozeile testen und optimieren:
get Schichtplan events format:custom="$S" limit:from=1d,to=8d
ja, habe ein wenig rumgetestet,
mit limit:from=0d,to=1d erhalte ich den Termin von heute und
mit limit:from=1d,to=2d erhalte ich den Termin von Morgen
also alles gut, hoffe ich zumindest
Besten Dank
Meine Abfrage mit der Tonne geht auf Termine die für den ganzen Tag eingetragen sind - das wird der Unterschied sein. ;)
das mag sein, ich bin jedenfalls begeistert !
ich habe jetzt folgendes AT:
*05:45:01 setreading Schichtplan Schicht_Heute {(my $evt=fhem('get Schichtplan events format:custom="$S" limit:from=0d,to=1d');;$evt?$evt:"")};
setreading Schichtplan Schicht_Morgen {(my $evt=fhem('get Schichtplan events format:custom="$S" limit:from=1d,to=2d');;$evt?$evt:"")}
Ich habs noch nicht getestet, aber kann man nicht die Abfrage
{(my $evt=fhem('get Schichtplan events format:custom="$S" limit:from=0d,to=1d');;$evt?$evt:"")}
auch direkt im Kalender als userReadings definieren bzw. eintragen ?
Dann könnte ich mir auch das AT sparen.
Geht schon - aber: Da hast Du wieder das Problem, wann steht was in dem Reading.
Ich bin mir nicht sicher wie gut man den Zeitpunkt des Triggerns eines userReadings beherrschen kann.
so, ich habe das jetzt als userReading direkt im Schichtplan gemacht:
attr Schichtplan userReadings Schicht_Heute {my $evt=fhem('get Schichtplan events format:custom="$S" limit:from=0d,to=1d');;;;$evt?$evt:"-"},\
Schicht_Morgen {my $evt=fhem('get Schichtplan events format:custom="$S" limit:from=1d,to=2d');;;;$evt?$evt:"-"},\
Schicht_Gestern {my $evt=fhem('get Schichtplan events format:custom="$S" limit:from=-1d,to=0d');;;;$evt?$evt:"-"}
Da der Interval im Schichtplan auf 3600 (also stündlich) steht und ich "Heute" das Reading "Schicht_Gestern" abfrage und gestern Nachtdienst war gehen die Rollos Heute erst um 13:30 auf.
Für mich ist das eine gute Lösung. Mir fällt jetzt auch nichts mehr ein was dagegen sprechen könnte.
Anderfalls gebt mir bitte Bescheid.
Danke