『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 854|回复: 4

[硬件DIY] 天逸功放接入HA

[复制链接]

16

主题

59

帖子

636

积分

论坛分享达人

积分
636
金钱
577
HASS币
10
发表于 2024-6-3 16:22:27 | 显示全部楼层 |阅读模式
本帖最后由 wz199021 于 2024-6-4 18:24 编辑

天逸功放3100通过esp8266接入homeassistant所需材料:D1_mini   TTL转232公头
代码:
esphome:
  name: hd3100
  friendly_name: HD3100

esp8266:
  board: d1_mini

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "eSWRH8ZJd7gYqDIqE6/O6OBkwkyaaztRbjX9maRIpPdKM="

ota:
  password: "11045507f3d76e675714zaq7282a78d0f74"

wifi:
  ssid: "xxxxxxxxx"
  password: "xxxxxxxxx"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Hd3100 Fallback Hotspot"
    password: "rVIShU1IeE06"

captive_portal:

web_server:
  port: 80

uart:
  tx_pin: GPIO1  # 对应D10
  rx_pin: GPIO3  # 对应D9
  baud_rate: 9600
  id: uart_bus

globals:
  - id: amplifier_status
    type: bool
    restore_value: no
    initial_value: 'false'

  - id: signal_source
    type: std::string
    restore_value: no
    initial_value: '"HDMI1"'

  - id: volume_level
    type: float
    restore_value: no
    initial_value: '50.0'

switch:
  - platform: template
    name: "Amplifier Power"
    lambda: |-
      return id(amplifier_status);
    turn_on_action:
      - uart.write: "##POWER ON*"
      - lambda: |-
          id(amplifier_status) = true;
    turn_off_action:
      - uart.write: "##POWER OFF*"
      - lambda: |-
          id(amplifier_status) = false;

  - platform: template
    name: "Set Signal Source to HDMI1"
    turn_on_action:
      - uart.write: "##SI 00*"
      - lambda: |-
          id(signal_source) = "HDMI1";

  - platform: template
    name: "Set Signal Source to HDMI2"
    turn_on_action:
      - uart.write: "##SI 01*"
      - lambda: |-
          id(signal_source) = "HDMI2";

  - platform: template
    name: "Set Signal Source to HDMI3"
    turn_on_action:
      - uart.write: "##SI 02*"
      - lambda: |-
          id(signal_source) = "HDMI3";

  - platform: template
    name: "Set Signal Source to HDMI4"
    turn_on_action:
      - uart.write: "##SI 03*"
      - lambda: |-
          id(signal_source) = "HDMI4";

  - platform: template
    name: "Set Signal Source to HDMI5"
    turn_on_action:
      - uart.write: "##SI 04*"
      - lambda: |-
          id(signal_source) = "HDMI5";

  - platform: template
    name: "Set Signal Source to HDMI6"
    turn_on_action:
      - uart.write: "##SI 05*"
      - lambda: |-
          id(signal_source) = "HDMI6";

binary_sensor:
  - platform: status
    name: "Amplifier Connectivity"

text_sensor:
  - platform: template
    name: "Current Signal Source"
    lambda: |-
      return {id(signal_source)};
    id: current_signal_source

sensor:
  - platform: template
    name: "Current Volume"
    lambda: |-
      return id(volume_level);
    id: current_volume

interval:
  - interval: 10s
    then:
      - logger.log:
          format: "Sending status requests to amplifier"
          level: DEBUG
          tag: main
      - uart.write: "##POWER ?*"
      - delay: 500ms
      - uart.write: "##SI ?*"
      - delay: 500ms
      - uart.write: "##VOL ?*"

  - interval: 1s
    then:
      - lambda: |-
          static std::string received = "";
          while (id(uart_bus).available()) {
            uint8_t byte;
            id(uart_bus).read_byte(&byte);
            char c = static_cast<char>(byte);
            if (c == '*') {
              // Process complete command
              ESP_LOGD("uart", "Received: %s", received.c_str());
              if (received.find("#POWER ON") != std::string::npos) {
                id(amplifier_status) = true;
                ESP_LOGD("uart", "Amplifier turned ON");
              } else if (received.find("#POWER OFF") != std::string::npos) {
                id(amplifier_status) = false;
                ESP_LOGD("uart", "Amplifier turned OFF");
              } else if (received.find("#SI ") != std::string::npos) {
                // Process signal source status
                size_t pos_index = received.find("#SI ") + 4;
                size_t pos_end = received.find(" ", pos_index);
                std::string source_number = received.substr(pos_index, pos_end - pos_index);

                std::string source_name;
                if (source_number == "00") {
                  source_name = "HDMI1";
                } else if (source_number == "01") {
                  source_name = "HDMI2";
                } else if (source_number == "02") {
                  source_name = "HDMI3";
                } else if (source_number == "03") {
                  source_name = "HDMI4";
                } else if (source_number == "04") {
                  source_name = "HDMI5";
                } else if (source_number == "05") {
                  source_name = "HDMI6";
                } else {
                  source_name = "UNKNOWN";
                }

                id(signal_source) = source_name;
                ESP_LOGD("uart", "Signal source name: %s", source_name.c_str());

                // Update Home Assistant state
                id(current_signal_source).publish_state(source_name);
              } else if (received.find("#VOL ") != std::string::npos) {
                // Process volume level
                size_t pos_index = received.find("#VOL ") + 5;
                size_t pos_end = received.find("*", pos_index);
                std::string volume_str = received.substr(pos_index, pos_end - pos_index);
                float volume = std::stof(volume_str);
                id(volume_level) = volume;
                ESP_LOGD("uart", "Volume level: %f", volume);

                // Update Home Assistant state
                id(current_volume).publish_state(volume);
              }
              // Clear the received string for the next command
              received.clear();
            } else {
              received += c;
            }
          }

回复

使用道具 举报

18

主题

266

帖子

2160

积分

论坛DIY达人

积分
2160
金钱
1889
HASS币
20
发表于 2024-6-3 17:22:10 | 显示全部楼层
这种提问方式很难有回复。您还不如把功放的RS232国际标准控制协议分享一下。
回复

使用道具 举报

20

主题

133

帖子

850

积分

高级会员

Rank: 4

积分
850
金钱
717
HASS币
0
发表于 2024-6-3 22:08:25 | 显示全部楼层
为什么 ,不用红外去控制功放呢?而使用串口 来控制
回复

使用道具 举报

18

主题

266

帖子

2160

积分

论坛DIY达人

积分
2160
金钱
1889
HASS币
20
发表于 2024-6-4 09:22:18 | 显示全部楼层
本帖最后由 polisher 于 2024-6-4 09:28 编辑

建议您用串口调试助手,测试一下协议与硬件的对应关系。
在您的代码中,切换HDMI用的是 "##SI 1*",根据协议的定义,这个是切换到输入端口1。如果要切换至HDMI1,应该是“##SI HD1*”
咱没玩过功放,不敢给出准确答案。另,天逸是否完全遵从了标准协议,也需要您自行确认。


回复

使用道具 举报

16

主题

59

帖子

636

积分

论坛分享达人

积分
636
金钱
577
HASS币
10
 楼主| 发表于 2024-6-4 10:09:42 | 显示全部楼层
已经成了。
信号源和音量都好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 22:56 , Processed in 0.369370 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表