Seveda...
v ESPHome imam takole (poleg ostalih obveznih priteklin):
- Koda: Izberi vse
i2c:
sda: GPIO5
scl: GPIO4
scan: True
id: bus_a
sensor:
- platform: vl53l0x
name: "Zaloga peletov FAST"
id: zaloga_peletov_fast
address: 0x29
update_interval: 1s
long_range: true
accuracy_decimals: 0
unit_of_measurement: cm
filters:
- round: 2
- multiply: 100
- offset: -1
- platform: copy
source_id: zaloga_peletov_fast
name: "Zaloga peletov"
accuracy_decimals: 0
unit_of_measurement: cm
filters:
- median:
window_size: 70
send_every: 60
send_first_at: 50
PRVI senzor (z imenom ...FAST) je tisti, ki komunicira s laser senzorjem. Tega imam nastavljeno na osveževanje 1s, zato da imam takoj rezultat, če kaj preverjam, testiram... ker senzor vrne meritev v metrih je tukaj filter: najprej zaokrožim na dve decimalki (npr. 0.344 --> 0.34), potem množim s 100, da dobim centimetre, na koncu dodam še offset (za 1cm mi je preveč kazal). Tu bi sicer lahko spustil filter "round: 2" in samo množil s 100, ker imam višje "accuracy_decimals: 0", ampak "accuracy" samo odreže decimalke, torej spremeni 34.8 -->34, medtem ko filter round zaokroži na najbližjo vrednost. Brez tega filtra bi torej dobil 34, s tem filtrom dobim 35. Pazi, vrstni red je pomemben, ko pišeš filtre, ker računa po vrsti. Lahko bi najprej množil s 100, a bi moral potem dati round: 0. Lahko bi tudi dal prej offset, če bi ga dal na prvo mesto bi za enak efekt moral dati: offset: 0.01 . itd...
DRUGI senzor (platform copy) je kopija prvega - rezultat jemlje od prvega, s tem, da je dodan median filter, ki malo "zravna" nihanje. Tega uporabljam v dashboardu.
V HA pa imam konverzijo v procente: v studio code server (urejevalnik kode, če nimaš ga namesti v dodatkih) pa imam template senzor, ki centimetre pretvori v procente:
- Koda: Izberi vse
- name: nivo_peletov
unit_of_measurement: "%"
state: >
{%set min_cm=5%}
{%set max_cm=49%}
{%if states('sensor.zaloga_peletov_fast') in('unknown', 'unavailable')%}
200
{%elif states('sensor.zaloga_peletov')|int < min_cm%}
100
{%elif states('sensor.zaloga_peletov')|int > max_cm%}
0
{%else%}
{{((1-((states('sensor.zaloga_peletov')|int-min_cm)/max_cm))*100)|round(0)}}
{% endif %}
Ta koda je narejena tako, da če je senzor offline mi kaže 200%, kar je nerealno in posledično takoj vem, da je nekaj narobe (ter s pogojno kartico vklopim opozorilo). Sicer pa vse, kar je pod 5cm je 100%, vse kar je nad 49cm je 0%