本帖最后由 hugh_jie 于 2019-12-20 19:11 编辑
自从开始玩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, 下载次数: 23)
ps:搞这个的过程中遇到了2个难题,第一个是计算的格式不会写,这里感谢zhou1104提供的帮助,第二个是怎么把运行时间传递给后面的节点,翻了好多网页才找到了一个SetTimeout(),又是一通试,终于搞定了,感觉这个表达式的用处会很多,后面再研究研究,代码盲的辛酸泪
11.14更新:由于成品窗帘电机一般都有遇阻停止和减速功能,尤其是减速功能,多次微调窗帘位置(且不到头)后,再完全打开或关闭窗帘会导致窗帘不能到头,加上之前的一些BUG,进行如下更新:
1、滑动条增加“开度”,现在0代表关闭,100代表完全打开
2、esphome干簧管代码添加上拉
2、反馈逻辑添加了检测当前运行状态
3、增加手动打开或关闭到底后自动停止
4、添加了设定值y的预判断,当y=0或者100时直接调用手动操作,确保能够完全打开或者关闭
遗留问题:滑动条不具备实时模拟位置功能,设定后运行全是由node-red完成,运行时间内重复设定会造成操作结果不理想
新的流:
2019.11.14.zip
(3.45 KB, 下载次数: 18)
11.15更新:一种粗暴的小爱控制窗帘开度方式:
需求:小爱已接入node-red,小爱处理转发V3(参考flashsoft的[新奇玩法] 【20190614,修复日志路径】让小爱支持控制任意自制.....,非常感谢各位大佬的无私奉献)
说明:由于f大佬的流太复杂,特殊指令里面虽然有打开窗帘和关闭窗帘但是不知道为啥我这儿搞不起来,所以采取了粗暴措施,没有弄"打开窗帘"是因为我把HA里面打开窗帘名字改成了打开窗帘
小爱转发能处理这个命令,但是关闭不行,按如上设置后可以说”窗帘关闭“以达到效果,也可以说”窗帘开到五十“等具体数值指令,具体想改成什么样的指令自己研究吧
12.20更新:
另一种更简洁还具有实时模拟的方法,参考[url=关于电机的想法,窗帘,窗户,晾衣架等 https://bbs.hassbian.com/thread-8881-1-1.html (出处: 『瀚思彼岸』» 智能家居技术论坛)]关于电机的想法,窗帘,窗户,晾衣架等 https://bbs.hassbian.com/thread-8881-1-1.html (出处: 『瀚思彼岸』» 智能家居技术论坛)[/url]和esphome
新的开度设置方式:
|