Created
June 7, 2024 17:56
-
-
Save jamesmyatt/570aa3e886ca748c23d572bfb324d90e to your computer and use it in GitHub Desktop.
ESPHome Flexispot E7 ESP8266
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# For pins, see: https://github.com/esp8266/Arduino/blob/master/variants/nodemcu/pins_arduino.h | |
substitutions: | |
devicename: flexispot-e7-esp8266 | |
min_height: "58.1" # Min height + 0.1 | |
max_height: "122.9" # Max height - 0.1 | |
tx_pin: D5 # =GPIO14 | |
rx_pin: D6 # =GPIO12 | |
pin_20: D2 # =GPIO4 | |
esphome: | |
name: ${devicename} | |
friendly_name: "${devicename}" | |
comment: Flexispot E7 | |
# Wake Desk by sending the "M" command | |
# This will pull the current height after boot | |
on_boot: | |
priority: -10 | |
then: | |
- button.press: button_m | |
external_components: | |
source: github://iMicknl/LoctekMotion_IoT@v2 | |
components: [ loctekmotion_desk_height ] | |
# refresh: 0s | |
esp8266: | |
board: d1_mini | |
framework: | |
# type: arduino # only required for ESP32 | |
version: recommended | |
wifi: | |
ssid: !secret wifi_ssid | |
password: !secret wifi_password | |
# Enable fallback hotspot (captive portal) in case wifi connection fails | |
ap: | |
ssid: "${devicename} AP" | |
password: !secret ap_password | |
captive_portal: | |
# Enable logging | |
logger: | |
# Enable Home Assistant API | |
api: | |
# Enable MQTT | |
mqtt: | |
broker: !secret mqtt_broker | |
port: !secret mqtt_port | |
username: !secret mqtt_username | |
password: !secret mqtt_password | |
discovery: false | |
topic_prefix: "esphome/${devicename}" | |
ota: | |
password: !secret ota_password | |
web_server: | |
port: 80 | |
include_internal: true | |
uart: | |
- id: desk_uart | |
baud_rate: 9600 | |
tx_pin: ${tx_pin} | |
rx_pin: ${rx_pin} | |
time: | |
- platform: homeassistant | |
id: esptime | |
timezone: !secret timezone | |
text_sensor: | |
- platform: version | |
name: ESPHome Version | |
output: | |
- platform: esp8266_pwm | |
pin: | |
number: GPIO2 # =D4 # =LED_BUILTIN | |
inverted: true | |
frequency: 1000 Hz | |
id: pwm_builtin | |
light: | |
- platform: monochromatic | |
output: pwm_builtin | |
name: Status | |
id: light_status | |
sensor: | |
- platform: wifi_signal | |
name: Signal | |
update_interval: 60s | |
- platform: uptime | |
name: Uptime | |
- platform: loctekmotion_desk_height | |
id: "desk_height" | |
name: Desk Height | |
on_value_range: | |
- below: ${min_height} | |
then: | |
- switch.turn_off: switch_down | |
- above: ${max_height} | |
then: | |
- switch.turn_off: switch_up | |
on_value: | |
then: | |
- cover.template.publish: | |
id: desk_cover | |
position: !lambda |- | |
// The sensor outputs values from min_height (cm) to max_height (cm) | |
// We need to translate this to 0 - 1 scale. | |
float position = (float(x) - float(${min_height})) / (float(${max_height}) - float(${min_height})); | |
return position; | |
- component.update: set_desk_height | |
switch: | |
- platform: gpio | |
name: "Virtual Screen" # PIN20 | |
pin: | |
number: ${pin_20} | |
mode: OUTPUT | |
restore_mode: ALWAYS_ON | |
entity_category: "config" | |
internal: true | |
- platform: uart | |
name: "Up" | |
id: switch_up | |
icon: mdi:arrow-up-bold | |
data: [0x9b, 0x06, 0x02, 0x01, 0x00, 0xfc, 0xa0, 0x9d] | |
uart_id: desk_uart | |
send_every: 108ms | |
internal: true | |
- platform: uart | |
name: "Down" | |
id: switch_down | |
icon: mdi:arrow-down-bold | |
data: [0x9b, 0x06, 0x02, 0x02, 0x00, 0x0c, 0xa0, 0x9d] | |
uart_id: desk_uart | |
send_every: 108ms | |
internal: true | |
- platform: uart | |
name: "Alarm off" | |
id: switch_alarm | |
icon: mdi:alarm | |
data: [0x9b, 0x06, 0x02, 0x40, 0x00, 0xAC, 0x90, 0x9d] | |
uart_id: desk_uart | |
send_every: 108ms | |
on_turn_on: | |
- delay: 3000ms | |
- switch.turn_off: switch_alarm | |
entity_category: "config" | |
- platform: uart | |
name: "Child Lock" | |
id: switch_child_lock | |
icon: mdi:account-lock | |
data: [0x9b, 0x06, 0x02, 0x20, 0x00, 0xac, 0xb8, 0x9d] | |
uart_id: desk_uart | |
send_every: 108ms | |
on_turn_on: | |
- delay: 5000ms | |
- switch.turn_off: switch_child_lock | |
entity_category: "config" | |
button: | |
- platform: template | |
name: "Preset 1" | |
icon: mdi:numeric-1-box | |
on_press: | |
- uart.write: | |
id: desk_uart | |
data: [0x9b, 0x06, 0x02, 0x04, 0x00, 0xac, 0xa3, 0x9d] | |
- platform: template | |
name: "Preset 2" | |
icon: mdi:numeric-2-box | |
on_press: | |
- uart.write: | |
id: desk_uart | |
data: [0x9b, 0x06, 0x02, 0x08, 0x00, 0xac, 0xa6, 0x9d] | |
- platform: template | |
name: "Sit" # Preset 3 on some control panels | |
icon: mdi:chair-rolling | |
on_press: | |
- uart.write: | |
id: desk_uart | |
data: [0x9b, 0x06, 0x02, 0x00, 0x01, 0xac, 0x60, 0x9d] | |
- platform: template | |
name: "Stand" # Preset 4 on some control panels | |
icon: mdi:human-handsup | |
on_press: | |
- uart.write: | |
id: desk_uart | |
data: [0x9b, 0x06, 0x02, 0x10, 0x00, 0xac, 0xac, 0x9d] | |
- platform: template | |
name: "Memory" | |
id: button_m | |
icon: mdi:alpha-m-box | |
entity_category: "config" | |
on_press: | |
- uart.write: | |
id: desk_uart | |
data: [0x9b, 0x06, 0x02, 0x20, 0x00, 0xac, 0xb8, 0x9d] | |
- platform: template | |
name: "Wake Screen" | |
id: button_wake_screen | |
icon: mdi:gesture-tap-button | |
entity_category: "config" | |
on_press: | |
- uart.write: | |
id: desk_uart | |
data: [0x9b, 0x06, 0x02, 0x00, 0x00, 0x6c, 0xa1, 0x9d] | |
- platform: template | |
name: "Alarm" | |
id: button_alarm | |
icon: mdi:alarm | |
on_press: | |
- uart.write: | |
id: desk_uart | |
data: [0x9b, 0x06, 0x02, 0x40, 0x00, 0xAC, 0x90, 0x9d] | |
- platform: restart | |
name: "Restart" | |
entity_category: "config" | |
cover: | |
- platform: template | |
id: "desk_cover" | |
icon: mdi:desk # or mdi:human-male-height-variant | |
name: "Desk" | |
device_class: blind # makes it easier to integrate with Google/Alexa | |
has_position: true | |
position_action: | |
- if: | |
condition: | |
- lambda: !lambda |- | |
return pos > id(desk_cover).position; | |
then: | |
- cover.open: desk_cover | |
- wait_until: | |
lambda: |- | |
return id(desk_cover).position >= pos; | |
- cover.stop: desk_cover | |
else: | |
- cover.close: desk_cover | |
- wait_until: | |
lambda: |- | |
return id(desk_cover).position <= pos; | |
- cover.stop: desk_cover | |
stop_action: | |
- switch.turn_off: switch_up | |
- switch.turn_off: switch_down | |
open_action: | |
- switch.turn_off: switch_down | |
- switch.turn_on: switch_up | |
close_action: | |
- switch.turn_off: switch_up | |
- switch.turn_on: switch_down | |
optimistic: false | |
number: | |
- platform: template | |
name: "Desk Height" | |
id: set_desk_height | |
min_value: ${min_height} | |
max_value: ${max_height} | |
icon: "mdi:counter" | |
unit_of_measurement: "cm" | |
device_class: "distance" | |
step: 0.1 | |
lambda: !lambda |- | |
return id(desk_height).state; | |
set_action: | |
- if: | |
condition: | |
- lambda: !lambda |- | |
return x > id(desk_height).state; | |
then: | |
- cover.open: desk_cover | |
- wait_until: | |
lambda: |- | |
return id(desk_height).state >= x; | |
- cover.stop: desk_cover | |
else: | |
- cover.close: desk_cover | |
- wait_until: | |
lambda: |- | |
return id(desk_height).state <= x; | |
- cover.stop: desk_cover |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment