Anyone looked into using Electronic Price Tag screens with HA?

As far as I know gicisky are compatible if the AP is an ESP32 S3.
I ordered a S3 recently and can report back when I get it.

I had seen this item before: https://www.aliexpress.com/item/1005002399342939.html

I would be very happy if you can report if it works for you @Hellis81

Thanks in advance

I have flashed the new ESP and it finds the BLE tag, but by some reason the ESP is not added to OpenEpaperLink.

Here I can see the ESP and the new tag in the white boxes but I also get a failed message at the top right corner.

On the other AP I get online.

Is not multiple APs supported?
Or what have I done wrong here?

Figured it out.
Needed to flash the ESP with BLE only firmware.

Now it’s time to peel the plastic and go to bed

Congratulations @Hellis81!

Keep us updated about your progress! And please share the item link where you ordered from. That would be much appreciated.

Good evening!

I bought mine at Giciskys official store.
https://www.aliexpress.com/item/1005002398744297.html?spm=a2g0o.order_list.order_list_main.11.7561180224uISW

And then I bought a ESP32 S3, apparently you need a specific one ESP32-S3 N16R8, OpenEPaperLink but I guess I was lucky or all S3’s are of that kind?

Then install the BLE only AP.
Install OpenEPaperLink
Connect to the ESP32 WIFI and got 192.168.4.1
Setup the WIFI settings and it will reboot and find the tag.

1 Like

Ok that’s great! It confirms we can source ESL from Giciskys. Good luck with your ESL project, and keep us posted :grinning:

I’m getting there…

Just a few tweaks .

Tags dont run on my HA, dont know why. Access point works, but nothing is displayed via HA.

sample code:

service: open_epaper_link.lines4
data:
line1: “This”
line2: “is”
line3: “a”
line4: “Test”
border: r
format1: lbbw
format2: mrrw
format3: lbbw
format4: mrrw
target:
entity_id: open_epaper_link.0000033364613E1A

Isn’t that service call removed?
I believe it’s customdraw you should use.

This doesn’t work either; the display only shows data from the AP. No data from HA.

action: open_epaper_link.drawcustom
target:
  entity_id: open_epaper_link.0000033364613E1A
data:
  background: white
  rotate: 0
  dither: false
  ttl: 300
  dry-run: false
  payload:
    line1: "This"
    line2: "is"
    line3: "a"
    line4: "Test"
    border: r
    format1: lbbw
    format2: mrrw
    format3: lbbw
    format4: mrrw

Depending on your version of the integration the target might be wrong.
It probably needs to be device.

Edit confirmed from your previous images.
It has to be device

Edit again.
The service you are using is a legacy and deprecated, and says it is for 2.9 inch versions. Yours is 2.6 inch.

Not sure if that matters.
But just try and do it correctly and see if that works.

Wait… What is line1, line2 etc.
Where do you see that in the documentations?

tried also this.

action: open_epaper_link.drawcustom
data:
  rotate: 0
  dither: "0"
  ttl: 60
  dry-run: false
  background: white
  payload: this is a test
target:
  entity_id: open_epaper_link.0000033364613E1A

How about testing something that we can expect that it works?
Look in the documentations for a simple text output and try that.
It’s obvious now that you have asked your LLM friend for help.

i tested, but it will not work

action: open_epaper_link.drawcustom
data:
  payload:
    - type: text
      value: Hello World!
      x: 0
      "y": 0
      size: 40
  background: white
  rotate: 0
  dither: "0"
  ttl: 600
  dry-run: false
target:
  device_id: 2a8028d259759255ffdd0a5d044a22a4

Edit:

Stop, no i ve “hello world”

Great.
I did not expect that to work since it was missing font and color. But good that it worked.

One small problem remains. The red is darker when the text comes from HA. It is better via the access point.
no different between “accent” and “red” as colour

action: open_epaper_link.drawcustom
data:
  payload:
    - type: text
      value: Rote Beete
      x: 30
      "y": 5
      size: 40
      color: accent
    - type: text
      value: 1,00€
      x: 10
      "y": 60
      size: 100
      color: black
      font: ppb.ttf
    - type: line
      x_start: 0
      x_end: 320
      y_start: 45
      y_end: 45
      width: 5
      fill: red
      outline: red
  background: white
  rotate: 0
  dither: "1"
  ttl: 60
  dry-run: false
target:
  device_id: 2a8028d259759255ffdd0a5d044a22a4

Drawing red color uses more battery, the battery icon on the top tag could be the issue

thx. think you are right

Latest screen is plant data using the OpenPlantbook integration and the Plant integration from HACS.

