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.