跳转到内容

Sim800L 组件

SIM800L 组件提供了拨号、接听电话、收发 SMS 短信以及收发 USSD 代码的能力。该设备必须通过支持发送和接收线路的 UART 总线 连接。UART 总线必须以与模块相同的速率配置,默认值为 9600bps。所需的连接导线为 +VCC、GND、RX 和 TX。

WARNING

如果你使用了 Logger,请确保不要将 TX 和 RX 使用同一引脚,否则请使用 baud_rate: 0 选项禁用 UART 日志记录。

NOTE

该模块需要电压在 3.8V 至 4.2V 之间、能承受最高 2 安培电流峰值的电源;仅使用 ESP 相同的 3.3V 电源将无法工作。不过你可以直接将 TX 和 RX 线路连接,无需电平转换器。

# 示例配置条目
sim800l:
on_sms_received:
- logger.log:
format: "Received '%s' from %s"
args: [ 'message.c_str()', 'sender.c_str()' ]
  • uart_id (可选, ID): 手动指定 UART 中心的 ID。

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

  • on_sms_received (可选, Automation): 收到 SMS 时要执行的动作。参见 on_sms_received 触发器。

  • on_incoming_call (可选, Automation): 收到来电时要执行的动作。参见 on_incoming_call 触发器。

  • on_call_connected (可选, Automation): 电话接通时要执行的动作,原因可能是外拨电话被接听或来电被接听。

  • on_call_disconnected (可选, Automation): 电话断开时要执行的动作。

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

    • 所有选项来自 Sensor。
binary_sensor:
- platform: sim800l
registered:
name: "Sim800L Registered"
  • registered (可选): 指示 SIM800L 是否已在蜂窝网络中成功注册。

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

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: "Incoming call from '%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: Hello there
# 模板化:
- sim800l.send_sms:
recipient: !lambda |-
if (id(reed_switch).state) return "+15551234567";
else return "15551234568";
message: !lambda |-
return id(reed_switch).state ? "Door is now OPEN" : "Hey door just CLOSED";
  • recipient (必选, string, 可模板化): 消息收件人的号码。

  • message (必选, string, 可模板化): 消息内容。

  • id (可选, ID): 如果你使用了多个组件,可手动指定 SIM800L 的 ID。

在自动化中使用此动作拨打到某个手机号码。

on_...:
then:
- sim800l.dial:
recipient: '+15551234567'
  • recipient (必选, string, 可模板化): 要拨打的号码。
  • 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: "Sms Sender"
- platform: template
id: sms_message
name: "Sms Message"
- platform: template
id: caller_id_text_sensor
name: "Caller ID"
- platform: template
id: ussd_message
name: "Ussd Code"
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: Call connected
on_call_disconnected:
- logger.log:
format: Call disconnected
on_ussd_received:
- lambda: |-
id(ussd_message).publish_state(ussd);

此时最新收到的短信和发送方号码将通过文本传感器显示出来。

要触发来自 Home Assistant 的自动化,你可以用以下代码调用服务:

automation:
# ...
action:
- action: esphome.livingroom_send_sms
data:
recipient: "+15551234567"
message: "Hello World!"
- 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