PN532 NFC/RFID
组件/集线器
Section titled “组件/集线器”pn532 组件允许您在 ESPHome 中使用 PN532 NFC/RFID 控制器(数据手册、Adafruit)。此组件是一个全局集线器,通过 SPI 或 I²C 建立与 PN532 的连接并输出其数据。使用 PN532 二进制传感器,您可以创建单独的二进制传感器来跟踪 NFC/RFID 标签当前是否被 PN532 检测到。
请参阅 设置标签 了解如何为此组件设置单独二进制传感器的信息。
PN532 可以配置为使用 SPI 或 I²C 协议进行数据通信。您需要根据板上印制的表格切换模块上的拨码开关。SPI 通常是开关 1 关闭、开关 2 打开,I²C 通常是开关 1 打开、开关 2 关闭。根据您的选择,您需要配置 SPI 总线 或 I²C 总线。
通过 SPI
Section titled “通过 SPI”pn532_spi 组件允许您在 ESPHome 中使用 PN532 NFC/RFID 控制器(数据手册、Adafruit)。此组件是一个全局集线器,通过 SPI 建立与 PN532 的连接并输出其数据。使用 PN532 二进制传感器,您可以创建单独的二进制传感器来跟踪 NFC/RFID 标签当前是否被 PN532 检测到。
pn532_spi: cs_pin: D3 update_interval: 1s
binary_sensor: - platform: pn532 uid: 74-10-37-94 name: "PN532 NFC 标签"-
cs_pin (*必需, 引脚模式): ESP 上连接片选线的引脚。
-
update_interval (可选, 时间): PN532 上每次扫描的持续时间。这影响各个二进制传感器被发现时保持活动的时间。如果在此时间窗口内未找到设备,将被标记为不存在。默认为 1s。
-
on_tag (可选, 自动化): 当读取标签时执行的自动化。请参阅 pn532-on_tag。
-
on_tag_removed (可选, 自动化): 当标签被移除时执行的自动化。请参阅
on_tag_removed。 -
id (可选, ID): 手动指定此组件的 ID。
通过 I²C
Section titled “通过 I²C”pn532 组件允许您在 ESPHome 中使用 PN532 NFC/RFID 控制器(数据手册、Adafruit)。此组件是一个全局集线器,通过 I²C 建立与 PN532 的连接并输出其数据。使用 PN532 二进制传感器,您可以创建单独的二进制传感器来跟踪 NFC/RFID 标签当前是否被 PN532 检测到。
pn532_i2c: update_interval: 1s
binary_sensor: - platform: pn532 uid: 74-10-37-94 name: "PN532 NFC 标签"-
update_interval (可选, 时间): PN532 上每次扫描的持续时间。这影响各个二进制传感器被发现时保持活动的时间。如果在此时间窗口内未找到设备,将被标记为不存在。默认为 1s。
-
on_tag (可选, 自动化): 当读取标签时执行的自动化。请参阅 pn532-on_tag。
-
id (可选, ID): 手动指定此组件的 ID。
on_tag 操作
Section titled “on_tag 操作”当 PN532 模块响应一个标签时,此自动化将被触发。仅当标签更改或在一个 update_interval 周期内消失时才会触发。
此触发器提供的参数 x 类型为 std::string,是格式为 74-10-37-94 的标签 UID。下面的配置将在 MQTT 主题 pn532/tag 上发布标签 ID。
请参阅下面的 NDEF 读取 了解如何使用提供给此触发器的第二个 tag 参数。
pn532_...: # ... on_tag: then: - mqtt.publish: topic: pn532/tag payload: !lambda 'return x;'还可以使用 homeassistant.tag_scanned 操作 将标签扫描事件发送到 Home Assistant 标签组件。
pn532_...: # ... on_tag: then: - homeassistant.tag_scanned: !lambda 'return x;'或者您也可以通过 模板传感器 直接将值发送到 Home Assistant。
pn532_...: # ... on_tag: then: - text_sensor.template.publish: id: rfid_tag state: !lambda 'return x;'
text_sensor: - platform: template name: "RFID 标签" id: rfid_tagon_tag_removed
Section titled “on_tag_removed”当 PN532 模块响应没有标签时,此自动化将被触发。仅当标签在一个 update_interval 周期内消失时才会触发。
此触发器提供的参数 x 类型为 std::string,是格式为 74-10-37-94 的被移除标签 UID。下面的配置将在 MQTT 主题 pn532/tag_removed 上发布被移除的标签 ID。
pn532: # ... on_tag_removed: then: - mqtt.publish: topic: pn532/tag_removed payload: !lambda 'return x;'pn532 二进制传感器
Section titled “pn532 二进制传感器”pn532 二进制传感器平台允许您跟踪具有给定唯一 ID (uid) 的 NFC/RFID 标签当前是否被 PN532 检测到。
# 示例配置条目spi: clk_pin: D0 miso_pin: D1 mosi_pin: D2
pn532_spi: cs_pin: D3 update_interval: 1s
binary_sensor: - platform: pn532 uid: 74-10-37-94 name: "PN532 NFC 标签"-
uid (*必需, 字符串): NFC/RFID 标签的唯一 ID。这是以连字符分隔的十六进制值列表。例如
74-10-37-94。 -
所有其他选项来自 二进制传感器。
要为特定 NFC 标签设置二进制传感器,您首先需要知道它们的唯一 ID。要获取此 ID,首先设置一个简单的 PN532 配置,不带任何二进制传感器,如上所示。
当代码运行并且您将 NFC 标签靠近 PN532 时,您应该看到类似以下的消息:
Found new tag '74-10-37-94'然后复制此 ID 并创建一个 binary_sensor 条目,如配置示例所示。对每个标签重复此过程。
PN532 支持读写 NDEF 格式数据到卡中。
NDEF 读取
Section titled “NDEF 读取”以下示例将读取使用 Home Assistant Companion 应用格式化和写入的 NFC 标签,并使用 homeassistant.tag_scanned 操作 将其发送到 Home Assistant。tag 变量提供给 on_tag 触发器以及运行的任何操作,可以如下使用。
pn532_...: # ... on_tag: then: - homeassistant.tag_scanned: !lambda | if (!tag.has_ndef_message()) { return x; } auto message = tag.get_ndef_message(); auto records = message->get_records(); for (auto &record : records) { std::string payload = record->get_payload(); size_t pos = payload.find("https://www.home-assistant.io/tag/"); if (pos != std::string::npos) { return payload.substr(pos + 34); } } return x;NDEF 写入
Section titled “NDEF 写入”以下示例可用于以与 Home Assistant Companion 应用相同的格式向标签写入(伪)随机 UUID。
on_... then: - 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("ndef", "Writing payload: %s", uri.c_str()); id(pn532_board).write_mode(message); - wait_until: not: pn532.is_writing: - logger.log: "完成写入标签"