Anyone looked into using Electronic Price Tag screens with HA?

The restful sensor seems to work

sensor.api_ninja_dad_jokes
API Ninja - Dad Jokes
OK	joke: Where do elephants store luggage? In a trunk.
friendly_name: API Ninja - Dad Jokes

but the automation dosen’t! It says “anchor not supported for multiline text” as below.

Executed: November 8, 2024 at 12:07:00
Error: anchor not supported for multiline text
Result:
params:
  domain: open_epaper_link
  service: drawcustom
  service_data:
    background: white
    rotate: 0
    payload:
      - type: icon
        value: emoticon-lol
        x: 1
        'y': 1
        size: 35
        color: red
      - type: icon
        value: emoticon-confused
        x: 260
        'y': 92
        size: 35
        color: red
      - type: text
        value: Where do elephants store luggage? In a trunk.
        font: ../../media/GothamRnd-Bold.ttf
        x: 32
        'y': 32
        size: 26
        color: black
        anchor: lt
        max_width: 232
        y_padding: 0
        spacing: 2
    entity_id:
      - open_epaper_link.00000335025f3e11
  target:
    entity_id:
      - open_epaper_link.00000335025f3e11
running_script: false

So what happens if you remove the anchor?
lt is the default anyway

Now it works, thanks!

alias: API Ninjas - Chuck Norris
description: Show an awesome Chuck Norris quote, joke, fact (mostly true!), every hour!
triggers:
  - minutes: "8"
    trigger: time_pattern
actions:
  - data:
      background: white
      rotate: 0
      payload:
        - type: icon
          value: comment-quote
          x: 1
          "y": 1
          size: 35
          color: red
        - type: text
          value: Chuck Norris
          font: ../../media/GothamRnd-Bold.ttf
          x: 38
          "y": 10
          size: 28
          color: red
          max_width: 200
          y_padding: 0
          spacing: 3
        - type: icon
          value: emoticon-confused
          x: 240
          "y": 110
          size: 35
          color: red
        - type: dlimg
          url: /config/media/chuck-icon.jpg
          x: 240
          "y": 100
          xsize: 50
          ysize: 50
          rotate: 0
        - type: text
          value: "{{ state_attr('sensor.api_ninja_chuck_norris', 'joke') | string }}"
          font: ../../media/GothamRnd-Bold.ttf
          x: 5
          "y": 50
          size: >-
            {% set string_len = state_attr('sensor.api_ninja_chuck_norris',
            'joke') | length | int %} {% if string_len <= 50 %}
              24  # Adjusted sizes for readability and fitting
            {% elif string_len <= 60 %}
              20
            {% elif string_len <= 100 %}
              18
            {% elif string_len <= 150 %}
              16
            {% elif string_len <= 200 %}
              14
            {% else %} 
              12
            {% endif %}
          color: black
          max_width: 200
          y_padding: 2
          spacing: 3
    target:
      entity_id:
        - open_epaper_link.000003337A0B3E19
    action: open_epaper_link.drawcustom
mode: restart

Hope this is the right place to ask…
Since the last update to open_epaper, I have been unable to send data to my ePaper displays.

Here is a script that I used to test the displays a year ago:

alias: ePaper Test
sequence:
  - target:
      entity_id:
        - open_epaper_link.0000021F85C23B16
    data:
      background: white
      rotate: 0
      payload:
        - type: line
          x_start: 0
          x_end: 296
          y_start: 0
          y_end: 128
          width: 1
          fill: black
        - type: line
          x_start: 296
          x_end: 0
          y_start: 0
          y_end: 128
          width: 1
          fill: red
    action: open_epaper_link.drawcustom
mode: single

When I run the script, I get this error:
“Failed to perform the action script/epaper_test. ‘NoneType’ object is not iterable”

I saw this in github: “Service target now uses device ID instead of entity ID”

Here is my device information:

And my modified script:

alias: ePaper Test
sequence:
  - target:
      device_id:
        - 0000021F85C23B16
    data:
      background: white
      rotate: 0
      payload:
        - type: line
          x_start: 0
          x_end: 296
          y_start: 0
          y_end: 128
          width: 1
          fill: black
        - type: line
          x_start: 296
          x_end: 0
          y_start: 0
          y_end: 128
          width: 1
          fill: red
    service: open_epaper_link.drawcustom
