Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Riporta sul display tutta una serie di letture ricavate da entità di Home Assistant.
- # Visualizza sensori numerici che booleani. Per i numerici indica il valore, e fa conteggi
- # per capire se il valore è stabile, in saluta o in discesa. Per i booleani visualizza un'icona
- # per ognuna di loro, quando è attivo.
- #
- # Funziona su D1-Mini Esp32 e display Epaper Waveshare 4,2"
- #
- esphome:
- name: displayepaper
- platform: ESP32
- board: nodemcu-32s
- on_boot:
- - output.turn_off: onboard_led
- wifi:
- networks:
- - ssid: !secret wifi_essid1
- password: !secret wifi_password1
- fast_connect: no
- manual_ip:
- static_ip: 192.168.1.128
- gateway: 192.168.1.1
- subnet: 255.255.255.0
- dns1: 192.168.1.1
- # Enable fallback hotspot (captive portal) in case wifi connection fails
- ap:
- ssid: "EspHomeEpaper"
- password: !secret fallback_password
- binary_sensor:
- web_server:
- port: 80
- auth:
- username: !secret web_login
- password: !secret web_password
- # Enable logging
- logger:
- # Enable Home Assistant API
- api:
- encryption:
- key: !secret api_secret
- ota:
- password: !secret ota_password
- platform: esphome
- font:
- - file: 'Google_Sans_Bold.ttf'
- id: small_font
- size: 14
- glyphs: [':', '/', '0', '1', '2', '3', '4', '5', '6', '7' ,'8', '9']
- - file: 'Google_Sans_Bold.ttf'
- id: value_font
- size: 44
- glyphs: [' ', '0', '1', '2', '3', '4', '5', '6', '7' ,'8', '9', ':', 'A', 'L', 'x', '.', '°', '%']
- - file: 'Materialdesignicons_Webfont.ttf'
- id: icon_font_big
- size: 44
- glyphs: [
- ' ', # Space
- "\U000F02DC", # Home
- "\U000F0290", # Fridge
- "\U000F028F", # Fridge outline
- "\U000F0504", # T° Celsius
- "\U000F050F", # Temperature
- "\U000F058E", # Umidity
- "\U000F0DA1", # Down Arrow
- "\U000F0DA3", # Up Arrow
- "\U000F029A", # Gauge Pressure
- "\U000F0D43", # Air quality
- "\U000F0335", # Lightbulb
- "\U000F1739", # Chat question outline
- "\U000F1356", # Television-ambient-light
- "\U000F058F", # Water-pump
- "\U000F1B45", # Flash-off-outline
- "\U000F1054", # Outdoor-lamp
- "\U000F0F92", # Water-boiler
- "\U000F00DE", # Bright
- "\U000F02FA", # Input
- "\U000F081A", # Outdoor
- "\U000F064D", # Human male
- "\U000F0649", # Human female
- ]
- spi:
- mosi_pin: GPIO23
- clk_pin: GPIO18
- globals:
- - id: values
- type: int[10][10]
- - id: mins
- type: int[10]
- - id: maxs
- type: int[10]
- - id: pointer
- type: int
- - id: global_counter
- type: int
- - id: cycles
- type: int
- initial_value: '10'
- - id: trend
- type: int[10]
- - id: countdown
- type: int
- initial_value: '0'
- - id: current_values
- type: int[10]
- display:
- - platform: waveshare_epaper
- id: epaper
- cs_pin: GPIO5
- dc_pin: GPIO17
- reset_pin: GPIO16
- busy_pin: GPIO4
- model: 4.20in
- rotation: 180°
- update_interval: 3600s
- reset_duration: 2ms
- # Dimensione 400x300 4 livelli di grigio
- lambda: |-
- const char *misc[10]={
- "\U000F02DC", // Home
- "\U000F0290", // Fridge
- "\U000F0504", // T° Celsius
- "\U000F050F", // Temperature
- "\U000F058E", // Umidity
- "\U000F0DA3", // Down arrow
- "\U000F0DA1", // Up arrow
- " ", // Temporary
- "\U000F029A", // Gauge pressure
- "\U000F0D43", // Air quality
- };
- const int line6[]={ 50, 100, 150, 200, 250, 300 };
- const int line6plus[]={ 53, 103, 153, 203, 253, 303 };
- const int col_icons[]={ 25, 75, 130, 175, 225, 275, 330, 375};
- // Cat Ico Val Arr Ico Val Arr
- // C C R C C C R C
- const int col_values[]={ 15, 45, 174, 198, 200, 235, 367, 389};
- const char *on="on";
- const char *off="off";
- const int x=4000, y=3000, cols=8, hh=800, vh=2500, line_0=0, line_1=60, line_2=110, line_3=160, line_4=210, sep_level=240, icon_level=299 ;
- ESP_LOGI("display","Display update");
- it.line(0,line6[1],399,line6[1]);
- it.line(0,line6[3],399,line6[3]);
- it.line(0,line6[4],399,line6[4]);
- /*
- it.line(30,0,30,line6[4]); */
- it.line(212,0,212,line6[4]);
- // T Cucina
- it.printf(col_values[0], line6[0], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F02FA");
- it.printf(col_values[1], line6[0], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F050F");
- it.printf(col_values[2], line6plus[0], id(value_font), TextAlign::BOTTOM_RIGHT , "%2d.%1d°", id(current_values)[0]/10, id(current_values)[0]%10);
- if (id(global_counter)>2) {
- it.printf(col_values[3], line6[0], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[0]]);
- }
- // H Cucina
- it.printf(col_values[5], line6[0], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F058E");
- it.printf(col_values[6], line6plus[0], id(value_font), TextAlign::BOTTOM_RIGHT , "%2d%%", id(current_values)[1]);
- if (id(global_counter)>2) {
- it.printf(col_values[7], line6[0], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[1]]);
- }
- // Lum Cucina
- it.printf(col_values[1], line6[1], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F00DE");
- it.printf(col_values[2], line6plus[1], id(value_font), TextAlign::BOTTOM_RIGHT , "%4d", id(current_values)[2]);
- if (id(global_counter)>2) {
- it.printf(col_values[3], line6[1], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[2]]);
- }
- // Qualità aria cucina
- it.printf(col_values[5], line6[1], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F0D43");
- it.printf(col_values[6], line6plus[1], id(value_font), TextAlign::BOTTOM_RIGHT, "%4d", id(current_values)[3]);
- if (id(global_counter)>2) {
- it.printf(col_values[7], line6[1], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[3]]);
- }
- // T Esterno
- it.printf(col_values[0], line6[2], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F081A");
- it.printf(col_values[1], line6[2], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F050F");
- it.printf(col_values[2], line6plus[2], id(value_font), TextAlign::BOTTOM_RIGHT , "%2d.%1d°", id(current_values)[4]/10, id(current_values)[4]%10);
- if (id(global_counter)>2) {
- it.printf(col_values[3], line6[2], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[4]]);
- }
- // H Esterno
- it.printf(col_values[5], line6[2], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F058E");
- it.printf(col_values[6], line6plus[2], id(value_font), TextAlign::BOTTOM_RIGHT , "%2d%%", id(current_values)[5]);
- if (id(global_counter)>2) {
- it.printf(col_values[7], line6[2], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[5]]);
- }
- // Lum Esterno
- it.printf(col_values[1], line6[3], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F00DE");
- it.printf(col_values[2], line6plus[3], id(value_font), TextAlign::BOTTOM_RIGHT , "%4d", id(current_values)[6]);
- if (id(global_counter)>2) {
- it.printf(col_values[3], line6[3], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[6]]);
- }
- // P Esterno
- it.printf(col_values[5], line6[3], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F029A");
- it.printf(col_values[6], line6plus[3], id(value_font), TextAlign::BOTTOM_RIGHT , "%4d", id(current_values)[7]);
- if (id(global_counter)>2) {
- it.printf(col_values[7], line6[3], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[7]]);
- }
- // T Frigorifero
- it.printf(col_values[0], line6[4], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F028F");
- it.printf(col_values[1], line6[4], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F050F");
- it.printf(col_values[2], line6plus[4], id(value_font), TextAlign::BOTTOM_RIGHT , "%2d.%1d°", id(current_values)[8]/10, id(current_values)[8]%10);
- if (id(global_counter)>2) {
- it.printf(col_values[3], line6[4], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[8]]);
- }
- // H Frigorifero
- it.printf(col_values[5], line6[4], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F058E");
- it.printf(col_values[6], line6plus[4], id(value_font), TextAlign::BOTTOM_RIGHT , "%2d%%", id(current_values)[9]);
- if (id(global_counter)>2) {
- it.printf(col_values[7], line6[4], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[9]]);
- }
- // Luce cucina principale
- if (id(light_cucina).has_state()) {
- if (!strcmp(id(light_cucina).state.c_str(),on)) {
- it.printf(col_icons[0], line6[5], id(icon_font_big), TextAlign::BOTTOM_CENTER , "\U000F0335");
- }
- }
- // LED Cucina TV
- if (id(light_tv).has_state()) {
- if (!strcmp(id(light_tv).state.c_str(),on)) {
- it.printf(col_icons[1], line6[5], id(icon_font_big), TextAlign::BOTTOM_CENTER , "\U000F1356");
- }
- }
- // LED Cucina lavabo
- if (id(light_lavabo).has_state()) {
- if (!strcmp(id(light_lavabo).state.c_str(),on)) {
- it.printf(col_icons[2], line6[5], id(icon_font_big), TextAlign::BOTTOM_CENTER , "\U000F058F");
- }
- }
- // Luce esterno
- if (id(light_esterno).has_state()) {
- if (!strcmp(id(light_esterno).state.c_str(),on)) {
- it.printf(col_icons[3], line6[5], id(icon_font_big), TextAlign::BOTTOM_CENTER , "\U000F1054");
- }
- }
- // Scaldabagno
- if (id(light_scaldabagno).has_state()) {
- if (!strcmp(id(light_scaldabagno).state.c_str(),on)) {
- it.printf(col_icons[6], line6[5], id(icon_font_big), TextAlign::BOTTOM_CENTER , "\U000F0F92");
- }
- }
- it.strftime(col_icons[7], line6[5]-20, id(small_font), TextAlign::BOTTOM_CENTER, "%d/%m", id(current_time).now());
- it.strftime(col_icons[7], line6[5], id(small_font), TextAlign::BOTTOM_CENTER, "%H:%M", id(current_time).now());
- output:
- - platform: gpio
- id: onboard_led
- pin:
- number: 2
- inverted: False
- # Il display non viene rinfrescato a intervalli regolari, ma quelche secondo dopo che uno dei valori è cambiato.
- # Ogni volta che un valore cambia, la variabile countdown viene portata a 2 e decrementata ongi secondo, Quando scende
- # a 0 il display viene rinfrescato
- time:
- - platform: sntp
- id: current_time
- timezone: Europe/Rome
- on_time:
- - seconds: '*'
- then:
- lambda: |-
- if (id(countdown)>0) {
- id(countdown)--;
- ESP_LOGI("display","Countdown decrease %d", id(countdown));
- if (id(countdown)==0) {
- id(epaper).update();
- }
- }
- - seconds: 0
- then:
- lambda: |-
- int i,j, minv=0, maxv=0;
- for (i=0; i<10; i++) {
- id(trend)[i]=7;
- if (id(current_values)[i]>id(maxs)[i]) {
- id(trend)[i]=5;
- } else {
- if (id(current_values)[i]<id(mins)[i]) {
- id(trend)[i]=6;
- }
- }
- id(values)[i][id(pointer)]=id(current_values)[i];
- if (id(global_counter)==0) {
- for (j=1; j<id(cycles); j++) {
- id(values)[i][j]=id(current_values)[i];
- }
- }
- minv=maxv=id(values)[i][0];
- for (j=1; j<id(cycles); j++) {
- maxv=max(maxv,id(values)[i][j]);
- minv=min(minv,id(values)[i][j]);
- }
- id(maxs)[i]=maxv;
- id(mins)[i]=minv;
- }
- id(pointer)=(id(pointer)+1)%id(cycles);
- id(global_counter)++;
- sensor:
- - platform: homeassistant
- id: t_cucina
- entity_id: sensor.temperatura_cucina
- internal: true
- on_value:
- then:
- - lambda: |-
- if (id(t_cucina).has_state()) {
- id(process_value)->execute(0, (int)(id(t_cucina).state*10+0.4999));
- }
- - platform: homeassistant
- id: h_cucina
- entity_id: sensor.umidita_cucina
- internal: true
- accuracy_decimals: 0
- on_value:
- then:
- - lambda: |-
- if (id(h_cucina).has_state()) {
- id(process_value)->execute(1, (int)(id(h_cucina).state+0.4999));
- }
- - platform: homeassistant
- id: l_cucina
- entity_id: sensor.illuminazione_cucina
- internal: true
- accuracy_decimals: 0
- on_value:
- then:
- - lambda: |-
- if (id(l_cucina).has_state()) {
- id(process_value)->execute(2, (int)(id(l_cucina).state+0.4999));
- }
- - platform: homeassistant
- id: g_cucina
- entity_id: sensor.gas_cucina
- internal: true
- accuracy_decimals: 0
- on_value:
- then:
- - lambda: |-
- if (id(g_cucina).has_state()) {
- id(process_value)->execute(3, (int)(id(g_cucina).state+0.4999));
- }
- - platform: homeassistant
- id: t_esterno
- entity_id: sensor.casa_esterno_temperatura
- internal: true
- on_value:
- then:
- - lambda: |-
- if (id(t_esterno).has_state()) {
- id(process_value)->execute(4, (int)(id(t_esterno).state*10+0.4999));
- }
- - platform: homeassistant
- id: h_esterno
- entity_id: sensor.casa_esterno_umidita
- internal: true
- accuracy_decimals: 0
- on_value:
- then:
- - lambda: |-
- if (id(h_esterno).has_state()) {
- id(process_value)->execute(5, (int)(id(h_esterno).state+0.4999));
- }
- - platform: homeassistant
- id: l_esterno
- entity_id: sensor.casa_esterno_illuminazione
- internal: true
- accuracy_decimals: 0
- on_value:
- then:
- - lambda: |-
- if (id(l_esterno).has_state()) {
- id(process_value)->execute(6, (int)(id(l_esterno).state+0.4999));
- }
- - platform: homeassistant
- id: p_esterno
- entity_id: sensor.casa_esterno_pressione
- internal: true
- accuracy_decimals: 0
- on_value:
- then:
- - lambda: |-
- if (id(p_esterno).has_state()) {
- id(process_value)->execute(7, (int)(id(p_esterno).state+0.4999));
- }
- - platform: homeassistant
- id: t_frigo
- entity_id: sensor.frigosensor_temperature
- internal: true
- on_value:
- then:
- - lambda: |-
- if (id(t_frigo).has_state()) {
- id(process_value)->execute(8, (int)(id(t_frigo).state*10+0.4999));
- }
- - platform: homeassistant
- id: h_frigo
- entity_id: sensor.frigosensor_humidity
- internal: true
- accuracy_decimals: 0
- on_value:
- then:
- - lambda: |-
- if (id(h_frigo).has_state()) {
- id(process_value)->execute(9, (int)(id(h_frigo).state+0.4999));
- }
- text_sensor:
- - platform: homeassistant
- id: light_cucina
- entity_id: light.lucecucina
- internal: true
- on_value:
- then:
- - lambda: |-
- ESP_LOGI("display","Update request: L Cucina");
- id(countdown)=2;
- - platform: homeassistant
- id: light_lavabo
- entity_id: light.led_lavabo
- internal: true
- on_value:
- then:
- - lambda: |-
- ESP_LOGI("display","Update request: LED Lavabo");
- id(countdown)=2;
- - platform: homeassistant
- id: light_tv
- entity_id: light.led_cucina
- internal: true
- on_value:
- then:
- - lambda: |-
- ESP_LOGI("display","Update request: LED TV");
- id(countdown)=2;
- - platform: homeassistant
- id: light_esterno
- entity_id: light.luceesterno
- internal: true
- on_value:
- then:
- - lambda: |-
- ESP_LOGI("display","Update request: Luce esterno");
- id(countdown)=2;
- - platform: homeassistant
- id: light_scaldabagno
- entity_id: switch.scaldabagno_2
- internal: true
- on_value:
- then:
- - lambda: |-
- ESP_LOGI("display","Update request: Scaldabagno");
- id(countdown)=2;
- script:
- - id: process_value
- parameters:
- index: int
- value: int
- then:
- - lambda: |-
- ESP_LOGI("display","Value change %d", index);
- if (value!=id(current_values)[index]) {
- ESP_LOGI("display","Value change effettivo %d", index);
- id(trend)[index]=7;
- if (value>id(maxs)[index]) {
- id(trend)[index]=5;
- } else {
- if (value<id(mins)[index]) {
- id(trend)[index]=6;
- }
- }
- id(current_values)[index]=value;
- id(countdown)=2;
- }
- switch:
- - platform: safe_mode
- name: "Riavvia display (Safe Mode)"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement