esphome/mlock-common.yaml

227 lines
7.7 KiB
YAML
Raw Normal View History

2023-10-07 19:59:34 +00:00
# todos:
# - move code into packages to make this re-useable
# - testing
substitutions:
2023-10-07 20:56:07 +00:00
ota_password: ""
api_enckey: ""
2023-10-07 20:51:48 +00:00
wifi_ssid: ""
wifi_password: ""
vault_role_id: ""
vault_secret_id: ""
2023-10-07 19:59:34 +00:00
###### nothing to change below this line ######
esphome:
2023-10-07 20:19:20 +00:00
name: mlock-${name_of_board}
2023-10-07 19:59:34 +00:00
platform: ESP8266
board: d1_mini
2024-03-02 01:05:43 +00:00
on_boot:
- priority: 600
then:
- light.addressable_set: { id: status_led, red: 0%, green: 0%, blue: 100% }
2024-03-02 01:05:43 +00:00
- priority: -100
then:
- if:
condition:
switch.is_on: mlock_${name_of_board}_switch
then:
- light.addressable_set: { id: status_led, red: 0%, green: 100%, blue: 0% }
else:
- light.addressable_set: { id: status_led, red: 100%, green: 0%, blue: 0% }
2023-10-07 19:59:34 +00:00
# Enable logging
logger:
api:
encryption:
key: $api_enckey
ota:
2024-06-28 22:38:18 +00:00
- platform: esphome
password: $ota_password
2023-10-07 19:59:34 +00:00
wifi:
ssid: $wifi_ssid
password: $wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "$name_of_board Fallback Hotspot"
password: "PZe2PJENtBiu"
manual_ip:
static_ip: $ip_addr
gateway: 172.23.23.1
dns1: 172.23.23.1
subnet: 255.255.255.0
captive_portal:
spi:
clk_pin: GPIO14
mosi_pin: GPIO13
miso_pin: GPIO12
http_request:
useragent: esphome
timeout: 2s
id: http_request_data
globals:
- id: my_token
type: std::string
restore_value: no
- id: my_tag
type: std::string
restore_value: no
2024-03-02 01:05:43 +00:00
- id: may_switch_output
type: int
restore_value: no
2023-10-07 19:59:34 +00:00
rc522_spi:
cs_pin: GPIO15
on_tag:
then:
2024-03-02 01:05:43 +00:00
- light.addressable_set:
id: status_led
red: 100%
green: 100%
blue: 0%
2023-10-07 19:59:34 +00:00
# store the tag id into global variable
- lambda: |-
id(my_tag) = x;
# login to vault with role_id to fetch short lived token
- http_request.post:
url: https://vault.ctdo.de/v1/auth/approle/login
headers:
Content-Type: application/json
json:
role_id: $vault_role_id
secret_id: $vault_secret_id
verify_ssl: false
on_response:
# fetch token from response, store into my_token
then:
- lambda: |-
json::parse_json(id(http_request_data).get_string(), [](JsonObject root) {
2024-03-02 01:05:43 +00:00
id(my_token) = (const char*) root["auth"]["client_token"];
2023-10-07 19:59:34 +00:00
});
# use the token to get json of scanned tag from vault
- http_request.get:
url: !lambda |-
return ((std::string) "https://vault.ctdo.de/v1/maschinenlock/" + id(my_tag));
headers:
2024-03-02 01:05:43 +00:00
X-Vault-Token: !lambda return id(my_token).c_str();
2024-03-02 01:32:18 +00:00
verify_ssl: false
2023-10-07 19:59:34 +00:00
on_response:
then:
- if:
condition:
lambda: 'return status_code == 200;'
2024-03-02 01:32:18 +00:00
then: # when found, check if machine is allowed, turn on output or blink LED red
2023-10-07 19:59:34 +00:00
- lambda: |-
json::parse_json(id(http_request_data).get_string(), [](JsonObject root) {
2024-03-02 01:16:31 +00:00
id(may_switch_output) = root["data"]["mlock-$name_of_board"];
2023-10-07 19:59:34 +00:00
});
2024-03-02 01:05:43 +00:00
- if:
condition:
lambda: 'return id(may_switch_output);'
then:
- if:
condition:
switch.is_on: mlock_${name_of_board}_switch
then:
- switch.turn_off: mlock_${name_of_board}_switch
- homeassistant.event:
event: esphome.mlock_locked
data:
tag: !lambda return id(my_tag);
machine: ${name_of_board}
else:
- switch.turn_on: mlock_${name_of_board}_switch
- homeassistant.event:
event: esphome.mlock_unlocked
data:
tag: !lambda return id(my_tag);
machine: ${name_of_board}
- text.set:
id: ${name_of_board}_letzte_entsperrung
value: !lambda return id(my_tag);
2024-03-02 01:05:43 +00:00
else:
- repeat:
count: 3
then:
- light.addressable_set: { id: status_led, red: 100%, green: 0%, blue: 0% }
- delay: 0.1s
- light.addressable_set: { id: status_led, red: 0%, green: 0%, blue: 0% }
- delay: 0.1s
else: # vault returns 404 on missing/unknown Tag so blink LED
- repeat:
count: 3
then:
- light.addressable_set: { id: status_led, red: 100%, green: 0%, blue: 0% }
- delay: 0.5s
- light.addressable_set: { id: status_led, red: 0%, green: 0%, blue: 0% }
- delay: 0.5s
2024-03-02 01:32:18 +00:00
- if: # return LED to switch state before
2024-03-02 01:16:31 +00:00
condition:
switch.is_on: mlock_${name_of_board}_switch
then:
- light.addressable_set: { id: status_led, red: 0%, green: 100%, blue: 0% }
else:
- light.addressable_set: { id: status_led, red: 100%, green: 0%, blue: 0% }
2023-10-07 19:59:34 +00:00
# switch component for the output state
switch:
2024-03-02 01:05:43 +00:00
- platform: gpio
pin: D1
2023-10-07 19:59:34 +00:00
name: "Relais Output"
2023-10-07 20:19:20 +00:00
id: mlock_${name_of_board}_switch
2024-03-02 01:16:31 +00:00
internal: true # hide from Homeassistant, so no one can turn it on without Tag-Scanning
2023-10-07 19:59:34 +00:00
binary_sensor:
# sensor input for Turning Device off
- platform: gpio
pin:
number: D3
inverted: true
mode: INPUT_PULLUP
2023-10-07 20:19:20 +00:00
id: ${name_of_board}gpio_input_ausschalter
2023-10-07 19:59:34 +00:00
on_press:
2023-10-07 20:19:20 +00:00
- switch.turn_off: mlock_${name_of_board}_switch
2024-03-02 01:05:43 +00:00
- light.addressable_set: { id: status_led, red: 100%, green: 0%, blue: 0% }
2023-10-07 19:59:34 +00:00
# a template sensor for showing the current switch state (read only)
- platform: template
2023-10-07 20:19:20 +00:00
id: mlock_${name_of_board}_state_output
2023-10-07 19:59:34 +00:00
name: "${name_of_board} Status Ausgang"
publish_initial_state: true
lambda: |-
2023-10-07 20:19:20 +00:00
return id(mlock_${name_of_board}_switch).state;
2023-10-07 19:59:34 +00:00
# a button element for Homeassistant UI to allow turning off
button:
- platform: template
name: "${name_of_board} Ausschalter"
id: ${name_of_board}_btn_ausschalter
on_press:
2023-10-07 20:19:20 +00:00
- switch.turn_off: mlock_${name_of_board}_switch
2024-03-02 01:05:43 +00:00
- light.addressable_set: { id: status_led, red: 100%, green: 0%, blue: 0% }
light:
- platform: neopixelbus
type: GRB
variant: WS2812
pin: D4
name: status_led
id: status_led
num_leds: 1
internal: true
text:
- platform: template
name: "$name_of_board Letzte Entsperung"
id: ${name_of_board}_letzte_entsperrung
optimistic: true
mode: text