[Widget Calview] Die fünf Termine ab heute

Begonnen von curt, 09 Oktober 2018, 03:21:16

Vorheriges Thema - Nächstes Thema

OdfFhem

#15
Ich habe mir schon mal angesehen, was für eine Altersberechnung zu tun ist.

Ganz ohne eigene Perl-Routinen, bietet sich die bereits im CALVIEW-Device integrierte Funktionalität an.

Dazu muss nur das Geburtsjahr in der ics-Datei in einem der Felder SUMMARY oder DESCRIPTION angegeben
und die Attribute isbirthday sowie yobfield im CALVIEW-Device gesetzt werden.

Schon hat man ein zusätzliches Reading pro Geburtstag, in dem das berechnete Alter hinterlegt ist.



Ein lauffähiges Beispiel mit Altersberechnung und FTUI-Darstellung könnte dann z.B. so aussehen:


BEGIN:VCALENDAR
PRODID:-//calcurse//NONSGML v4.0.0//EN
VERSION:2.0
BEGIN:VEVENT
DTSTART:19111111
DTEND:19111111
RRULE:FREQ=YEARLY
SUMMARY: Geburtstag meiner Mutter
DESCRIPTION: 1911
END:VEVENT
END:VCALENDAR



defmod Testkalender Calendar ical file FHEM/test.ics 86400
attr Testkalender hideOlderThan 3600s



defmod TestkalenderView CALVIEW Testkalender 1
attr TestkalenderView isbirthday 1
attr TestkalenderView modes next
attr TestkalenderView yobfield _description



<div data-type="calview" data-device="TestkalenderView" data-get="all"
                         data-detail='["bdate","summary","age","daysleftLong"]'
                         data-detailwidth='["15","55","10","20"]'
data-showempty="true"
data-sourcecolor="yes"
data-dateformat="long"
data-timeformat="short"
data-oneline="yes"/>


curt

Zitat von: OdfFhem am 13 Oktober 2018, 05:20:05
Ich habe mir schon mal angesehen, was für eine Altersberechnung zu tun ist.

Du hast doch gerade gesagt, dass wir ganz schrittweise vorgehen wollen? (Ja, ich weiß, dass die Altersberechnung geht.)

Ich habe nun Deine Testversion umgesetzt, vielleicht sogar falsch umgesetzt:

cat geburtstage.ics
BEGIN:VCALENDAR
PRODID:-//calcurse//NONSGML v4.0.0//EN
VERSION:2.0
BEGIN:VEVENT
DTSTART:19111111
DTEND:19111111
RRULE:FREQ=YEARLY
SUMMARY: Geburtstag meiner Mutter
DESCRIPTION: 1911
END:VEVENT
END:VCALENDAR


Ergebnis der Veranstaltung ist, dass ich den Termin weder in FHEM noch in FTUI sehe. Da ist genau NICHTS!

Das Reading selbst scheint zu existieren: list Geburtstage

Internals:
   DEF        ical file www/calendar/geburtstage.ics 86400
   NAME       Geburtstage
   NOTIFYDEV  global
   NR         729
   NTFY_ORDER 50-Geburtstage
   STATE      triggered
   TYPE       Calendar
   READINGS:
     2018-10-13 05:37:23   lastUpdate      2018-10-13 05:37:23
     2018-10-08 02:34:42   modeAlarm       
     2018-10-13 05:31:43   modeAlarmOrStart
     2018-10-08 02:34:42   modeAlarmed     
     2018-10-08 02:34:42   modeChanged     
     2018-10-08 02:34:42   modeEnd         
     2018-10-08 02:34:42   modeEnded       
     2018-10-13 05:31:43   modeStart       
     2018-10-08 02:34:42   modeStarted     
     2018-10-13 05:31:43   modeUpcoming    synthetic000004
     2018-10-13 05:37:23   nextUpdate      2018-10-14 05:37:23
     2018-10-13 05:37:23   nextWakeup      2018-10-14 05:37:23
     2018-10-13 05:37:23   state           triggered
Attributes:
   group      Calendar
   hideLaterThan 20d
   hideOlderThan 2d
   room       99_System


<seufzt>
RPI 4 - Jeelink HomeMatic Z-Wave

OdfFhem

#17
Dass Du nichts siehst, liegt daran, dass Du nicht genau die Testversion übernommen hast.

