epa­per tags und an­de­re bild­schirm­chen

felix schwenzel in artikel

im lau­fe der jah­re habe ich in der au­to­ma­ti­schen woh­nung re­la­tiv vie­le bild­schirm­chen auf­ge­stellt, weil die au­to­ma­ti­sche woh­nung nicht nur ohne app und mo­bil­te­le­fon be­dien­bar sein soll, son­dern auch aus­ser­halb von apps und mo­bil­te­le­fo­nen mit uns kom­mu­ni­zie­ren kön­nen soll.

mei­ne weit­aus am häu­figs­ten ge­nutz­te in­for­ma­ti­on die ich ger­ne auf ei­nen blick er­ken­nen möch­te sind uhr­zeit. und da­tum. des­halb hängt die woh­nung voll mit uh­ren, nicht nur ku­ckucks­uh­ren, auch LED-ma­trix dis­plays. na­tür­lich ste­hen uhr­zeit und da­tum auch auf han­dies, arm­band­uh­ren, lap­tops und ipads, aber of­fen­sicht­lich ist es mir wich­tig über­all hin­se­hen zu kön­nen um die uhr­zeit oder das da­tum zu er­fah­ren. wenn ich kei­ne lust habe zu schau­en, be­ob­ach­te ich mich er­staun­lich oft dass ich im kin­der­zim­mer oder in der kü­che siri oder snips nach der uhr­zeit oder dem da­tum fra­ge. das ist vor al­lem prak­tisch, wenn man mit ge­schlos­se­nen oder ver­quol­le­nen au­gen im bett liegt. ge­gen den home­pod von ap­ple und app­les siri kann man viel sa­gen, aber was der wirk­lich gut kann ist auch die sehr lei­se ge­spro­che­ne fra­ge nach der uhr­zeit zu hö­ren und zu be­ant­wor­ten.

noch wich­ti­ger ist mir die zeit­um­stel­lun­gen zwei­mal im jahr nicht ma­nu­ell durch­füh­ren zu müs­sen. com­pu­ter und te­le­fo­ne be­kom­men das mitt­ler­wei­le gut al­lei­ne hin, aber na­tür­lich auch alle uh­ren die ir­gend­wie am home as­sistant hän­gen. die ein­zi­ge uhr die ich bei uns noch ma­nu­ell um­stel­len muss ist die der mi­cro­wel­le.

die mehr­heit un­se­rer dis­plays braucht eine kon­stan­te strom­ver­sor­gung. dis­plays, sen­so­ren oder ak­to­ren selbst aus esp8266s, esp32s oder ar­dui­nos zu bau­en ist dank es­phome wirk­lich ein­fach. bat­te­rie­be­trie­be­ne ge­rä­te selbst zu bau­en ist hin­ge­gen ver­gleichs­wei­se schwer. und mei­nen ers­ten selbst­ge­bau­ten epa­per-dis­play hat es auch schnell da­hin­ge­rafft, ent­we­der weil die trei­ber nicht gut op­ti­miert wa­ren oder ich ein­fach zu doof war das al­les her­stel­ler­spe­zi­fisch zu im­ple­men­tie­ren.

des­halb wur­de ich hell­hö­rig als ich hör­te, dass man die epa­per preis­schil­der die man mitt­ler­wei­le über­all sieht und be­kommt, leicht ha­cken kann. in­for­ma­tio­nen zu ein­zel­nen preis­schil­dern, ih­rer hacka­bi­li­ty und steue­rung wer­den im Ope­nE­Pa­per­Link re­po­si­ti­to­ry auf git­hub ge­sam­melt.

so sehr ich die idee mag aus­ge­mus­ter­te oder neue güns­ti­ge epa­per-dis­plays für ei­ge­ne zwe­cke zu nut­zen, so we­nig lust hat­te ich die auf­zu­ma­chen und ei­ge­ne firm­ware ein­zu­spie­len. im prin­zip ist das nicht all zu schwer, aber ich ent­schied mich den ein­fa­che­ren weg zu ge­hen: epa­per-schil­der zu kau­fen, die be­reits kom­pa­ti­bel sind.

da­mals, als ich da­für eine quel­le such­te, habe ich die kom­pa­ti­blen und BLE fä­hi­gen schild­chen nur bei ali­baba ge­fun­den (da­mals für ca. $10/stück). der pri­mä­re such­be­griff ist „Picksmart“, der pro­dukt­na­me bei ali­baba lau­tet:

Picksmart ODM 2.9 Inch 3 Co­lor Eink Elec­tro­nic Shelf La­bel ESL Epa­per BLE 5.0 Elec­tro­nic Pri­ce Tag Di­gi­tal Re­tail RED Dis­play

das schild­chen im flur zeigt an wenns (laut re­gen­ra­dar) re­gent, sonst ein wet­ter­sym­bol und die aus­sen­tem­pe­ra­tur. und na­tür­lich das da­tum.

