本帖最后由 hugh_jie 于 2019-11-15 12:55 编辑
自从开始玩HA,就天天想着接入各种设备,奈何兜里没几个钱,早就看不顺眼家里的窗帘了,前几天捡了个破产公司的垃圾,是zigbee HA协议的,有干触点,想过学论坛的大佬自制一个zigbee网关,但是感觉很复杂的样子,正好有现成的nodemcu,就想着干脆用继电器接算了。。。于是开始了折腾
先说硬件部分:
介绍一下我这个窗帘干触点的接线方式:
这就很好搞了,2路继电器分别控制两条控制线,公共线接COM
既然用了外挂的nodemcu,用于校准的两个传感器就很多选择了,干簧管,便宜
然后给窗帘滑车的铁片上贴上磁贴,搞定
接下来是软件部分:
esphome代码非常简单:
esphome:
name: cover
platform: ESP8266
board: nodemcuv2
wifi:
ssid: "bai"
password: "WiFi密码"
manual_ip:
static_ip: 192.168.0.221
gateway: 192.168.0.1
subnet: 255.255.255.0
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Cover Fallback Hotspot"
password: "bIBkVfMwtlLb"
captive_portal:
# Enable logging
logger:
# Enable Home Assistant API
api:
password: "HA需要输入的密码"
ota:
password: "同上"
switch:
- platform: gpio
pin: D5
name: "close"
id: relay1
interlock: [relay2]
- platform: gpio
pin: D0
name: "open"
id: relay2
interlock: [relay1]
binary_sensor:
- platform: gpio
pin:
number: D6
mode: INPUT_PULLUP
name: "100"
filters:
- invert:
- delayed_on: 10ms
- platform: gpio
pin:
number: D7
mode: INPUT_PULLUP
name: "0"
filters:
- invert:
- delayed_on: 10ms
两个继电器加入interlock: 的作用是互锁,避免同时打开了开和关
然后是HA的代码:
input_number:
livingromm_cover:
name: 窗帘开度
min: 0
max: 100
step: 10
initial: 0
效果是这样:
然后是自动化代码:参考[url=简单使用PWM控制MOS调光低压灯带 https://bbs.hassbian.com/thread-3615-1-1.html (出处: 『瀚思彼岸』» 智能家居技术论坛)]简单使用PWM控制MOS调光低压灯带 https://bbs.hassbian.com/thread-3615-1-1.html (出处: 『瀚思彼岸』» 智能家居技术论坛)[/url]非常感谢大佬的分享
- alias: Set temp slider
trigger:
platform: mqtt
topic: '/cover/0'
action:
- service: input_number.set_value
data_template:
entity_id: input_number.livingromm_cover
value: "{{ trigger.payload }}"
- alias: Temp slider moved
trigger:
platform: state
entity_id: input_number.livingromm_cover
action:
- service: mqtt.publish
data_template:
topic: '/cover/0'
retain: true
payload: "{{ states('input_number.livingromm_cover') | int }}"
接下来是node-red部分:(磕碰历程见我的求助贴~)
校准部分,两个干簧管
到达两端稳定后校准,通过mqtt发送给HA,通过自动化完成校准,trigger这个节点可以在设定时间内阻止重复信息,我一般用来做二元传感器的防抖~这个esphome里面也能完成,不过习惯啦,我设定的是2秒,可以自己调整
然后是核心部分:
思路是这样:mqtt接受到HA传过来的设定值(假定y)后,同时获取之前的位置值(x),通过比较x和y的大小确定电机的运行方向,同时通过x和y的差值乘上打开或者关闭窗帘的总时间就能获取到电机需要运行的时间,应该跟菲佣大佬写的博联窗帘插件一样的
关于获取当前值x的history节点,我设定的是前一秒,实际测试发现没啥问题,就没改了
需要修改的部分就是计算节点里面的10和11两个,分别是窗帘完全打开需要的时间和完全关闭的时间,,掐表哦,单位是秒
最后附上流:
flows.zip
(527 Bytes, 下载次数: 7)
|