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

 找回密码
 立即注册
查看: 97875|回复: 112

[集成接入] 把红外遥控器接入HA,用来控制灯光,开关,随便什么

  [复制链接]

20

主题

218

帖子

1466

积分

论坛DIY达人

积分
1466
金钱
1223
HASS币
100
发表于 2020-3-27 21:33:32 | 显示全部楼层 |阅读模式
本帖最后由 zro22 于 2020-3-28 20:04 编辑

现在啥东西都想用手机控制,倒是到最后我发现很多时候用手机反而很麻烦,打开APP-找到按钮-点击。
或者用小爱啥的,经常说几遍听不懂,气的想扔了。
所以我就思量有时候还是用遥控器最靠谱。
如果利用现有红外遥控器控制HA呢

总体架构是这样,红外(或者315 433射频)遥控器发射信号,接收头接收到信号后给到ESP,然后ESP交给MQTT。

HA里面根据MQTT内容执行相应的自动化。

硬件很简单,首先买个红外一体接收头 2块多钱。再买个ESP8266或者ESP32.

下载ESPHOME

连线也简单,红外接收头三个pin,看规格书,一个5v 一个GND 一个信号。
随便在esp上找一个脚连上信号。
esphome 加入如下代码.
也就是说在收到对应码的时候转发到MQTT。
remote_receiver:
  pin: 
    number: GPIO23
    inverted: True
    mode: INPUT_PULLUP
  dump: all
  on_nec:
    then:
    - mqtt.publish:
        topic: esphome32/senso/ir
        payload: !lambda |-
          char temp[20];
          sprintf(temp, "%d:%d", x.address, x.command);
          ESP_LOGI("main", "nec: %s", temp);
          return temp;
  on_panasonic:
    then:
    - mqtt.publish:
        topic: esphome32/senso/ir
        payload: !lambda |-
          char temp[20];
          sprintf(temp, "%d:%d", x.address, x.command);
          ESP_LOGI("main", "nec: %s", temp);
          return temp;          
  on_sony:
    then:
    - mqtt.publish:
        topic: esphome32/senso/ir
        payload: !lambda |-
          char temp[20];
          sprintf(temp, "%d:%d", x.data, x.nbits);
          ESP_LOGI("main", "nec: %s", temp);
          return temp; 
  on_jvc:        
    then:
    - mqtt.publish:
        topic: esphome32/senso/ir
        payload: !lambda |-
          char temp[20];
          sprintf(temp, "%d", x.data);
          ESP_LOGI("main", "nec: %s", temp);
          return temp; 
  on_rc5:        
    then:
    - mqtt.publish:
        topic: esphome32/senso/ir
        payload: !lambda |-
          char temp[20];
          sprintf(temp, "%d:%d", x.address, x.command);
          ESP_LOGI("main", "nec: %s", temp);
          return temp;

然后在HA里面写自动化就好了,
比如开灯
- alias: num4 toggle zoulangdeng
  trigger:
    platform: mqtt
    topic: 'esphome32/senso/ir'
    payload: "52530:29070"   # 4
  action:  
    - service: switch.toggle
      data:
        entity_id: switch.wall_switch_left_158d0xxxx 

以上是红外的例子,
还可以搞一个射频的中转,但是苦于没有好看的按键比较多的射频遥控器,所以我还没有做,但是ESP到MQTT我已经尝试了。
首先需要买一个可以解码射频转UART的模块。
然后把模块的TX GND VCC随便在esp板子上找个pin接好。
我参照网上的例子,自己简单改了一下,把如下代码保存成uarttext_sensor.h或者随便你想叫什么都可以。
#include "esphome.h"

using namespace esphome;

#define P1_MAXTELEGRAMLENGTH 1500
#define DELAY_MS 60000 // Delay in miliseconds before reading another telegram
#define WAIT_FOR_DATA_MS 2000

// Use data structure according to: https://github.com/matthijskooijman/arduino-dsmr


class CustomP1UartComponent : public Component, public uart::UARTDevice {
 protected:
   char telegram[P1_MAXTELEGRAMLENGTH];
   char c;
   int telegramlen;
   bool headerfound;
   bool footerfound;
   unsigned long lastread;
   int bytes_read;
  
  bool data_available() {
        // See if there's data available.
        unsigned long currentMillis = millis();
        unsigned long previousMillis = currentMillis; 
  
        //while (currentMillis - previousMillis < WAIT_FOR_DATA_MS) { // wait in miliseconds
        //        currentMillis = millis();
                if (available()) {
                        return true;
                }
//        }
        return false;  
  }  
   