mode: single

But, I am getting the same error.

Any assistance would be appreciated.

Hi,
a serial number is not a device_id.

Read this issue on GitHub: https://github.com/OpenEPaperLink/Home_Assistant_Integration/issues/224

Thanks- I read the breaking changes on GitHub but never saw the page you referenced.

Also, since posting my question I found an easy way to get the device_id:

To get the Device ID:

  • Goto settings → Devices then click on the device.
  • Click on the device
  • Click on the plus button in Automations.
  • Click on “Use device as trigger”.
  • This will open the automation editor page.
  • Click three dots, choose “Edit in YAML” - you will see device_id and entity_id of this device.
  • Don’t save the automation, just exit the editor.

Why change this to something that is so much harder to find?
And it seems there are more breaking changes in the syntax also.

1 Like

Don’T understand and don’t like it either. At least (as everywhere else) the entity-id way of the service calls should be still possible, even if someone like to add (not replace) it to the device_id-way.

For those looking at this thread and wondering how to get started.
I’ve just bought these for the Access Point:

following this guide on how-to:

and these for the e-paper screens:

The screens ‘just work’ without any need for flashing/soldering etc first. Once you get them in the post (only took 7 days, arrived today) and they’re near a working ESP32-S3 N16R8 with OpenEPaper installed on it they auto-connect to it.

4 Likes

Friendly word of warning here - the ESP32-S3 has some issues when trying to do WiFi and BLE at the same time (it only has one radio). So if you go the BLE route, your AP might occasionally hang and stop responding.

I started out the same way (BLE-only ESLs), but I ended up flashing the ESLs with a custom firmware for 802.15 (they are very easy to flash over BLE, no need for soldering or pogo pins).

For the people who want to get started, I know the project documentation is a bit… difficult to follow at the moment :slight_smile: . But there is a discord channel, and the people there are incredibly helpful. Including and especially atc1441 (one of the creators of the project), who seems to be one of the most patient people I have ever met… :slight_smile:

One more way (the one I normally use):

  • go to developer tools / actions
  • choose “open_epaper_link.drawcustom”
  • switch to UI mode (click on “go to UI mode” on the bottom left)
  • click on “choose device”, and you can now use the search box to look for the correct ESL
  • switch back to YAML mode (“go to YAML mode” on the bottom left)
  • you now have the correct device_id populated in the yaml, you can c/p it to your automations

Yes, it is slightly annoying, but… luckily it is not something that needs to be done very often :slight_smile:

Editing to add one more way I just tested - go to Developer Tools / Templates, and use the following template:

{% for dev in (integration_entities('open_epaper_link') | map('device_id') | unique | list) %}
{{dev}} - {{device_attr(dev, 'name')}}
{%- endfor%}

This will list all the device IDs and the corresponding names (MACs by default, or custom names you set in the OEPL AP).

hey @arganto
the code stopped working last friday… so you have the same issue?
It seems to be down to sensor.next_full_moon not reporting anything anymore.