Das Attribut hideLaterThan blendet alle Geburtstage, die erst in 20 oder mehr Tagen sind, aus.
Darunter fällt dann auch der 11.11.

Also das Attribut entweder auf einen größeren Wert setzen oder (zunächst einmal) löschen.



Edit: Anschließend auf jeden Fall noch einmal das Calendar-Device reloaden.

Prof. Dr. Peter Henning

ZitatIch habe nun Deine Testversion umgesetzt, vielleicht sogar falsch umgesetzt:

Es ist oben bereits eindeutig erklärt worden, dass ein Eintrag immer ein DTEND-Tag haben muss, das einen anderen (späteren) Wert als den von DTSTART beinhaltet. Entweder später am gleichen Tag, oder an einem beliebigen Folgetag.

Ebenso ist klar gesagt worden, dass das Attribut hideLaterThan im Calender-Device zu setzen ist.

Mein Tipp @curt: Vielleicht einfach genauer lesen, was als Antwort gegeben wurde - das hätte in diesem Thread 2/3 der Nachfragen erspart.

Zu Thema der händischen Erzeugung von ical-Files: Das sollte man bleiben lassen, weil es sehr fehleranfällig ist. Wie wir oben gesehen haben ...

Stattdessen besser eine einfache XML-Datei erzeugen,

<?xml version="1.0" encoding="UTF-8"?>
<birthdays>
  <birthday>
      <name>X.</name>
      <date>29. April 1958</date>
  </birthday>
    <birthday>
        <name>Y...</name>
        <date>1. November 1960</date>
    </birthday>
    <birthday>
        <name>R...</name>
        <date>27. Dezember 1988</date>
    </birthday>
    <birthday>
        <name>R...</name>
        <date>25. November 1991</date>
    </birthday>
    <birthday>
        <name>D..</name>
        <date>20. Januar 2000</date>
    </birthday>
</birthdays>

