From 929da89c74cc14058d9d3ee7a918af7999f85649 Mon Sep 17 00:00:00 2001 From: Daniele Verducci Date: Sat, 20 Dec 2025 21:30:12 +0100 Subject: [PATCH] Ugly but working playback code --- esphome/fabula.yaml | 49 +++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/esphome/fabula.yaml b/esphome/fabula.yaml index beb727e..aefa1b3 100644 --- a/esphome/fabula.yaml +++ b/esphome/fabula.yaml @@ -22,6 +22,14 @@ wifi: password: "SediaChinita@Terrazzo2017" +# ---------------------- Global variables ---------------------- + +globals: + - id: current_folder + type: int + restore_value: no + initial_value: '0' + # ---------------------- PN532 NFC Reader ---------------------- @@ -35,30 +43,31 @@ pn532_i2c: update_interval: 1s on_tag: then: + - !lambda |- + if (tag.has_ndef_message()) { + const auto &message = tag.get_ndef_message(); + const auto &records = message->get_records(); + for (const auto &record : records) { + if (record->get_type().c_str()[0] != 'T') { + ESP_LOGD("Fabula", " Ignoring non-text record %s", record->get_payload().c_str()); + continue; + } + ESP_LOGD("Fabula", " Found record %s in tag, try to convert to int", record->get_payload().c_str()); + // Note: exception handling is disabled in ESPHome: the following line may crash the microcontroller if a tag with a textual record if scanned + int folderId = std::stoi(record->get_payload()); + ESP_LOGD("Fabula", " Found valid record in tag: playing folder %d", folderId); + id(current_folder) = folderId; + return folderId; + } + } + ESP_LOGD("Fabula", " No valid record found in tag. Please add a text field containing the folder number, e.g. 001"); + id(current_folder) = 0; + return 0; # - logger.log: # format: "NFC Tag found: %s" # args: [ 'tag.get_ndef_message()->get_records()[0]->get_payload().c_str()' ] - dfplayer.play_folder: - loop: True - # Crashes somewhere here in the lambda - folder: !lambda |- - if (tag.has_ndef_message()) { - const auto &message = tag.get_ndef_message(); - const auto &records = message->get_records(); - for (const auto &record : records) { - if (record->get_type().c_str()[0] != 'T') { - ESP_LOGD("Fabula", " Ignoring non-text record %s", record->get_payload().c_str()); - continue; - } - ESP_LOGD("Fabula", " Found record %s in tag, try to convert to int", record->get_payload().c_str()); - // Note: exception handling is disabled in ESPHome: the following line may crash the microcontroller if a tag with a textual record if scanned - int folderId = std::stoi(record->get_payload()); - ESP_LOGD("Fabula", " Found valid record in tag: playing folder %d", folderId); - return folderId; - } - } - ESP_LOGD("Fabula", " No valid record found in tag. Please add a text field containing the folder number, e.g. 001"); - return 0; + folder: on_tag_removed: then: - logger.log: "NFC Tag removed"