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.
Ok thatâs great! It confirms we can source ESL from Giciskys. Good luck with your ESL project, and keep us posted ![]()
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
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










