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

 找回密码
 立即注册
12
返回列表 发新帖
楼主: hejie127

[技术探讨] 求救一下!简单的开关折腾我好久个晚上了。。实在是没.....

[复制链接]

8

主题

156

帖子

885

积分

高级会员

Rank: 4

积分
885
金钱
729
HASS币
0
 楼主| 发表于 2020-7-10 11:23:29 | 显示全部楼层
本帖最后由 hejie127 于 2020-7-10 11:25 编辑
neroxps 发表于 2020-7-10 11:17
esphome 编译的时候会把 yaml 翻译成C++文件。我不知道你是怎么部署 esphome 的hassio 的话,会在 config ...

esphome、hass、nodered分别装在群晖的docker里。hass、nodered有定义文件夹。esphome没有,这个文件装在什么地方了,我可能不太知道

QQ截图20200710112432.png
这是容器里面的路径吗? 可以ssh上去群晖里面找?
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2020-7-10 11:43:21 | 显示全部楼层
hejie127 发表于 2020-7-10 11:23
esphome、hass、nodered分别装在群晖的docker里。hass、nodered有定义文件夹。esphome没有,这个文件装在 ...

那么要映射一个目录到 /config 容器里面对应就好了。
Nero
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11445
金钱
8514
HASS币
460

教程狂人突出贡献

发表于 2020-7-10 12:20:18 | 显示全部楼层
本帖最后由 XCray 于 2020-7-10 12:51 编辑

我总觉的楼主的问题就是想的太多太复杂,本来很简单的事情,非要兜一大圈。

esp就实现开关的功能就足够了,不管是那个控制单片机的uart switch,还是直接控制gpio的,你都已经会了。

剩下的逻辑,不管你想延时也好、加口令也好,无论是node-red还是hass,都足可以实现,根本不需要在esp板子的固件上死磕。

~~~~~~~~~~~~
比如在Node-Red里,记录上次的操作时间,每次被激发后先检查距上次操作是否已够10秒,不够的话就啥都不做,够了的话就执行switch.toggle并更新上次操作时间。你既然会弄node-red,这个流对你来说就是小case了。
回复

使用道具 举报

8

主题

156

帖子

885

积分

高级会员

Rank: 4

积分
885
金钱
729
HASS币
0
 楼主| 发表于 2020-7-10 15:21:44 | 显示全部楼层
XCray 发表于 2020-7-10 12:20
我总觉的楼主的问题就是想的太多太复杂,本来很简单的事情,非要兜一大圈。

esp就实现开关的功能就足够了 ...

朋友,我现在的问题是 2个开关状态不统一,你回答了好几次都是在绕圈子,一点干货都没有。

hass的代码不会写,我才去弄nodered,流程弄好了发现开关状态不统一,我只有回来弄固件,麻烦你往前看一眼版主回答的内容。哪怕你给个例程我也感谢你。

你跟我比如Node-Red了半天都是我弄好的东西,算了,相忘于江湖吧
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11445
金钱
8514
HASS币
460

教程狂人突出贡献

发表于 2020-7-10 16:11:49 | 显示全部楼层
hejie127 发表于 2020-7-10 15:21
朋友,我现在的问题是 2个开关状态不统一,你回答了好几次都是在绕圈子,一点干货都没有。

hass的代码不 ...

很抱歉无法帮到你,真的非常抱歉哦。最后说一句打扰了,祝楼主开心。。。

我说楼主的思路是兜圈子,楼主说我的回答是兜圈子,天地良心,我只是想帮楼主解决你的问题。

到底是谁在兜圈子呢?
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2020-7-10 17:11:44 | 显示全部楼层
本帖最后由 neroxps 于 2020-7-10 17:53 编辑
hejie127 发表于 2020-7-10 15:21
朋友,我现在的问题是 2个开关状态不统一,你回答了好几次都是在绕圈子,一点干货都没有。

