Last active
September 3, 2024 21:43
-
-
Save linknum23/698100bdfe2c3739a5ffb72cfc8c5660 to your computer and use it in GitHub Desktop.
Song Tag reader for amplipro demo using a ESP32-POE and reference code from Adonno
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
# POE NFG Tag reader | |
# this is a slight modification of https://github.com/adonno/tagreader to use POE with the ESP32-POE dev board | |
substitutions: | |
name: tagreader-poe | |
friendly_name: TagReaderPOE | |
esphome: | |
name: $name | |
friendly_name: $friendly_name | |
# Automatically add the mac address to the name | |
# so you can use a single firmware for all devices | |
#name_add_mac_suffix: true | |
# This will allow for (future) project identification, | |
# configuration and updates. | |
project: | |
name: adonno.tag_reader | |
version: "1.4" | |
# 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 | |
esp32: | |
board: esp32-poe | |
framework: | |
type: arduino | |
dashboard_import: | |
package_import_url: github://adonno/tagreader/tagreader.yaml | |
# use ethernet instead of the "normal" wifi | |
ethernet: | |
type: LAN8720 | |
mdc_pin: GPIO23 | |
mdio_pin: GPIO18 | |
clk_mode: GPIO17_OUT | |
phy_addr: 0 | |
power_pin: GPIO12 | |
switch: | |
- platform: template | |
name: "${friendly_name} Buzzer Enabled" | |
id: buzzer_enabled | |
icon: mdi:volume-high | |
optimistic: true | |
restore_mode: RESTORE_DEFAULT_ON | |
entity_category: config | |
- platform: template | |
name: "${friendly_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: "${friendly_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: "${friendly_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: "${friendly_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" | |
- platform: restart | |
name: "${friendly_name} Restart" | |
entity_category: config | |
# Enable logging | |
logger: | |
# level: VERY_VERBOSE | |
# level: VERBOSE | |
# Enable Home Assistant API | |
api: | |
encryption: | |
key: "ft44l0UFPac8cARt+ITymUu6viW93lNfyV9Exd62x1Q=" | |
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" | |
ota: | |
- platform: esphome | |
password: "7cb6f12bd14867e5aa16657d47a25287" | |
# updated to use i2c pins on ESP32-POE's UEXT connector | |
i2c: | |
sda: 13 | |
scl: 16 | |
scan: True | |
frequency: 100kHz | |
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" | |
on_tag_removed: | |
then: | |
- homeassistant.event: | |
event: esphome.tag_removed | |
# Define the buzzer output | |
# updated to use i/o pin on ESP32-POE's UEXT connector | |
output: | |
- platform: ledc | |
pin: GPIO14 | |
id: buzzer | |
binary_sensor: | |
- platform: status | |
name: "${friendly_name} Status" | |
entity_category: diagnostic | |
text_sensor: | |
- platform: version | |
hide_timestamp: true | |
name: "${friendly_name} ESPHome Version" | |
entity_category: diagnostic | |
- platform: ethernet_info | |
ip_address: | |
name: "${friendly_name} IP Address" | |
entity_category: diagnostic | |
# Define buzzer as output for RTTTL | |
rtttl: | |
output: buzzer | |
# Configure LED | |
# updated to use i/o pin on ESP32-POE's UEXT connector | |
# not currently used | |
light: | |
- platform: neopixelbus | |
variant: WS2812 | |
pin: GPIO15 | |
num_leds: 1 | |
flash_transition_length: 500ms | |
type: GRB | |
id: activity_led | |
name: "${friendly_name} LED" | |
restore_mode: ALWAYS_OFF | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment