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

 找回密码
 立即注册
查看: 1064|回复: 6

[技术探讨] (已解决)请教大家esp32如何通过api读取天气网站的信息

[复制链接]

14

主题

249

帖子

1990

积分

金牌会员

Rank: 6Rank: 6

积分
1990
金钱
1736
HASS币
50
发表于 2023-2-22 20:37:56 | 显示全部楼层 |阅读模式
本帖最后由 book123 于 2023-2-25 21:42 编辑

我想用esp32,独立于HA系统运行,用http_request:代码读取openweathermap的当日天气信息,但是怎么也读取不了。
浏览器能够看到json格式的信息,如下:
{
        "coord": {
                "lon": 117.12,
                "lat": 36.65
        },
        "weather": [{
                "id": 804,
                "main": "Clouds",
                "description": "overcast clouds",
                "icon": "04d"
        }],
        "base": "stations",
        "main": {
                "temp": 2.66,
                "feels_like": 0.68,
                "temp_min": 2.66,
                "temp_max": 2.66,
                "pressure": 1040,
                "humidity": 23,
                "sea_level": 1040,
                "grnd_level": 1020
        },
        "visibility": 10000,
        "wind": {
                "speed": 1.97,
                "deg": 114,
                "gust": 2.42
        },
        "clouds": {
                "all": 97
        },
        "dt": 1676946193,
        "sys": {
                "country": "CN",
                "sunrise": 1676933624,
                "sunset": 1676973423
        },
        "timezone": 28800,
        "id": 1805753,
        "name": "Jinan",
        "cod": 200
}

esphome代码如下:
esp32:
  board: wemos_d1_mini32 #esp32dev
  framework:
    type: arduino

sensor:
  - platform: template
    name: "Air temperature"
    id: air_temp

http_request:
  useragent: esphome/esp32dev
  id: http_request_data


time:
  - platform: sntp
    id: sntp_time
    on_time:
      # Every 5 minutes 获取openweathermap的当日天气信息
      - seconds: 0
        minutes: /5
        then:
          - http_request.get:
              url: http://api.openweathermap.org/data/2.5/weather?lat=36.65&lon=117.12&appid=***************&units=metric
              headers:
                Content-Type: application/json
              verify_ssl: false
              on_response:
                then:
                  - lambda: |-
                      json::parse_json(id(http_request_data).get_string(), [](JsonObject root) {
                        id(air_temp).publish_state(root["main"]["temp"]);
                      });

编译和上传都正常。联网正常,显示时间正常。但是就是air_temp没有数值。
请各位大佬指教,哪里出了问题。
====================================================================
后经多方查阅资料,已经解决,代码如下:
http_request:
  ### OPENWEATHERMAP
  useragent: esphome/device
  timeout: 10s
  id: http_request_data

sensor:
  ### OPENWEATHERMAP
  # 室外温度
  - platform: template
    name: "Weather Temperature"
    id: weather_temperature0
  # 室外湿度
  - platform: template
    name: "Weather Humidity"
    id: weather_humidity0
  # 室外风速
  - platform: template
    id: outside_wind_speed0



text_sensor:
  ### OPENWEATHERMAP
  # 当日天气
  - platform: template
    name: "Weather Condition0"
    id: weather_condition0
  # 当日天气描述-中文
  - platform: template
    name: "Weather Condition0"
    id: weather_condition0_c



time:
  ### INTERNET TIME
  - platform: sntp
    id: sntp_time

interval:
    ### OPENWEATHERMAP
  - interval: 5min
    then:
      - http_request.get:
          # 调用 5 天 / 3 小时预测数据
          url: http://api.openweathermap.org/data/2.5/forecast?lat=****&lon=****&appid=****************&lang=zh_cn&units=metric
          on_response:
            then:
              - lambda: |-
                  json::parse_json(id(http_request_data).get_string(), [](JsonObject doc) {
                    auto listf = doc["list"];

                    float tempf0 = listf[0]["main"]["temp"];
                    float humf0 = listf[0]["main"]["humidity"];
                    float winspeedf0 = listf[0]["wind"]["speed"];

                    id(weather_temperature0).publish_state(tempf0);
                    id(weather_humidity0).publish_state(humf0);
                    id(outside_wind_speed0).publish_state(winspeedf0);

                    const char* weatherdesc0 = listf[0]["weather"][0]["main"];
                    const char* weatherdesc0_c = listf[0]["weather"][0]["description"];
                    if (weatherdesc0) id(weather_condition0).publish_state(weatherdesc0);
                    if (weatherdesc0_c) id(weather_condition0_c).publish_state(weatherdesc0_c);
                  });



回复

使用道具 举报

4

主题

254

帖子

2387

积分

金牌会员

Rank: 6Rank: 6

积分
2387
金钱
2133
HASS币
0
发表于 2023-2-23 10:01:00 | 显示全部楼层
为啥要脱裤子放屁呢?HASS有直接可以集成的天气插件啊
回复

使用道具 举报

14

主题

249

帖子

1990

积分

金牌会员

Rank: 6Rank: 6

积分
1990
金钱
1736
HASS币
50
 楼主| 发表于 2023-2-23 10:42:29 | 显示全部楼层
crazymouse 发表于 2023-2-23 10:01
为啥要脱裤子放屁呢?HASS有直接可以集成的天气插件啊

因为我要在没有HA的地方用。用tft显示天气预报。
回复

使用道具 举报

14

主题

249

帖子

1990

积分

金牌会员

Rank: 6Rank: 6

积分
1990
金钱
1736
HASS币
50
 楼主| 发表于 2023-2-23 10:51:55 | 显示全部楼层
crazymouse 发表于 2023-2-23 10:01
为啥要脱裤子放屁呢?HASS有直接可以集成的天气插件啊

而且,HA系统上的我已经做出来了,运行的不错。
5a018da62g9a3171e9b7c4df14fe5352-2.jpg
回复

使用道具 举报

14

主题

249

帖子

1990

积分

金牌会员

Rank: 6Rank: 6

积分
1990
金钱
1736
HASS币
50
 楼主| 发表于 2023-2-23 10:54:06 | 显示全部楼层
我现在想请教的是如何在不连接ha的情况下,用esphome代码,实现从天气网站获得信息。硬件是esp32和ili9341TFT.
回复

使用道具 举报

14

主题

249

帖子

1990

积分

金牌会员

Rank: 6Rank: 6

积分
1990
金钱
1736
HASS币
50
 楼主| 发表于 2023-2-24 21:43:26 | 显示全部楼层
本帖最后由 book123 于 2023-2-24 22:00 编辑

问题解决了。
SharedScreenshot2_副本.jpg

可以在没有HA的情况下顺利获取外部网站数据。但是不太稳定,个别时候获取不了数据,显示nan。

回复

使用道具 举报

5

主题

471

帖子

2100

积分

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
1629
HASS币
0
发表于 2023-2-25 14:26:51 | 显示全部楼层

高手!高手!
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-28 01:14 , Processed in 0.056906 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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