If progress bar is black then values are within what plant likes, else it becomes red.
All progress bars are set up so that they display the what the value is within the range.
As an example the carrot want’s between 15 and 60% soil humidity and it’s currently 39% that means it shows up as 53% in the progress bar, but the text says 39%.

Automation to get these displays is below.
You should not need to change anything but the first three variables, meaning sensor_prefix, plant and icon.
All the other values and calculations are based upon these.
The sensor_prefix is should be to the plant sensor values (the physical device in the pot).

alias: Display Morot
description: ""
variables:
  sensor_prefix: sensor.morot_
  plant: plant.morot
  icon: carrot
  spieces: "{{ state_attr(plant, 'species') | lower | replace(' ', '_') }}"
  max_soil: "{{ state_attr('openplantbook.' ~ spieces , 'max_soil_moist') }}"
  min_soil: "{{ state_attr('openplantbook.' ~ spieces , 'min_soil_moist') }}"
  max_temp: "{{ state_attr('openplantbook.' ~ spieces , 'max_temp') }}"
  min_temp: "{{ state_attr('openplantbook.' ~ spieces , 'min_temp') }}"
  max_hum: "{{ state_attr('openplantbook.' ~ spieces , 'max_env_humid') }}"
  min_hum: "{{ state_attr('openplantbook.' ~ spieces , 'min_env_humid') }}"
  max_cond: "{{ state_attr('openplantbook.' ~ spieces , 'max_soil_ec') }}"
  min_cond: "{{ state_attr('openplantbook.' ~ spieces , 'min_soil_ec') }}"
  max_lux: "{{ state_attr('openplantbook.' ~ spieces , 'max_light_lux') }}"
  min_lux: "{{ state_attr('openplantbook.' ~ spieces , 'min_light_lux') }}"
  max_mmol: "{{ (state_attr('openplantbook.' ~ spieces , 'max_light_mmol') * 0.0036) | int + 1 }}"
  min_mmol: "{{ (state_attr('openplantbook.' ~ spieces , 'min_light_mmol') * 0.0036) | int }}"

triggers:
  - trigger: time_pattern
    hours: /2