um die din­ger zu steu­ern braucht man dann aber noch ei­nen zu­gangs­punkt, ac­cess point. auch dazu gibt es es ton­nen­wei­se doku bei Ope­nE­Pa­per­Link. ich habe mir ei­nen „AP“ aus ei­nen ESP32-S3 mit dis­play und ESP32-C6 ge­baut (spa­ghet­ti AP). den fer­tig ge­bau­ten AP hab ich dann in un­se­ren „ser­ver­raum“ ge­stellt, wo er sich gut mit den drei preis­schil­dern ver­bin­den kann.

der Ope­nE­Pa­per­Link „spa­ghet­ti AP“ im ser­ver­raum. theo­re­tisch kann man auf dem auch rum­ma­len oder be­li­bi­ge in­hal­te an­zei­gen las­sen, aber die sieht im ser­ver­raum ja nie­mand.

im web­in­ter­face des APs kann man be­reits in­hal­te de­fi­nie­ren, die auf den epa­per-schild­chen ge­zeigt wer­den kön­nen (da­tum, count­downs, wet­ter, bil­der, ka­len­der, etc.) aber richtg in­ter­es­sant wird das na­tür­lich erst mit home as­sistant, dort lie­gen schliess­lich alle mei­ne da­ten, vor al­lem ge­nau die wet­ter­da­ten, die ich auch an­zei­gen will: reg­nets? wenn ja, wann ge­nau und wie stark? und die ewi­ge fra­ge: wel­cher tag ist heu­te?

die home as­sistant in­te­gra­ti­on für den Ope­nE­Pa­per­Link hat ge­ra­de ei­nen gros­sen ver­si­ons­sprung hin­ge­legt und kann an­geb­lich auch ohne den AP mit be­stimm­ten tags re­den.

This re­lease in­tro­du­ces sup­port for di­rect com­mu­ni­ca­ti­on with ATC BLE tags via Blue­tooth Low En­er­gy (BLE). This me­ans an AP is no lon­ger re­qui­red for in­ter­ac­ting with tags that sup­port BLE.

wel­che preis­schil­der das sind habe ich noch nicht re­cher­chiert, mei­ne wer­den je­den­falls nicht ge­fun­den und ATC BLE be­deu­tet wohl: tags mit der ge­flash­ten/ge­hack­ten ATC cus­tom firm­ware.

in home as­sistant kann man mit der in­te­gra­ti­on dann be­lie­big auf den preis­schil­dern rum­ma­len. so sieht die ak­ti­on aus, mit der ich ein wet­ter-icon, die tem­pe­ra­tur und das da­tum auf die din­ger schrei­be.

action: open_epaper_link.drawcustom
target:
  device_id:
    - 0757317ceda12c6b521765bdf6987139
    - bc59cd23287f1d22d3f2d90b5900cdbd
