XIAO IR Mate 智能红外遥控器入门指南(适用于 Home Assistant)
欢迎使用 XIAO IR Mate 智能红外遥控器!该设备专为 Home Assistant 用户设计,旨在提供无缝、高效且集成的智能红外遥控解决方案。通过本指南,您将学习如何设置设备、将其连接到家庭网络、集成到 Home Assistant 中,并释放其全部潜力,从基本信号学习到高级智能空调控制。

简介
XIAO IR Mate 是一款基于 Seeed Studio XIAO ESP32-C3 的紧凑型智能红外模块。它集成了红外发射和接收、触摸感应、振动反馈和状态指示功能。通过 Wi-Fi 连接,可以完美集成到您的 Home Assistant 智能家居生态系统中。其核心使命是让所有使用红外遥控器的传统家电(如电视、空调、风扇等)变得"智能",并允许您通过 HA 控制它们进行自动化。






- 与 Home Assistant 无缝集成
基于 ESPHome 平台构建,IR Mate 可被 Home Assistant 自动发现,提供简单的实体以便轻松进行自动化和脚本编写。
- 强大的红外学习和发射功能
配备三个高功率红外发射器,实现 360° 覆盖,以及一个高灵敏度接收器。支持从标准遥控器学习多达 10 个红外命令(例如控制投影仪、空调、定时器),可在 Home Assistant 中一键回放。
- 直观的物理交互反馈
配备振动马达和 LED 指示灯。短振动确认操作,长振动表示学习模式,LED 显示网络状态,简化设置和故障排除。
- 可升级为狂热智能空调控制器
刷入自定义固件可将 IR Mate 转换为智能空调遥控器。在 Home Assistant 中直接设置精确的温度、模式和风扇速度,具有自动红外代码生成功能,无需重复学习。
- 紧凑设计,USB-C 供电
硬件概述
了解设备的基本组件将帮助您更好地使用它:
- 主控制器:Seeed Studio XIAO ESP32-C3,提供强大的性能和 Wi-Fi 连接。
- 电源供应:通过板载 Type-C 端口供电(5V)。
- 红外发射器:3 个高功率红外 LED(使用引脚 D1),确保 360° 信号传输无盲点。
- 红外接收器:1 个高精度红外接收器(使用引脚 D2),用于学习其他遥控器的信号。
- 触摸传感器:设备集成了触摸模块(使用引脚 D3)。单次触摸触发短振动(0.5 秒)作为操作反馈。
- 振动马达:内置振动马达(使用引脚 D4)提供清晰的触觉反馈,具有不同的振动持续时间。
- 状态指示 LED:LED 灯(使用引脚 D5)用于指示设备的不同工作状态。
- 复位按钮:设备上的物理按钮(连接到引脚 D0),用于重启或恢复出厂设置。
首次使用和网络配置(出厂固件)
当您首次获得设备时,请按照以下步骤完成初始设置。
步骤 1:开机
使用标准 USB Type-C 线缆为设备供电。启动后,设备将进入等待配置状态,您将看到白色 LED 以 1Hz 频率闪烁。
步骤 2:进入 AP 配网模式
当网络未配置时,设备将自动创建一个名为 XIAO IR Mate(或 Seeed_ir,取决于您找到的名称)的 Wi-Fi 热点(AP)。
步骤 3:连接热点并配置网络
- 在您的手机或电脑上打开 Wi-Fi 设置,搜索并连接到名为 XIAO IR Mate 的网络。
热点的默认网络密码为 '12345678'。
- 连接成功后,您的设备通常会自动打开配置页面。如果没有,请手动打开浏览器并访问 http://192.168.4.1。
- 在此页面上,您将看到 Wi-Fi 网络列表。请选择您家的 2.4GHz Wi-Fi 网络(SSID) 并输入正确的密码。
- 点击 "Connect" 或 "Save"。设备将尝试连接到您提供的 Wi-Fi 网络。
步骤 4:连接成功
一旦设备成功连接到您的家庭 Wi-Fi,AP 热点将自动关闭,状态指示灯将变为常亮。网络配置现已完成。
Home Assistant 集成(出厂固件)
设备固件基于 ESPHome,使其很容易集成到 Home Assistant 中。
- 自动发现:确保您的 Home Assistant 主机和 XIAO IR Mate 连接到同一本地网络。通常,HA 会自动发现新的 ESPHome 设备。您将在 Settings > Devices & Services 中看到"发现新设备"的通知。
- 手动添加:如果未自动发现,您可以点击右下角的 [Add Integration] 按钮,搜索 "ESPHome",然后输入设备的主机名(例如 xiao-ir-mate)或 IP 地址来手动添加。




