Files
hassos_config/esphome/esp32-s2-stepper-test.yaml
2024-04-10 14:49:07 +02:00

281 lines
8.8 KiB
YAML

substitutions:
device_name: "steppertest"
friendly_name: "stepper"
comment: "esp32-S2, motor"
location: "zolder"
api_password: !secret stepper_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret stepper_ip
update_interval: 30s
pin_mot_rst: GPIO18
pin_mot_slp: GPIO21
pin_mot_dir: GPIO17
pin_mot_stp: GPIO16
blinds_name: speelkamer
packages:
board: !include boards/esp32_s2_arduino.yaml
device_base: !include common/common.yaml
connection: !include common/wifi.yaml
logger: !include templates/logger.yaml
api:
services:
- service: control_stepper
variables:
target: int
then:
- stepper.set_target:
id: stepper_motor
target: !lambda 'return target;'
esphome:
on_boot:
- priority: -200.0
then:
- stepper.report_position: # Set stepper to global variable
id: stepper_motor
position: !lambda return id(stepper_motor_global);
- stepper.set_target: # Set stepper to global variable
id: stepper_motor
target: !lambda return id(stepper_motor_global);
- if: # If blind is Closed
condition:
- lambda: 'return id(stepper_motor_global) == 0;'
then: # Publish state etc.
- cover.template.publish:
id: ${blinds_name}
state: CLOSED
current_operation: IDLE
- if: # If blind is Open
condition:
- lambda: 'return id(stepper_motor_global) == id(endstop).state;'
then: # Publish state etc.
- cover.template.publish:
id: ${blinds_name}
state: OPEN
current_operation: IDLE
- if: # If blind is Neither
condition:
- lambda: 'return (id(stepper_motor_global) != 0) && (id(stepper_motor_global) != id(endstop).state);'
then: # # Publish state etc.
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
current_operation: IDLE
globals:
- id: stepper_motor_global # Integer for storing the stepper position in case of reboot
type: int
restore_value: True
initial_value: '0'
- id: openclosed # Boolean to store OPEN/CLOSED state
type: bool
restore_value: True
initial_value: '0'
# - id: endstop # Variable for storing ENDSTOP (how far to move stepper)
# type: int
# restore_value: True
# initial_value: '750' # this is the max value # this is the max value
sensor:
- platform: template
name: steppe_pos
id: stepper_pos
number:
- platform: template
name: endstop Control
id: endstop
min_value: 0
max_value: 2000
step: 1
mode: slider
unit_of_measurement: steps
restore_value: True
optimistic: True
# set_action:
# then:
# - globals.set:
# id: endstop
# value: !lambda 'return x;'
stepper:
- platform: a4988
id: stepper_motor
step_pin: ${pin_mot_stp}
dir_pin: ${pin_mot_dir}
max_speed: 250
# Optional:
sleep_pin: ${pin_mot_slp}
acceleration: inf
deceleration: inf
cover:
- platform: template
name: Dining Room Blinds
id: ${blinds_name}
open_action:
then:
- logger.log: "Opening"
- stepper.set_target:
id: stepper_motor
target: 750
- while:
condition:
lambda: 'return id(stepper_motor).current_position < id(endstop).state;'
then:
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
current_operation: OPENING
- delay: 1000 ms
- globals.set: # Set global to current position
id: stepper_motor_global
value: !lambda return id(stepper_motor).current_position;
- sensor.template.publish:
id: stepper_pos
state: !lambda return id(stepper_motor).current_position;
- globals.set: # Set toggle to OPEN (No need for 'optimistic mode')
id: openclosed
value: '1'
- cover.template.publish:
id: ${blinds_name}
state: OPEN
current_operation: IDLE
close_action:
then:
- logger.log: "Closing"
- stepper.set_target: # Send stepper to 0
id: stepper_motor
target: '0'
- while:
condition:
lambda: 'return id(stepper_motor).current_position > 0;'
then:
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
current_operation: CLOSING
- delay: 1000 ms
- globals.set: # Set global to current position
id: stepper_motor_global
value: !lambda return id(stepper_motor).current_position;
- sensor.template.publish:
id: stepper_pos
state: !lambda return id(stepper_motor).current_position;
- globals.set: # Set toggle to CLOSED (No need for 'optimistic mode')
id: openclosed
value: '0'
- cover.template.publish:
id: ${blinds_name}
state: CLOSED
current_operation: IDLE
position_action:
then:
- stepper.set_target:
id: stepper_motor
target: !lambda return int(id(endstop).state * pos);
- while:
condition:
lambda: 'return id(stepper_motor).current_position != int(id(endstop).state * pos);'
then:
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
- delay: 1000 ms
- globals.set: # Set global to current position
id: stepper_motor_global
value: !lambda return id(stepper_motor).current_position;
- sensor.template.publish:
id: stepper_pos
state: !lambda return id(stepper_motor).current_position;
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
current_operation: IDLE
stop_action:
then:
- stepper.set_target:
id: stepper_motor
target: !lambda return id(stepper_motor).current_position;
- globals.set: # Set global to current position
id: stepper_motor_global
value: !lambda return id(stepper_motor).current_position;
- sensor.template.publish:
id: stepper_pos
state: !lambda return id(stepper_motor).current_position;
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
current_operation: IDLE
has_position: true
device_class: blind
switch:
- platform: template
name: Reset Dining Room Blinds
id: reset
turn_on_action:
- stepper.set_target:
id: stepper_motor
target: !lambda 'return id(endstop).state * 2;'
- wait_until:
lambda: 'return id(stepper_motor).current_position == id(endstop).state*2;'
- delay: 1s
- stepper.set_target:
id: stepper_motor
target: '0'
- globals.set: # Set global to current position
id: stepper_motor_global
value: !lambda return id(stepper_motor).current_position;
- sensor.template.publish:
id: stepper_pos
state: !lambda return id(stepper_motor).current_position;
- globals.set: # Set toggle to CLOSED (No need for 'optimistic mode')
id: openclosed
value: '0'
- cover.template.publish:
id: ${blinds_name}
state: CLOSED
current_operation: IDLE
- switch.turn_off: reset
# - platform: output
# name: "A4988 reset"
# output: 'A4988reset'
# internal: false
# id: swreset
output:
- platform: gpio
id: 'A4988reset'
pin: ${pin_mot_rst}
inverted: True
# cover:
# - platform: template
# name: "Template Cover"
# lambda: |-
# open_action:
# - switch.turn_on: open_cover_switch
# close_action:
# - switch.turn_on: close_cover_switch
# stop_action:
# - switch.turn_on: stop_cover_switch
# optimistic: true