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

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

[技术探讨] ESPHome http_request导致看门狗重启

[复制链接]

9

主题

53

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
金钱
227
HASS币
0
发表于 2024-8-8 15:48:29 | 显示全部楼层 |阅读模式
本帖最后由 996054544 于 2024-8-8 15:51 编辑
<div class="blockcode"><blockquote># http请求
http_request:
  useragent: esphome/device
  id: my_request
  timeout: 30s

# 定时操作
interval:
  - interval: 3s
    then:
      - if:
          condition: # 定义用于判断的条件
            wifi.connected:
          then:
            - logger.log: "WiFi已连接"
            - http_request.get:
                url: $sensorURL
                on_response:
                  then:


当wifi连接后,执行http_request.get
如果get能正常返回数据,设备正常运行
如果"http://c3-hx711.local/sensor/percentage"这个链接的设备不在线,get就没有数据返回(应该是在等待返回的操作时间过长)导致看门狗复位重启了
下面是重启日志
[C][http_request:014]: HTTP Request:
[C][http_request:015]:   Timeout: 2000ms
[C][http_request:016]:   User-Agent: esphome/device
[C][http_request:017]:   Follow Redirects: 1
[C][http_request:018]:   Redirect limit: 3
[W][component:237]: Component display took a long time for an operation (86 ms).
[W][component:238]: Components should block for at most 30 ms.
E (26385) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (26385) task_wdt:  - loopTask (CPU 0)
E (26385) task_wdt: Tasks currently running:
E (26385) task_wdt: CPU 0: IDLE
E (26385) task_wdt: Aborting.
请问有大佬遇到过相同的问题吗?知道怎么解决吗?












回复

使用道具 举报

9

主题

53

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
金钱
227
HASS币
0
 楼主| 发表于 2024-8-8 15:59:25 | 显示全部楼层
https://esphome.io/components/http_request.html
在官网上也有提到请求时间过长,导致看门狗复位
但是watchdog_timeout 只适合ESP32和RP2040,而我使用的是ESP32C3
1723103827214.jpg
回复

使用道具 举报

8

主题

66

帖子

907

积分

高级会员

Rank: 4

积分
907
金钱
841
HASS币
0
发表于 2024-8-8 16:06:07 | 显示全部楼层
本帖最后由 xiongmx 于 2024-8-8 16:13 编辑

我是通过ping的掉包率来做的看门狗,搭配wifi状态进行多种识别 看门狗.zip (2.54 KB, 下载次数: 2)

ping的部分使用的代码
esphome:
  libraries:
    - ESP8266WiFi
    - https://github.com/akaJes/AsyncPing#95ac7e4

external_components:
  - source:
      type: git
      url: https://github.com/trombik/esphome-component-ping
      ref: main

sensor:
  - platform: ping  
    ip_address: ${ping_ip} # 目标IP地址
    num_attempts: 18 # 发送数据包数量。默认:13(最小=1, 最大=60)
    timeout: 3sec # 数据包发送间隔。
    loss:
      name: 丢包率
      id: packet_loss
    latency:
      name: 延迟
      accuracy_decimals: 3
    update_interval: 60s

text_sensor:
  - platform: template
    name: "Target IP Address"
    lambda: |- 
      return esphome::optional<std::string>("${ping_ip}");


回复

使用道具 举报

9

主题

53

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
金钱
227
HASS币
0
 楼主| 发表于 2024-8-8 17:34:52 | 显示全部楼层
xiongmx 发表于 2024-8-8 16:06
我是通过ping的掉包率来做的看门狗,搭配wifi状态进行多种识别

ping的部分使用的代码

看门狗.yaml看了一下
大致知道你测试了ping,可以获取到丢包的情况
如果丢包率高,就进行重启设备
喂狗的操作我不知道你是在哪里进行的
回复

使用道具 举报

9

主题

53

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
金钱
227
HASS币
0
 楼主| 发表于 2024-8-9 15:24:00 | 显示全部楼层
xiongmx 发表于 2024-8-8 16:06
我是通过ping的掉包率来做的看门狗,搭配wifi状态进行多种识别

ping的部分使用的代码

感谢大佬提供的思路
先ping一下IP地址,如果通的话,再执行http_request.get:,这样子就不会导致get阻塞看门重启了


# 使用外部库
external_components:
  - source:
      type: git
      url: https://github.com/trombik/esphome-component-ping
      ref: main

sensor:
  - platform: ping
    ip_address: ${ping_ip} # 目标IP地址
    num_attempts: 1 # 发送数据包数量。默认:13(最小=1, 最大=60)
    timeout: 3sec # 等待单个数据包响应的最大时间
    loss:
      name: 丢包率
      id: packet_loss
    latency:
      name: 延迟
      accuracy_decimals: 3 # 传感器值的小数精度
    update_interval: 5s # 每隔x秒执行一次 Ping 测试

# http请求
http_request:
  useragent: esphome/device
  id: my_request
  timeout: 4s

# 定时操作
interval:
  - interval: 5s
    then:
      - if:
          condition:
            - sensor.in_range:
                id: packet_loss
                below: 10 # 丢包率小于 10%
          then:
            - logger.log: "网络正常,开始执行http_request.get"
            - http_request.get:
                url: $sensorURL
                on_response:
                  then:
                    - if:
                        condition: # 判断条件 请求状态==200表示成功
                          - lambda: "return status_code == 200;"
                        then:
                          - logger.log: "请求成功"
                          - lambda: |-
                              std::string json_string = id(my_request).get_string(); // 获取http返回的字符串
                              ESP_LOGI("Rx", "%s", json_string.c_str());

                              // 尝试解析 JSON
                              json::parse_json(json_string.c_str(), [](JsonObject root)
                              {
                                id(my_value).publish_state(root["value"]);
                              });

                              id(water_signal_count)++;

                        else:
                          - lambda: id(water_signal_count) = 0;

                          - logger.log: "请求失败"
                          - logger.log:
                              format: "Response status: %d, Duration: %u ms"
                              args: [status_code, duration_ms]
          else:
            - logger.log: "丢包率大于 10%,可能存在网络问题"

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 06:20 , Processed in 0.147005 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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