data:
  background: white
  dry-run: false
  ttl: 360
  payload:
    - type: text
      font: ppb.ttf
      x: 198
      "y": 42
      anchor: mm
      color: red
      value: >-
        {{
        ['Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag'][now().weekday()]
        }}
      size: >-
        {% set tagesname =
        ['Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag']
        [now().weekday()]  %} {% if tagesname|length == 6 %} 48 {% elif
        tagesname|length == 7 %} 41 {% elif tagesname|length == 8 %} 36 {% elif
        tagesname|length == 10 %} 26 {% else %} 26 {% endif %}
    - type: text
      value: >-
        {% set tagesdatum = now().day|string %}  {% set monatsname =
        ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember']
        [now().month|int()-1]  %} {{ tagesdatum }}. {{ monatsname }}      
      font: ppb.ttf
      x: 198
      "y": 84
      anchor: mm
      size: 28
      color: black
    - type: icon
      value: >-
        {% set condition = states('weather.dwd_berlin_tegel') %}  {%if
        (condition == "sunny") %}{{"weather-sunny"}} {%elif (condition ==
        "clear-night") %}{{"weather-night"}} {%elif (condition ==
        "cloudy")%}{{"weather-cloudy"}} {%elif (condition ==
        "fair")%}{{"weather-sunny"}} {%elif (condition ==
        "sunny")%}{{"weather-sunny"}} {%elif (condition == "fog")%}
        {{"weather-fog"}} {%elif (condition == "pouring")%}
        {{"weather-pouring"}} {%elif (condition == "heavyrainandthunder")%}
        {{"weather-lightning-rainy"}} {%elif (condition == "heavyrainshowers")%}
        {{"weather-pouring"}} {%elif (condition ==
        "heavyrainshowersandthunder")%}{{"weather-fog"}} {%elif (condition ==
        "heavysleet")%}{{"weather-snowy-heavy"}} {%elif (condition ==
        "heavysleetandthunder")%}{{"weather-snowy-heavy"}} {%elif (condition ==
        "heavysleetshowers")%}{{"weather-snowy-rainy"}} {%elif (condition ==
        "heavysleetshowersandthunder")%}{{"weather-snowy-rainy"}} {%elif
        (condition == "heavysnow")%}{{"weather-snowy-heavy"}} {%elif (condition
        == "heavysnowandthunder")%}{{"wweather-snowy-rainy"}} {%elif (condition
        == "heavysnowshowers")%}{{"weather-snowy-heavy"}} {%elif (condition ==
        "heavysnowshowersandthunder")%}{{"weather-snowy-heavy"}} {%elif
        (condition == "lightrain")%}{{"weather-rainy"}} {%elif (condition ==
        "lightrainandthunder")%}{{"weather-lightning-rainy"}} {%elif (condition
        == "lightrainshowers")%}{{"weather-partly-rainy"}} {%elif (condition ==
        "lightrainshowersandthunder")%}{{"weather-partly-lightning"}} {%elif
        (condition == "lightsleet")%}  {{"weather-snowy-rainy"}} {%elif
        (condition == "lightsleetandthunder")%}{{"weather-snowy-rainy"}} {%elif
        (condition == "lightsleetshowers")%}  {{"weather-snowy-rainy"}} {%elif
        (condition == "lightsnow")%}  {{"weather-snowy"}} {%elif (condition ==
        "lightsnowandthunder")%}{{"weather-snowy"}} {%elif (condition ==
        "lightsnowshowers")%}{{"weather-snowy-rainy"}} {%elif (condition ==
        "lightssleetshowersandthunder")%}{{"weather-snowy-rainy"}} {%elif
        (condition == "lightssnowshowersandthunder")%}{{"weather-snowy-rainy"}}
        {% elif (condition == "partlycloudy") and states("sun.sun") ==
        "above_horizon"%}{{"weather-partly-cloudy"}} {% elif (condition ==
        "partlycloudy") and states("sun.sun") ==
        "below_horizon"%}{{"weather-night-partly-cloudy"}} {% elif (condition ==
        "rainy")%}{{"weather-rainy"}} {%elif (condition ==
        "rainandthunder")%}{{"weather-lightning-rainy"}} {%elif (condition ==
        "rainshowers")%}{{"weather-partly-rainy"}} {%elif (condition ==
        "rainshowersandthunder")%}{{"weather-lightning-rainy"}} {%elif
        (condition == "sleet")%}{{"weather-snowy"}} {%elif (condition ==
        "sleetandthunder")%}{{"weather-snowy"}} {%elif (condition ==
        "sleetshowers")%}{{"weather-snowy"}} {%elif (condition ==
        "sleetshowersandthunder")%}{{"weather-snowy"}} {%elif (condition ==
        "snow")%}{{"weather-snowy"}} {%elif (condition ==
        "snowandthunder")%}{{"weather-snowy"}} {%elif (condition ==
        "snowshowers")%}{{"weather-snowy"}} {%elif (condition ==
        "snowshowersandthunder")%}{{"weather-snowy"}} {%elif (condition ==
        "snowy")%}{{"weather-snowy"}} {% else %} {{"cloud-question"}} {% endif
        %}
      x: 10
      "y": 10
      size: 80
      color: black
    - type: text
      value: "{{ states(\"sensor.temperature_berlin_tegel\") | float(-1) | round(0) }}°"
      font: ppb.ttf
      x: 50
      "y": 104
      size: 32
      color: black
      anchor: mm

die epa­per schild­chen lau­fen hier jetzt seit ok­to­ber 2024 pro­blem­los. die bat­te­rien las­sen sich tau­schen und weil die tags ma­gne­tisch sind, las­sen sie sich auch über­all hin­hän­gen. ich mag die dis­plays sehr, auch weil sie gut ab­les­bar sind, aber mehr von de­nen muss ich mir nicht un­be­dingt kau­fen. aus­ser mir fällt noch was ein, wo sie wirk­lich nütl­zich sein könn­ten.

beiträge die hierher linken
6 kommentare
Dieterjosef
Ich habe technisch zu wenig Ahnung, aber ich überlege immer, was man mit diesen Schildern anfangen könnte, wenn man die aussortierten vom Discounter um die Ecke kriegen kann und dann viele von denen verbindet.
Lippe

@ix Ist das auf dem ersten Bild ein Ikea Vindrikting Sensor? Ich habe mir den vor kurzem auch geholt, finde den darin eingebauten, ständig anspringenden Lüfter aber so dermaßen nervig, dass ich das Gerät nach einer Woche wieder abgebaut habe. Ist meiner einfach nur defekt oder merkst du das bei deinem auch? (Und ich hoffe, ich habe dich jetzt nicht drauf aufmerksam gemacht und du hörst die Geräusche nun auch ständig...)

ix

@Lippe ich hör den eigentlich nicht, was aber auch daran liegen kann, dass in der küche ständig lautere geräusche zu hören sind. oder dass die frühen modelle leiser waren. ich hab den allerdings auch etwas aufgebohrt mit einem esp8266, so dass er seine messwerte auch an homeassistant senden kann. so sollte man auch die steuerung des partikel-sensors steuern können.

Lippe

@ix Oh, hast du da eine Anleitung zu?

ix

@Lippe massig anleitungen gibts dazu, hier ist eine, die auch (optional) die den ventilator mit 3,3V statt 5V versorgt, was das geräusch stark reduzieren soll: https://style.oversubstance.net/2021/08/diy-use-an-ikea-vindriktning-air-quality-sensor-in-home-assistant-with-esphome/