conditions: []
actions:
  - action: open_epaper_link.drawcustom
    data:
      background: white
      rotate: 0
      dither: "0"
      ttl: 60
      dry-run: false
      payload:
        - type: icon
          value: "{{ icon }}"
          x: 5
          "y": -5
          size: 30
          color: black
        - type: text
          value: "{{ state_attr(plant, 'friendly_name') }}"
          font: ppb.ttf
          x: 35
          "y": 0
          size: 25
          color: black
        - type: line
          x_start: 0
          x_end: 298
          y_start: 21
          y_end: 21
          width: 2
          fill: black
        - type: icon
          value: >-
            {{ ('mdi:battery-' ~ ((states(sensor_prefix ~
            'battery'))|int/10)|int*10) | replace('-100','') }}
          x: 280
          "y": 0
          size: 20
          color: black
        - type: icon
          value: >-
            {% set hr = {0:"twelve", 1:"one", 2:"two", 3:"three", 4:"four",
            5:"five", 6:"six", 7:"seven", 8:"eight", 9:"nine", 10:"ten",
            11:"eleven", 12:"twelve",} %} mdi:clock-time-{{ hr[now().hour % 12]
            }}-outline
          x: 255
          "y": -1
          size: 24
          color: black
        - type: icon_sequence
          x: 0
          "y": 25
          icons:
            - mdi:water-percent
            - mdi:thermometer-high
            - mdi:cloud-percent-outline
          size: 30
          direction: down
        - type: progress_bar
          x_start: 32
          y_start: 32
          x_end: 80
          y_end: 46
          fill: |
            {% set p = states(sensor_prefix ~ 'soil_moisture')  | float %}
            {% set percent = (p-min_soil)/(max_soil-min_soil)*100 %}
            {{ 'black' if 0.1 < percent and percent <= 100 else 'red' }}
          outline: black
          width: 1
          progress: |
            {% set p = states(sensor_prefix ~ 'soil_moisture')  | float %}
            {{ (p-min_soil)/(max_soil-min_soil)*100 }}
          direction: right
          show_percentage: false
          font: ppb.ttf
        - type: text
          value: "{{ states(sensor_prefix ~ 'soil_moisture') | int }}%"
          font: ppb.ttf
          x: 85
          "y": 32
          size: 16
          color: black
        - type: progress_bar
          x_start: 32
          y_start: 70
          x_end: 80
          y_end: 84
          fill: |
            {% set t = states(sensor_prefix ~ 'temperature')  | float %}
            {% set percent = (t-min_temp)/(max_temp-min_temp)*100 %}
            {{ 'black' if 0.1 < percent and percent <= 100 else 'red' }}
          outline: black
          width: 1
          progress: |
            {% set t = states(sensor_prefix ~ 'temperature')  | float %}
            {{ (t-min_temp)/(max_temp-min_temp)*100 }} 
          direction: right
          show_percentage: false
          font: ppb.ttf
        - type: text
          value: "{{ states(sensor_prefix ~ 'temperature') | int }}°C"
          font: ppb.ttf
          x: 85
          "y": 70
          size: 16
          color: black
        - type: progress_bar
          x_start: 32
          y_start: 108
          x_end: 80
          y_end: 122
          fill: |
            {% set h = states(sensor_prefix ~ 'air_humidity')  | float %}
            {% set percent = (h-min_hum)/(max_hum-min_hum)*100 %}
            {{ 'black' if 0.1 < percent and percent <= 100 else 'red' }}
          outline: black
          width: 1
          progress: |
            {% set h = states(sensor_prefix ~ 'air_humidity')  | float %}
            {{ (h-min_hum)/(max_hum-min_hum)*100 }} 
          direction: right
          show_percentage: false
          font: ppb.ttf
        - type: text
          value: "{{ states(sensor_prefix ~ 'air_humidity') | int }}%"
          font: ppb.ttf
          x: 85
          "y": 108
          size: 16
          color: black
        - type: icon_sequence
          x: 130
          "y": 25
          icons:
            - mdi:flower
            - mdi:white-balance-sunny
            - mdi:sun-clock
          size: 30
          direction: down
        - type: progress_bar
          x_start: 163
          y_start: 32
          x_end: 211
          y_end: 46
          fill: |
            {% set c = states(sensor_prefix ~ 'conductivity')  | float %}
            {% set percent = (c-min_cond)/(max_cond-min_cond)*100  %}
            {{ 'black' if 0.1 < percent and percent <= 100 else 'red' }}
          outline: black
          width: 1
          progress: |
            {% set c = states(sensor_prefix ~ 'conductivity')  | float %}
            {{ (c-min_cond)/(max_cond-min_cond)*100 }}
          direction: right
          show_percentage: false
          font: ppb.ttf
        - type: text
          value: "{{ states(sensor_prefix ~ 'conductivity') | int }}"
          font: ppb.ttf
          x: 216
          "y": 32
          size: 16
          color: black
        - type: text
          value: ÂľS
          font: ppb.ttf
          x: 262
          "y": 24
          size: 16
          color: black
        - type: line
          x_start: 260
          x_end: 290
          y_start: 39
          y_end: 39
          width: 1
          fill: black
        - type: text
          value: cm
          font: ppb.ttf
          x: 261
          "y": 41
          size: 16
          color: black
        - type: progress_bar
          x_start: 163
          y_start: 70
          x_end: 211
          y_end: 84
          fill: |
            {% set l = states(sensor_prefix ~ 'illuminance')  | float %}
            {% set percent = (l-min_lux)/(max_lux-min_lux)*100  %}
            {{ 'black' if 0.1 < percent and percent <= 100 else 'red' }}
          outline: black
          width: 1
          progress: |
            {% set l = states(sensor_prefix ~ 'illuminance')  | float %}
            {{ (l-min_lux)/(max_lux-min_lux)*100 }}
          direction: right
          show_percentage: false
          font: ppb.ttf
        - type: text
          value: "{{ states(sensor_prefix ~ 'illuminance') | int }} lux"
          font: ppb.ttf
          x: 216
          "y": 70
          size: 16
          color: black
        - type: progress_bar
          x_start: 163
          y_start: 108
          x_end: 211
          y_end: 122
          fill: |
            {% set dli = states(sensor_prefix ~ 'dli') | float %}
            {% set percent = (dli-min_mmol)/(max_mmol-min_mmol)*100  %}
            {{ 'black' if 0.1 < percent and percent <= 100 else 'red' }}
          outline: black
          width: 1
          progress: |
            {% set dli = states(sensor_prefix ~ 'dli') | float %}
            {{ (dli-min_mmol)/(max_mmol-min_mmol)*100 }}
          direction: right
          show_percentage: false
          font: ppb.ttf
        - type: text
          value: "{{ states(sensor_prefix ~ 'dli') |round(2) }}"
          font: ppb.ttf
          x: 216
          "y": 108
          size: 16
          color: black
        - type: text
          value: mol
          font: ppb.ttf
          x: 260
          "y": 98
          size: 16
          color: black
        - type: line
          x_start: 260
          x_end: 290
          y_start: 113
          y_end: 113
          width: 1
          fill: black
        - type: text
          value: dm²
          font: ppb.ttf
          x: 260
          "y": 115
          size: 16
          color: black
    target:
      device_id:
        - e34881c6b711f1a56d36316758eda1b9
mode: single
2 Likes