Skip to content

Instantly share code, notes, and snippets.

@chunkysteveo
Created August 1, 2022 10:10
Show Gist options
  • Save chunkysteveo/c9468b4e4d4ca87ef7093fd400514c8a to your computer and use it in GitHub Desktop.
Save chunkysteveo/c9468b4e4d4ca87ef7093fd400514c8a to your computer and use it in GitHub Desktop.
Badgy 02 Weather - Vertical
substitutions:
display_name: 'EPaper Display Badgy 02'
device_description: 'EPaper Display Badgy 01. The Blue one!'
friendly_name: 'EPaper Display Badgy 02' # displayed in HA.. Whatever name you'd like
device_name: epaper-display-02
node_name: epaper_display_02
esphome:
name: ${device_name}
comment: ${device_description}
platform: ESP8266
board: nodemcuv2
on_boot:
- priority: -100.0
then:
- script.execute: deep_sleep_evaluation
- priority: 800.0
then:
# - component.update: ${node_name}_uptime_raw
- component.update: wifisignal
#- component.update: epaper # Don't do this - seems to crash it? Reset Pin?
# - priority: -100.0
# then:
# - component.update: epaper
# Enable logging
logger:
# Enable Home Assistant API
api:
# encryption:
# key: "RCTqKVg4GhXDzd18GtYK4G3IWC4brgJXI4Pi+Q1UNi8="
ota:
password: "caf76e73df5608b7facc075639985e97"
safe_mode: true
reboot_timeout: 10min
num_attempts: 5
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Epaper-Display-02"
password: "IhPmXwynEjxf"
captive_portal:
#web_server:
# port: 80
deep_sleep:
id: deep_sleep_enabled
#run_duration: 30sec # move this value to -delay- deep_sleep_evaluation script parameter
sleep_duration: 10min
time:
- platform: homeassistant
id: homeassistant_time
# on_time:
# Every 1 minutes
# - seconds: 0
# then:
# - component.update: epaper
script:
- id: deep_sleep_evaluation
mode: queued
then:
- delay: 30s
- if:
condition:
binary_sensor.is_on: disable_deep_sleep
then:
- logger.log: 'Deep Sleep Disabled'
else:
- deep_sleep.enter: deep_sleep_enabled
- script.execute: deep_sleep_evaluation
#light:
# - platform: status_led
# name: ${display_name} Onboard LED
# pin:
# number: GPIO2
# inverted: true
text_sensor:
- platform: wifi_info
ip_address:
name: ${display_name} IP Address
ssid:
name: ${display_name} Connected SSID
bssid:
name: ${display_name} Connected BSSID
# - platform: template
# name: ${friendly_name} Uptime
# id: ${node_name}_uptime
# icon: mdi:clock-start
- platform: homeassistant
entity_id: weather.home_hourly
id: weather_state
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_condition_now
id: weather_condition_now
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_condition_0
id: weather_condition_0
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_timestamp_0
id: weather_timestamp_0
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_condition_1
id: weather_condition_1
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_timestamp_1
id: weather_timestamp_1
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_condition_2
id: weather_condition_2
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_timestamp_2
id: weather_timestamp_2
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_condition_3
id: weather_condition_3
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_timestamp_3
id: weather_timestamp_3
binary_sensor:
- platform: homeassistant
id: disable_deep_sleep
entity_id: input_boolean.disable_deep_sleep
- platform: status
name: ${display_name} Status
- platform: gpio
pin:
number: GPIO3
mode: INPUT_PULLUP
inverted: true
name: ${display_name} SW LEFT
filters:
- delayed_on: 10ms
#on_press:
# then:
# - logger.log: "SW UP"
- platform: gpio
pin:
number: GPIO1
mode: INPUT_PULLUP
inverted: true
name: ${display_name} SW DOWN
filters:
- delayed_on: 10ms
- platform: gpio
pin:
number: GPIO10
mode: INPUT_PULLUP
inverted: true
name: ${display_name} SW UP
filters:
- delayed_on: 10ms
- platform: gpio
pin:
number: GPIO12
mode: INPUT_PULLUP
inverted: true
name: ${display_name} SW RIGHT
filters:
- delayed_on: 10ms
- platform: gpio
pin:
number: GPIO5
mode: INPUT_PULLUP
inverted: true
name: ${display_name} SW CENTRE
filters:
- delayed_on: 10ms
sensor:
- platform: wifi_signal
name: ${display_name} WiFi Singal Strength
id: wifisignal
update_interval: 120s
# - platform: uptime
# name: "${friendly_name} Uptime Sensor"
# id: ${node_name}_uptime_raw
# update_interval: 60s
# on_raw_value:
# then:
# - logger.log:
# format: "Raw Value of Uptime sensor: %f, %f"
# args: ['id(${node_name}_uptime_raw).raw_state', 'id(${node_name}_uptime_raw).state']
# level: INFO
# - text_sensor.template.publish:
# id: ${node_name}_uptime
# state: !lambda |-
# int seconds = round(id(${node_name}_uptime_raw).raw_state);
# int days = seconds / (24 * 3600);
# seconds = seconds % (24 * 3600);
# int hours = seconds / 3600;
# seconds = seconds % 3600;
# int minutes = seconds / 60;
# seconds = seconds % 60;
# return (
# (days ? String(days) + "d " : "") +
# (hours ? String(hours) + "h " : "") +
# (minutes ? String(minutes) + "m " : "") +
# (String(seconds) + "s")
# ).c_str();
- platform: homeassistant
entity_id: weather.home_hourly
attribute: temperature
id: weather_temperature
on_value:
then:
- component.update: epaper
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_temperature_0
id: weather_temperature_0
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_temperature_1
id: weather_temperature_1
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_temperature_2
id: weather_temperature_2
- platform: homeassistant
entity_id: sensor.weatherman_data
attribute: weather_temperature_3
id: weather_temperature_3
button:
- platform: restart
name: ${display_name} Restart
# Include custom fonts
font:
- file: 'fonts/GothamRnd-Bold.ttf'
id: font_tiny_bold
size: 12
- file: 'fonts/GothamRnd-Bold.ttf'
id: font_large_bold
size: 42
glyphs: [' ', '°', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'C']
- file: 'fonts/GothamRnd-Bold.ttf'
id: font_medium_bold
size: 30
# glyphs: [' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'M', 'I', 'N']
- file: 'fonts/GothamRnd-Bold.ttf'
id: font_small_bold
size: 18
# glyphs: ['°', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'C', 'M', 'I', 'N']
# Include Material Design Icons font
# Thanks to https://community.home-assistant.io/t/display-materialdesign-icons-on-esphome-attached-to-screen/199790/16
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_mdi_large
size: 100
glyphs: &mdi-weather-glyphs
- "\U000F0590" # mdi-weather-cloudy
- "\U000F0F2F" # mdi-weather-cloudy-alert
- "\U000F0E6E" # mdi-weather-cloudy-arrow-right
- "\U000F0591" # mdi-weather-fog
- "\U000F0592" # mdi-weather-hail
- "\U000F0F30" # mdi-weather-hazy
- "\U000F0898" # mdi-weather-hurricane
- "\U000F0593" # mdi-weather-lightning
- "\U000F067E" # mdi-weather-lightning-rainy
- "\U000F0594" # mdi-weather-night
- "\U000F0F31" # mdi-weather-night-partly-cloudy
- "\U000F0595" # mdi-weather-partly-cloudy
- "\U000F0F32" # mdi-weather-partly-lightning
- "\U000F0F33" # mdi-weather-partly-rainy
- "\U000F0F34" # mdi-weather-partly-snowy
- "\U000F0F35" # mdi-weather-partly-snowy-rainy
- "\U000F0596" # mdi-weather-pouring
- "\U000F0597" # mdi-weather-rainy
- "\U000F0598" # mdi-weather-snowy
- "\U000F0F36" # mdi-weather-snowy-heavy
- "\U000F067F" # mdi-weather-snowy-rainy
- "\U000F0599" # mdi-weather-sunny
- "\U000F0F37" # mdi-weather-sunny-alert
- "\U000F14E4" # mdi-weather-sunny-off
- "\U000F059A" # mdi-weather-sunset
- "\U000F059B" # mdi-weather-sunset-down
- "\U000F059C" # mdi-weather-sunset-up
- "\U000F0F38" # mdi-weather-tornado
- "\U000F059D" # mdi-weather-windy
- "\U000F059E" # mdi-weather-windy-variant
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_mdi_medium
size: 36
glyphs: *mdi-weather-glyphs
# Define colors
# This design is white on black so this is necessary.
color:
- id: color_black
red: 0%
green: 0%
blue: 0%
white: 0%
- id: color_white
red: 0%
green: 0%
blue: 0%
white: 100%
spi:
clk_pin: GPIO14
mosi_pin: GPIO13 #DIN
display:
- platform: waveshare_epaper
id: epaper
cs_pin: GPIO15
dc_pin: GPIO0
busy_pin: GPIO4
reset_pin: GPIO2
model: 2.90in
#296*128
#rotation: 180°
#full_update_every: 1
update_interval: 6min
lambda: |-
// Map weather states to MDI characters.
std::map<std::string, std::string> weather_icon_map
{
{"cloudy", "\U000F0590"},
{"cloudy-alert", "\U000F0F2F"},
{"cloudy-arrow-right", "\U000F0E6E"},
{"fog", "\U000F0591"},
{"hail", "\U000F0592"},
{"hazy", "\U000F0F30"},
{"hurricane", "\U000F0898"},
{"lightning", "\U000F0593"},
{"lightning-rainy", "\U000F067E"},
{"night", "\U000F0594"},
{"night-partly-cloudy", "\U000F0F31"},
{"partlycloudy", "\U000F0595"},
{"partly-lightning", "\U000F0F32"},
{"partly-rainy", "\U000F0F33"},
{"partly-snowy", "\U000F0F34"},
{"partly-snowy-rainy", "\U000F0F35"},
{"pouring", "\U000F0596"},
{"rainy", "\U000F0597"},
{"snowy", "\U000F0598"},
{"snowy-heavy", "\U000F0F36"},
{"snowy-rainy", "\U000F067F"},
{"sunny", "\U000F0599"},
{"sunny-alert", "\U000F0F37"},
{"sunny-off", "\U000F14E4"},
{"sunset", "\U000F059A"},
{"sunset-down", "\U000F059B"},
{"sunset-up", "\U000F059C"},
{"tornado", "\U000F0F38"},
{"windy", "\U000F059D"},
{"windy-variant", "\U000F059E"},
};
// Fill background in black.
//it.fill(color_black);
if(id(weather_temperature).has_state()) {
it.printf(64, 0, id(font_mdi_large), color_white, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(weather_condition_now).state.c_str()].c_str());
it.printf(64, 95, id(font_large_bold), color_white, TextAlign::TOP_CENTER, "%2.0f°C", id(weather_temperature).state);
it.printf(32, 140, id(font_tiny_bold), color_white, TextAlign::TOP_CENTER, "%s", id(weather_timestamp_0).state.c_str());
it.printf(32, 155, id(font_mdi_medium), color_white, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(weather_condition_0).state.c_str()].c_str());
it.printf(32, 190, id(font_small_bold), color_white, TextAlign::TOP_CENTER, "%2.0f°C", id(weather_temperature_0).state);
it.printf(96, 140, id(font_tiny_bold), color_white, TextAlign::TOP_CENTER, "%s", id(weather_timestamp_1).state.c_str());
it.printf(96, 155, id(font_mdi_medium), color_white, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(weather_condition_1).state.c_str()].c_str());
it.printf(96, 190, id(font_small_bold), color_white, TextAlign::TOP_CENTER, "%2.0f°C", id(weather_temperature_1).state);
it.printf(32, 215, id(font_tiny_bold), color_white, TextAlign::TOP_CENTER, "%s", id(weather_timestamp_2).state.c_str());
it.printf(32, 230, id(font_mdi_medium), color_white, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(weather_condition_2).state.c_str()].c_str());
it.printf(32, 265, id(font_small_bold), color_white, TextAlign::TOP_CENTER, "%2.0f°C", id(weather_temperature_2).state);
it.printf(96, 215, id(font_tiny_bold), color_white, TextAlign::TOP_CENTER, "%s", id(weather_timestamp_3).state.c_str());
it.printf(96, 230, id(font_mdi_medium), color_white, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(weather_condition_3).state.c_str()].c_str());
it.printf(96, 265, id(font_small_bold), color_white, TextAlign::TOP_CENTER, "%2.0f°C", id(weather_temperature_3).state);
}
#interval:
# - interval: 5s
# then:
# - display.page.show_next: epaper
# - component.update: epaper
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment