{"id":34,"date":"2021-04-07T20:30:53","date_gmt":"2021-04-07T18:30:53","guid":{"rendered":"https:\/\/blog.walliczek.de\/?p=34"},"modified":"2021-05-02T10:57:33","modified_gmt":"2021-05-02T08:57:33","slug":"der-online-familien-kalender-als-display","status":"publish","type":"post","link":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/","title":{"rendered":"Der online Familien-Kalender als Display"},"content":{"rendered":"\n<p>Sp\u00e4testens dann, wenn f\u00fcr verschiedene Personen Termine geplant werden m\u00fcssen, und das auch unterwegs (im Kindergarten, beim Training etc.) kommt ein Papier-Familienkalender an seine Grenzen.<br>Gleichzeitig geht bei einem rein Online-Kalender die \u00dcbersichtlichkeit und der schnelle Blick zuhause auf den Kalender verloren.<br>Die L\u00f6sung ist eine Anzeige f\u00fcr die Online-Kalender, die gro\u00df und dauerhaft gut ablesbar ist.<\/p>\n\n\n\n<p>Ich stelle hier eine Variante mit einem e-Paper vor, das einerseits extrem wenig Strom verbraucht, gleichzeitig von den Materialkosten \u00fcberschaubar ist (alles zusammen unter 150 EUR). Ich habe das Display (das sehr flach ist, ca. 0,5 cm H\u00f6he) mit einem Stahl-Blech abgedeckt, das so auch als Magnetwand funktioniert.<\/p>\n\n\n\n<p>Ich nutze das Display gleichzeitig f\u00fcr die Anzeige der Raumtemperatur (per DHT-22 Sensor gemessen) und der Wettervorhersage.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ergebnis<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"742\" src=\"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-1024x742.jpg\" alt=\"\" class=\"wp-image-118\" srcset=\"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-1024x742.jpg 1024w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-300x217.jpg 300w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-768x556.jpg 768w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-1536x1112.jpg 1536w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-2048x1483.jpg 2048w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-480x348.jpg 480w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-960x695.jpg 960w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>So sieht es unter dem Blech aus. Generell kann der Display-Adapter auch direkt auf den Raspberry aufgesteckt werden; ich habe mich aber als Platzgr\u00fcnden dazu entschieden, eine Winkel-Pfostenleiste in den Raspberry einzul\u00f6ten und so etwas Bauh\u00f6he einzusparen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"768\" src=\"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/03\/20-09-12-16-37-13-6030-1024x768.jpg\" alt=\"\" class=\"wp-image-40\" srcset=\"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/03\/20-09-12-16-37-13-6030-1024x768.jpg 1024w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/03\/20-09-12-16-37-13-6030-300x225.jpg 300w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/03\/20-09-12-16-37-13-6030-768x576.jpg 768w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/03\/20-09-12-16-37-13-6030-1536x1152.jpg 1536w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/03\/20-09-12-16-37-13-6030-2048x1536.jpg 2048w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/03\/20-09-12-16-37-13-6030-1200x900.jpg 1200w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/03\/20-09-12-16-37-13-6030-1980x1485.jpg 1980w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware<\/h2>\n\n\n\n<ul><li><a href=\"https:\/\/amzn.to\/3u0Z6FR\" target=\"_blank\" rel=\"noreferrer noopener sponsored nofollow\">Raspberry Zero<\/a> (*)<\/li><li><a href=\"https:\/\/amzn.to\/3cuyasb\" target=\"_blank\" rel=\"noreferrer noopener sponsored nofollow\">7,5&#8243; eInk Display<\/a> (*)<\/li><li>ggf. <a href=\"https:\/\/amzn.to\/3wkyZLV\" target=\"_blank\" rel=\"noreferrer noopener sponsored nofollow\">DHT 22 Temperatur \/ Feuchtigkeitssensor<\/a> (*)<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Software<\/h2>\n\n\n\n<ul><li>CalDAV-Server, z.B. <a data-type=\"URL\" data-id=\"https:\/\/nextcloud.com\/\" rel=\"noreferrer noopener\" href=\"https:\/\/nextcloud.com\/\" target=\"_blank\">Nextcloud<\/a> <\/li><li>ggf. Wettervorhersage, z.B. <a data-type=\"URL\" data-id=\"https:\/\/openweathermap.org\/\" rel=\"noreferrer noopener\" href=\"https:\/\/openweathermap.org\/\" target=\"_blank\">OpenWeather<\/a> (gibt einen kostenlosen Account)<\/li><li>ein Python-Skript zum Rendern der Anzeige (siehe unten)<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Python-Skript<\/h2>\n\n\n\n<p>Das Skript hier dient nur als Beispiel und muss an den konkreten Zweck angepasst werden, insbesondere was die Einbindung und Darstellung der Kalender angeht.<\/p>\n\n\n\n<p>Zun\u00e4chst folgende Bibliothek installieren: <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/waveshare\/e-Paper\/\" data-type=\"URL\" data-id=\"https:\/\/github.com\/waveshare\/e-Paper\/\" target=\"_blank\">https:\/\/github.com\/waveshare\/e-Paper\/<\/a>, siehe <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/waveshare\/e-Paper\/blob\/master\/RaspberryPi_JetsonNano\/python\/readme_rpi_EN.txt\" data-type=\"URL\" data-id=\"https:\/\/github.com\/waveshare\/e-Paper\/blob\/master\/RaspberryPi_JetsonNano\/python\/readme_rpi_EN.txt\" target=\"_blank\">https:\/\/github.com\/waveshare\/e-Paper\/blob\/master\/RaspberryPi_JetsonNano\/python\/readme_rpi_EN.txt<\/a>.<\/p>\n\n\n\n<p>Der Import-Block orientiert sich an den Beispielen von waveshare:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/python\n# -*- coding:utf-8 -*-\nimport sys\nimport os\nimport random\npicdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'pic')\nlibdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')\nif os.path.exists(libdir):\n    sys.path.append(libdir)\n\nimport logging\nfrom waveshare_epd import epd7in5_V2\nimport time\nfrom PIL import Image,ImageDraw,ImageFont\nimport traceback\n\nfrom datetime import timedelta\nfrom datetime import date\nfrom datetime import time\nfrom datetime import datetime\nimport locale\nimport caldav\nimport vobject\nfrom tzlocal import get_localzone\nimport re\nimport requests\nimport json\nimport Adafruit_DHT\n\nlocale.setlocale(locale.LC_ALL, '')\nlogging.basicConfig(level=logging.ERROR)<\/code><\/pre>\n\n\n\n<p>Wir definieren noch zwei Hilfsfunktionen f\u00fcr die Darstellung der Temperatur und Berechnung der Startzeit f\u00fcr die Kalender-Eintr\u00e4ge:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def temp(temp):\n    return ((\"%i\" + u'\\u00b0') % round(temp))\n\ndef start(item):\n    if isinstance(item.vevent.dtstart.value, datetime):\n        return item.vevent.dtstart.value.time()\n    else:\n        return time(0, 0, 0)\n<\/code><\/pre>\n\n\n\n<p>Anschlie\u00dfend beginnt die Programmlogik mit dem Abruf der Wettervorhersage (Geokoordinaten und API-Key eintragen) und der lokalen Temperatur (falls ein DHT-22 Sensor verwendet wird:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>try:\n    try:\n        forecast = requests.get(\"https:\/\/api.openweathermap.org\/data\/2.5\/onecall?lat=49.0&amp;lon=8.0&amp;appid=xzy&amp;lang=de&amp;units=metric\")\n        forecast_json = forecast.json()\n    except requests.exceptions.RequestException:\n        print(datetime.now(), \" could not connect to omv\")\n        exit()\n\n    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 4)\n    if humidity is None or temperature is None:\n        print(datetime.now(), \" Failed to get reading DHT22\")\n        exit()\n<\/code><\/pre>\n\n\n\n<p>Jetzt zeichnen wir den Kalender inkl. Wettervorhersage mit den Icons von <a href=\"https:\/\/openweathermap.org\/weather-conditions\">https:\/\/openweathermap.org\/weather-conditions<\/a>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    logging.info(\"calendar start\")\n\n    epd = epd7in5_V2.EPD()\n\n    font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)\n    font20 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 20)\n    font16 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 16)\n\n    Himage = Image.new('L', (epd.width, epd.height), 255)  # 255: clear the frame\n    draw = ImageDraw.Draw(Himage)\n    text = \"Innen: \" + temp(temperature) + \" \/ \" + ((\"%i\") % round(humidity)) + \"%, Au\" + u'\\u00df' + \"en: \" + temp(forecast_json&#91;\"current\"]&#91;\"temp\"]) + \" \/ \" + str(forecast_json&#91;\"current\"]&#91;\"humidit\n    draw.text((3, -4), text, font = font20, fill = 0)\n    x = draw.textsize(text, font = font20)&#91;0] + 6\n    i = 0\n    icon = \"\"\n    startTime = 0\n    currentDate = date.today()\n    while x &lt; 780 and i &lt; 48:\n        hourly = forecast_json&#91;\"hourly\"]&#91;i]\n        if hourly&#91;\"weather\"]&#91;0]&#91;\"icon\"] != icon:\n            if startTime != 0:\n                iconPng = Image.open(\"pic\/\" + icon + \".png\")\n                iconPng = iconPng.resize((22, 22))\n                newDate = startTime.date()\n                if newDate != currentDate:\n                    lc = 0\n                    currentDate = newDate\n                    text = startTime.strftime(\"%a %H\") + \"-\" + datetime.fromtimestamp(hourly&#91;\"dt\"]).strftime(\"%H\")\n                else:\n                    lc = 128\n                    text = startTime.strftime(\"%H\") + \"-\" + datetime.fromtimestamp(hourly&#91;\"dt\"]).strftime(\"%H\")\n                draw.line((x, 0, x, 20), fill = lc)\n                x = x + 2\n                draw.text((x, 1), text, font = font16, fill = 0)\n                x = x + draw.textsize(text, font = font16)&#91;0]\n                draw.bitmap((x, 0), iconPng)\n                x = x + 22\n            startTime = datetime.fromtimestamp(hourly&#91;\"dt\"])\n            icon = hourly&#91;\"weather\"]&#91;0]&#91;\"icon\"]\n        i = i + 1\n\n    draw.line((0, 21, 799, 21), fill = 0)\n    draw.text(((80 - draw.textsize('Datum', font = font24)&#91;0])\/2, 19), 'Datum', font = font24, fill = 0)\n    draw.line((80, 25, 80, 479), fill = 0)\n    draw.text((80 + (180 - draw.textsize('Foo', font = font24)&#91;0])\/2, 19), 'Foo', font = font24, fill = 0)\n    draw.line((260, 25, 260, 479), fill = 0)\n    draw.text((260 + (180 - draw.textsize('Bar', font = font24)&#91;0])\/2, 19), 'Bar', font = font24, fill = 0)\n    draw.line((440, 25, 440, 479), fill = 0)\n    draw.text((440 + (180 - draw.textsize('Dummy', font = font24)&#91;0])\/2, 19), 'Dummy', font = font24, fill = 0)\n    draw.line((620, 25, 620, 479), fill = 0)\n    draw.text((620 + (180 - draw.textsize('Raboof', font = font24)&#91;0])\/2, 19), 'Raboof', font = font24, fill = 0)\n    draw.line((0, 45, 799, 45), fill = 0)\n\n<\/code><\/pre>\n\n\n\n<p>Jetzt lesen wir den Kalender aus und stellen ihn dar. Dabei ist die Idee, dass in einem gemeinsamen Kalender die Eintr\u00e4ge mit dem Personen-Namen gepr\u00e4fixt werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    client = caldav.DAVClient(url=\"https:\/\/example.com\/remote.php\/dav\", username=\"foo\", password=\"bar\")\n    my_principal = client.principal()\n    calendars = my_principal.calendars()\n\n    y = 46;\n    i = 0;\n    while y &lt; 480:\n        currentDate = date.today() + timedelta(days=i)\n        draw.text((2, y), currentDate.strftime(\"%a\"), font = font16, fill = 0)\n        dateStr = currentDate.strftime(\"%d.%m.\")\n        draw.text((78 - draw.textsize(dateStr, font = font16)&#91;0], y+1), dateStr, font = font16, fill = 0)\n        oy = y\n        lines = 0\n        events = &#91;]\n        for calendar in calendars:\n            events_fetched = calendar.date_search(start=currentDate, end=(currentDate + timedelta(days=1)), expand=True)\n\n            for event in events_fetched:\n                try:\n                    parsedCal = vobject.readOne(event.data)\n                    events.append(parsedCal)\n                except AttributeError as error:\n                    # Output expected AttributeErrors.\n                    print(error)\n                except TypeError as error:\n                    # Output expected TypeErrors.\n                    print(error)\n\n        events.sort(key=start)\n\n        allDay = \"\"\n        for parsedCal in events:\n            summary = parsedCal.vevent.summary.value\n            if summary.startswith(\"Foo:\"):\n                x = 80\n                w = 179\n                summary = summary&#91;len(\"Foo:\")+1:]\n            elif summary.startswith(\"Bar:\"):\n                x = 260\n                w = 179\n                summary = summary&#91;len(\"Bar:\")+1:]\n            elif summary.startswith(\"Dummy:\"):\n                x = 440\n                w = 179\n                summary = summary&#91;len(\"Dummy:\")+1:]\n            elif summary.startswith(\"Raboof:\"):\n                x = 620\n                w = 179\n                summary = summary&#91;len(\"Raboof:\")+1:]\n            if isinstance(parsedCal.vevent.dtstart.value, datetime):\n                bc = 224\n                allDay = \"\"\n                if parsedCal.vevent.dtstart.value.date() == currentDate:\n                    text = parsedCal.vevent.dtstart.value.astimezone(get_localzone()).strftime(\"%H:%M\") + \": \" + summary.strip()\n                else:\n                    text = u'\\u2190' + \" \" + summary.strip()\n                    bc = 200\n            else:\n                text = summary.strip()\n                if allDay != \"\":\n                    text = allDay + \" \/ \" + text\n                    y = y - 23\n                    lines = lines - 1\n\n                allDay = text\n                bc = 180\n            if getattr(parsedCal.vevent, 'dtend', None) != None:\n                if isinstance(parsedCal.vevent.dtend.value, datetime):\n                    if parsedCal.vevent.dtend.value.date() &gt; currentDate:\n                        text = text + \" \" + u'\\u2192'\n                        bc = 200\n                    elif (datetime.now(get_localzone()) - parsedCal.vevent.dtend.value) &gt; timedelta(hours=2):\n                        continue\n            draw.rectangle((x+1, y, x+w-1, y+21), outline = 128, fill = bc)\n            textWidth = draw.textsize(text, font = font16)&#91;0]\n            if textWidth &gt; w:\n                while textWidth &gt;= w:\n                    text = text&#91;:len(text)-1]\n                    textWidth = draw.textsize(text + \"...\", font = font16)&#91;0]\n                text = text + \"...\"\n            draw.rectangle((x + 1 + (w - textWidth) \/ 2, y+1, x + 1 + (w - textWidth) \/ 2 + textWidth , y+20), outline = None, fill = 255)\n            draw.text((x + 1 + (w - textWidth) \/ 2, y+1), text, font = font16, fill = 0)\n            y = y + 23\n            lines = lines + 1\n        dailyForecast = None\n        for daily in forecast_json&#91;\"daily\"]:\n            if datetime.fromtimestamp(daily&#91;\"dt\"]).date() == currentDate:\n                dailyForecast = daily\n                break\n        if dailyForecast != None:\n            iconPng = Image.open(\"pic\/\" + dailyForecast&#91;\"weather\"]&#91;0]&#91;\"icon\"] + \".png\")\n            iconPng = iconPng.resize((22, 22))\n            draw.bitmap((0, oy+23), iconPng)\n            draw.text((22, oy+24), temp(dailyForecast&#91;\"temp\"]&#91;\"min\"]) + \"-\" + temp(dailyForecast&#91;\"temp\"]&#91;\"max\"]), font = font16, fill = 0)\n            if lines == 0:\n                lines = 2\n                y = y + 46\n            elif lines == 1:\n                lines = 2\n                y = y + 23\n        if lines == 0:\n            y = y + 23;\n        if currentDate.weekday() == 6:\n            draw.line((0, y-1, 799, y-1), fill = 0)\n        else:\n            draw.line((0, y-1, 799, y-1), fill = 140)\n        i = i + 1\n\n<\/code><\/pre>\n\n\n\n<p>Anschlie\u00dfend wird das Bild in Schwarz\/Wei\u00df umgewandelt und Graustufen mit Dithering dargestellt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    result = Himage.convert(\"1\")<\/code><\/pre>\n\n\n\n<p>Sinnvollerweise kann man noch \u00fcberpr\u00fcfen, ob sich das Bild ge\u00e4ndert hat, um unn\u00f6tige Neudarstellungen (und damit verbundenes Flackern) zu vermeiden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    try:\n        last = Image.open(\"\/mnt\/ramdisk\/calendar.png\")\n        if last.tobytes() == result.tobytes():\n            exit()\n    except IOError:\n        logging.debug(\"file not found\")\n\n    result.save(\"\/mnt\/ramdisk\/calendar.png\")<\/code><\/pre>\n\n\n\n<p>Anschlie\u00dfend wird das Bild dargestellt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    logging.info(\"init and Clear\")\n    epd.init()\n    epd.display(epd.getbuffer(result))\n    epd.sleep()<\/code><\/pre>\n\n\n\n<p>So sieht der Kalender dann aus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"800\" height=\"480\" src=\"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/calendar.png\" alt=\"\" class=\"wp-image-116\" srcset=\"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/calendar.png 800w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/calendar-300x180.png 300w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/calendar-768x461.png 768w, https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/calendar-480x288.png 480w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Sp\u00e4testens dann, wenn f\u00fcr verschiedene Personen Termine geplant werden m\u00fcssen, und das auch unterwegs (im Kindergarten, beim Training etc.) kommt ein Papier-Familienkalender an seine Grenzen.Gleichzeitig geht bei einem rein Online-Kalender die \u00dcbersichtlichkeit und der schnelle Blick zuhause auf den Kalender verloren.Die L\u00f6sung ist eine Anzeige f\u00fcr die Online-Kalender, die gro\u00df und dauerhaft gut ablesbar ist. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":118,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[14],"tags":[18,20,19,17],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Der online Familien-Kalender als Display - Matthias&#039; Technik-Ecke<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Der online Familien-Kalender als Display - Matthias&#039; Technik-Ecke\" \/>\n<meta property=\"og:description\" content=\"Sp\u00e4testens dann, wenn f\u00fcr verschiedene Personen Termine geplant werden m\u00fcssen, und das auch unterwegs (im Kindergarten, beim Training etc.) kommt ein Papier-Familienkalender an seine Grenzen.Gleichzeitig geht bei einem rein Online-Kalender die \u00dcbersichtlichkeit und der schnelle Blick zuhause auf den Kalender verloren.Die L\u00f6sung ist eine Anzeige f\u00fcr die Online-Kalender, die gro\u00df und dauerhaft gut ablesbar ist. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/\" \/>\n<meta property=\"og:site_name\" content=\"Matthias&#039; Technik-Ecke\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-07T18:30:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-02T08:57:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1854\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"mwalliczek\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.walliczek.de\/#website\",\"url\":\"https:\/\/blog.walliczek.de\/\",\"name\":\"Matthias&#039; Technik-Ecke\",\"description\":\"Spielereien mit Gentoo-Linux-Servern, React, Raspberry, ESP und Co.\",\"publisher\":{\"@id\":\"https:\/\/blog.walliczek.de\/#\/schema\/person\/15d35a7cd20cd4a127d30a226f50c33f\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.walliczek.de\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de-DE\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#primaryimage\",\"inLanguage\":\"de-DE\",\"url\":\"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-scaled.jpg\",\"contentUrl\":\"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-scaled.jpg\",\"width\":2560,\"height\":1854},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#webpage\",\"url\":\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/\",\"name\":\"Der online Familien-Kalender als Display - Matthias&#039; Technik-Ecke\",\"isPartOf\":{\"@id\":\"https:\/\/blog.walliczek.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#primaryimage\"},\"datePublished\":\"2021-04-07T18:30:53+00:00\",\"dateModified\":\"2021-05-02T08:57:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#breadcrumb\"},\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.walliczek.de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Der online Familien-Kalender als Display\"}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#webpage\"},\"author\":{\"@id\":\"https:\/\/blog.walliczek.de\/#\/schema\/person\/15d35a7cd20cd4a127d30a226f50c33f\"},\"headline\":\"Der online Familien-Kalender als Display\",\"datePublished\":\"2021-04-07T18:30:53+00:00\",\"dateModified\":\"2021-05-02T08:57:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#webpage\"},\"wordCount\":399,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.walliczek.de\/#\/schema\/person\/15d35a7cd20cd4a127d30a226f50c33f\"},\"image\":{\"@id\":\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-scaled.jpg\",\"keywords\":[\"Display\",\"e-Paper\",\"Familien-Kalender\",\"Kalender\"],\"articleSection\":[\"Raspberry\"],\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/blog.walliczek.de\/#\/schema\/person\/15d35a7cd20cd4a127d30a226f50c33f\",\"name\":\"mwalliczek\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/blog.walliczek.de\/#personlogo\",\"inLanguage\":\"de-DE\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5920ffa7140bf7a615c7d7f0c3fd9b2c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5920ffa7140bf7a615c7d7f0c3fd9b2c?s=96&d=mm&r=g\",\"caption\":\"mwalliczek\"},\"logo\":{\"@id\":\"https:\/\/blog.walliczek.de\/#personlogo\"},\"sameAs\":[\"https:\/\/blog.walliczek.de\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Der online Familien-Kalender als Display - Matthias&#039; Technik-Ecke","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/","og_locale":"de_DE","og_type":"article","og_title":"Der online Familien-Kalender als Display - Matthias&#039; Technik-Ecke","og_description":"Sp\u00e4testens dann, wenn f\u00fcr verschiedene Personen Termine geplant werden m\u00fcssen, und das auch unterwegs (im Kindergarten, beim Training etc.) kommt ein Papier-Familienkalender an seine Grenzen.Gleichzeitig geht bei einem rein Online-Kalender die \u00dcbersichtlichkeit und der schnelle Blick zuhause auf den Kalender verloren.Die L\u00f6sung ist eine Anzeige f\u00fcr die Online-Kalender, die gro\u00df und dauerhaft gut ablesbar ist. [&hellip;]","og_url":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/","og_site_name":"Matthias&#039; Technik-Ecke","article_published_time":"2021-04-07T18:30:53+00:00","article_modified_time":"2021-05-02T08:57:33+00:00","og_image":[{"width":2560,"height":1854,"url":"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-scaled.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"mwalliczek","Gesch\u00e4tzte Lesezeit":"6 Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"https:\/\/blog.walliczek.de\/#website","url":"https:\/\/blog.walliczek.de\/","name":"Matthias&#039; Technik-Ecke","description":"Spielereien mit Gentoo-Linux-Servern, React, Raspberry, ESP und Co.","publisher":{"@id":"https:\/\/blog.walliczek.de\/#\/schema\/person\/15d35a7cd20cd4a127d30a226f50c33f"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.walliczek.de\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de-DE"},{"@type":"ImageObject","@id":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#primaryimage","inLanguage":"de-DE","url":"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-scaled.jpg","contentUrl":"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-scaled.jpg","width":2560,"height":1854},{"@type":"WebPage","@id":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#webpage","url":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/","name":"Der online Familien-Kalender als Display - Matthias&#039; Technik-Ecke","isPartOf":{"@id":"https:\/\/blog.walliczek.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#primaryimage"},"datePublished":"2021-04-07T18:30:53+00:00","dateModified":"2021-05-02T08:57:33+00:00","breadcrumb":{"@id":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#breadcrumb"},"inLanguage":"de-DE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.walliczek.de\/"},{"@type":"ListItem","position":2,"name":"Der online Familien-Kalender als Display"}]},{"@type":"Article","@id":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#article","isPartOf":{"@id":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#webpage"},"author":{"@id":"https:\/\/blog.walliczek.de\/#\/schema\/person\/15d35a7cd20cd4a127d30a226f50c33f"},"headline":"Der online Familien-Kalender als Display","datePublished":"2021-04-07T18:30:53+00:00","dateModified":"2021-05-02T08:57:33+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#webpage"},"wordCount":399,"commentCount":0,"publisher":{"@id":"https:\/\/blog.walliczek.de\/#\/schema\/person\/15d35a7cd20cd4a127d30a226f50c33f"},"image":{"@id":"https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.walliczek.de\/wp-content\/uploads\/2021\/04\/familien-kalender-1-scaled.jpg","keywords":["Display","e-Paper","Familien-Kalender","Kalender"],"articleSection":["Raspberry"],"inLanguage":"de-DE","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.walliczek.de\/index.php\/2021\/04\/07\/der-online-familien-kalender-als-display\/#respond"]}]},{"@type":["Person","Organization"],"@id":"https:\/\/blog.walliczek.de\/#\/schema\/person\/15d35a7cd20cd4a127d30a226f50c33f","name":"mwalliczek","image":{"@type":"ImageObject","@id":"https:\/\/blog.walliczek.de\/#personlogo","inLanguage":"de-DE","url":"https:\/\/secure.gravatar.com\/avatar\/5920ffa7140bf7a615c7d7f0c3fd9b2c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5920ffa7140bf7a615c7d7f0c3fd9b2c?s=96&d=mm&r=g","caption":"mwalliczek"},"logo":{"@id":"https:\/\/blog.walliczek.de\/#personlogo"},"sameAs":["https:\/\/blog.walliczek.de"]}]}},"_links":{"self":[{"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/posts\/34"}],"collection":[{"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/comments?post=34"}],"version-history":[{"count":13,"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/posts\/34\/revisions"}],"predecessor-version":[{"id":129,"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/posts\/34\/revisions\/129"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/media\/118"}],"wp:attachment":[{"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/media?parent=34"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/categories?post=34"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.walliczek.de\/index.php\/wp-json\/wp\/v2\/tags?post=34"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}