- 设备仪表板:成功添加后,XIAO IR Mate 将作为设备出现在 HA 中。其仪表板将包含以下实体,用于控制 10 个不同的红外信号:
核心功能详情(出厂固件)
如果您想恢复设备或更新其固件,可以通过下面的按钮跳转。我们创建了一个专门用于 XIAO Gadget 直接刷写固件的页面。
红外信号学习
当您需要教 IR Mate 学习新的遥控器命令时,请按照以下步骤操作。出厂固件的核心界面包括信号槽选择列表,以及 Learn 和 Send 按钮。
- 在 Home Assistant 设备仪表板中,首先找到名为 "Signal" 的下拉选择列表。
- 点击下拉列表并选择您要使用的信号槽,例如 "signal_1"。
- 选择后,找到 "Learn" 按钮并点击其旁边的 "PRESS"。
- XIAO IR Mate 现在将进入学习模式并开始持续振动,表示您可以开始配对。
- 将您的原始遥控器对准 IR Mate 的红外接收器窗口,短按您要学习的按钮。
- IR Mate 成功接收并记录信号后,振动将停止,表示学习成功。
- 此时,名为 "Is Learned Signal" 的状态指示器将自动变为 "ON",表示下拉列表中当前选择的信号槽(即 "signal_1")现在已存储了信号。
红外信号发送
一旦信号成功学习后,您可以随时发送它。
- 在 "Signal" 下拉列表中,确保您已选择要发送的信号槽,例如 "signal_1"。
- 找到 "Send" 按钮,点击旁边的 "PRESS"。
- XIAO IR Mate 将立即通过其 3 个红外发射器发送存储在当前选定槽中的信号。
- 注意:如果您在下拉列表中选择了从未学习过信号的信号槽,点击发送按钮将不会有任何效果。
物理交互与状态指示
除了 HA 控制外,您还可以通过物理交互来了解和控制设备。
状态指示灯(白色 LED)
- 慢闪烁(1Hz):设备正在等待连接到 Wi-Fi 网络。
- 常亮:设备已成功连接到 Wi-Fi 网络并正常运行。
振动反馈
- 短振动(100ms):用于一般操作确认,例如触摸设备时。
- 长振动(500ms):用于重要状态提醒,例如进入学习模式或执行恢复出厂设置时。
RESET 按钮
- 短按(1 秒内):设备将重启,伴随短振动。如果设备无响应,这非常有用。
- 长按(超过 5 秒):设备将执行恢复出厂设置。此操作将清除所有保存的 Wi-Fi 凭据和所有 10 个学习的红外信号。执行此操作时,设备将发出长振动作为提示。完成后,设备将重启并返回到初始等待配置状态(LED 闪烁)。
高级用法 - 智能空调控制
出厂固件提供的基本"录制-重放"模式是通用的,但在控制具有多种状态的设备(如空调的温度、模式、风速等)时可能显得笨拙。为了实现更精细、更智能的空调控制,我们可以刷入专用的 ESPHome 固件,将 XIAO IR Mate 从"红外信号重复器"转变为真正的"智能空调控制器"。
在本章中,我们将以格力空调为详细示例,但这绝不是唯一选择。ESPHome 强大的生态系统支持众多空调品牌,您可以轻松按照本指南中的概念,对配置代码进行微小更改,实现对美的、大金、松下等其他品牌的智能控制。
核心优势
- 状态化控制:不再是简单的重放。您可以在 HA 中直接设置"24°C,制冷,自动风速",设备将立即生成并发送正确的红外命令。
- 更友好的界面:在 HA 中显示为标准的 Climate 卡片,操作直观。
- 节省空间:无需为每个温度或模式学习单独的信号;一个配置即可控制所有空调功能。
前提条件
- 安装 ESPHome:如果您还没有安装,请从 Home Assistant Add-on Store 安装并启动 ESPHome 插件。
- 获取您的空调品牌协议:ESPHome 支持许多空调品牌协议(如格力、美的、大金等)。您需要知道您的空调品牌以选择正确的协议。
刷入自定义固件
- 创建新设备配置
- 在 HA 中打开 ESPHome 界面。
- 点击右下角的 "+ NEW DEVICE" 按钮,在弹出窗口中点击 "Continue"。
- 为您的设备命名(例如 xiao-ir-ac-controller),然后选择板型为 Seeed Studio XIAO ESP32C3。
- 编辑配置文件
- 点击新创建的设备卡片上的 EDIT 按钮进入 YAML 配置编辑器。
- 删除编辑器中的所有默认内容。
- 完全复制并粘贴下面的代码到编辑器中:
seeed-ir-v2.yaml
# ==== AUTO-SYNC START: xiao_smart_ir_mate/xiao_smart_ir_mate.yaml ====
substitutions:
name: "xiao-smart-ir-mate"
friendly_name: "XIAO Smart IR Mate"
esphome:
name: "${name}"
friendly_name: "${friendly_name}"
name_add_mac_suffix: True
project:
name: "xiao.smart-ir-mate"
version: "2.0"
esp32:
board: seeed_xiao_esp32c3
framework:
type: arduino
globals:
- id: is_wifi_connected
type: bool
initial_value: 'false'
- id: reset_press_time
type: uint32_t
initial_value: '0'
- id: touch_timer
type: unsigned long
restore_value: no
initial_value: '0'
# open or close the learning mode
- id: is_learning_mode
type: bool
initial_value: 'false'
# signal index , you can select the signal index on ESPHome
- id: signal_select_index
type: int
restore_value: no
initial_value: '0'
# Read the signals stored in nvs and store them in this vector
- id: send_data_vector
type: std::vector<long int>
restore_value: no
- id: filter_size
type: int
initial_value: '10'
# Enable logging
logger:
level: INFO
# Enable Home Assistant API
api:
ota:
- platform: esphome
password: "15afb09b5aba7b3d6a6ba01180c60df5"
wifi:
# ssid: !secret wifi_ssid
# password: !secret wifi_password
on_connect:
- globals.set:
id: is_wifi_connected
value: 'true'
- light.turn_on: rgb_light
- lambda: |-
ESP_LOGI("ir", "IP address: %s", ::esphome::wifi::global_wifi_component->wifi_sta_ip_addresses()[0].str().c_str());
on_disconnect:
- globals.set:
id: is_wifi_connected
value: 'false'
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
# ssid: "XIAO Smart IR Mate"
password: "12345678"
captive_portal:
# Custom components
external_components:
- source:
type: git # git component
url: https://github.com/Seeed-Studio/xiao-esphome-projects # Path where the component is github
ref: main # Branch name
components: [Flash_comp] # Explicitly specify the components to import
# Component name
Flash_comp:
id: signal_nvs # Component id
remote_transmitter:
id: my_transmitter
pin: GPIO3
carrier_duty_percent: 50%
remote_receiver:
- id: rcvr
pin:
number: GPIO4
inverted: true
# Idle time, if the low level exceeds this time, it is considered as a new segment of the signal
# That is "segmentation"
idle: 65500us
# Important, this parameter is used to segment the infrared signal
# If a certain segment of the infrared signal is too long, it may be divided into several segments
# For such a case, you must send the infrared signal strictly according to the corresponding timing, otherwise it will fail
# If you don't want it to be segmented, you can reduce the frequency and adjust the idle parameter to make it receive as complete as possible
clock_resolution: "500000"
# Receive data: using raw data
# In the infrared parsing of esphome, a signal (e.g., NEC) may be parsed into multiple signals (e.g., JVC, Pronto, etc.).
# Here, we only retain the original signal and do not decode the protocol.
on_raw:
- switch.turn_off: vibration_switch
- lambda: |-
if (id(is_learning_mode)) {
if (x.size() > id(filter_size)){
ESP_LOGI("ir", "Saved signal index: %d", id(signal_select_index));
id(signal_nvs).save_to_nvs(id(signal_select_index), x);
id(send_data_vector).clear();
id(send_data_vector) = id(signal_nvs).load_from_nvs<long int>(id(signal_select_index));
id(is_learning_mode) = false;
// Learned the signal, turn on the switch
id(is_learned_signal_script).execute(true);
}
}
button:
# Button in learning mode, you need to open learning mode first, and the signal will be saved
- platform: template
id: learn
name: "Learn"
on_press:
- switch.turn_on: vibration_switch
- lambda: |-
id(is_learning_mode) = true;
ESP_LOGI("ir", "Learning mode activated!");
# Button in sending mode, according to your current index, read the signal from nvs and send it
# Since it's using a script to send, it will always trigger a log print whether the sending is successful or not
# That is, it will print Sending signal index
# So when there is a log print but the control doesn't work, you need to write a separate receiving code to analyze the data
# It is recommended to use the example program in the Arduino IRremote library.
- platform: template
id: transmit
name: "Send"
on_press:
- lambda: |-
if (id(send_data_vector).size() > 0) {
id(send_raw).execute();
ESP_LOGI("ir", "Sending signal index: %d", id(signal_select_index));
ESP_LOGI("ir", "Sending signal size: %d", id(send_data_vector).size());
} else {
ESP_LOGI("ir", "Signal index %d not learned", id(signal_select_index));
}
# Signal selection dropdown list
# Provides ten signals to choose from, and records the index
select:
- platform: template
name: signal_select
id: signal_select
options:
- "Signal0"
- "Signal1"
- "Signal2"
- "Signal3"
- "Signal4"
- "Signal5"
- "Signal6"
- "Signal7"
- "Signal8"
- "Signal9"
initial_option: "Signal0"
optimistic: true
on_value:
- lambda: |-
id(signal_select_index) = i;
ESP_LOGI("ir", "Current selected signal index: %d", i);
id(send_data_vector).clear();
id(send_data_vector) = id(signal_nvs).load_from_nvs<long int>(id(signal_select_index));
if (id(send_data_vector).size() > 0) {
id(is_learned_signal_script).execute(true);
} else {
id(is_learned_signal_script).execute(false);
}
switch:
- platform: output
id: vibration_switch
name: "Vibration device"
output: vibration_output
- platform: factory_reset
id: factory_switch
name: "Restart with Factory Default Settings"
# Has the signal been learned?
# If the signal has been learned, turn on this switch.
# Otherwise, turn off this switch.
- platform: template
id: is_learned_signal_switch
name: "Is Learned Signal?"
optimistic: true
light:
- platform: esp32_rmt_led_strip
rgb_order: GRB
pin: GPIO7 # D5
num_leds: 1
chipset: WS2812
name: "WIFI RGB Light"
id: rgb_light
rmt_symbols: 48
binary_sensor:
- platform: gpio
id: touch_pad
pin:
number: GPIO5 # D3
mode: INPUT_PULLDOWN
on_state:
then:
- lambda: |-
id(vibe).execute(100);
id(touch_timer) = millis();
if (id(check_touch_delay).is_running()) {
id(check_touch_delay).stop();
delay(10);
}
id(check_touch_delay).execute();
- platform: gpio
id: reset_button
pin:
number: GPIO9 # D9
mode: INPUT_PULLUP
filters:
invert
on_press:
then:
- lambda: |-
id(reset_press_time) = millis();
on_release:
then:
- lambda: |-
uint32_t press_duration = millis() - id(reset_press_time);
if (press_duration < 5000) {
id(vibe).execute(100);
ESP_LOGI("ir", "Restart Device");
ESP.restart();
} else {
// clear all learned signals
for (int i = 0; i < 10; i++) {
id(signal_nvs).clear_signal_by_index(i);
}
ESP_LOGI("ir", "Restart with Factory Default Settings");
id(vibe).execute(500);
id(factory_switch).turn_on();
}
output:
- platform: gpio
id: vibration_output
pin: GPIO6 # D4
script:
- id: vibe
parameters:
delay_ms: int
then:
- switch.turn_on: vibration_switch
- delay: !lambda return delay_ms;
- switch.turn_off: vibration_switch
- id: check_touch_delay
then:
- delay: 300ms
- lambda: |-
unsigned long current_time = millis();
if (current_time - id(touch_timer) >= 300) {
ESP_LOGI("check click", "single click action");
id(transmit).press();
}
# Send infrared signal
# The saved signal is the original signal, we do not encode or decode, just send
- id: send_raw
then:
- remote_transmitter.transmit_raw:
code: !lambda return id(send_data_vector);
carrier_frequency: 38000Hz
repeat: 1
# Used to indicate whether the signal can be sent
# If there is a signal, turn on the switch
# Otherwise, turn off the switch
- id: is_learned_signal_script
parameters:
is_learned_signal: bool
then:
- lambda: |-
if (is_learned_signal) {
id(is_learned_signal_switch).turn_on();
} else {
id(is_learned_signal_switch).turn_off();
}
interval:
- id: blink_rgb
interval: 500ms
then:
- lambda: |-
if (!id(is_wifi_connected)) {
static int state = 0;
if (state == 1) {
auto call = id(rgb_light).turn_on();
call.set_rgb(1.0, 1.0, 1.0);
call.set_transition_length(0);
call.perform();
} else {
auto call = id(rgb_light).turn_off();
call.set_transition_length(0);
call.perform();
}
state = !state;
}
# ==== AUTO-SYNC END ====
- 自定义您的配置
- Wi-Fi:如果您不使用
!secret文件,请取消注释wifi:部分,并将Your_WiFi_SSID和Your_WiFi_Password替换为您自己的 Wi-Fi 信息。 - 选择正确的空调协议:这是最关键的步骤!示例使用
platform: gree。如果您的空调不是格力品牌,请将其替换为您品牌的平台。如何找到支持的品牌?请访问 ESPHome Climate Components 页面,该页面列出了所有支持的品牌及其平台名称(例如daikin、midea、panasonic_ac等)。- 选择相应平台后,您可能还需要根据该平台的文档微调
model或支持的模式等参数。
- 选择相应平台后,您可能还需要根据该平台的文档微调
- Wi-Fi:如果您不使用
- 编译和刷写
- 保存您的 YAML 配置。
- 通过 USB 线将您的 XIAO IR Mate 连接到运行 HA 的计算机。
- 点击设备卡片上的 INSTALL 按钮。
- 选择 "Plug into this computer" 选项。
- ESPHome 将编译固件并通过浏览器将其刷写到您的设备。按照屏幕提示完成该过程。
- 刷写成功后,设备将自动重启并连接到您配置的 Wi-Fi。
在 Home Assistant 中使用
刷写和重启后,您的设备将在 Home Assistant 中显示为新的 Climate 实体(例如 climate.gree_air_conditioner)。您可以在仪表板中添加"恒温器卡片"以获得功能齐全的空调控制面板,让您可以自由调节温度、模式、风速和摆风,就像原生智能空调一样!
进一步展望:开拓您的思路
恭喜!到现在为止,您已经掌握了 XIAO IR Mate 的两个核心用途:一个是开箱即用的"万能遥控学习"功能,另一个是用于精确空调控制的"专业气候控制器"模式。
但不要止步于此,因为这只是开始!XIAO IR Mate 的真正乐趣在于其令人难以置信的灵活性。将其视为由您定义的"创意积木",您可以用它构建远超想象的东西。以下是两个开拓思路的想法来启发您:
想法 1:将旧遥控器复活为万能场景开关
应用场景
看看您周围。您是否有很多闲置的旧遥控器?旧电视、DVD 或音响的遥控器,有很多按钮,手感很好,现在只是在抽屉里积灰。如果您能使用这些遥控器上的按钮来控制智能灯、扫地机器人,甚至复杂的"回家"场景,那不是很酷吗?
工作原理
这个想法的核心是将 XIAO IR Mate 从"发射器"转变为"监听器"。它不再主动控制其他设备,而是静静地监听来自任何旧遥控器的信号,然后告诉 Home Assistant:"我听到了一个信号,您决定做什么!"
-
实施步骤
-
配置"监听器"固件: 在您的 ESPHome 固件中,核心配置是
remote_receiver组件。设备开机后的唯一工作就是"监听"红外信号。 -
识别每个按钮的"密码": 拿起一个旧遥控器,指向设备按任意按钮。在 ESPHome 日志中,您将看到按钮的唯一红外代码(如一串
RAW数据或NEC协议代码)。记下这个"密码"。 -
在 HA 中创建自动化规则: 在 Home Assistant 中,设置一个自动化,触发条件为:"当 XIAO IR Mate 检测到特定的红外密码时。"
-
定义动作: 规则的动作可以是任何事情!例如:
-
当检测到电视遥控器的"音量 +"按钮时 -> 启动扫地机器人开始清洁。
-
当检测到Apple Remote 的"播放"按钮时 -> 打开浴室灯。
-
当检测到DVD 遥控器的"红色"按钮时 -> 执行"离家模式"场景。
-
-
-
这种方法的优势
-
升级改造和环保: 为闲置硬件注入新生命,让电子垃圾重新发挥作用,既省钱又环保。
-
真实的触觉按钮体验: 与触摸屏相比,具有数十个不同、手感扎实按钮的物理遥控器在许多场景下更直接、更令人满意。
-
高妻子接受因子(WAF): 对于不习惯手机应用或智能音箱的家庭成员(如老人或儿童),告诉他们"按这个按钮开灯"是最直观、最容易学习的交互方式。
-
不需要充电的"智能开关": 传统遥控器的电池通常可以使用一到两年,这比许多需要频繁充电的智能设备方便得多。
-
想法 2:创建万能"IoT 魔法按钮"
核心概念
设备上的触摸按钮真的只能用于控制红外吗?当然不是!我们可以将其变成控制您家中任何东西的魔法按钮。关键是"解耦"——完全分离"按下按钮"的物理动作和"实际发生什么"的智能动作。
-
实施步骤
-
让按钮只做"报告者": 在固件中,配置触摸按钮(单击、双击、长按)不执行任何特定任务,只向 Home Assistant 发送"事件通知"。例如,双击时,它只向 HA 报告:"嘿!我被双击了!"
-
让 HA 成为"指挥官": 在 Home Assistant 中,创建专门监听按钮这些各种"报告"(事件)的自动化。
-
连接一切,做任何事: 一旦 HA 收到报告,它就可以命令您家中的任何设备执行动作!
-
收到**"单击"**报告 -> 切换房屋中所有 Zigbee 灯的开/关状态。
-
收到**"双击"报告 -> 命令扫地机器人**开始清洁。
-
收到**"长按"**报告 -> 执行"电影模式"场景,关闭窗帘、调暗灯光、打开投影仪和音响系统。
-
-
-
这种方法的优势
-
打破界限,无限可能: 您的触摸按钮不再只是"红外遥控器"的一部分,而是整个智能家居的物理开关,能够控制连接到 HA 的任何设备。
-
灵活定义,随心改变: 今天双击启动吸尘器,但明天您想让它播放音乐?只需在 HA 界面中编辑自动化,完全不需要触碰固件。
-
最直观的交互: 为您的家人提供最简单的控制方式。具有触觉反馈的物理按钮通常比打开手机应用更方便、更优雅。
-
总之,不要只将 XIAO IR Mate 视为红外工具。将其视为连接到 Wi-Fi 的迷你机器人,具有触觉和"声音"(红外发射器)。它能做什么只受您想象力的限制!
常见问题(FAQ)
问:为什么我在手机上找不到 XIAO IR Mate 的热点? 答: 请确认设备通过 Type-C 正常供电。检查白色 LED 是否闪烁。如果指示灯熄灭,请尝试更换线缆或电源。如果设备之前已成功配置到网络,除非网络连接失败或通过长按 RESET 按钮恢复出厂设置,否则不会再次创建 AP 热点。
问:红外学习失败怎么办?(出厂固件) 答: 请确保您的原始遥控器电池电量充足,并尽可能靠近 IR Mate 的接收器(通常是黑色半透明组件)。另外,避免在强光下或其他红外干扰源附近进行学习过程。
问:设备在 HA 中显示为离线? 答: 请检查您的家庭 Wi-Fi 是否正常工作,以及 IR Mate 是否在 Wi-Fi 信号范围内。您可以尝试短按 RESET 按钮重启设备。
问:刷写自定义固件后,如何恢复出厂固件? 答: 您需要获取出厂固件的
.bin文件或其 ESPHome YAML 源文件,然后通过 ESPHome 再次刷写以覆盖自定义固件。
问:如何在自动化中使用学习的信号(出厂固件)或空调控制(高级固件)? 答: 在 HA 的自动化或脚本编辑器中,选择 "Call service"。
资源
技术支持与产品讨论
感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。