Anyone looked into using Electronic Price Tag screens with HA?

the small one

service: open_epaper_link.drawcustom
target:
  entity_id:
    - open_epaper_link.0000021a7d233b1b
data:
  background: white
  rotate: 270
  payload:
    - type: text
      value: >-
        {{
        ['Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag'][now().weekday()]
        }}
      font: /media/fonts/CascadiaCode.ttf
      x: 0
      "y": 1
      size: 20
      color: black
    - type: text
      value: "{{ now().day }}"
      font: /media/fonts/CascadiaCode.ttf
      x: 0
      "y": 25
      size: 50
      color: black
    - type: text
      value: "{{ now().month }}"
      font: /media/fonts/CascadiaCode.ttf
      x: 62
      "y": 25
      size: 50
      color: black
    - type: text
      value: .
      font: /media/fonts/CascadiaCode.ttf
      x: 46
      "y": 54
      size: 50
      color: red
    - type: text
      value: .
      font: /media/fonts/CascadiaCode.ttf
      x: 108
      "y": 54
      size: 50
      color: red
    - type: icon
      value: weather-sunset
      x: 5
      "y": 92
      size: 27
      color: black
    - type: text
      value: >-
        {{as_timestamp(states.sun.sun.attributes.next_rising) |
        timestamp_custom(" %H:%M") | string }}
      font: /media/fonts/CascadiaCode.ttf
      x: 33
      "y": 80
      size: 30
      color: black
    - type: text
      value: >-
        {{as_timestamp(states.sun.sun.attributes.next_setting) |
        timestamp_custom(" %H:%M") | string }}
      font: /media/fonts/CascadiaCode.ttf
      x: 33
      "y": 110
      size: 30
      color: black
    - type: text
      value: >-
        {% set temp = (state_attr('weather.home', 'forecast')[0].templow |
        float) | round(0)|string  %}  {% if temp|length == 1 %} {{temp ~ "Ā°"}}
        {% elif temp|length == 2 %} {{temp ~ "Ā°"}} {% elif temp|length == 3 %}
        {{temp}} {% endif %}
      font: /media/fonts/CascadiaCode.ttf
      x: >-
        {% set temp = (state_attr('weather.home', 'forecast')[0].templow |
        float) | round(0)|string  %}  {% if temp|length == 1 %} 89 {% elif
        temp|length == 2 %} 70 {% elif temp|length == 3 %} {{temp}} 70 {% endif
        %}
      "y": 150
      size: 30
      color: >-
        {% set temp = (state_attr('weather.home', 'forecast')[0].templow |
        float) | round(0)  %} {% if temp < 3 %} red {% else %} black {% endif %}
    - type: text
      value: >-
        {% set temp = (state_attr('weather.home', 'forecast')[0].temperature |
        float) | round(0)|string  %}  {% if temp|length == 1 %} {{temp ~ "Ā°"}}
        {% elif temp|length == 2 %} {{temp ~ "Ā°"}} {% elif temp|length == 3 %}
        {{temp}} {% endif %}
      font: /media/fonts/CascadiaCode.ttf
      x: >-
        {% set temp = (state_attr('weather.home', 'forecast')[0].temperature |
        float) | round(0)|string  %}  {% if temp|length == 1 %} 89 {% elif
        temp|length == 2 %} 70 {% elif temp|length == 3 %} {{temp}} 70 {% endif
        %}
      "y": 180
      size: 30
      color: >-
        {% set temp = (state_attr('weather.home', 'forecast')[0].temperature |
        float) | round(0)  %} {% if temp < 3 %} red {% else %} black {% endif
        %}  
    - type: text
      value: >-
        {% set temp = (state_attr('weather.home', 'forecast')[1].templow |
        float) | round(0)|string  %}  {% if temp|length == 1 %} {{temp ~ "Ā°"}}
        {% elif temp|length == 2 %} {{temp ~ "Ā°"}} {% elif temp|length == 3 %}
        {{temp}} {% endif %}
      font: /media/fonts/CascadiaCode.ttf
      x: >-
        {% set temp = (state_attr('weather.home', 'forecast')[1].templow |
        float) | round(0)|string  %}  {% if temp|length == 1 %} 89 {% elif
        temp|length == 2 %} 70 {% elif temp|length == 3 %} {{temp}} 70 {% endif
        %}
      "y": 220
      size: 30
      color: >-
        {% set temp = (state_attr('weather.home', 'forecast')[1].templow |
        float) | round(0)  %} {% if temp < 3 %} red {% else %} black {% endif %}
    - type: text
      value: >-
        {% set temp = (state_attr('weather.home', 'forecast')[1].temperature |
        float) | round(0)|string  %}  {% if temp|length == 1 %} {{temp ~ "Ā°"}}
        {% elif temp|length == 2 %} {{temp ~ "Ā°"}} {% elif temp|length == 3 %}
        {{temp}} {% endif %}
      font: /media/fonts/CascadiaCode.ttf
      x: >-
        {% set temp = (state_attr('weather.home', 'forecast')[1].temperature |
        float) | round(0)|string  %}  {% if temp|length == 1 %} 89 {% elif
        temp|length == 2 %} 70 {% elif temp|length == 3 %} {{temp}} 70 {% endif
        %}
      "y": 250
      size: 30
      color: >-
        {% set temp = (state_attr('weather.home', 'forecast')[1].temperature |
        float) | round(0)  %} {% if temp < 3 %} red {% else %} black {% endif
        %} 
    - type: icon
      value: >-
        {% set condition = state_attr('weather.home', 'forecast')[0].condition
        %} {%if (condition == "clearsky") %} {{"weather-sunny"}}
        {%elif(condition == "cloudy")%} {{"weather-cloudy"}} {%elif (condition
        == "fair")%} {{"weather-sunny"}} {%elif (condition == "fog")%}
        {{"weather-fog"}} {%elif (condition == "heavyrain")%}
        {{"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")%}  {{"weather-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"}}  {% else %} {{"cloud-question"}} {% endif %}
      x: 12
      "y": 145
      size: 55
      color: black
    - type: icon
      value: >-
        {% set condition = state_attr('weather.home', 'forecast')[1].condition 
        %}  {%if (condition == "clearsky") %} {{"weather-sunny"}} {%elif
        (condition == "cloudy")%} {{"weather-cloudy"}} {%elif (condition ==
        "fair")%} {{"weather-sunny"}} {%elif (condition == "fog")%}
        {{"weather-fog"}} {%elif (condition == "heavyrain")%}
        {{"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")%}  {{"weather-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"}} {% else %} {{"cloud-question"}} {% endif %}
      x: 12
      "y": 220
      size: 55
      color: black