Ferner diese Datei hier als calendartransform.xsl abspeichern
<?xml version="1.0" encoding="UTF-8"?>
<!--
########################################################################################
#
# calendartransform.xsl
#
# Prof. Dr. Peter A. Henning 2012
#
########################################################################################
#
#  This programm is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  The GNU General Public License can be found at
#  http://www.gnu.org/copyleft/gpl.html.
#  A copy is found in the textfile GPL.txt and important notices to the license
#  from the author is found in LICENSE.txt distributed with these scripts.
#
#  This script is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
########################################################################################
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">
    <xsl:template match="/">
        BEGIN:VCALENDAR
        VERSION:2.0
        METHOD:PUBLISH
        PRODID:Prof. Dr. Peter A. Henning
        <xsl:apply-templates select="//restmuell">
            <xsl:with-param name="text">Restmüllabfuhr</xsl:with-param>
        </xsl:apply-templates>
        <xsl:apply-templates select="//altpapier">
            <xsl:with-param name="text">Altpapiersammlung</xsl:with-param>
        </xsl:apply-templates>
        <xsl:apply-templates select="//wertstoffmuell">
            <xsl:with-param name="text">Wertstoffmüllabfuhr</xsl:with-param>
        </xsl:apply-templates>
        <xsl:apply-templates select="//birthdays">
            <xsl:with-param name="text">Geburtstage</xsl:with-param>
        </xsl:apply-templates>
        END:VCALENDAR
    </xsl:template>
    <xsl:template match="termin">
        <xsl:param name="text"/>
        <xsl:variable name="r1" select="substring-after(.,', ')"/>
        <xsl:variable name="d" select="substring-before($r1,'. ')"/>
        <xsl:variable name="r2" select="substring-after($r1,'. ')"/>
        <xsl:variable name="m" select="substring-before($r2,' ')"/>
        <xsl:variable name="mm">
            <xsl:choose>
                <xsl:when test="$m='Januar'">01</xsl:when>
                <xsl:when test="$m='Februar'">02</xsl:when>
                <xsl:when test="$m='März'">03</xsl:when>
                <xsl:when test="$m='April'">04</xsl:when>
                <xsl:when test="$m='Mai'">05</xsl:when>
                <xsl:when test="$m='Juni'">06</xsl:when>
                <xsl:when test="$m='Juli'">07</xsl:when>
                <xsl:when test="$m='August'">08</xsl:when>
                <xsl:when test="$m='September'">09</xsl:when>
                <xsl:when test="$m='Oktober'">10</xsl:when>
                <xsl:when test="$m='November'">11</xsl:when>
                <xsl:when test="$m='Dezember'">12</xsl:when>
            </xsl:choose>   
        </xsl:variable>
        BEGIN:VEVENT
        CREATED:20180207T210000Z
        LAST-MODIFIED:20180207T210000Z
        DTSTAMP:20180207T210000Z
        DTSTART;VALUE=DATE:2018<xsl:value-of select="$mm"/><xsl:value-of select="$d"/>T050000Z
        DTEND;VALUE=DATE:2018<xsl:value-of select="$mm"/><xsl:value-of select="$d"/>T160000Z
        SUMMARY:<xsl:value-of select="$text"/>
        TRANSP:TRANSPARENT
        UID:<xsl:text>M_2018</xsl:text><xsl:value-of select="$mm"/><xsl:value-of select="$d"/>
        BEGIN:VALARM
        TRIGGER:-PT12H
        ACTION:DISPLAY
        END:VALARM
        END:VEVENT
    </xsl:template>
    <xsl:template match="birthday">
        <xsl:param name="text"/>
        <xsl:variable name="name" select="name"/>
        <xsl:variable name="date" select="date"/>
        <xsl:variable name="d" select="substring-before($date,'. ')"/>
        <xsl:variable name="r2" select="substring-after($date,'. ')"/>
        <xsl:variable name="m" select="substring-before($r2,' ')"/>
        <xsl:variable name="mm">
            <xsl:choose>
                <xsl:when test="$m='Januar'">01</xsl:when>
                <xsl:when test="$m='Februar'">02</xsl:when>
                <xsl:when test="$m='März'">03</xsl:when>
                <xsl:when test="$m='April'">04</xsl:when>
                <xsl:when test="$m='Mai'">05</xsl:when>
                <xsl:when test="$m='Juni'">06</xsl:when>
                <xsl:when test="$m='Juli'">07</xsl:when>
                <xsl:when test="$m='August'">08</xsl:when>
                <xsl:when test="$m='September'">09</xsl:when>
                <xsl:when test="$m='Oktober'">10</xsl:when>
                <xsl:when test="$m='November'">11</xsl:when>
                <xsl:when test="$m='Dezember'">12</xsl:when>
            </xsl:choose>   
        </xsl:variable>
        BEGIN:VEVENT
        CREATED:20180207T210000Z
        LAST-MODIFIED:20180207T210000Z
        DTSTAMP:20180207T210000Z
        DTSTART;VALUE=DATE:2018<xsl:value-of select="$mm"/><xsl:value-of select="$d"/>T000000
        DTEND;VALUE=DATE:2018<xsl:value-of select="$mm"/><xsl:value-of select="$d"/>T235900
        RRULE:FREQ=YEARLY
        SUMMARY:<xsl:value-of select="$name"/>
        TRANSP:TRANSPARENT
        UID:<xsl:text>M_2018</xsl:text><xsl:value-of select="$mm"/><xsl:value-of select="$d"/>
        BEGIN:VALARM
        TRIGGER:-PT36H
        ACTION:DISPLAY
        END:VALARM
        END:VEVENT
    </xsl:template>
</xsl:stylesheet>

und mit dem Mini-Perl-Programm
use XML::LibXSLT;
use XML::LibXML;

my $xml_parser  = XML::LibXML->new;
my $xslt_parser = XML::LibXSLT->new;

my $xml         = $xml_parser->parse_file('birthday.xml');
my $xsl         = $xml_parser->parse_file('calendartransform.xsl');

my $stylesheet  = $xslt_parser->parse_stylesheet($xsl);
my $results     = $stylesheet->transform($xml);

print $stylesheet->output_string($results);

daraus eine wirklich (!) gültige ical-Datei erzeugen. Geht übrigens auch für Mülltermine...

LG

pah

curt

#19
@OdfFhem
Zitat von: OdfFhem am 13 Oktober 2018, 07:40:33
Dass Du nichts siehst, liegt daran, dass Du nicht genau die Testversion übernommen hast.
Das Attribut hideLaterThan blendet alle Geburtstage, die erst in 20 oder mehr Tagen sind, aus.
Darunter fällt dann auch der 11.11.

Du hast recht. Irgendwann ist es spät und man sieht den Wald vor lauter Bäumen nicht mehr.

Zitat von: OdfFhem am 13 Oktober 2018, 05:20:05
Ich habe mir schon mal angesehen, was für eine Altersberechnung zu tun ist.
Ganz ohne eigene Perl-Routinen, bietet sich die bereits im CALVIEW-Device integrierte Funktionalität an.

