Geburtstagskalender, Alter berechnen

Begonnen von Pankratius, 04 Dezember 2016, 20:39:21

Vorheriges Thema - Nächstes Thema

Pankratius

Hallo zusammen,

ich habe hier im Forum gesucht, aber leider keine Lösung gefunden.

Mein Wunsch ist es für die Anzeige von Geburtstagsterminen das
jeweilige Alter des Geburtstagskindes anzuzeigen.

Die Geburtstage sind als ical-Kalender verfügbar.


define calGeburtstage Calendar ical url http://localhost/davical/public.php/XXXX/birthdays.ics 6000
attr calGeburtstage hideLaterThan 20d
attr calGeburtstage hideOlderThan 10d
attr calGeburtstage room Kalender


Diese Einträge werde als CALVIEW verarbeitet

define cvGeburtstage CALVIEW calGeburtstage 2
attr cvGeburtstage modes next
attr cvGeburtstage room Kalender


Und mit TabletUI gebe ich diese Informationen so aus:

                               <li data-row="1" data-col="3" data-sizex="2" data-sizey="1">
                                        <header>
                                        <div data-type="label" class="large">Geburtstage</div>
                                        </header>
                                        <table width="100%" >
                                                <tr>
                                                        <td>
                                                                <div data-type="label" data-device="cvGeburtstage" data-get="t_001_bdate" data-part="(\d\d\.\d\d\.).*"></div>
                                                        </td>
                                                        <td class="r"><div data-type="label" data-device="cvGeburtstage" data-get="t_001_summary" data-part="1"></div></td>
                                                        <td class="r"><div data-type="label" data-device="cvGeburtstage" data-get="t_001_summary" data-part="3"></div></td>
                                                </tr>
                                                <tr>
                                                        <td>
                                                                <div data-type="label" data-device="cvGeburtstage" data-get="t_002_bdate" data-part="(\d\d\.\d\d\.).*"></div>
                                                        </td>
                                                        <td class="r"><div data-type="label" data-device="cvGeburtstage" data-get="t_002_summary" data-part="1"></div></td>
                                                        <td class="r"><div data-type="label" data-device="cvGeburtstage" data-get="t_002_summary" data-part="3"></div></td>
                                                </tr>
                                                <tr>
                                                        <td>
                                                                <div data-type="label" data-device="cvGeburtstage" data-get="t_003_bdate" data-part="(\d\d\.\d\d\.).*"></div>
                                                        </td>
                                                        <td class="r"><div data-type="label" data-device="cvGeburtstage" data-get="t_003_summary" data-part="1"></div></td>
                                                        <td class="r"><div data-type="label" data-device="cvGeburtstage" data-get="t_003_summary" data-part="3"></div></td>
                                                </tr>
                                                <tr>
                                                        <td>
                                                                <div data-type="label" data-device="cvGeburtstage" data-get="t_004_bdate" data-part="(\d\d\.\d\d\.).*"></div>
                                                        </td>
                                                        <td class="r"><div data-type="label" data-device="cvGeburtstage" data-get="t_004_summary" data-part="1"></div></td>
                                                        <td class="r"><div data-type="label" data-device="cvGeburtstage" data-get="t_004_summary" data-part="3"></div></td>
                                                </tr>
                                        </table>
                                </li>


Soweit alles gut
aus dem Eintrag t_001_summary = "Marga XXXX, #1921" wird der richtige Eintrag angezeigt. Siehe Anhang.

Nun möchte ich aber statt #1921 das Alter eingeben, also
jetziges Jahr - 1921 = 95 Jahre, bzw. korrekter: Termin - Wert von #1921 = 95
(damit schlägt man auch den Fall dass man am 31.12. einen Geburtstag ab dem 1.1. anzeigen will).

Nun suche ich eine Möglichkeit diese Berechnung durchzuführen um als Rückgabe die 95 zu erhalten.

Ist dieses nur mit Perl möglich oder hat jemand bereits eine Lösung?

Vielen Dank
Rüdiger

chris1284

ich denke du wirst da nicht drumherum kommen. ich hatte mal den plan eine art attr in calview einzubauen das diese view als geburtstagskalender kennzeichnet und dann intern ein bestimmtes feld als jahreszahl her nimmt und rechnet. danach alles als neues reading t_xxx_age auszugeben. habe ich bisher aber noch nicht angefangen das es bisher kaum anfragen dazu gab (würde dann natütlich auch im tui widget calview einfließen)

chris1284

ich habe die calview erweiter:
- calview um description reading erweitert (Beschreibung eines Termins)
- es gibt ein attribut "isbirthday": wird dieses gesetzt wird in description nach inhalt gesucht und dieser vom aktuellen jahr abgezogne
- das ergebniss steh im reagding t_xxx_age / tomorrow_xxx_age /  today_xxx_age

bedingt eine view für geburtstage

todo:
- jareszahlenfeld variabel gestalten (description / location /...)
- prüfung ob jahreszahlenfeld eine (4stellige) zahl enthält die kleiner als das aktuelle jahr ist

Christoph

Hallo Chris,

ist die Änderung schon ins normale fhem Update eingeflossen ?
Finde das Attribut nicht

Version gibt folgendes aus, Fhem ist aktuell:

57_CALVIEW.pm           12837 2016-12-19 20:53:48Z chris1284

Gruß Christoph

chris1284

nein, läuft bei mir als test. bisher soweit i.O. spätestens am we werde ich es einchecken

chris1284


tomster

Servus Chris,