2 Likes

Iā€™m using an image to be rotated for the wind direction, as the icons or text donā€™t seem to be rotatable.

    - type: dlimg
      url: >-
        https://icons.veryicon.com/png/o/miscellaneous/eva/arrow-circle-down-outline-1.png
      x: 111
      "y": 200
      xsize: 80
      ysize: 80
      rotate: "{{ states.weather.home.attributes.wind_bearing | round(0)}}"

does anyone have any idea how to use a local file? i tried /local/ and local/, but it doesnā€™t seem to workā€¦

I would like us to be able to rotate a piece of text or icon individually on the canvas.

Thank you for the code. Very helpful.

i tried that, it doesnā€™t seem to work.
i suggested an enhancement for that here:

1 Like

What batteries does the 2.9" display use? Iā€™ll go ahead and order some while waiting for the AP.

CR2450 batterie. The 2.9" tags take two of them.

Loving playing around with these!

Sorry if this is a basic question, is there a way of being able to see the output/image without waiting for it to refresh on the tag? Iā€™m new to scripting and finding the feedback loop very slow as I learn the syntax.

There is a camera featue, that creates a jpeg for every device, thats get updated before the display., try adding a new card on you HA, and select by device, the look for camera. (notice the .) it will be camera.MAC of the tag.

from my config

show_state: false
show_name: false
camera_view: auto
type: picture-entity
entity: camera.0000021ed4223b1d_cam
name: Tag01
1 Like

Had to update to the very latest version, but that works great - thanks!

Did you see dry-run as well?

2 Likes

Just finished a electric price graf for the next 12 hours.

open_epaper_link.0000021f1f683b15

just wanted to share the code, but be warned, iā€™m no programmer, so messy and ugly code.

Both EDS and nordpool edition

Github

4 Likes

Is there a way of looping in payload to create elements? Something like:

payload: >-
  {%- for openDoor in expand('binary_sensor.external_doors') | selectattr('state','eq','on') -%}
  - type: text
    value: {{openDoor.name}}
    font: ppb.ttf
    x: 0
    y: 10
    size: 10
    color: black
  {% endfor -%}

I canā€™t put any multiline code into payload without getting the error string indices must be integers, not 'str'

I appreciate Iā€™d have to do some funky stuff with positioning and think about space limitations, but it would be great to make it work with groups so that as I add more door and window sensors I donā€™t have to update my scripts. And repeated code makes the programmer in me ache.

Am a complete novice at HA scripting and YAML so maybe there is a better way?

My AP stopped updating my tags yesterday. It says, blinkingly ā€œfile system FULL! 0 bytesā€. Browsing through the files, I donā€™t see anything special. Anyone with an idea where to look or what to do?

to answer my own, reflashing did the trick, the file system must have been corrupted.

How did you do this?

By writing to Nic, the seller :wink: kidding, but I did. Thanks for his quick reply.

I used
https://install.openepaperlink.de/
in chrome on a windows machine, it didnā€™t work for me on a mac though.

I will also add, inserting the batteries by laying them on the backplate and pushing the display into the batteries works much better than popping the batteries in and the closing the cover.

2 Likes

Help please.
I finally received the AP and got it on my LAN easily. Did the battery change and this is what I got:

And on the AP website:
epaper ap

How do I get the AP to see the display??

(The Post-It notes are covering the brightest LED Iā€™ve ever seen on a device.)

Can anyone tell me what to do next?

What do you mean with ā€œDid the battery changeā€? You put new batteries in?

You have to reset the panel to get it to search for the AP. The way I do it, is to put the batteries in upside down. But you can also do like this video : PC controlled E-Paper price tag custom firmware flashing How-to (youtube.com)

For other issues with the tags, this page is a good source: Troubleshooting Tags Ā· jjwbruijn/OpenEPaperLink Wiki (github.com)

Yes. I received it with no batteries, and I shorted the contacts like this:

Because of the markings, I assumed that the batteries are in parallel, but I tried shorting the other positive terminal and the display went blank. When I reinstalled the batteries, it rebooted and the AP found the display quickly.

If I do nothing else, how often does the ESP32 wake up?

For my next trick, I will try installing the Home Assistant integration.

Your assistance is greatly appreciated.

By the way, do you know if anyone designed a mount for this tag? I am getting a 3D printer for Xmas and that would be a neat test print.