hass的代码不 ...
delay的目的:用手机控制热水器,怕小孩子反复乱点烧坏设备,所以想实现一个小功能,就是手机点击开/关之后,先判断与上次开/关的时间,如果小于10秒无效(延时),大于10秒再触发开关,这样。在10秒之内连续点击开关是不管用的。(开关只能10秒用一次,杜绝安全风险)

你的需求就是要switch 点击后,10秒之后,十秒内不再触发是吧。

楼主可以试试以下代码,我没上机测试过,但是编译是过的

substitutions:
  devicename: 'test'
  wifi_ssid: !secret wifi_ssid
  wifi_password: !secret wifi_password
  api_password: !secret api_password
  ota_password: !secret ota_password
  hotport_ssid: !secret hotport_ssid
  hotport_password: !secret hotport_password

esphome:
  name: $devicename
  platform: ESP8266
  board: esp12e

wifi:
  # 设置ID 可以在 lambda 下用 id($id_name) 调用,继承 WiFiComponent 类。
  id: wifi_state
  ssid: $wifi_ssid
  password: $wifi_password
  # 启动 AP 模式
  ap:
    ssid: $hotport_ssid
    password: $hotport_password
# AP 模式启动后,需要使用门户修改 SSID 和 Password 的需要启动 captive_portal
## 但在门户修改 SSID 之后,还需要手动重启 SSID 配置才会生效.
captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: $api_password
  reboot_timeout: 0s

ota:
  password: $ota_password

# 设置初始时间变量,初始是0
globals:
  - id: my_global_time
    type: unsigned long
    restore_value: no
    initial_value: "0"
# 物理按键
binary_sensor:
  - platform: gpio
    pin: GPIO13
    internal: true
    name: "Button"
    on_press:
      then:
        - switch.toggle: uart_switch

uart:
  baud_rate: 9600
  tx_pin: TX

# 假设是继电器
switch:
  - platform: uart
    name: "uart_on"
    id: uart_on
    internal: true
    data: [0xA0, 0x01, 0x01, 0xA2]
  - platform: uart
    name: "uart_off"
    id: uart_Off
    internal: true
    data: [0xA0, 0x01, 0x01, 0xA1]
  # 整合 uart 开和关
  - platform: template
    name: "UART Switch"
    id: uart_switch
    internal: true
    turn_on_action:
      - switch.toggle: uart_on
    turn_off_action:
      - switch.toggle: uart_Off

  # 作为 HA 前台开关
  - platform: template
    name: "Template Switch"
    lambda: |-
      if (id(uart_switch).state) {
        return true;
      } else {
        return false;
      }
    turn_on_action:
      - script.execute: my_script
    turn_off_action:
      - script.execute: my_script

# 开或者关的触发脚本
script:
  - id: my_script
    then:
      - lambda: |-
          unsigned long currentTime = millis();
          if ( currentTime > id(my_global_time ) + 10000){
            id(uart_switch).toggle();
          }
          id(my_global_time) = currentTime;

# 
# // 定义变量 currentTime 获取当前时间
# unsigned long currentTime = millis();
# // 判断当前时间大于上一次时间10秒(10000毫秒)则切换 switch_relay 的状态
# if (currentTime > id(my_global_time) + 10000){
#   id(switch_relay).toggle();
# }
# // 保存当前时间
# id(my_global_time) = currentTime;

test.zip (1.28 KB, 下载次数: 9)


更新了下,楼主可以试试,编译过了,HA 那边的控制按钮是10秒之后才反应,物理按钮是立刻反应。











Nero
回复

使用道具 举报

8

主题

156

帖子

885

积分

高级会员

Rank: 4

积分
885
金钱
729
HASS币
0
 楼主| 发表于 2020-7-10 21:43:35 | 显示全部楼层
neroxps 发表于 2020-7-10 17:11
你的需求就是要switch 点击后,10秒之后,十秒内不再触发是吧。

[md]

谢谢大神。帖子中间的多了一个 &gt,估计是论坛粘帖后字符转换了。附件里面的完全可以用,就是我想要的结果。。

而且这样写 不需要nodered了。 再次感谢

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-27 20:56 , Processed in 0.053713 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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