gibt es einen bestimmten Grund dafür, dass man für die Geburtstagsberechnung - das ist doch das yobfield, oder? - "nur" die Felder _description oder _location auswählen kann? In meinem Fall (Auslesen eines Google Kalenders) habe ich nämlich gar keine _description- und _location gibt den Ort an. Das Geburtsjahr steht zusammen mit dem Namen im Feld _summary. Das kann man nur dummerweise nicht auswählen...

Zudem stelle ich mir die Frage, ob es nicht Sinn machen könnte das Modul um eine Angabe "der Tage bis..." zu einem Termin zu erweitern. Ein Reading das aus dem heutigen Datum abzüglich des Startdatums des jeweiligen Termins ein "in X Monat(en)/Tag(en)/morgen/heute" ausgibt. Klar, ein UserReading ist auch kein Ding, aber "einheitlicher" wäre es, wenn das Modul diese Berechnung selbst anstellen könnte, oder?

Was meinst?
LG,
Tom

chris1284

#7
ZitatIn meinem Fall (Auslesen eines Google Kalenders) habe ich nämlich gar keine _description- und _location gibt den Ort an. Das Geburtsjahr steht zusammen mit dem Namen im Feld _summary. Das kann man nur dummerweise nicht auswählen...

was ist das für einer.? ich habe auch mal einen goolge-geburtsagskalender gehabt den google aus den kontakten generiert hat. diesen könnte man aber nicht im calendar nutzen (somit nicht in calview). deswegen habe ich diese Termine stupf in einen neuen googlecalendar kopiert und dort dann auch die geburstjahre in description/locaction geschrieben.


_summary zu durchsuchen nach einer 4 stelligen zahl wäre natürlich auch möglich

ZitatZudem stelle ich mir die Frage, ob es nicht Sinn machen könnte das Modul um eine Angabe "der Tage bis..."

da stell ich mir die frage wer das wirklich braucht/nutzen würde, ich wüsste nicht wozu aber in fhem wird ja oft alles mögliche angezeigt nur wiel man es kann  ;D

Das errechnen der tage bis zum nächsten termin (muss man ja nicht nur auf geburtstage anwenden) finde ich an sich im modul abfall schon für mich sinnfrei (auch wennich es aktuell in der ui noch per warn-symbol) anzeigen lasse. mich interessiert eigentlich nur muss ich heute oder morgen was rausstellen und nicht in ob in 10 tagen irgendwelcher müll abgeholt wird.

ich schaue mir beides an (_summary +  _daysleft)



chris1284

wenn du den kontakte und kreise google default kalender in fhem hast, wäre ich interessiert wie du ihn rein bekommen hast. der hat ja nur ne html-adresse und keine private ical

tomster

Ich hab den "Default-Kalender" meines Google-Accounts gar nicht eingebaut, geschweige es versucht. Mir war es bislang schon immer ein Gräuel, wenn alle Terminarten in einem einzigen Kalender verwurschtelt sind. Darum hab ich auf Google einen "Sub-Kalender" mit den Geburtstagen und noch einen mit der Abfallabholung angelegt.
Beide sind separat mittels Calendar-Modul (=ical) in FHEM definiert. In Deinem CALVIEW hab ich dann einfach beide Kalender zusammen im DEF eingetragen. Das hat aus meiner Sicht den Vorteil, dass in den Readings für jeden Eintrag nun auch immer gleich die _source mit angegeben ist. Damit kann ich im FTUI ganz einfach unterscheiden um welche Terminart es sich handelt und vor dem Eintrag ein entsprechendes Icon anzeigen lassen.

Hintergrund ist, dass ich derzeit an einem DIY-"Magic Mirror" (MM) bastle, dessen GUI ich gerne mit FTUI realisieren möchte, weil ich nicht noch ein System (MM + FHEM/FTUI) pflegen, bzw. rumstehen haben möchte. Von daher kann ich Dir versprechen, dass die _daysleft zumindest in meinem Fall nicht nur da sind, weil man es kann, sondern auch einen nicht außer Acht zu lassenden (WAF-)Nutzen haben.

Klar, ein UserReading wäre auch möglich, aber manchmal frag ich mich ob es wirklich sinnvoll ist bestimmte Modul-Funktionen von jedem Nutzer immer "zu Fuß" einbauen zu müssen, nur weil man es kann ;-)

chris1284

ok, wie gesagt die daysleft und jahr aus summary schaue ich mir an, aber wenn du nen normalen calendar nutzt kannst du die jahrezahl doch einfach in description (feld beschreibung eintragen. das ist

tomster

Klar, kann ich die Geburtsjahre von der _summary in die _description umschreiben. Mal abgesehen, dass das knapp 400 Einträge sind, hätt ich aber auf den Geräten, die kein FHEM sind (und nicht ausrechnen können, der wievielte Geb es gerade ist) zumindest das Geburtsjahr gern auf einen Blick im Eintrag stehen. Beide Felder "pflegen" kommt aus Benutzergründen (Frau trägt auch ein) irgendwie weniger in Frage.
Klingt komisch, is aber so.

chris1284

ich habe nun eingebaut das wenn attr yobfield _summary das feld summary nach den ersten 4 aufeinanderfolgenden zahlen durchsucht wird und damit gerechnet.
bedeutet wenn im termin zb tante otto 01.02.1900 steht wird 1900 gefiltert und von terminjahr (2017 zb) abgezogen und das alter 117 ausgegeben

chris1284

reading daysleft wurde auch eingebaut

tomster

Servus Chris,
bin noch bis 10.02. ohne wirklichen Zugang zur "FHEM-Welt", sag aber schon Mal: Vielen Dank!
Test gips alsbald ich wieder in der Zivilisation bin.
LG,
Tom