mirror of
https://github.com/CeeWeasel/fresh-home.git
synced 2026-08-09 10:30:14 -04:00
75fb9c2ab8
finally fixing hvac-multisensor. All of this was caused by the display switch referenced the display while it wasn't plugged in. Updated code to check for the existence first.
348 lines
8.8 KiB
YAML
348 lines
8.8 KiB
YAML
substitutions:
|
|
devicename: nursery-tagreader
|
|
entity_name: nursery_tagreader
|
|
friendly_name: Nursery Tagreader
|
|
comment: Clever Tag Reader
|
|
platform: ESP8266
|
|
board: d1_mini
|
|
static_ip: !secret nursery-tagreader-ip
|
|
|
|
packages:
|
|
wifi: !include common/wifi.yaml
|
|
device_base: !include common/device_base.yaml
|
|
|
|
esp8266:
|
|
board: d1_mini
|
|
|
|
esphome:
|
|
# If buzzer is enabled, notify on api connection success
|
|
on_boot:
|
|
priority: -10
|
|
then:
|
|
- wait_until:
|
|
api.connected:
|
|
- logger.log: API is connected!
|
|
- rtttl.play: "success:d=24,o=5,b=100:c,g,b"
|
|
- light.turn_on:
|
|
id: activity_led
|
|
brightness: 100%
|
|
red: 0%
|
|
green: 0%
|
|
blue: 100%
|
|
flash_length: 500ms
|
|
- switch.turn_on: buzzer_enabled
|
|
- switch.turn_on: led_enabled
|
|
|
|
# Define switches to control LED and buzzer from HA
|
|
switch:
|
|
- platform: template
|
|
name: "Buzzer Enabled"
|
|
id: buzzer_enabled
|
|
icon: mdi:volume-high
|
|
optimistic: true
|
|
restore_mode: restore_default_on
|
|
entity_category: config
|
|
- platform: template
|
|
name: "LED enabled"
|
|
id: led_enabled
|
|
icon: mdi:alarm-light-outline
|
|
optimistic: true
|
|
restore_mode: restore_default_on
|
|
entity_category: config
|
|
|
|
# Define buttons for writing tags via HA
|
|
button:
|
|
- platform: template
|
|
name: Write Tag Random
|
|
id: write_tag_random
|
|
# Optional variables:
|
|
icon: "mdi:pencil-box"
|
|
on_press:
|
|
then:
|
|
- light.turn_on:
|
|
id: activity_led
|
|
brightness: 100%
|
|
red: 100%
|
|
green: 0%
|
|
blue: 100%
|
|
- lambda: |-
|
|
static const char alphanum[] = "0123456789abcdef";
|
|
std::string uri = "https://www.home-assistant.io/tag/";
|
|
for (int i = 0; i < 8; i++)
|
|
uri += alphanum[random_uint32() % (sizeof(alphanum) - 1)];
|
|
uri += "-";
|
|
for (int j = 0; j < 3; j++) {
|
|
for (int i = 0; i < 4; i++)
|
|
uri += alphanum[random_uint32() % (sizeof(alphanum) - 1)];
|
|
uri += "-";
|
|
}
|
|
for (int i = 0; i < 12; i++)
|
|
uri += alphanum[random_uint32() % (sizeof(alphanum) - 1)];
|
|
auto message = new nfc::NdefMessage();
|
|
message->add_uri_record(uri);
|
|
ESP_LOGD("tagreader", "Writing payload: %s", uri.c_str());
|
|
id(pn532_board).write_mode(message);
|
|
- rtttl.play: "write:d=24,o=5,b=100:b"
|
|
- wait_until:
|
|
not:
|
|
pn532.is_writing:
|
|
- light.turn_off:
|
|
id: activity_led
|
|
- rtttl.play: "write:d=24,o=5,b=100:b,b"
|
|
- platform: template
|
|
name: Clean Tag
|
|
id: clean_tag
|
|
icon: "mdi:nfc-variant-off"
|
|
on_press:
|
|
then:
|
|
- light.turn_on:
|
|
id: activity_led
|
|
brightness: 100%
|
|
red: 100%
|
|
green: 64.7%
|
|
blue: 0%
|
|
- lambda: 'id(pn532_board).clean_mode();'
|
|
- rtttl.play: "write:d=24,o=5,b=100:b"
|
|
- wait_until:
|
|
not:
|
|
pn532.is_writing:
|
|
- light.turn_off:
|
|
id: activity_led
|
|
- rtttl.play: "write:d=24,o=5,b=100:b,b"
|
|
- platform: template
|
|
name: Cancel writing
|
|
id: cancel_writing
|
|
icon: "mdi:pencil-off"
|
|
on_press:
|
|
then:
|
|
- lambda: 'id(pn532_board).read_mode();'
|
|
- light.turn_off:
|
|
id: activity_led
|
|
- rtttl.play: "write:d=24,o=5,b=100:b,b"
|
|
|
|
|
|
# Enable logging
|
|
logger:
|
|
# level: VERY_VERBOSE
|
|
level: INFO
|
|
|
|
# Enable Home Assistant API
|
|
api:
|
|
services:
|
|
- service: rfidreader_tag_ok
|
|
then:
|
|
- rtttl.play: "beep:d=16,o=5,b=100:b"
|
|
|
|
- service: rfidreader_tag_ko
|
|
then:
|
|
- rtttl.play: "beep:d=8,o=5,b=100:b"
|
|
|
|
- service: play_rtttl
|
|
variables:
|
|
song_str: string
|
|
then:
|
|
- rtttl.play: !lambda 'return song_str;'
|
|
|
|
- service: write_tag_id
|
|
variables:
|
|
tag_id: string
|
|
then:
|
|
- light.turn_on:
|
|
id: activity_led
|
|
brightness: 100%
|
|
red: 100%
|
|
green: 0%
|
|
blue: 0%
|
|
- lambda: |-
|
|
auto message = new nfc::NdefMessage();
|
|
std::string uri = "https://www.home-assistant.io/tag/";
|
|
uri += tag_id;
|
|
message->add_uri_record(uri);
|
|
id(pn532_board).write_mode(message);
|
|
- rtttl.play: "write:d=24,o=5,b=100:b"
|
|
- wait_until:
|
|
not:
|
|
pn532.is_writing:
|
|
- light.turn_off:
|
|
id: activity_led
|
|
- rtttl.play: "write:d=24,o=5,b=100:b,b"
|
|
|
|
- service: write_music_tag
|
|
variables:
|
|
music_url: string
|
|
music_info: string
|
|
then:
|
|
- light.turn_on:
|
|
id: activity_led
|
|
brightness: 100%
|
|
red: 100%
|
|
green: 0%
|
|
blue: 0%
|
|
- lambda: |-
|
|
auto message = new nfc::NdefMessage();
|
|
std::string uri = "";
|
|
std::string text = "";
|
|
uri += music_url;
|
|
text += music_info;
|
|
if ( music_url != "" ) {
|
|
message->add_uri_record(uri);
|
|
}
|
|
if ( music_info != "" ) {
|
|
message->add_text_record(text);
|
|
}
|
|
id(pn532_board).write_mode(message);
|
|
- rtttl.play: "write:d=24,o=5,b=100:b"
|
|
- wait_until:
|
|
not:
|
|
pn532.is_writing:
|
|
- light.turn_off:
|
|
id: activity_led
|
|
- rtttl.play: "write:d=24,o=5,b=100:b,b"
|
|
|
|
# Enable OTA upgrade
|
|
ota:
|
|
|
|
i2c:
|
|
scan: False
|
|
frequency: 400kHz
|
|
|
|
globals:
|
|
- id: source
|
|
type: std::string
|
|
- id: url
|
|
type: std::string
|
|
- id: info
|
|
type: std::string
|
|
|
|
pn532_i2c:
|
|
id: pn532_board
|
|
on_tag:
|
|
then:
|
|
- if:
|
|
condition:
|
|
switch.is_on: led_enabled
|
|
then:
|
|
- light.turn_on:
|
|
id: activity_led
|
|
brightness: 100%
|
|
red: 0%
|
|
green: 100%
|
|
blue: 0%
|
|
flash_length: 500ms
|
|
|
|
- delay: 0.15s #to fix slow component
|
|
|
|
- lambda: |-
|
|
id(source)="";
|
|
id(url)="";
|
|
id(info)="";
|
|
if (tag.has_ndef_message()) {
|
|
auto message = tag.get_ndef_message();
|
|
auto records = message->get_records();
|
|
for (auto &record : records) {
|
|
std::string payload = record->get_payload();
|
|
std::string type = record->get_type();
|
|
size_t hass = payload.find("https://www.home-assistant.io/tag/");
|
|
size_t applemusic = payload.find("https://music.apple.com");
|
|
size_t spotify = payload.find("https://open.spotify.com");
|
|
size_t sonos = payload.find("sonos-2://");
|
|
|
|
if (type == "U" and hass != std::string::npos ) {
|
|
ESP_LOGD("tagreader", "Found Home Assistant tag NDEF");
|
|
id(source)="hass";
|
|
id(url)=payload;
|
|
id(info)=payload.substr(hass + 34);
|
|
}
|
|
else if (type == "U" and applemusic != std::string::npos ) {
|
|
ESP_LOGD("tagreader", "Found Apple Music tag NDEF");
|
|
id(source)="amusic";
|
|
id(url)=payload;
|
|
}
|
|
else if (type == "U" and spotify != std::string::npos ) {
|
|
ESP_LOGD("tagreader", "Found Spotify tag NDEF");
|
|
id(source)="spotify";
|
|
id(url)=payload;
|
|
}
|
|
else if (type == "U" and sonos != std::string::npos ) {
|
|
ESP_LOGD("tagreader", "Found Sonos app tag NDEF");
|
|
id(source)="sonos";
|
|
id(url)=payload;
|
|
}
|
|
else if (type == "T" ) {
|
|
ESP_LOGD("tagreader", "Found music info tag NDEF");
|
|
id(info)=payload;
|
|
}
|
|
else if ( id(source)=="" ) {
|
|
id(source)="uid";
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
id(source)="uid";
|
|
}
|
|
|
|
- if:
|
|
condition:
|
|
lambda: 'return ( id(source)=="uid" );'
|
|
then:
|
|
- homeassistant.tag_scanned: !lambda |-
|
|
ESP_LOGD("tagreader", "No HA NDEF, using UID");
|
|
return x;
|
|
else:
|
|
- if:
|
|
condition:
|
|
lambda: 'return ( id(source)=="hass" );'
|
|
then:
|
|
- homeassistant.tag_scanned: !lambda 'return id(info);'
|
|
else:
|
|
- homeassistant.event:
|
|
event: esphome.music_tag
|
|
data:
|
|
reader: !lambda |-
|
|
return App.get_name().c_str();
|
|
source: !lambda |-
|
|
return id(source);
|
|
url: !lambda |-
|
|
return id(url);
|
|
info: !lambda |-
|
|
return id(info);
|
|
|
|
- if:
|
|
condition:
|
|
switch.is_on: buzzer_enabled
|
|
then:
|
|
- rtttl.play: "success:d=24,o=5,b=100:c,g,b"
|
|
|
|
# Define the buzzer output
|
|
output:
|
|
- platform: esp8266_pwm
|
|
pin: D7
|
|
id: buzzer
|
|
|
|
binary_sensor:
|
|
- platform: gpio
|
|
name: Door
|
|
device_class: door
|
|
pin:
|
|
mode: INPUT_PULLUP
|
|
number: D5
|
|
|
|
# Define buzzer as output for RTTTL
|
|
rtttl:
|
|
output: buzzer
|
|
|
|
# Configure LED
|
|
light:
|
|
- platform: neopixelbus
|
|
variant: WS2812
|
|
pin: D8
|
|
num_leds: 1
|
|
flash_transition_length: 500ms
|
|
type: GRB
|
|
id: activity_led
|
|
name: "LED"
|
|
restore_mode: ALWAYS_OFF
|
|
|
|
|
|
|