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:
|
2024-05-28 21:04:28 +00:00
|
|
|
- light.addressable_set: { id: status_led, red: 0%, green: 0%, blue: 100% }
|
2024-03-02 01:05:43 +00:00
|
|
|
- priority: -100
|
|
|
|
then:
|
2024-05-28 21:04:28 +00:00
|
|
|
- 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-07-09 17:49:47 +00:00
|
|
|
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;
|
2024-07-09 17:25:42 +00:00
|
|
|
- text.set:
|
|
|
|
id: ${name_of_board}_letzter_token
|
|
|
|
value: !lambda return id(my_tag);
|
2023-10-07 19:59:34 +00:00
|
|
|
# login to vault with role_id to fetch short lived token
|
|
|
|
- http_request.post:
|
|
|
|
url: https://vault.ctdo.de/v1/auth/approle/login
|
2024-07-09 17:49:47 +00:00
|
|
|
verify_ssl: false
|
2023-10-07 19:59:34 +00:00
|
|
|
headers:
|
|
|
|
Content-Type: application/json
|
|
|
|
json:
|
|
|
|
role_id: $vault_role_id
|
|
|
|
secret_id: $vault_secret_id
|
|
|
|
on_response:
|
|
|
|
# fetch token from response, store into my_token
|
|
|
|
then:
|
|
|
|
- lambda: |-
|
2024-07-09 17:49:47 +00:00
|
|
|
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));
|
2024-07-09 17:49:47 +00:00
|
|
|
verify_ssl: false
|
2023-10-07 19:59:34 +00:00
|
|
|
headers:
|
2024-03-02 01:05:43 +00:00
|
|
|
X-Vault-Token: !lambda return id(my_token).c_str();
|
2023-10-07 19:59:34 +00:00
|
|
|
on_response:
|
|
|
|
then:
|
|
|
|
- if:
|
|
|
|
condition:
|
2024-07-09 17:49:47 +00:00
|
|
|
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: |-
|
2024-07-09 17:49:47 +00:00
|
|
|
json::parse_json(id(http_request_data).get_string(), [](JsonObject root) {
|
2024-06-28 22:38:18 +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:
|
2024-05-28 20:36:16 +00:00
|
|
|
- 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
|
|
|
|
|
2024-05-28 20:36:16 +00:00
|
|
|
text:
|
|
|
|
- platform: template
|
|
|
|
name: "$name_of_board Letzte Entsperung"
|
|
|
|
id: ${name_of_board}_letzte_entsperrung
|
|
|
|
optimistic: true
|
|
|
|
mode: text
|
2024-07-09 17:25:42 +00:00
|
|
|
- platform: template
|
|
|
|
name: "$name_of_board Zuletzt Gelesener Token"
|
|
|
|
id: ${name_of_board}_letzter_token
|
|
|
|
optimistic: true
|
|
|
|
mode: text
|