{% set mond_tage
            = count_the_days(states('sensor.next_full_moon'))|int %} {% set
            mond_datum = strptime(states('sensor.next_full_moon'),"%Y-%m-%d
            %H:%M:%S") %}

Did I miss a breaking change? Did you change your code or are you not using it anymore?

The mentioned code is not the problem. The sensor is. The cource site is currently down.

http://wannistvollmond.celll.net

Completely, not only for moon. Let’s wait if it comes back perhaps soon. If not, we have to find another source with api for German full moon.

thanks, I forgot it was a different service than the regular moon integration…

here’s an integration that works for me, it doesn’t have the “last full moon” sensor though…

I’m not sure I really understood what the old template showed…

The sensor just stores the last full moon coming from the integration if another the next full moon is then new in the sensor. To be able to show “yesterday”, etc.

Should work with the new integration as well. Will try and post an update. Thanks for the hint to the integration.

Installed the mentioned integration to get next full moon with that. Working.

Here my new templates for last_full moon (of course will have the real last full moon after the next full moon:

Code
  - trigger:
      - platform: state
        entity_id: sensor.xxx_next_full_moon
    sensor:
      - name: Last Full Moon Helper
        unique_id: unique_id_template_sensor_last_full_moon_helper
        state: >
          {% if trigger.from_state.state|as_datetime(0) != 0 %}
            {{ trigger.from_state.state }}
          {% else %}
            {{ this.state }}
          {% endif %}
        icon: mdi:moon-full

  - trigger:
      - platform: state
        entity_id: sensor.last_full_moon_helper
    sensor:
      - name: Last Full Moon
        unique_id: unique_id_template_sensor_last_full_moon
        state: >
          {% if trigger.from_state.state|as_datetime(0) != 0 %}
            {{ trigger.from_state.state }}
          {% else %}
            {{ this. State }}
          {% endif %}
          {% if 1 == 2 %}
            {{ strptime(states('sensor.xxx_next_full_moon'),"%Y-%m-%d %H:%M:%S") - timedelta(days=29,hours=12,minutes=44) }}
          {% endif %}
        icon: mdi:moon-full

And then this items in weather tag

Code
        - type: text
          value: |
            {% if states('sensor.moon_phase') == 'waning_gibbous' %}
              Abnehmender Mond
            {% elif states('sensor.moon_phase') == 'waning_crescent' %}
              Abnehmende Sichel
            {% elif states('sensor.moon_phase') == 'waxing_crescent' %}
              Zunehmende Sichel
            {% elif states('sensor.moon_phase') == 'waxing_gibbous' %}
              Zunehmender Mond
            {% else %}
              {{ state_translated('sensor.moon_phase') }}
            {% endif %}
          x: 339
          "y": 17
          anchor: ra
          size: 16
        - type: text
          value: >-
            {% from 'easy_time.jinja' import count_the_days %}
            {% set mond_tage = count_the_days(states('sensor.xxx_next_full_moon'))|int %}
            {% set mond_datum = strptime(states('sensor.xxx_next_full_moon'),"%Y-%m-%dT%H:%M:%S+00:00") %}
            {% if mond_tage > 10 %}
              {% if states('sensor.last_full_moon') %}
                {% set mond_tage = count_the_days(states('sensor.last_full_moon'))|int %}
              {% endif %}
            {% endif %}
            {% if mond_tage < -4 %}
              {{ mond_datum.day }}.{{ '{:02d}'.format(mond_datum.month) }}.
            {% elif mond_tage < -2  %}
              {{ mond_tage }}
            {% elif mond_tage == -2  %}
              Vorgestern
            {% elif mond_tage == -1  %}
              Gestern  
            {% elif mond_tage == 0  %}
              Heute
            {% elif mond_tage == 1  %}
              Morgen
            {% elif mond_tage == 2  %}
              Übermorgen  
            {% elif mond_tage > 4  %}
              {{ mond_datum.day }}.{{ '{:02d}'.format(mond_datum.month) }}.
            {% elif mond_tage > 2  %}
              {{ ' +' ~ mond_tage ~ " Tage" }}      
            {% endif %}
          x: 339
          "y": 34
          anchor: ra
          size: 16
        - type: icon
          value: >-
            {% from 'easy_time.jinja' import count_the_days %} {% set mond_tage
            = count_the_days(states('sensor.last_full_moon'))|int %} {% if
            mond_tage == 0 %}
              moon-full
            {% else %}            
              {{ ("moon-" ~
              states('sensor.moon_phase')|replace('_','-'))|replace('moon-new-moon','moon-new')|replace('moon-full-moon','moon-full')
              }}
            {% endif %}
          x: 346
          "y": 16
          anchor: la
          size: 40
          color: black

Hello everyone and thanks for sharing your projects! I’ve just found this thread and very optimistic about using it for my own projet. My first question is does anyone know where to buy the smallest compatible ESL compatible with OpenEPaperLink ? Has anyone bought recently and can help find where to source compatible ESLs? I need small rectangular ones, smallest, and cheapest.

Ali Express is the cheapest source.

I’ve been searching Ali Express deeply for compatible ESLs but can’t find any. Can you share a link?