Heute habe ich mich schrittweise durchgearbeitet.
Wow. Perfekt. - Danke vor allem, dass nicht nur sagtest, dass das geht, sondern den Code hier öffentlich zeigtest.

Aus meiner Sicht gehört das Codebeispiel #15 in https://wiki.fhem.de/wiki/FTUI_Widget_Calview machst Du das oder soll ich das machen? Oder @chris1284 ?

OdfFhem: Wenn ich meinen Papporden "Selbstloser Helfer" verleihen dürfte, würde ich ihn Dir verleihen. Danke!

P.S: Dein Codebeispiel (sanft verändert) nun in https://wiki.fhem.de/wiki/FTUI_Widget_Calview
RPI 4 - Jeelink HomeMatic Z-Wave

curt

@System
Zitat von: Prof. Dr. Peter Henning am 13 Oktober 2018, 10:54:36
Es ist oben bereits eindeutig erklärt worden, dass ein Eintrag immer ein DTEND-Tag haben muss,

Und das sagt wer? Das mag ja für das FHEM-Universum gelten. Aber dann hält es sich nicht an den Standard, dieser heißt RFC 5545. Dort steht klar, dass DTEND nicht zwingend ist. Dort steht darüber hinaus ganz konkret, wie zu verfahren ist, wenn DTEND fehlt.

Aus meiner Sicht bedeutet das, dass FHEM-Calendar sich an diesem Punkt nicht an den Standard hält. Kann man machen. Aber das bedeutet, dass eigentlich valide iCal scheitern.

Und ja: Meine iCal-Datei war valide, erzeugt von calcurse. Nicht von Hand erzeugt, wie Du annahmst.

Zitat von: Prof. Dr. Peter Henning am 13 Oktober 2018, 10:54:36
Ebenso ist klar gesagt worden, dass das Attribut hideLaterThan im Calender-Device zu setzen ist.

Mit welcher Begründung?

Zitat von: Prof. Dr. Peter Henning am 13 Oktober 2018, 10:54:36
Stattdessen besser eine einfache XML-Datei erzeugen,

Interessanter Ansatz. Ändert aber nichts daran, dass externe iCal, die standardkonform kein DTEND haben, bei FHEM-Calendar scheitern.

Nenne dieses Posting halt Bugreport.
RPI 4 - Jeelink HomeMatic Z-Wave

OdfFhem

@curt
Wenn man helfen kann und gerade Zeit hat, sollte Unterstützung kein Problem sein.

Bzgl. der Wiki-Pflege muss ich derzeit noch passen. Aber ich bin drauf und dran, mir einen Zugang geben zu lassen. Was ich bis dahin anbieten kann, ist das kontrolllesen des abgeänderten Wikis - falls gewünscht.

Übrigens habe ich #15 noch mal korrigiert, da die Prozentangaben in data-detailwidth ein wenig zu großzügig waren. Die neuen Angaben habe ich allerdings nicht getestet.

Prof. Dr. Peter Henning

@curt: Bei dem Tonfall erübrigt sich weitere Unterstützung.

pah

curt

#23
@System
Zitat von: Prof. Dr. Peter Henning am 14 Oktober 2018, 05:12:04
@curt: Bei dem Tonfall erübrigt sich weitere Unterstützung.

Du meinst jetzt Deinen Tonfall?
Ja, den fand ich unangemessen. Das muss ich sehr deutlich sagen. Wir reden auf gleicher Ebene, auf Augenhöhe - oder gar nicht.

Ich habe tatsächlich den Eindruck, dass Du mit sachlicher Kritik nicht umgehen kannst - Du hast keine Unsachlichkeit von mir gelesen. Und wirst die auch nicht lesen. Das wäre weit unter meinem Niveau.

Zurück zur Sache,  RFC 5545. Dort steht:

Zitat
If such a "VEVENT" has a "DTEND" property, it MUST be specified as a DATE value also.

If  --> falls

Zitat
The "DTEND" property for a "VEVENT" calendar component specifies the non-inclusive end of the event. For cases where a "VEVENT" calendar component specifies a "DTSTART" property with a DATE value type but no "DTEND" nor "DURATION" property, the event's duration is taken to be one day.

Wenn es kein DTEND gibt, hast Du das Ende des gleichen Tages zu codieren. Steht ganz klar da.

