Advertisement
DPYUD

EspHome Display Epaper 4,2"

Sep 5th, 2024 (edited)
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 16.98 KB | Source Code | 0 0
  1. # Riporta sul display tutta una serie di letture ricavate da entità di Home Assistant.
  2. # Visualizza sensori numerici che booleani. Per i numerici indica il valore, e fa conteggi
  3. # per capire se il valore è stabile, in saluta o in discesa. Per i booleani visualizza un'icona
  4. # per ognuna di loro, quando è attivo.
  5. #
  6. # Funziona su D1-Mini Esp32 e display Epaper Waveshare 4,2"
  7. #
  8. esphome:
  9.   name: displayepaper
  10.   platform: ESP32
  11.   board: nodemcu-32s
  12.   on_boot:
  13.     - output.turn_off: onboard_led
  14.  
  15. wifi:
  16.   networks:
  17.   - ssid: !secret wifi_essid1
  18.     password: !secret wifi_password1
  19.   fast_connect: no
  20.   manual_ip:
  21.     static_ip: 192.168.1.128
  22.     gateway: 192.168.1.1
  23.     subnet: 255.255.255.0
  24.     dns1: 192.168.1.1
  25.   # Enable fallback hotspot (captive portal) in case wifi connection fails
  26.   ap:
  27.     ssid: "EspHomeEpaper"
  28.     password: !secret fallback_password
  29.  
  30. binary_sensor:
  31. web_server:
  32.   port: 80
  33.   auth:
  34.     username: !secret web_login
  35.     password: !secret web_password
  36.  
  37. # Enable logging
  38. logger:
  39. # Enable Home Assistant API
  40. api:
  41.   encryption:
  42.     key: !secret api_secret
  43.  
  44. ota:
  45.   password: !secret ota_password
  46.   platform: esphome
  47.  
  48. font:
  49.   - file: 'Google_Sans_Bold.ttf'
  50.     id: small_font
  51.     size: 14
  52.     glyphs: [':', '/', '0', '1', '2', '3', '4', '5', '6', '7' ,'8', '9']
  53.   - file: 'Google_Sans_Bold.ttf'
  54.     id: value_font
  55.     size: 44
  56.     glyphs: [' ', '0', '1', '2', '3', '4', '5', '6', '7' ,'8', '9', ':', 'A', 'L', 'x', '.', '°', '%']
  57.   - file: 'Materialdesignicons_Webfont.ttf'
  58.     id: icon_font_big
  59.     size: 44
  60.     glyphs: [
  61.       ' ',          # Space
  62.       "\U000F02DC", # Home
  63.       "\U000F0290", # Fridge
  64.       "\U000F028F", # Fridge outline
  65.       "\U000F0504", # T° Celsius
  66.       "\U000F050F", # Temperature
  67.       "\U000F058E", # Umidity
  68.       "\U000F0DA1", # Down Arrow
  69.       "\U000F0DA3", # Up Arrow
  70.       "\U000F029A", # Gauge Pressure
  71.       "\U000F0D43", # Air quality
  72.       "\U000F0335", # Lightbulb
  73.       "\U000F1739", # Chat question outline
  74.       "\U000F1356", # Television-ambient-light
  75.       "\U000F058F", # Water-pump
  76.       "\U000F1B45", # Flash-off-outline
  77.       "\U000F1054", # Outdoor-lamp
  78.       "\U000F0F92", # Water-boiler
  79.       "\U000F00DE", # Bright
  80.       "\U000F02FA", # Input
  81.       "\U000F081A", # Outdoor
  82.       "\U000F064D", # Human male
  83.       "\U000F0649", # Human female
  84.     ]
  85.  
  86. spi:
  87.   mosi_pin: GPIO23
  88.   clk_pin: GPIO18
  89.  
  90. globals:
  91.   - id: values
  92.     type: int[10][10]
  93.   - id: mins
  94.     type: int[10]
  95.   - id: maxs
  96.     type: int[10]
  97.   - id: pointer
  98.     type: int
  99.   - id: global_counter
  100.     type: int
  101.   - id: cycles
  102.     type: int
  103.     initial_value: '10'
  104.   - id: trend
  105.     type: int[10]
  106.   - id: countdown
  107.     type: int
  108.     initial_value: '0'
  109.   - id: current_values
  110.     type: int[10]
  111.  
  112. display:
  113.   - platform: waveshare_epaper
  114.     id: epaper
  115.     cs_pin: GPIO5
  116.     dc_pin: GPIO17
  117.     reset_pin: GPIO16
  118.     busy_pin: GPIO4
  119.     model: 4.20in
  120.     rotation: 180°
  121.     update_interval: 3600s
  122.     reset_duration: 2ms
  123.     # Dimensione 400x300 4 livelli di grigio
  124.     lambda: |-
  125.       const char *misc[10]={
  126.         "\U000F02DC", // Home
  127.         "\U000F0290", // Fridge
  128.         "\U000F0504", // T° Celsius
  129.         "\U000F050F", // Temperature
  130.         "\U000F058E", // Umidity
  131.         "\U000F0DA3", // Down arrow
  132.         "\U000F0DA1", // Up arrow
  133.         " ", // Temporary
  134.         "\U000F029A", // Gauge pressure
  135.         "\U000F0D43", // Air quality
  136.       };
  137.       const int line6[]={ 50, 100, 150, 200, 250, 300 };
  138.       const int line6plus[]={ 53, 103, 153, 203, 253, 303 };
  139.       const int col_icons[]={ 25, 75, 130, 175, 225, 275, 330, 375};
  140.       //                       Cat Ico  Val  Arr       Ico  Val  Arr
  141.       //                         C   C    R    C    C    C    R    C
  142.       const int col_values[]={  15, 45,  174, 198, 200, 235, 367, 389};
  143.       const char *on="on";
  144.       const char *off="off";
  145.       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 ;
  146.       ESP_LOGI("display","Display update");
  147.  
  148.       it.line(0,line6[1],399,line6[1]);
  149.       it.line(0,line6[3],399,line6[3]);
  150.       it.line(0,line6[4],399,line6[4]);
  151.       /*
  152.       it.line(30,0,30,line6[4]); */
  153.       it.line(212,0,212,line6[4]);
  154.      
  155.       // T Cucina
  156.       it.printf(col_values[0], line6[0], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F02FA");
  157.       it.printf(col_values[1], line6[0], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F050F");
  158.       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);
  159.       if (id(global_counter)>2) {
  160.         it.printf(col_values[3], line6[0], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[0]]);
  161.       }
  162.      
  163.       // H Cucina
  164.       it.printf(col_values[5], line6[0], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F058E");
  165.       it.printf(col_values[6], line6plus[0], id(value_font), TextAlign::BOTTOM_RIGHT , "%2d%%", id(current_values)[1]);
  166.       if (id(global_counter)>2) {
  167.         it.printf(col_values[7], line6[0], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[1]]);
  168.       }
  169.  
  170.       // Lum Cucina
  171.       it.printf(col_values[1], line6[1], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F00DE");
  172.       it.printf(col_values[2], line6plus[1], id(value_font), TextAlign::BOTTOM_RIGHT , "%4d", id(current_values)[2]);
  173.       if (id(global_counter)>2) {
  174.         it.printf(col_values[3], line6[1], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[2]]);
  175.       }
  176.       // Qualità aria cucina
  177.       it.printf(col_values[5],   line6[1], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F0D43");
  178.       it.printf(col_values[6], line6plus[1], id(value_font), TextAlign::BOTTOM_RIGHT, "%4d", id(current_values)[3]);
  179.       if (id(global_counter)>2) {
  180.         it.printf(col_values[7], line6[1], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[3]]);
  181.       }    
  182.  
  183.  
  184.       // T Esterno
  185.       it.printf(col_values[0], line6[2], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F081A");
  186.       it.printf(col_values[1], line6[2], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F050F");
  187.       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);
  188.       if (id(global_counter)>2) {
  189.         it.printf(col_values[3], line6[2], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[4]]);
  190.       }
  191.      
  192.       // H Esterno
  193.       it.printf(col_values[5], line6[2], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F058E");
  194.       it.printf(col_values[6], line6plus[2], id(value_font), TextAlign::BOTTOM_RIGHT , "%2d%%", id(current_values)[5]);
  195.       if (id(global_counter)>2) {
  196.         it.printf(col_values[7], line6[2], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[5]]);
  197.       }
  198.  
  199.       // Lum Esterno
  200.       it.printf(col_values[1], line6[3], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F00DE");
  201.       it.printf(col_values[2], line6plus[3], id(value_font), TextAlign::BOTTOM_RIGHT , "%4d", id(current_values)[6]);
  202.       if (id(global_counter)>2) {
  203.         it.printf(col_values[3], line6[3], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[6]]);
  204.       }    
  205.  
  206.       // P Esterno
  207.       it.printf(col_values[5], line6[3], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F029A");
  208.       it.printf(col_values[6], line6plus[3], id(value_font), TextAlign::BOTTOM_RIGHT , "%4d", id(current_values)[7]);
  209.       if (id(global_counter)>2) {
  210.         it.printf(col_values[7], line6[3], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[7]]);
  211.       }
  212.  
  213.       // T Frigorifero
  214.       it.printf(col_values[0], line6[4], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F028F");
  215.       it.printf(col_values[1], line6[4], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F050F");
  216.       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);
  217.       if (id(global_counter)>2) {
  218.         it.printf(col_values[3], line6[4], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[8]]);
  219.       }
  220.      
  221.       // H Frigorifero
  222.       it.printf(col_values[5], line6[4], id(icon_font_big), TextAlign::BOTTOM_CENTER, "\U000F058E");
  223.       it.printf(col_values[6], line6plus[4], id(value_font), TextAlign::BOTTOM_RIGHT , "%2d%%", id(current_values)[9]);
  224.       if (id(global_counter)>2) {
  225.         it.printf(col_values[7], line6[4], id(icon_font_big), TextAlign::BOTTOM_CENTER, misc[id(trend)[9]]);
  226.       }
  227.       // Luce cucina principale
  228.       if (id(light_cucina).has_state()) {
  229.         if (!strcmp(id(light_cucina).state.c_str(),on)) {
  230.           it.printf(col_icons[0], line6[5], id(icon_font_big), TextAlign::BOTTOM_CENTER , "\U000F0335");
  231.         }
  232.       }
  233.       // LED Cucina TV
  234.       if (id(light_tv).has_state()) {
  235.         if (!strcmp(id(light_tv).state.c_str(),on)) {
  236.           it.printf(col_icons[1], line6[5], id(icon_font_big), TextAlign::BOTTOM_CENTER , "\U000F1356");
  237.         }
  238.       }
  239.       // LED Cucina lavabo
  240.       if (id(light_lavabo).has_state()) {
  241.         if (!strcmp(id(light_lavabo).state.c_str(),on)) {
  242.           it.printf(col_icons[2], line6[5], id(icon_font_big), TextAlign::BOTTOM_CENTER , "\U000F058F");
  243.         }
  244.       }
  245.       // Luce esterno
  246.       if (id(light_esterno).has_state()) {
  247.         if (!strcmp(id(light_esterno).state.c_str(),on)) {
  248.           it.printf(col_icons[3], line6[5], id(icon_font_big), TextAlign::BOTTOM_CENTER , "\U000F1054");
  249.         }
  250.       }
  251.       // Scaldabagno
  252.       if (id(light_scaldabagno).has_state()) {
  253.         if (!strcmp(id(light_scaldabagno).state.c_str(),on)) {
  254.           it.printf(col_icons[6], line6[5], id(icon_font_big), TextAlign::BOTTOM_CENTER , "\U000F0F92");
  255.         }
  256.       }
  257.       it.strftime(col_icons[7], line6[5]-20, id(small_font), TextAlign::BOTTOM_CENTER, "%d/%m", id(current_time).now());
  258.       it.strftime(col_icons[7], line6[5],    id(small_font), TextAlign::BOTTOM_CENTER, "%H:%M", id(current_time).now());
  259.  
  260. output:
  261.   - platform: gpio
  262.     id: onboard_led
  263.     pin:
  264.       number: 2
  265.       inverted: False
  266.  
  267. # Il display non viene rinfrescato a intervalli regolari, ma quelche secondo dopo che uno dei valori è cambiato.
  268. # Ogni volta che un valore cambia, la variabile countdown viene portata a 2 e decrementata ongi secondo, Quando scende
  269. # a 0 il display viene rinfrescato
  270. time:
  271.   - platform: sntp
  272.     id: current_time
  273.     timezone: Europe/Rome
  274.     on_time:
  275.       - seconds: '*'
  276.         then:
  277.           lambda: |-
  278.             if (id(countdown)>0) {
  279.               id(countdown)--;
  280.               ESP_LOGI("display","Countdown decrease %d", id(countdown));
  281.               if (id(countdown)==0) {
  282.                 id(epaper).update();            
  283.               }
  284.             }
  285.       - seconds: 0
  286.         then:
  287.           lambda: |-
  288.             int i,j, minv=0, maxv=0;
  289.             for (i=0; i<10; i++) {
  290.               id(trend)[i]=7;
  291.               if (id(current_values)[i]>id(maxs)[i]) {
  292.                 id(trend)[i]=5;
  293.               } else {
  294.                 if (id(current_values)[i]<id(mins)[i]) {
  295.                   id(trend)[i]=6;
  296.                 }
  297.               }
  298.               id(values)[i][id(pointer)]=id(current_values)[i];
  299.               if (id(global_counter)==0) {
  300.                 for (j=1; j<id(cycles); j++) {
  301.                   id(values)[i][j]=id(current_values)[i];
  302.                 }
  303.               }
  304.               minv=maxv=id(values)[i][0];
  305.               for (j=1; j<id(cycles); j++) {
  306.                 maxv=max(maxv,id(values)[i][j]);
  307.                 minv=min(minv,id(values)[i][j]);
  308.               }
  309.               id(maxs)[i]=maxv;
  310.               id(mins)[i]=minv;
  311.             }
  312.             id(pointer)=(id(pointer)+1)%id(cycles);
  313.             id(global_counter)++;
  314.  
  315. sensor:
  316.   - platform: homeassistant
  317.     id: t_cucina
  318.     entity_id: sensor.temperatura_cucina
  319.     internal: true
  320.     on_value:
  321.       then:
  322.         - lambda: |-
  323.             if (id(t_cucina).has_state()) {
  324.               id(process_value)->execute(0, (int)(id(t_cucina).state*10+0.4999));
  325.             }
  326.  
  327.   - platform: homeassistant
  328.     id: h_cucina
  329.     entity_id: sensor.umidita_cucina
  330.     internal: true
  331.     accuracy_decimals: 0
  332.     on_value:
  333.       then:
  334.         - lambda: |-
  335.             if (id(h_cucina).has_state()) {
  336.               id(process_value)->execute(1, (int)(id(h_cucina).state+0.4999));
  337.             }
  338.  
  339.   - platform: homeassistant
  340.     id: l_cucina
  341.     entity_id: sensor.illuminazione_cucina
  342.     internal: true
  343.     accuracy_decimals: 0
  344.     on_value:
  345.       then:
  346.         - lambda: |-
  347.             if (id(l_cucina).has_state()) {
  348.               id(process_value)->execute(2, (int)(id(l_cucina).state+0.4999));
  349.             }
  350.  
  351.   - platform: homeassistant
  352.     id: g_cucina
  353.     entity_id: sensor.gas_cucina
  354.     internal: true
  355.     accuracy_decimals: 0
  356.     on_value:
  357.       then:
  358.         - lambda: |-
  359.             if (id(g_cucina).has_state()) {
  360.               id(process_value)->execute(3, (int)(id(g_cucina).state+0.4999));
  361.             }
  362.  
  363.   - platform: homeassistant
  364.     id: t_esterno
  365.     entity_id: sensor.casa_esterno_temperatura
  366.     internal: true
  367.     on_value:
  368.       then:
  369.         - lambda: |-
  370.             if (id(t_esterno).has_state()) {
  371.               id(process_value)->execute(4, (int)(id(t_esterno).state*10+0.4999));
  372.             }
  373.  
  374.   - platform: homeassistant
  375.     id: h_esterno
  376.     entity_id: sensor.casa_esterno_umidita
  377.     internal: true
  378.     accuracy_decimals: 0
  379.     on_value:
  380.       then:
  381.         - lambda: |-
  382.             if (id(h_esterno).has_state()) {
  383.               id(process_value)->execute(5, (int)(id(h_esterno).state+0.4999));
  384.             }
  385.  
  386.   - platform: homeassistant
  387.     id: l_esterno
  388.     entity_id: sensor.casa_esterno_illuminazione
  389.     internal: true
  390.     accuracy_decimals: 0
  391.     on_value:
  392.       then:
  393.         - lambda: |-
  394.             if (id(l_esterno).has_state()) {
  395.               id(process_value)->execute(6, (int)(id(l_esterno).state+0.4999));
  396.             }
  397.  
  398.   - platform: homeassistant
  399.     id: p_esterno
  400.     entity_id: sensor.casa_esterno_pressione
  401.     internal: true
  402.     accuracy_decimals: 0
  403.     on_value:
  404.       then:
  405.         - lambda: |-
  406.             if (id(p_esterno).has_state()) {
  407.               id(process_value)->execute(7, (int)(id(p_esterno).state+0.4999));
  408.             }
  409.  
  410.   - platform: homeassistant
  411.     id: t_frigo
  412.     entity_id: sensor.frigosensor_temperature
  413.     internal: true
  414.     on_value:
  415.       then:
  416.         - lambda: |-
  417.             if (id(t_frigo).has_state()) {
  418.               id(process_value)->execute(8, (int)(id(t_frigo).state*10+0.4999));
  419.             }
  420.  
  421.   - platform: homeassistant
  422.     id: h_frigo
  423.     entity_id: sensor.frigosensor_humidity
  424.     internal: true
  425.     accuracy_decimals: 0
  426.     on_value:
  427.       then:
  428.         - lambda: |-
  429.             if (id(h_frigo).has_state()) {
  430.               id(process_value)->execute(9, (int)(id(h_frigo).state+0.4999));
  431.             }
  432.  
  433. text_sensor:
  434.   - platform: homeassistant
  435.     id: light_cucina
  436.     entity_id: light.lucecucina
  437.     internal: true
  438.     on_value:
  439.       then:
  440.         - lambda: |-
  441.             ESP_LOGI("display","Update request: L Cucina");
  442.            id(countdown)=2;
  443.  
  444.  - platform: homeassistant
  445.    id: light_lavabo
  446.    entity_id: light.led_lavabo
  447.    internal: true
  448.    on_value:
  449.      then:
  450.        - lambda: |-
  451.            ESP_LOGI("display","Update request: LED Lavabo");
  452.            id(countdown)=2;
  453.  
  454.  - platform: homeassistant
  455.    id: light_tv
  456.    entity_id: light.led_cucina
  457.    internal: true
  458.    on_value:
  459.      then:
  460.        - lambda: |-
  461.            ESP_LOGI("display","Update request: LED TV");
  462.            id(countdown)=2;
  463.  
  464.  - platform: homeassistant
  465.    id: light_esterno
  466.    entity_id: light.luceesterno
  467.    internal: true
  468.    on_value:
  469.      then:
  470.        - lambda: |-
  471.            ESP_LOGI("display","Update request: Luce esterno");
  472.            id(countdown)=2;
  473.  
  474.  - platform: homeassistant
  475.    id: light_scaldabagno
  476.    entity_id: switch.scaldabagno_2
  477.    internal: true
  478.    on_value:
  479.      then:
  480.        - lambda: |-
  481.            ESP_LOGI("display","Update request: Scaldabagno");
  482.            id(countdown)=2;
  483.  
  484. script:
  485.  - id: process_value
  486.    parameters:
  487.      index: int
  488.      value: int
  489.    then:
  490.      - lambda: |-
  491.          ESP_LOGI("display","Value change %d", index);
  492.           if (value!=id(current_values)[index]) {
  493.             ESP_LOGI("display","Value change effettivo %d", index);
  494.             id(trend)[index]=7;
  495.             if (value>id(maxs)[index]) {
  496.               id(trend)[index]=5;
  497.             } else {
  498.               if (value<id(mins)[index]) {
  499.                 id(trend)[index]=6;
  500.               }
  501.             }
  502.             id(current_values)[index]=value;
  503.             id(countdown)=2;
  504.           }
  505.  
  506. switch:
  507.   - platform: safe_mode
  508.     name: "Riavvia display (Safe Mode)"
  509.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement