跳转到内容

Sim800L 组件

SIM800L 组件提供拨号、接听电话、发送/接收短信以及发送/接收 USSD 代码的功能。设备必须通过支持接收和发送线路的 UART 总线 连接。UART 总线必须配置为与模块相同的速度,默认为 9600bps。所需的连接线是 +VCCGNDRXTX

WARNING

如果您使用 Logger,请确保不要为 TXRX 使用相同的引脚,或者使用 baud_rate: 0 选项禁用 UART 日志记录。

NOTE

此模块需要 3.8V 到 4.2V 之间的电源,能够处理高达 2 安培的电流峰值,它无法通过 ESP 的 3.3V 电源供电。但是,您可以直接连接 TXRX 线路,无需任何电平转换器。

# 示例配置项
sim800l:
on_sms_received:
- logger.log:
format: "从 %s 收到 '%s'"
args: [ 'message.c_str()', 'sender.c_str()' ]
  • uart_id (可选, ID): 手动指定 UART 集线器的 ID。

  • id (可选, ID): 手动指定用于代码生成的 ID。

  • on_sms_received (可选, 自动化): 收到短信时执行的操作。请参阅 on_sms_received 触发器

  • on_incoming_call (可选, 自动化): 收到来电时执行的操作。请参阅 on_incoming_call 触发器

  • on_call_connected (可选, 自动化): 通话连接时执行的操作,无论是拨出的电话被接受还是接听来电。

  • on_call_disconnected (可选, 自动化): 通话断开时执行的操作。

sensor:
- platform: sim800l
rssi:
name: "Sim800L RSSI"
  • rssi (可选): 报告的接收信号强度指示 (RSSI),单位为 dBm。

binary_sensor:
- platform: sim800l
registered:
name: "Sim800L 已注册"
  • registered (可选): 指示 SIM800L 是否已成功注册到蜂窝网络。

使用此配置选项,您可以在收到短信时编写复杂的自动化。要使用消息内容,请使用 lambda 模板,消息内容和发送者电话号码在该 lambda 中分别通过名为 messagesender 的变量可用。

on_sms_received:
- lambda: |-
id(sms_sender).publish_state(sender);
id(sms_message).publish_state(message);

每当 SIM800L 发送 RING / 来电显示消息时,此自动化就会触发,此消息每次通话会发送多次,据推测每次电话”响铃”时都会发送。自动化提供一个 caller_id 字符串参数,其中包含接收到的信息。电话既不会被接听也不会被拒绝。

on_incoming_call:
- logger.log:
format: "来自 '%s' 的来电"
args: ["caller_id.c_str()"]
- lambda: |-
id(caller_id_text_sensor).publish_state(caller_id);
- sim800l.disconnect
- homeassistant.event:
event: esphome.incoming_call_event
data:
payload: !lambda 'return id(caller_id_text_sensor).state;'

使用此配置选项,您可以在收到网络的 USSD 代码时编写复杂的自动化。

on_ussd_received:

在自动化中使用此操作向电话收件人发送短信。

on_...:
then:
- sim800l.send_sms:
recipient: '+15551234567'
message: 你好
# 使用模板:
- sim800l.send_sms:
recipient: !lambda |-
if (id(reed_switch).state) return "+15551234567";
else return "15551234568";
message: !lambda |-
return id(reed_switch).state ? "门现在打开" : "嘿,门刚刚关闭";
  • recipient (必需, 字符串, 可模板化): 消息收件人号码。

  • message (必需, 字符串, 可模板化): 消息内容。

  • id (可选, ID): 如果您有多个组件,手动指定 SIM800L 的 ID。

在自动化中使用此操作拨打电话收件人。

on_...:
then:
- sim800l.dial:
recipient: '+15551234567'
  • recipient (必需, 字符串, 可模板化): 要拨打的号码。
  • id (可选, ID): 如果您有多个组件,手动指定 SIM800L 的 ID。

接听来电。

on_...:
then:
- sim800l.connect

断开通话,无论是拨出的还是接听的。

on_...:
then:
- sim800l.disconnect

向网络发送 USSD 代码。

on_...:
then:
- sim800l.send_ussd

以下代码将帮助您完成配置,在 Home Assistant 上更新接收到的消息,并设置一个服务,以便您可以使用 SIM800L 发送消息和拨打电话。

api:
actions:
- action: send_sms
variables:
recipient: string
message: string
then:
- sim800l.send_sms:
recipient: !lambda 'return recipient;'
message: !lambda 'return message;'
- action: dial
variables:
recipient: string
then:
- sim800l.dial:
recipient: !lambda 'return recipient;'
- action: connect
then:
- sim800l.connect
- action: disconnect
then:
- sim800l.disconnect
- action: send_ussd
variables:
ussdCode: string
then:
- sim800l.send_ussd:
ussd: !lambda 'return ussdCode;'
text_sensor:
- platform: template
id: sms_sender
name: "短信发送者"
- platform: template
id: sms_message
name: "短信内容"
- platform: template
id: caller_id_text_sensor
name: "来电号码"
- platform: template
id: ussd_message
name: "USSD 代码"
uart:
baud_rate: 9600
tx_pin: TX
rx_pin: RX
sim800l:
on_sms_received:
- lambda: |-
id(sms_sender).publish_state(sender);
id(sms_message).publish_state(message);
on_incoming_call:
- lambda: |-
id(caller_id_text_sensor).publish_state(caller_id);
on_call_connected:
- logger.log:
format: 通话已连接
on_call_disconnected:
- logger.log:
format: 通话已断开
on_ussd_received:
- lambda: |-
id(ussd_message).publish_state(ussd);

现在您最新收到的短信和发送者号码将通过文本传感器显示。

要从 Home Assistant 触发自动化,您可以使用以下代码调用服务:

automation:
# ...
action:
- action: esphome.livingroom_send_sms
data:
recipient: "+15551234567"
message: "你好世界!"
- action: esphome.livingroom_dial
data:
recipient: "+15551234567"

从授权发送者接收继电器管理命令:

sim800l:
on_sms_received:
- lambda: |-
if ( (id(sms_sender).state == "+79991234567") && ( (id(sms_message).state == "relay_1_on") || (id(sms_message).state == "Relay_1_on") ) ) {
id(relay_1).turn_on();
}
switch:
- platform: gpio
id: relay_1
pin: GPIOXX