Letzte Anmerkung:
Dein Beitrag erschüttert mich.
RPI 4 - Jeelink HomeMatic Z-Wave

Beta-User

Schau mal in der cref nach Calendar "on CreateEvent". Da ist ein Plugin beschrieben...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Prof. Dr. Peter Henning

#25
Ich empfehle einfach, die Antworten hier im Forum genauso aufmerksam zu lesen, wie RFCs.

LG

pah

OdfFhem

@curt
In #15 war noch ein Schreibfehler.

falsch
date-oneline="yes"
richtig
data-oneline="yes"

Das Attribut data-oneline - steuert, ob eine zu lange Spalte abgeschnitten  oder umgebrochen wird - ist im zugehörigen Wiki-Artikel nicht beschrieben. Da ich gesehen habe, dass Du dabei bist, den Wiki-Artikel zu überarbeiten, könntest Du ja vielleicht das fehlende Attribut nachtragen.

Zur weiteren Steuerung von oneline gab es noch folgende zusätzliche Steuerattribute; diese scheinen aber nicht mehr unterstützt zu werden. "..." wird nun wohl standardmäßig beim Abschneiden gesetzt.

data-onelinesum ; Werte=yes/no ; Wird das Feld summary abgeschnitten, dann ... am Ende setzen
data-onelinedesc ; Werte=yes/no ; Wird das Feld description abgeschnitten, dann ... am Ende setzen
data-onelineloc ; Werte= yes/no ; Wird das Feld location abgeschnitten, dann ... am Ende setzen


Daher das Attribut data-onelinesum aus #15 entfernt.

curt

#27
Zitat von: OdfFhem am 14 Oktober 2018, 11:08:58
@curt
In #15 war noch ein Schreibfehler.

Danke für den Hinweis. Bei mir und im Wiki geändert.

Zitat von: OdfFhem am 14 Oktober 2018, 11:08:58
Zur weiteren Steuerung von oneline gab es noch folgende zusätzliche Steuerattribute; diese scheinen aber nicht mehr unterstützt zu werden. "..." wird nun wohl standardmäßig beim Abschneiden gesetzt.
...
Daher das Attribut data-onelinesum aus #15 entfernt.

In der zuständigen *.js steht
"// Modifications chris1284 13.09.2017 19:05 - nur noch oneline yes/no , onlinesum/desc/loc entfernt)" - das ist hier: /opt/fhem/www/tablet/js/widget_calview.js

BTW:
Das ist im Moment meine größte Baustelle. RPi mit offiziellem Display, Mini-X11 und als Browser Midori im Kioskmode. Dort wird jede Spalte einer Zeile umgebrochen. Nun ist natürlich schwer zu sagen, ob sich Midori oder eher das Widget knapp am Standard vorbei hangelt - mehr Verdächtige sind ja nicht auszumachen.

Midori - weil der nicht nach Hause telefoniert. Daher eigentlich ja das Mittel der Wahl.

Vielleicht kann @chris1284 kann dazu (Zeilenumbruch nach jedem data-detail-Wert etwas sagen. Oder mal schauen, wie er da die nächste Spalte formatiert.
RPI 4 - Jeelink HomeMatic Z-Wave

curt

Im Code des Widget hat @OdfFhem ein bislang undokumentiertes "data-sourcecolor" gefunden. Es ist wie bei Calview in FHEM möglich, Einträge verschiedener Kalender unterschiedliche Farben zu geben. Er hat gleich ein Beispiel in Wiki https://wiki.fhem.de/wiki/FTUI_Widget_Calview eingearbeitet.

@chris1284
RPI 4 - Jeelink HomeMatic Z-Wave

curt

@OdfFhem
ich denke, dass man sowas öffentlich diskutieren sollte - es gibt wohl ein Problem bei (nicht dokumentiert) weekdayname.

Wir waren an dieser Stelle (fhem.cfg):

attr <CALVIEW-Device> weekdayformat de-long
--> Montag .. Sonntag

attr <CALVIEW-Device> weekdayformat de-short
--> Mo .. So


Und bei FTUI:
data-detail='["weekdayname","bdate","summary"]'

Das fand ich für Geburtstage prima und wollte mir die de-short-Version einbauen ... und stolperte: In FTUI wird mir die long-Version angezeigt. Kannst Du das bei Dir bitte unabhängig testen?
RPI 4 - Jeelink HomeMatic Z-Wave