mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-27 14:42:18 +03:00
154 lines
4.3 KiB
C++
154 lines
4.3 KiB
C++
|
|
#include "Global.h"
|
||
|
|
#include "classes/IoTItem.h"
|
||
|
|
#include <ArduinoJson.h>
|
||
|
|
|
||
|
|
long prevWeatherMillis = millis() - 60001;
|
||
|
|
StaticJsonDocument<JSON_BUFFER_SIZE * 2> Weatherdoc;
|
||
|
|
|
||
|
|
extern IoTGpio IoTgpio;
|
||
|
|
class Weather : public IoTItem
|
||
|
|
{
|
||
|
|
private:
|
||
|
|
String _location;
|
||
|
|
String _param;
|
||
|
|
long interval;
|
||
|
|
|
||
|
|
public:
|
||
|
|
Weather(String parameters) : IoTItem(parameters)
|
||
|
|
{
|
||
|
|
_location = jsonReadStr(parameters, "location");
|
||
|
|
_param = jsonReadStr(parameters, "param");
|
||
|
|
jsonRead(parameters, F("int"), interval);
|
||
|
|
interval = interval * 1000 * 60 * 60; // интервал проверки погоды в часах
|
||
|
|
}
|
||
|
|
|
||
|
|
void getWeather()
|
||
|
|
{
|
||
|
|
String ret;
|
||
|
|
|
||
|
|
if (WiFi.status() == WL_CONNECTED)
|
||
|
|
{
|
||
|
|
// char c;
|
||
|
|
String payload;
|
||
|
|
WiFiClient client;
|
||
|
|
HTTPClient http;
|
||
|
|
http.begin(client, "http://live-control.com/iotm/weather.php");
|
||
|
|
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
|
||
|
|
String httpRequestData = "loc=" + _location;
|
||
|
|
int httpResponseCode = http.POST(httpRequestData);
|
||
|
|
if (httpResponseCode > 0)
|
||
|
|
{
|
||
|
|
ret = httpResponseCode;
|
||
|
|
|
||
|
|
if (httpResponseCode == HTTP_CODE_OK)
|
||
|
|
{
|
||
|
|
payload = http.getString();
|
||
|
|
|
||
|
|
deserializeJson(Weatherdoc, payload);
|
||
|
|
// ret += payload;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
ret = http.errorToString(httpResponseCode).c_str();
|
||
|
|
}
|
||
|
|
SerialPrint("<-", F("getWeather"), httpRequestData);
|
||
|
|
SerialPrint("->", F("getWeather"), "server: " + ret);
|
||
|
|
|
||
|
|
http.end();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void doByInterval()
|
||
|
|
{
|
||
|
|
|
||
|
|
if (prevWeatherMillis + 60000 < millis())
|
||
|
|
{
|
||
|
|
getWeather();
|
||
|
|
prevWeatherMillis = millis();
|
||
|
|
}
|
||
|
|
if (jsonReadStr(Weatherdoc["current_condition"][0], "temp_C", true) != "null")
|
||
|
|
{
|
||
|
|
if (_param == "temp_C")
|
||
|
|
{
|
||
|
|
value.valS = jsonReadStr(Weatherdoc["current_condition"][0], "temp_C", true);
|
||
|
|
}
|
||
|
|
if (_param == "avgtempC")
|
||
|
|
{
|
||
|
|
value.valS = jsonReadStr(Weatherdoc["weather"][0], "avgtempC", true);
|
||
|
|
}
|
||
|
|
if (_param == "humidity")
|
||
|
|
{
|
||
|
|
value.valS = jsonReadStr(Weatherdoc["current_condition"][0], "humidity", true);
|
||
|
|
}
|
||
|
|
if (_param == "weatherCode")
|
||
|
|
{
|
||
|
|
value.valS = jsonReadStr(Weatherdoc["current_condition"][0], "weatherCode", true);
|
||
|
|
}
|
||
|
|
if (_param == "sunrise")
|
||
|
|
{
|
||
|
|
|
||
|
|
value.valS = jsonReadStr(Weatherdoc["weather"][0]["astronomy"][0], "sunrise", true);
|
||
|
|
}
|
||
|
|
if (_param == "sunset")
|
||
|
|
{
|
||
|
|
value.valS = jsonReadStr(Weatherdoc["weather"][0]["astronomy"][0], "sunset", true);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (_param == "rangetempC")
|
||
|
|
{
|
||
|
|
value.valS = jsonReadStr(Weatherdoc["weather"][0], "mintempC", true) + "..." + jsonReadStr(Weatherdoc["weather"][0], "maxtempC", true);
|
||
|
|
}
|
||
|
|
|
||
|
|
// погода на завтра
|
||
|
|
if (_param == "temp_C_tomorrow")
|
||
|
|
{
|
||
|
|
value.valS = jsonReadStr(Weatherdoc["weather"][1], "avgtempC", true);
|
||
|
|
}
|
||
|
|
if (_param == "rangetempC_tomorrow")
|
||
|
|
{
|
||
|
|
value.valS = jsonReadStr(Weatherdoc["weather"][1], "mintempC", true) + "..." + jsonReadStr(Weatherdoc["weather"][1], "maxtempC", true);
|
||
|
|
}
|
||
|
|
|
||
|
|
regEvent(value.valS, "Weather");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
void loop()
|
||
|
|
{
|
||
|
|
if (enableDoByInt)
|
||
|
|
{
|
||
|
|
currentMillis = millis();
|
||
|
|
difference = currentMillis - prevMillis;
|
||
|
|
if (difference >= interval)
|
||
|
|
{
|
||
|
|
prevMillis = millis();
|
||
|
|
this->doByInterval();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
IoTValue execute(String command, std::vector<IoTValue> ¶m)
|
||
|
|
{
|
||
|
|
if (command == "get")
|
||
|
|
{
|
||
|
|
getWeather();
|
||
|
|
doByInterval();
|
||
|
|
}
|
||
|
|
|
||
|
|
return {};
|
||
|
|
}
|
||
|
|
|
||
|
|
~Weather(){};
|
||
|
|
};
|
||
|
|
|
||
|
|
void *getAPI_Weather(String subtype, String param)
|
||
|
|
{
|
||
|
|
if (subtype == F("Weather"))
|
||
|
|
{
|
||
|
|
return new Weather(param);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return nullptr;
|
||
|
|
}
|
||
|
|
}
|