  bool read_message() {
        //ESP_LOGD("DmsrCustom","Read message");
        headerfound = false;
        footerfound = false;
        telegramlen = 0;
        bytes_read = 0;
        unsigned long currentMillis = millis();
        unsigned long previousMillis = currentMillis;         
        
        if (available()) { // Check to be sure
                // Messages come in batches. Read until footer.
                //while (!footerfound && currentMillis - previousMillis < 5000) { // Loop while there's no footer found with a maximum of 5 seconds
                //        currentMillis = millis();
                        // Loop while there's data to read
                        while (available()) { // Loop while there's data 
                                if (telegramlen >= P1_MAXTELEGRAMLENGTH) {  // Buffer overflow
                                        headerfound = false;
                                        footerfound = false;
                                        ESP_LOGD("DmsrCustom","Error: Message larger than buffer");
                                        break;
                                }
                                //bytes_read++;
                                //c = read();
                                telegram[telegramlen++] = read();
                                } // While data available        
                        telegram[telegramlen] = 0;
                //} // !footerfound        
                  if(telegramlen>1)
                          s_energy_delivered_tariff1->publish_state(telegram);
                }         
        return false;          
  }

   
 public:
  CustomP1UartComponent(UARTComponent *parent) : UARTDevice(parent) {}
  TextSensor *s_energy_delivered_tariff1 = new TextSensor();
  
  void setup() override {
    lastread = 0;
        }
  
  void loop() override {
        unsigned long now = millis();
        
//        if (now - lastread > DELAY_MS || lastread == 0) {
//                lastread = now;
                if (data_available()) { // Check for x seconds if there's data available
                        
                        bool have_message = read_message();
                                        }        
//        }
  }        

};

然后在esphome里面配置text sensor

esphome:
  name: esphome32
  platform: ESP32
  board: nodemcu-32s
  includes:
   - uarttext_sensor.h

text_sensor:
  - platform: custom
    lambda: |-
      auto dsmr_p1_sensor = new CustomP1UartComponent(id(uart_bus1));
      App.register_component(dsmr_p1_sensor);
      return {dsmr_p1_sensor->s_energy_delivered_tariff1};
    text_sensors:
      name: "My Custom Text Sensor"
    
uart:
  - id: uart_bus1
    tx_pin: GPIO15
    rx_pin: GPIO35
    baud_rate: 9600

当uart收到消息时会更新textsensor,然后在MQTT里面就可以看到更新了。
当然esphome的mqtt别忘了打开
mqtt:
  broker: 192.168.xx.xxx
  username: admin
  password: xxxx

帖子没说esphome怎么搞,如果不懂esphome的先去搜索别的帖子搞懂esphome。
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 3金钱 +25 收起 理由
sorrypqa + 10 大神666!
firewater + 10 感谢楼主分享!
lzzmn + 5 感谢楼主分享!

查看全部评分

回复

使用道具 举报

20

主题

218

帖子

1466

积分

论坛DIY达人

积分
1466
金钱
1223
HASS币
100
 楼主| 发表于 2020-3-27 21:34:55 | 显示全部楼层
晕,代码部分怎么都被吃了?
回复

使用道具 举报

20

主题

218

帖子

1466

积分

论坛DIY达人

积分
1466
金钱
1223
HASS币
100
 楼主| 发表于 2020-3-27 21:42:39 | 显示全部楼层
我编辑了一次,怎么代码还是被吃掉了,这怎么搞
回复

使用道具 举报

8

主题

382

帖子

1779

积分

金牌会员

Rank: 6Rank: 6

积分
1779
金钱
1397
HASS币
0
发表于 2020-3-28 09:33:10 | 显示全部楼层
本帖最后由 peter5858 于 2020-3-28 09:34 编辑

谢谢分享!!代码重新上
回复

使用道具 举报

0

主题

17

帖子

103

积分

注册会员

Rank: 2

积分
103
金钱
86
HASS币
0
发表于 2020-3-28 13:27:12 | 显示全部楼层
感谢大佬分享
回复

使用道具 举报

123

主题

4664

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16442
金钱
11693
HASS币
45
发表于 2020-3-28 16:01:56 | 显示全部楼层
zro22 发表于 2020-3-27 21:42
我编辑了一次,怎么代码还是被吃掉了,这怎么搞

试试在纯文本模式下编辑,去掉那些blockquote。
回复

使用道具 举报

9

主题

269

帖子

2461

积分

金牌会员

Rank: 6Rank: 6

积分
2461
金钱
2192
HASS币
15
发表于 2020-3-28 19:47:48 | 显示全部楼层
不愧DIY达人
回复

使用道具 举报

20

主题

218

帖子

1466

积分

论坛DIY达人

积分
1466
金钱
1223
HASS币
100
 楼主| 发表于 2020-3-28 20:04:46 | 显示全部楼层
代码好了,要在纯文本下编辑
回复

使用道具 举报

5

主题

231

帖子

4470

积分

元老级技术达人

积分
4470
金钱
4224
HASS币
40
发表于 2020-3-28 20:38:55 | 显示全部楼层
zro22 发表于 2020-3-28 20:04
代码好了,要在纯文本下编辑

esp大佬 能不能帮写个串口转tcp的esphome插件啊....
回复

使用道具 举报

20

主题

218

帖子

1466

积分

论坛DIY达人

积分
1466
金钱
1223
HASS币
100
 楼主| 发表于 2020-3-28 20:47:28 | 显示全部楼层
81795791 发表于 2020-3-28 20:38
esp大佬 能不能帮写个串口转tcp的esphome插件啊....

为啥要转tcp呢?收到的数据直接发送到mqtt,然后从mqtt读取不就行了?
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-22 15:53 , Processed in 0.064736 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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