void CFitbit::GetMeterDetails() { if (!m_isLogged) return; return; std::stringstream sstr2; // sstr2 << "https://api.Fitbit.net/api/devicelist"; sstr2 << "https://api.Fitbit.net/api/getstationsdata"; sstr2 << "?"; sstr2 << "access_token=" << m_accessToken; sstr2 << "&" << "get_favorites=" << "true"; std::string httpUrl = sstr2.str(); std::vector<std::string> ExtraHeaders; std::string sResult; #ifdef DEBUG_FitbitWeatherStationR //sResult = ReadFile("E:\\Fitbit_mdetails.json"); sResult = ReadFile("E:\\Fitbit_getstationdata.json"); bool ret = true; #else bool ret=HTTPClient::GET(httpUrl, ExtraHeaders, sResult); if (!ret) { _log.Log(LOG_STATUS, "Fitbit: Error connecting to Server..."); return; } #endif #ifdef DEBUG_FitbitWeatherStationW SaveString2Disk(sResult, "E:\\Fitbit_getstationdata.json"); #endif ParseFitbitGetResponse(sResult); }
bool CPhilipsHue::GetStates() { std::vector<std::string> ExtraHeaders; std::string sResult; #ifdef DEBUG_PhilipsHue sResult= ReadFile("E:\\philipshue.json"); #else std::stringstream sstr2; sstr2 << "http://" << m_IPAddress << ":" << m_Port << "/api/" << m_UserName; //Get Data std::string sURL = sstr2.str(); if (!HTTPClient::GET(sURL, ExtraHeaders, sResult)) { _log.Log(LOG_ERROR, "Philips Hue: Error getting Light States, (Check IPAddress/Username)"); return false; } #endif #ifdef DEBUG_PhilipsHue2 SaveString2Disk(sResult, "E:\\philipshue.json"); #endif Json::Value root; Json::Reader jReader; bool ret = jReader.parse(sResult, root); if (!ret) { _log.Log(LOG_ERROR, "Philips Hue: Invalid data received, or invalid IPAddress/Username!"); return false; } if (sResult.find("\"error\":") != std::string::npos) { //We had an error _log.Log(LOG_ERROR, "Philips Hue: Error received: %s", root[0]["error"]["description"].asString().c_str()); return false; } if (!GetLights(root)) { //_log.Log(LOG_ERROR, "Philips Hue: No Lights found!"); return false; } GetGroups(root); GetScenes(root); return true; }
std::string CAccuWeather::GetLocationKey() { std::string sResult; #ifdef DEBUG_AccuWeatherR sResult = ReadFile("E:\\AccuWeather_LocationSearch.json"); #else std::stringstream sURL; std::string szLoc = CURLEncode::URLEncode(m_Location); sURL << "https://dataservice.accuweather.com/locations/v1/search?apikey=" << m_APIKey << "&q=" << szLoc; try { bool bret; std::string szURL = sURL.str(); bret = HTTPClient::GET(szURL, sResult); if (!bret) { _log.Log(LOG_ERROR, "AccuWeather: Error getting http data!"); return ""; } } catch (...) { _log.Log(LOG_ERROR, "AccuWeather: Error getting http data!"); return ""; } #endif #ifdef DEBUG_AccuWeatherW2 SaveString2Disk(sResult, "E:\\AccuWeather_LocationSearch.json"); #endif Json::Value root; Json::Reader jReader; bool ret = jReader.parse(sResult, root); if (!ret) { _log.Log(LOG_ERROR, "AccuWeather: Invalid data received!"); return ""; } if (root.size()>0) { if (root.isArray()) root = root[0]; } if (root["Key"].empty()) { _log.Log(LOG_ERROR, "AccuWeather: Invalid data received, or unknown location!"); return ""; } return root["Key"].asString(); }
void CThermosmart::GetMeterDetails() { if (m_UserName.empty() || m_Password.empty() ) return; std::string sResult; #ifdef DEBUG_ThermosmartThermostat_read sResult = ReadFile("E:\\thermosmart_getdata.txt"); #else if (m_bDoLogin) { if (!Login()) return; } std::string sURL = THERMOSMART_ACCESS_PATH; stdreplace(sURL, "[TID]", m_ThermostatID); stdreplace(sURL, "[access_token]", m_AccessToken); if (!HTTPClient::GET(sURL, sResult)) { _log.Log(LOG_ERROR, "Thermosmart: Error getting thermostat data!"); m_bDoLogin = true; return; } #ifdef DEBUG_ThermosmartThermostat SaveString2Disk(sResult, "E:\\thermosmart_getdata.txt"); #endif #endif Json::Value root; Json::Reader jReader; bool ret = jReader.parse(sResult, root); if (!ret) { _log.Log(LOG_ERROR, "Thermosmart: Invalid/no data received..."); m_bDoLogin = true; return; } if (root["target_temperature"].empty() || root["room_temperature"].empty()) { _log.Log(LOG_ERROR, "Thermosmart: Invalid/no data received..."); m_bDoLogin = true; return; } float temperature; temperature = (float)root["target_temperature"].asFloat(); SendSetPointSensor(1, temperature, "target temperature"); temperature = (float)root["room_temperature"].asFloat(); SendTempSensor(2, 255, temperature, "room temperature"); if (!root["outside_temperature"].empty()) { temperature = (float)root["outside_temperature"].asFloat(); SendTempSensor(3, 255, temperature, "outside temperature"); } if (!root["source"].empty()) { std::string actSource = root["source"].asString(); bool bPauzeOn = (actSource == "pause"); SendSwitch(1, 1, 255, bPauzeOn, 0, "Thermostat Pause"); } }
bool CThermosmart::Login() { if (!m_AccessToken.empty()) { Logout(); } if (m_UserName.empty()) return false; m_AccessToken = ""; m_ThermostatID = ""; std::string sURL; std::stringstream sstr; sstr << "username="******"&password="******"Thermosmart: Error login!"); return false; } #ifdef DEBUG_ThermosmartThermostat SaveString2Disk(sResult, "E:\\thermosmart1.txt"); #endif //# 2. Get Authorize Dialog sURL = THERMOSMART_AUTHORISE_PATH; stdreplace(sURL, "client123", "api-rob-b130d8f5123bf24b"); ExtraHeaders.clear(); if (!HTTPClient::GET(sURL, sResult)) { _log.Log(LOG_ERROR, "Thermosmart: Error login!"); return false; } #ifdef DEBUG_ThermosmartThermostat SaveString2Disk(sResult, "E:\\thermosmart2.txt"); #endif size_t tpos = sResult.find("value="); if (tpos == std::string::npos) { _log.Log(LOG_ERROR, "Thermosmart: Error login!, check username/password"); return false; } sResult = sResult.substr(tpos + 7); tpos = sResult.find("\">"); if (tpos == std::string::npos) { _log.Log(LOG_ERROR, "Thermosmart: Error login!, check username/password"); return false; } std::string TID = sResult.substr(0, tpos); //# 3. Authorize (read out transaction_id from the HTML form received in the previous step). transaction_id prevents from XSRF attacks. szPostdata = "transaction_id=" + TID; ExtraHeaders.clear(); sURL = THERMOSMART_DECISION_PATH; if (!HTTPClient::POST(sURL, szPostdata, ExtraHeaders, sResult, false)) { _log.Log(LOG_ERROR, "Thermosmart: Error login!, check username/password"); return false; } #ifdef DEBUG_ThermosmartThermostat SaveString2Disk(sResult, "E:\\thermosmart3.txt"); #endif tpos = sResult.find("code="); if (tpos == std::string::npos) { _log.Log(LOG_ERROR, "Thermosmart: Error login!, check username/password"); return false; } std::string CODE = sResult.substr(tpos + 5); //# 4. Exchange authorization code for Access token (read out the code from the previous response) szPostdata = "grant_type=authorization_code&code=" + CODE + "&redirect_uri=http://clientapp.com/done"; sURL = THERMOSMART_TOKEN_PATH; stdreplace(sURL, "username", "api-rob-b130d8f5123bf24b"); stdreplace(sURL, "password", "c1d91661eef0bc4fa2ac67fd"); if (!HTTPClient::POST(sURL, szPostdata, ExtraHeaders, sResult, false)) { _log.Log(LOG_ERROR, "Thermosmart: Error login!, check username/password"); return false; } #ifdef DEBUG_ThermosmartThermostat SaveString2Disk(sResult, "E:\\thermosmart4.txt"); #endif Json::Value root; Json::Reader jReader; bool ret = jReader.parse(sResult, root); if (!ret) { _log.Log(LOG_ERROR, "Thermosmart: Invalid/no data received..."); return false; } if (root["access_token"].empty()||root["thermostat"].empty()) { _log.Log(LOG_ERROR, "Thermosmart: No access granted, check username/password..."); return false; } m_AccessToken = root["access_token"].asString(); m_ThermostatID = root["thermostat"].asString(); _log.Log(LOG_STATUS, "Thermosmart: Login successfull!..."); m_bDoLogin = false; return true; }
void CAccuWeather::GetMeterDetails() { std::string sResult; #ifdef DEBUG_AccuWeatherR sResult=ReadFile("E:\\AccuWeather.json"); #else std::stringstream sURL; std::string szLoc = CURLEncode::URLEncode(m_LocationKey); sURL << "https://dataservice.accuweather.com/currentconditions/v1/" << szLoc << "?apikey=" << m_APIKey << "&details=true"; try { bool bret; std::string szURL = sURL.str(); bret = HTTPClient::GET(szURL, sResult); if (!bret) { _log.Log(LOG_ERROR, "AccuWeather: Error getting http data!"); return; } } catch (...) { _log.Log(LOG_ERROR, "AccuWeather: Error getting http data!"); return; } #endif #ifdef DEBUG_AccuWeatherW SaveString2Disk(sResult, "E:\\AccuWeather.json"); #endif try { Json::Value root; Json::Reader jReader; bool ret = jReader.parse(sResult, root); if (!ret) { _log.Log(LOG_ERROR, "AccuWeather: Invalid data received!"); return; } if (root.size() < 1) { _log.Log(LOG_ERROR, "AccuWeather: Invalid data received!"); return; } root = root[0]; if (root["LocalObservationDateTime"].empty()) { _log.Log(LOG_ERROR, "AccuWeather: Invalid data received, or unknown location!"); return; } float temp = 0; int humidity = 0; int barometric = 0; int barometric_forcast = baroForecastNoInfo; if (!root["Temperature"].empty()) { temp = root["Temperature"]["Metric"]["Value"].asFloat(); } if (!root["RelativeHumidity"].empty()) { humidity = root["RelativeHumidity"].asInt(); } if (!root["Pressure"].empty()) { barometric = atoi(root["Pressure"]["Metric"]["Value"].asString().c_str()); if (barometric < 1000) barometric_forcast = baroForecastRain; else if (barometric < 1020) barometric_forcast = baroForecastCloudy; else if (barometric < 1030) barometric_forcast = baroForecastPartlyCloudy; else barometric_forcast = baroForecastSunny; if (!root["WeatherIcon"].empty()) { int forcasticon = atoi(root["WeatherIcon"].asString().c_str()); switch (forcasticon) { case 1: case 2: case 3: barometric_forcast = baroForecastSunny; break; case 4: case 5: case 6: barometric_forcast = baroForecastCloudy; break; case 7: case 8: case 9: case 10: case 11: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 39: case 40: case 41: case 42: case 43: case 44: barometric_forcast = baroForecastRain; break; case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: barometric_forcast = baroForecastCloudy; break; } } } if (barometric != 0) { //Add temp+hum+baro device SendTempHumBaroSensor(1, 255, temp, humidity, static_cast<float>(barometric), barometric_forcast, "THB"); } else if (humidity != 0) { //add temp+hum device SendTempHumSensor(1, 255, temp, humidity, "TempHum"); } else { //add temp device SendTempSensor(1, 255, temp, "Temperature"); } //Wind if (!root["Wind"].empty()) { int wind_degrees = -1; float windspeed_ms = 0; float windgust_ms = 0; float wind_temp = temp; float wind_chill = temp; if (!root["Wind"]["Direction"].empty()) { wind_degrees = root["Wind"]["Direction"]["Degrees"].asInt(); } if (!root["Wind"]["Speed"].empty()) { windspeed_ms = root["Wind"]["Speed"]["Metric"]["Value"].asFloat() / 3.6f; //km/h to m/s } if (!root["WindGust"].empty()) { if (!root["WindGust"]["Speed"].empty()) { windgust_ms = root["WindGust"]["Speed"]["Metric"]["Value"].asFloat() / 3.6f; //km/h to m/s } } if (!root["RealFeelTemperature"].empty()) { wind_chill = root["RealFeelTemperature"]["Metric"]["Value"].asFloat(); } if (wind_degrees != -1) { SendWind(1, 255, wind_degrees, windspeed_ms, windgust_ms, temp, wind_chill, true, "Wind"); } } //UV if (!root["UVIndex"].empty()) { float UV = static_cast<float>(atof(root["UVIndex"].asString().c_str())); if ((UV < 16) && (UV >= 0)) { SendUVSensor(0, 1, 255, UV, "UV"); } } //Rain if (!root["PrecipitationSummary"].empty()) { if (!root["PrecipitationSummary"]["Precipitation"].empty()) { float RainCount = static_cast<float>(atof(root["PrecipitationSummary"]["Precipitation"]["Metric"]["Value"].asString().c_str())); if ((RainCount != -9999.00f) && (RainCount >= 0.00f)) { RBUF tsen; memset(&tsen, 0, sizeof(RBUF)); tsen.RAIN.packetlength = sizeof(tsen.RAIN) - 1; tsen.RAIN.packettype = pTypeRAIN; tsen.RAIN.subtype = sTypeRAINWU; tsen.RAIN.battery_level = 9; tsen.RAIN.rssi = 12; tsen.RAIN.id1 = 0; tsen.RAIN.id2 = 1; tsen.RAIN.rainrateh = 0; tsen.RAIN.rainratel = 0; if (!root["PrecipitationSummary"]["PastHour"].empty()) { float rainrateph = static_cast<float>(atof(root["PrecipitationSummary"]["PastHour"]["Metric"]["Value"].asString().c_str())); if (rainrateph != -9999.00f) { int at10 = round(std::abs(rainrateph*10.0f)); tsen.RAIN.rainrateh = (BYTE)(at10 / 256); at10 -= (tsen.RAIN.rainrateh * 256); tsen.RAIN.rainratel = (BYTE)(at10); } } int tr10 = int((float(RainCount)*10.0f)); tsen.RAIN.raintotal1 = 0; tsen.RAIN.raintotal2 = (BYTE)(tr10 / 256); tr10 -= (tsen.RAIN.raintotal2 * 256); tsen.RAIN.raintotal3 = (BYTE)(tr10); sDecodeRXMessage(this, (const unsigned char *)&tsen.RAIN, NULL, 255); } } } //Visibility if (!root["Visibility"].empty()) { if (!root["Visibility"]["Metric"].empty()) { float visibility = root["Visibility"]["Metric"]["Value"].asFloat(); if (visibility >= 0) { _tGeneralDevice gdevice; gdevice.subtype = sTypeVisibility; gdevice.floatval1 = visibility; sDecodeRXMessage(this, (const unsigned char *)&gdevice, NULL, 255); } } } //Forecast URL if (!root["Link"].empty()) { m_ForecastURL = root["Link"].asString(); } } catch (...) { _log.Log(LOG_ERROR, "AccuWeather: Error parsing JSon data!"); } }
void CToonThermostat::GetMeterDetails() { if (m_UserName.size()==0) return; if (m_Password.size()==0) return; std::string sResult; if (m_bDoLogin) { if (!Login()) return; } std::vector<std::string> ExtraHeaders; std::stringstream sstr2; sstr2 << "?clientId=" << m_ClientID << "&clientIdChecksum=" << m_ClientIDChecksum << "&random=" << GetRandom(); std::string szPostdata = sstr2.str(); //Get Data std::string sURL = TOON_HOST + TOON_UPDATE_PATH + szPostdata; if (!HTTPClient::GET(sURL, ExtraHeaders, sResult)) { _log.Log(LOG_ERROR, "ToonThermostat: Error getting current state!"); m_bDoLogin = true; return; } time_t atime = mytime(NULL); #ifdef DEBUG_ToonThermostat char szFileName[MAX_PATH]; static int sNum = 1; sprintf_s(szFileName, "E:\\toonresult_%03d.txt", sNum++); SaveString2Disk(sResult, szFileName); #endif Json::Value root; Json::Reader jReader; if (!jReader.parse(sResult, root)) { _log.Log(LOG_ERROR, "ToonThermostat: Invalid data received!"); m_bDoLogin = true; return; } if (root["success"].empty() == true) { _log.Log(LOG_ERROR, "ToonThermostat: ToonState request not successful, restarting..!"); m_bDoLogin = true; return; } if (root["success"] == false) { _log.Log(LOG_ERROR, "ToonThermostat: ToonState request not successful, restarting..!"); m_bDoLogin = true; return; } //ZWave Devices if (root["deviceStatusInfo"].empty() == false) { if (root["deviceStatusInfo"]["device"].empty() == false) { int totDevices = root["deviceStatusInfo"]["device"].size(); for (int ii = 0; ii < totDevices; ii++) { std::string deviceName = root["deviceStatusInfo"]["device"][ii]["name"].asString(); std::string uuid = root["deviceStatusInfo"]["device"][ii]["devUUID"].asString(); int state = root["deviceStatusInfo"]["device"][ii]["currentState"].asInt(); int Idx; if (!GetUUIDIdx(uuid, Idx)) { if (!AddUUID(uuid, Idx)) { _log.Log(LOG_ERROR, "ToonThermostat: Error adding UUID to database?! Uuid=%s", uuid.c_str()); return; } } UpdateSwitch(Idx, state != 0, deviceName); } } } //thermostatInfo if (root["thermostatInfo"].empty() == false) { float currentTemp = root["thermostatInfo"]["currentTemp"].asFloat() / 100.0f; float currentSetpoint = root["thermostatInfo"]["currentSetpoint"].asFloat() / 100.0f; SendSetPointSensor(1, currentSetpoint, "Room Setpoint"); SendTempSensor(1, currentTemp, "Room Temperature"); //int programState = root["thermostatInfo"]["programState"].asInt(); //int activeState = root["thermostatInfo"]["activeState"].asInt(); if (root["thermostatInfo"]["burnerInfo"].empty() == false) { //burnerinfo //0=off //1=heating //2=hot water //3=pre-heating int burnerInfo = 0; if (root["thermostatInfo"]["burnerInfo"].isString()) { burnerInfo = atoi(root["thermostatInfo"]["burnerInfo"].asString().c_str()); } else if (root["thermostatInfo"]["burnerInfo"].isInt()) { burnerInfo = root["thermostatInfo"]["burnerInfo"].asInt(); } if (burnerInfo == 1) { UpdateSwitch(113, true, "HeatingOn"); UpdateSwitch(114, false, "TapwaterOn"); UpdateSwitch(115, false, "PreheatOn"); } else if (burnerInfo == 2) { UpdateSwitch(113, false, "HeatingOn"); UpdateSwitch(114, true, "TapwaterOn"); UpdateSwitch(115, false, "PreheatOn"); } else if (burnerInfo == 3) { UpdateSwitch(113, false, "HeatingOn"); UpdateSwitch(114, false, "TapwaterOn"); UpdateSwitch(115, true, "PreheatOn"); } else { UpdateSwitch(113, false, "HeatingOn"); UpdateSwitch(114, false, "TapwaterOn"); UpdateSwitch(115, false, "PreheatOn"); } } } if (root["gasUsage"].empty() == false) { m_p1gas.gasusage = (unsigned long)(root["gasUsage"]["meterReading"].asFloat()); } if (root["powerUsage"].empty() == false) { m_p1power.powerusage1 = (unsigned long)(root["powerUsage"]["meterReadingLow"].asFloat()); m_p1power.powerusage2 = (unsigned long)(root["powerUsage"]["meterReading"].asFloat()); if (root["powerUsage"]["meterReadingProdu"].empty() == false) { m_p1power.powerdeliv1 = (unsigned long)(root["powerUsage"]["meterReadingLowProdu"].asFloat()); m_p1power.powerdeliv2 = (unsigned long)(root["powerUsage"]["meterReadingProdu"].asFloat()); } m_p1power.usagecurrent = (unsigned long)(root["powerUsage"]["value"].asFloat()); //Watt } //Send Electra if value changed, or at least every 5 minutes if ( (m_p1power.usagecurrent != m_lastelectrausage) || (atime - m_lastSharedSendElectra >= 300) ) { if ((m_p1power.powerusage1 != 0) || (m_p1power.powerusage2 != 0) || (m_p1power.powerdeliv1 != 0) || (m_p1power.powerdeliv2 != 0)) { m_lastSharedSendElectra = atime; m_lastelectrausage = m_p1power.usagecurrent; sDecodeRXMessage(this, (const unsigned char *)&m_p1power); } } //Send GAS if the value changed, or at least every 5 minutes if ( (m_p1gas.gasusage != m_lastgasusage) || (atime - m_lastSharedSendGas >= 300) ) { if (m_p1gas.gasusage != 0) { m_lastSharedSendGas = atime; m_lastgasusage = m_p1gas.gasusage; sDecodeRXMessage(this, (const unsigned char *)&m_p1gas); } } }
void CNest::GetMeterDetails() { std::string sResult; #ifdef DEBUG_NextThermostatR sResult = ReadFile("E:\\nest.json"); #else if (m_UserName.size()==0) return; if (m_Password.size()==0) return; if (m_bDoLogin) { if (!Login()) return; } std::vector<std::string> ExtraHeaders; ExtraHeaders.push_back("user-agent:Nest/1.1.0.10 CFNetwork/548.0.4"); ExtraHeaders.push_back("Authorization:Basic " + m_AccessToken); ExtraHeaders.push_back("X-nl-user-id:" + m_UserID); ExtraHeaders.push_back("X-nl-protocol-version:1"); //Get Data std::string sURL = m_TransportURL + NEST_GET_STATUS + m_UserID; if (!HTTPClient::GET(sURL, ExtraHeaders, sResult)) { _log.Log(LOG_ERROR, "Nest: Error getting current state!"); m_bDoLogin = true; return; } #endif #ifdef DEBUG_NextThermostatW SaveString2Disk(sResult, "E:\\nest.json"); #endif Json::Value root; Json::Reader jReader; if (!jReader.parse(sResult, root)) { _log.Log(LOG_ERROR, "Nest: Invalid data received!"); m_bDoLogin = true; return; } bool bHaveShared = !root["shared"].empty(); bool bHaveTopaz = !root["topaz"].empty(); if ((!bHaveShared) && (!bHaveTopaz)) { _log.Log(LOG_ERROR, "Nest: request not successful, restarting..!"); m_bDoLogin = true; return; } //Protect if (bHaveTopaz) { if (root["topaz"].size() < 1) { _log.Log(LOG_ERROR, "Nest: request not successful, restarting..!"); m_bDoLogin = true; return; } Json::Value::Members members = root["topaz"].getMemberNames(); if (members.size() < 1) { _log.Log(LOG_ERROR, "Nest: request not successful, restarting..!"); m_bDoLogin = true; return; } int SwitchIndex = 1; for (Json::Value::iterator itDevice = root["topaz"].begin(); itDevice != root["topaz"].end(); ++itDevice) { Json::Value device = *itDevice; std::string devstring = itDevice.key().asString(); if (device["where_id"].empty()) continue; std::string whereid = device["where_id"].asString(); //lookup name std::string devName = devstring; if (!root["where"].empty()) { for (Json::Value::iterator itWhere = root["where"].begin(); itWhere != root["where"].end(); ++itWhere) { Json::Value iwhere = *itWhere; if (!iwhere["wheres"].empty()) { for (Json::Value::iterator itWhereNest = iwhere["wheres"].begin(); itWhereNest != iwhere["wheres"].end(); ++itWhereNest) { Json::Value iwhereItt = *itWhereNest; if (!iwhereItt["where_id"].empty()) { std::string tmpWhereid = iwhereItt["where_id"].asString(); if (tmpWhereid == whereid) { devName = iwhereItt["name"].asString(); break; } } } } } } bool bIAlarm = false; bool bBool; if (!device["component_speaker_test_passed"].empty()) { bBool = device["component_speaker_test_passed"].asBool(); if (!bBool) bIAlarm = true; } if (!device["component_smoke_test_passed"].empty()) { bBool = device["component_smoke_test_passed"].asBool(); if (!bBool) bIAlarm = true; } if (!device["component_heat_test_passed"].empty()) { bBool = device["component_heat_test_passed"].asBool(); if (!bBool) bIAlarm = true; } if (!device["component_buzzer_test_passed"].empty()) { bBool = device["component_buzzer_test_passed"].asBool(); if (!bBool) bIAlarm = true; } if (!device["component_us_test_passed"].empty()) { bBool = device["component_us_test_passed"].asBool(); if (!bBool) bIAlarm = true; } if (!device["component_temp_test_passed"].empty()) { bBool = device["component_temp_test_passed"].asBool(); if (!bBool) bIAlarm = true; } if (!device["component_wifi_test_passed"].empty()) { bBool = device["component_wifi_test_passed"].asBool(); if (!bBool) bIAlarm = true; } if (!device["component_als_test_passed"].empty()) { bBool = device["component_als_test_passed"].asBool(); if (!bBool) bIAlarm = true; } if (!device["component_co_test_passed"].empty()) { bBool = device["component_co_test_passed"].asBool(); if (!bBool) bIAlarm = true; } if (!device["component_hum_test_passed"].empty()) { bBool = device["component_hum_test_passed"].asBool(); if (!bBool) bIAlarm = true; } UpdateSmokeSensor(SwitchIndex, bIAlarm, devName); SwitchIndex++; } } //Thermostat if (!bHaveShared) return; if (root["shared"].size()<1) { if (bHaveTopaz) return; _log.Log(LOG_ERROR, "Nest: request not successful, restarting..!"); m_bDoLogin = true; return; } size_t iThermostat = 0; for (Json::Value::iterator ittStructure = root["structure"].begin(); ittStructure != root["structure"].end(); ++ittStructure) { Json::Value nstructure = *ittStructure; if (!nstructure.isObject()) continue; std::string StructureID = ittStructure.key().asString(); std::string StructureName = nstructure["name"].asString(); for (Json::Value::iterator ittDevice = nstructure["devices"].begin(); ittDevice != nstructure["devices"].end(); ++ittDevice) { std::string devID = (*ittDevice).asString(); if (devID.find("device.")==std::string::npos) continue; std::string Serial = devID.substr(7); if (root["device"].empty()) continue; if (root["device"][Serial].empty()) continue; //not found !? if (root["shared"][Serial].empty()) continue; //Nothing shared? Json::Value ndevice = root["device"][Serial]; if (!ndevice.isObject()) continue; std::string Name = "Thermostat"; if (!ndevice["where_id"].empty()) { //Lookup our 'where' (for the Name of the thermostat) std::string where_id = ndevice["where_id"].asString(); if (!root["where"].empty()) { if (!root["where"][StructureID].empty()) { for (Json::Value::iterator ittWheres = root["where"][StructureID]["wheres"].begin(); ittWheres != root["where"][StructureID]["wheres"].end(); ++ittWheres) { Json::Value nwheres = *ittWheres; if (nwheres["where_id"] == where_id) { Name = StructureName + " " + nwheres["name"].asString(); break; } } } } } _tNestThemostat ntherm; ntherm.Serial = Serial; ntherm.StructureID = StructureID; ntherm.Name = Name; m_thermostats[iThermostat] = ntherm; Json::Value nshared = root["shared"][Serial]; //Setpoint if (!nshared["target_temperature"].empty()) { float currentSetpoint = nshared["target_temperature"].asFloat(); SendSetPointSensor((const unsigned char)(iThermostat * 3) + 1, currentSetpoint, Name + " Setpoint"); } //Room Temperature/Humidity if (!nshared["current_temperature"].empty()) { float currentTemp = nshared["current_temperature"].asFloat(); int Humidity = root["device"][Serial]["current_humidity"].asInt(); SendTempHumSensor((iThermostat * 3) + 2, 255, currentTemp, Humidity, Name + " TempHum"); } // Check if thermostat is currently Heating if (nshared["can_heat"].asBool() && !nshared["hvac_heater_state"].empty()) { bool bIsHeating = nshared["hvac_heater_state"].asBool(); UpdateSwitch((unsigned char)(113 + (iThermostat * 3)), bIsHeating, Name + " HeatingOn"); } // Check if thermostat is currently Cooling if (nshared["can_cool"].asBool() && !nshared["hvac_ac_state"].empty()) { bool bIsCooling = nshared["hvac_ac_state"].asBool(); UpdateSwitch((unsigned char)(114 + (iThermostat * 3)), bIsCooling, Name + " CoolingOn"); } //Away if (!nstructure["away"].empty()) { bool bIsAway = nstructure["away"].asBool(); SendSwitch((iThermostat * 3) + 3, 1, 255, bIsAway, 0, Name + " Away"); } iThermostat++; } } }
bool CFitbit::Login() { if (m_isLogged) return true; if (LoadRefreshToken()) { if (RefreshToken(true)) { m_isLogged = true; return true; } } std::stringstream sstr; sstr << "grant_type=password&"; sstr << "client_id=" << m_clientId << "&"; sstr << "client_secret=" << m_clientSecret << "&"; sstr << "username="******"&"; sstr << "password="******"&"; sstr << "scope=activity heartrate"; std::string httpData = sstr.str(); std::vector<std::string> ExtraHeaders; ExtraHeaders.push_back("Host: api.fitbit.com"); ExtraHeaders.push_back("Content-Type: application/x-www-form-urlencoded;charset=UTF-8"); std::string httpUrl("https://api.fitbit.com/oauth2/token"); std::string sResult; bool ret = HTTPClient::POST(httpUrl, httpData, ExtraHeaders, sResult); if (!ret) { _log.Log(LOG_ERROR, "Fitbit: Error connecting to Server..."); return false; } #ifdef DEBUG_FitbitWeatherStationW SaveString2Disk(sResult, "E:\\fitbit_login.json"); #endif Json::Value root; Json::Reader jReader; ret = jReader.parse(sResult, root); if (!ret) { _log.Log(LOG_ERROR, "Fitbit: Invalid/no data received..."); return false; } if (root["access_token"].empty() || root["expires_in"].empty() || root["refresh_token"].empty()) { _log.Log(LOG_ERROR, "Fitbit: No access granted, check username/password..."); return false; } /* //Initial Access Token m_accessToken = root["access_token"].asString(); m_refreshToken = root["refresh_token"].asString(); //_log.Log(LOG_STATUS, "Access token: %s", m_accessToken.c_str()); //_log.Log(LOG_STATUS, "RefreshToken: %s", m_refreshToken.c_str()); int expires = root["expires_in"].asInt(); m_nextRefreshTs = mytime(NULL) + expires; StoreRefreshToken(); */ return true; }
bool CPhilipsHue::GetLightStates() { std::vector<std::string> ExtraHeaders; std::string sResult; #ifdef DEBUG_PhilipsHue sResult= ReadFile("E:\\philipshue.jon"); #else std::stringstream sstr2; sstr2 << "http://" << m_IPAddress << ":" << m_Port << "/api/" << m_UserName; //Get Data std::string sURL = sstr2.str(); if (!HTTPClient::GET(sURL, ExtraHeaders, sResult)) { _log.Log(LOG_ERROR, "Philips Hue: Error getting Light States, (Check IPAddress/Username)"); return false; } #endif #ifdef DEBUG_PhilipsHue2 SaveString2Disk(sResult, "E:\\philipshue.jon"); #endif Json::Value root; Json::Reader jReader; bool ret = jReader.parse(sResult, root); if (!ret) { _log.Log(LOG_ERROR, "Philips Hue: Invalid data received, or invalid IPAddress/Username!"); return false; } if (sResult.find("error") != std::string::npos) { //We had an error _log.Log(LOG_ERROR, "Philips Hue: Error received: %s", root[0]["error"]["description"].asString().c_str()); return false; } if (sResult.find("lights") == std::string::npos) { return false; } int totLights = root["lights"].size(); char szNode[10]; for (int ii = 0; ii < 255; ii++) { sprintf(szNode, "%d", ii + 1); if (root["lights"][szNode].empty()) continue; std::string ltype = root["lights"][szNode]["type"].asString(); if ( (ltype == "Dimmable plug-in unit") || (ltype == "Dimmable light") ) { //Normal light (with dim option) bool bIsOn = root["lights"][szNode]["state"]["on"].asBool(); int tbri = root["lights"][szNode]["state"]["bri"].asInt(); int BrightnessLevel = int((100.0f / 255.0f)*float(tbri)); _tHueLight tlight; if (bIsOn) { tlight.cmd = (BrightnessLevel != 0) ? light2_sSetLevel: light2_sOn; } else tlight.cmd = light2_sOff; tlight.level = BrightnessLevel; tlight.sat = 0; tlight.hue = 0; bool bDoSend = true; if (m_lights.find(ii + 1) != m_lights.end()) { _tHueLight alight = m_lights[ii + 1]; if ( (alight.cmd == tlight.cmd) && (alight.level == tlight.level) ) { bDoSend = false; } } m_lights[ii + 1] = tlight; if (bDoSend) InsertUpdateSwitch(ii + 1, HLTYPE_DIM, bIsOn, BrightnessLevel, 0, 0, root["lights"][szNode]["name"].asString()); } else if ( (ltype == "Extended color light") || (ltype == "Color light") ) { //RGBW type bool bIsOn = root["lights"][szNode]["state"]["on"].asBool(); int tbri = root["lights"][szNode]["state"]["bri"].asInt(); int tsat = root["lights"][szNode]["state"]["sat"].asInt(); int thue = root["lights"][szNode]["state"]["hue"].asInt(); int BrightnessLevel = int((100.0f / 255.0f)*float(tbri)); _tHueLight tlight; if (bIsOn) { tlight.cmd = (BrightnessLevel != 0) ? Limitless_SetBrightnessLevel : Limitless_LedOn; } else tlight.cmd = Limitless_LedOff; tlight.level = BrightnessLevel; tlight.sat = tsat; tlight.hue = thue; bool bDoSend = true; if (m_lights.find(ii + 1) != m_lights.end()) { _tHueLight alight = m_lights[ii + 1]; if ( (alight.cmd == tlight.cmd) && (alight.level == tlight.level)&& (alight.sat == tlight.sat)&& (alight.hue == tlight.hue) ) { bDoSend = false; } } m_lights[ii + 1] = tlight; if (bDoSend) InsertUpdateSwitch(ii + 1, HLTYPE_RGBW, bIsOn, BrightnessLevel, tsat, thue, root["lights"][szNode]["name"].asString()); } } return true; }
void CWunderground::GetMeterDetails() { std::string sResult; #ifdef DEBUG_WUNDERGROUND sResult= ReadFile("E:\\wu.json"); #else std::stringstream sURL; std::string szLoc = CURLEncode::URLEncode(m_Location); sURL << "http://api.wunderground.com/api/" << m_APIKey << "/conditions/q/" << szLoc << ".json"; bool bret; std::string szURL=sURL.str(); bret=HTTPClient::GET(szURL,sResult); if (!bret) { _log.Log(LOG_ERROR,"Wunderground: Error getting http data!"); return; } #ifdef DEBUG_WUNDERGROUND2 SaveString2Disk(sResult, "E:\\wu.json"); #endif #endif Json::Value root; Json::Reader jReader; bool ret=jReader.parse(sResult,root); if (!ret) { _log.Log(LOG_ERROR,"WUnderground: Invalid data received!"); return; } bool bValid = true; if (root["response"].empty() == true) { bValid = false; } else if (!root["response"]["error"].empty()) { bValid = false; if (!root["response"]["error"]["description"].empty()) { _log.Log(LOG_ERROR, "WUnderground: Error: %s", root["response"]["error"]["description"].asString().c_str()); return; } } else if (root["current_observation"].empty()==true) { bValid = false; return; } else if (root["current_observation"]["temp_c"].empty() == true) { bValid = false; } if (!bValid) { _log.Log(LOG_ERROR, "WUnderground: Invalid data received, or no data returned!"); return; } /* std::string tmpstr2 = root.toStyledString(); FILE *fOut = fopen("E:\\underground.json", "wb+"); fwrite(tmpstr2.c_str(), 1, tmpstr2.size(), fOut); fclose(fOut); */ std::string tmpstr; float temp; int humidity=0; int barometric=0; int barometric_forcast=baroForecastNoInfo; temp=root["current_observation"]["temp_c"].asFloat(); if (root["current_observation"]["relative_humidity"].empty()==false) { tmpstr=root["current_observation"]["relative_humidity"].asString(); size_t pos=tmpstr.find("%"); if (pos==std::string::npos) { _log.Log(LOG_ERROR,"WUnderground: Invalid data received!"); return; } humidity=atoi(tmpstr.substr(0,pos).c_str()); } if (root["current_observation"]["pressure_mb"].empty()==false) { barometric=atoi(root["current_observation"]["pressure_mb"].asString().c_str()); if (barometric<1000) barometric_forcast=baroForecastRain; else if (barometric<1020) barometric_forcast=baroForecastCloudy; else if (barometric<1030) barometric_forcast=baroForecastPartlyCloudy; else barometric_forcast=baroForecastSunny; if (root["current_observation"]["icon"].empty()==false) { std::string forcasticon=root["current_observation"]["icon"].asString(); if (forcasticon=="partlycloudy") { barometric_forcast=baroForecastPartlyCloudy; } else if (forcasticon=="cloudy") { barometric_forcast=baroForecastCloudy; } else if (forcasticon=="sunny") { barometric_forcast=baroForecastSunny; } else if (forcasticon=="rain") { barometric_forcast=baroForecastRain; } } } if (barometric!=0) { //Add temp+hum+baro device SendTempHumBaroSensor(1, 255, temp, humidity, static_cast<float>(barometric), barometric_forcast, "THB"); } else if (humidity!=0) { //add temp+hum device SendTempHumSensor(1, 255, temp, humidity, "TempHum"); } else { //add temp device SendTempSensor(1, 255, temp, "Temperature"); } //Wind int wind_degrees=-1; float wind_mph=-1; float wind_gust_mph=-1; float windspeed_ms=0; float windgust_ms=0; float wind_temp=temp; float wind_chill=temp; int windgust=1; float windchill=-1; if (root["current_observation"]["wind_degrees"].empty()==false) { wind_degrees=atoi(root["current_observation"]["wind_degrees"].asString().c_str()); } if (root["current_observation"]["wind_mph"].empty()==false) { if ((root["current_observation"]["wind_mph"] != "N/A") && (root["current_observation"]["wind_mph"] != "--")) { float temp_wind_mph = static_cast<float>(atof(root["current_observation"]["wind_mph"].asString().c_str())); if (temp_wind_mph!=-9999.00f) { wind_mph=temp_wind_mph; //convert to m/s windspeed_ms=wind_mph*0.44704f; } } } if (root["current_observation"]["wind_gust_mph"].empty()==false) { if ((root["current_observation"]["wind_gust_mph"] != "N/A") && (root["current_observation"]["wind_gust_mph"] != "--")) { float temp_wind_gust_mph = static_cast<float>(atof(root["current_observation"]["wind_gust_mph"].asString().c_str())); if (temp_wind_gust_mph!=-9999.00f) { wind_gust_mph=temp_wind_gust_mph; //convert to m/s windgust_ms=wind_gust_mph*0.44704f; } } } if (root["current_observation"]["feelslike_c"].empty()==false) { if ((root["current_observation"]["feelslike_c"] != "N/A") && (root["current_observation"]["feelslike_c"] != "--")) { wind_chill = static_cast<float>(atof(root["current_observation"]["feelslike_c"].asString().c_str())); } } if (wind_degrees!=-1) { RBUF tsen; memset(&tsen,0,sizeof(RBUF)); tsen.WIND.packetlength=sizeof(tsen.WIND)-1; tsen.WIND.packettype=pTypeWIND; tsen.WIND.subtype=sTypeWIND4; tsen.WIND.battery_level=9; tsen.WIND.rssi=12; tsen.WIND.id1=0; tsen.WIND.id2=1; float winddir=float(wind_degrees); int aw=round(winddir); tsen.WIND.directionh=(BYTE)(aw/256); aw-=(tsen.WIND.directionh*256); tsen.WIND.directionl=(BYTE)(aw); tsen.WIND.av_speedh=0; tsen.WIND.av_speedl=0; int sw=round(windspeed_ms*10.0f); tsen.WIND.av_speedh=(BYTE)(sw/256); sw-=(tsen.WIND.av_speedh*256); tsen.WIND.av_speedl=(BYTE)(sw); tsen.WIND.gusth=0; tsen.WIND.gustl=0; int gw=round(windgust_ms*10.0f); tsen.WIND.gusth=(BYTE)(gw/256); gw-=(tsen.WIND.gusth*256); tsen.WIND.gustl=(BYTE)(gw); //this is not correct, why no wind temperature? and only chill? tsen.WIND.chillh=0; tsen.WIND.chilll=0; tsen.WIND.temperatureh=0; tsen.WIND.temperaturel=0; tsen.WIND.tempsign=(wind_temp>=0)?0:1; int at10=round(std::abs(wind_temp*10.0f)); tsen.WIND.temperatureh=(BYTE)(at10/256); at10-=(tsen.WIND.temperatureh*256); tsen.WIND.temperaturel=(BYTE)(at10); tsen.WIND.chillsign=(wind_temp>=0)?0:1; at10=round(std::abs(wind_chill*10.0f)); tsen.WIND.chillh=(BYTE)(at10/256); at10-=(tsen.WIND.chillh*256); tsen.WIND.chilll=(BYTE)(at10); sDecodeRXMessage(this, (const unsigned char *)&tsen.WIND, NULL, 255); } //UV if (root["current_observation"].empty() == false) { if (root["current_observation"]["UV"].empty() == false) { if ((root["current_observation"]["UV"] != "N/A") && (root["current_observation"]["UV"] != "--")) { float UV = static_cast<float>(atof(root["current_observation"]["UV"].asString().c_str())); if ((UV < 16) && (UV >= 0)) { SendUVSensor(0, 1, 255, UV, "UV"); } } } } //Rain if (root["current_observation"]["precip_today_metric"].empty() == false) { if ((root["current_observation"]["precip_today_metric"] != "N/A") && (root["current_observation"]["precip_today_metric"] != "--")) { float RainCount = static_cast<float>(atof(root["current_observation"]["precip_today_metric"].asString().c_str())); if ((RainCount != -9999.00f) && (RainCount >= 0.00f)) { RBUF tsen; memset(&tsen, 0, sizeof(RBUF)); tsen.RAIN.packetlength = sizeof(tsen.RAIN) - 1; tsen.RAIN.packettype = pTypeRAIN; tsen.RAIN.subtype = sTypeRAINWU; tsen.RAIN.battery_level = 9; tsen.RAIN.rssi = 12; tsen.RAIN.id1 = 0; tsen.RAIN.id2 = 1; tsen.RAIN.rainrateh = 0; tsen.RAIN.rainratel = 0; if (root["current_observation"]["precip_1hr_metric"].empty() == false) { if ((root["current_observation"]["precip_1hr_metric"] != "N/A") && (root["current_observation"]["precip_1hr_metric"] != "--")) { float rainrateph = static_cast<float>(atof(root["current_observation"]["precip_1hr_metric"].asString().c_str())); if (rainrateph != -9999.00f) { int at10 = round(std::abs(rainrateph*10.0f)); tsen.RAIN.rainrateh = (BYTE)(at10 / 256); at10 -= (tsen.RAIN.rainrateh * 256); tsen.RAIN.rainratel = (BYTE)(at10); } } } int tr10 = int((float(RainCount)*10.0f)); tsen.RAIN.raintotal1 = 0; tsen.RAIN.raintotal2 = (BYTE)(tr10 / 256); tr10 -= (tsen.RAIN.raintotal2 * 256); tsen.RAIN.raintotal3 = (BYTE)(tr10); sDecodeRXMessage(this, (const unsigned char *)&tsen.RAIN, NULL, 255); } } } //Visibility if (root["current_observation"]["visibility_km"].empty() == false) { if ((root["current_observation"]["visibility_km"] != "N/A") && (root["current_observation"]["visibility_km"] != "--")) { float visibility = static_cast<float>(atof(root["current_observation"]["visibility_km"].asString().c_str())); if (visibility >= 0) { _tGeneralDevice gdevice; gdevice.subtype = sTypeVisibility; gdevice.floatval1 = visibility; sDecodeRXMessage(this, (const unsigned char *)&gdevice, NULL, 255); } } } //Solar Radiation if (root["current_observation"]["solarradiation"].empty() == false) { if ((root["current_observation"]["solarradiation"] != "N/A") && (root["current_observation"]["solarradiation"] != "--")) { float radiation = static_cast<float>(atof(root["current_observation"]["solarradiation"].asString().c_str())); if (radiation >= 0.0f) { _tGeneralDevice gdevice; gdevice.subtype = sTypeSolarRadiation; gdevice.floatval1 = radiation; sDecodeRXMessage(this, (const unsigned char *)&gdevice, NULL, 255); } } } }
void CDarkSky::GetMeterDetails() { std::string sResult; #ifdef DEBUG_DarkSkyR sResult=ReadFile("E:\\DarkSky.json"); #else std::stringstream sURL; std::string szLoc = m_Location; std::string szExclude = "minutely,hourly,daily,alerts,flags"; sURL << "https://api.darksky.net/forecast/" << m_APIKey << "/" << szLoc << "?exclude=" << szExclude; try { bool bret; std::string szURL = sURL.str(); bret = HTTPClient::GET(szURL, sResult); if (!bret) { _log.Log(LOG_ERROR, "DarkSky: Error getting http data!."); return; } } catch (...) { _log.Log(LOG_ERROR, "DarkSky: Error getting http data!"); return; } #ifdef DEBUG_DarkSkyW SaveString2Disk(sResult, "E:\\DarkSky.json"); #endif #endif Json::Value root; Json::Reader jReader; bool ret=jReader.parse(sResult,root); if ((!ret) || (!root.isObject())) { _log.Log(LOG_ERROR,"DarkSky: Invalid data received! Check Location, use a City or GPS Coordinates (xx.yyyy,xx.yyyyy)"); return; } if (root["currently"].empty()==true) { _log.Log(LOG_ERROR,"DarkSky: Invalid data received, or unknown location!"); return; } /* std::string tmpstr2 = root.toStyledString(); FILE *fOut = fopen("E:\\DarkSky.json", "wb+"); fwrite(tmpstr2.c_str(), 1, tmpstr2.size(), fOut); fclose(fOut); */ float temp; int humidity=0; int barometric=0; int barometric_forcast=baroForecastNoInfo; temp=root["currently"]["temperature"].asFloat(); //Convert to celcius temp=float((temp-32)*(5.0/9.0)); if (root["currently"]["humidity"].empty()==false) { humidity=round(root["currently"]["humidity"].asFloat()*100.0f); } if (root["currently"]["pressure"].empty()==false) { barometric=atoi(root["currently"]["pressure"].asString().c_str()); if (barometric<1000) barometric_forcast=baroForecastRain; else if (barometric<1020) barometric_forcast=baroForecastCloudy; else if (barometric<1030) barometric_forcast=baroForecastPartlyCloudy; else barometric_forcast=baroForecastSunny; if (root["currently"]["icon"].empty()==false) { std::string forcasticon=root["currently"]["icon"].asString(); if ((forcasticon=="partly-cloudy-day")||(forcasticon=="partly-cloudy-night")) { barometric_forcast=baroForecastPartlyCloudy; } else if (forcasticon=="cloudy") { barometric_forcast=baroForecastCloudy; } else if ((forcasticon=="clear-day")||(forcasticon=="clear-night")) { barometric_forcast=baroForecastSunny; } else if ((forcasticon=="rain")||(forcasticon=="snow")) { barometric_forcast=baroForecastRain; } } } if (barometric!=0) { //Add temp+hum+baro device SendTempHumBaroSensor(1, 255, temp, humidity, static_cast<float>(barometric), barometric_forcast, "THB"); } else if (humidity!=0) { //add temp+hum device SendTempHumSensor(1, 255, temp, humidity, "TempHum"); } else { //add temp device SendTempSensor(1, 255, temp, "Temperature"); } //Wind int wind_degrees=-1; float windspeed_ms=0; float windgust_ms=0; float wind_temp=temp; float wind_chill=temp; int windgust=1; float windchill=-1; if (root["currently"]["windBearing"].empty()==false) { wind_degrees=atoi(root["currently"]["windBearing"].asString().c_str()); } if (root["currently"]["windSpeed"].empty()==false) { if ((root["currently"]["windSpeed"] != "N/A") && (root["currently"]["windSpeed"] != "--")) { float temp_wind_mph = static_cast<float>(atof(root["currently"]["windSpeed"].asString().c_str())); if (temp_wind_mph!=-9999.00f) { //convert to m/s windspeed_ms=temp_wind_mph*0.44704f; } } } if (root["currently"]["windGust"].empty()==false) { if ((root["currently"]["windGust"] != "N/A") && (root["currently"]["windGust"] != "--")) { float temp_wind_gust_mph = static_cast<float>(atof(root["currently"]["windGust"].asString().c_str())); if (temp_wind_gust_mph!=-9999.00f) { //convert to m/s windgust_ms=temp_wind_gust_mph*0.44704f; } } } if (root["currently"]["apparentTemperature"].empty()==false) { if ((root["currently"]["apparentTemperature"] != "N/A") && (root["currently"]["apparentTemperature"] != "--")) { wind_chill = static_cast<float>(atof(root["currently"]["apparentTemperature"].asString().c_str())); //Convert to celcius wind_chill=float((wind_chill-32)*(5.0/9.0)); } } if (wind_degrees!=-1) { RBUF tsen; memset(&tsen,0,sizeof(RBUF)); tsen.WIND.packetlength=sizeof(tsen.WIND)-1; tsen.WIND.packettype=pTypeWIND; tsen.WIND.subtype=sTypeWIND4; tsen.WIND.battery_level=9; tsen.WIND.rssi=12; tsen.WIND.id1=0; tsen.WIND.id2=1; float winddir=float(wind_degrees); int aw=round(winddir); tsen.WIND.directionh=(BYTE)(aw/256); aw-=(tsen.WIND.directionh*256); tsen.WIND.directionl=(BYTE)(aw); tsen.WIND.av_speedh=0; tsen.WIND.av_speedl=0; int sw=round(windspeed_ms*10.0f); tsen.WIND.av_speedh=(BYTE)(sw/256); sw-=(tsen.WIND.av_speedh*256); tsen.WIND.av_speedl=(BYTE)(sw); tsen.WIND.gusth=0; tsen.WIND.gustl=0; int gw=round(windgust_ms*10.0f); tsen.WIND.gusth=(BYTE)(gw/256); gw-=(tsen.WIND.gusth*256); tsen.WIND.gustl=(BYTE)(gw); //this is not correct, why no wind temperature? and only chill? tsen.WIND.chillh=0; tsen.WIND.chilll=0; tsen.WIND.temperatureh=0; tsen.WIND.temperaturel=0; tsen.WIND.tempsign=(wind_temp>=0)?0:1; int at10=round(std::abs(wind_temp*10.0f)); tsen.WIND.temperatureh=(BYTE)(at10/256); at10-=(tsen.WIND.temperatureh*256); tsen.WIND.temperaturel=(BYTE)(at10); tsen.WIND.chillsign=(wind_temp>=0)?0:1; at10=round(std::abs(wind_chill*10.0f)); tsen.WIND.chillh=(BYTE)(at10/256); at10-=(tsen.WIND.chillh*256); tsen.WIND.chilll=(BYTE)(at10); sDecodeRXMessage(this, (const unsigned char *)&tsen.WIND, NULL, 255); } //UV if (root["currently"]["uvIndex"].empty() == false) { if ((root["currently"]["uvIndex"] != "N/A") && (root["currently"]["uvIndex"] != "--")) { float UV = root["currently"]["uvIndex"].asFloat(); if ((UV < 16) && (UV >= 0)) { SendUVSensor(0, 1, 255, UV, "UV Index"); } } } //Rain if (root["currently"]["precipIntensity"].empty()==false) { if ((root["currently"]["precipIntensity"] != "N/A") && (root["currently"]["precipIntensity"] != "--")) { float RainCount = static_cast<float>(atof(root["currently"]["precipIntensity"].asString().c_str()))*25.4f; //inches to mm if ((RainCount!=-9999.00f)&&(RainCount>=0.00f)) { RBUF tsen; memset(&tsen,0,sizeof(RBUF)); tsen.RAIN.packetlength=sizeof(tsen.RAIN)-1; tsen.RAIN.packettype=pTypeRAIN; tsen.RAIN.subtype=sTypeRAINWU; tsen.RAIN.battery_level=9; tsen.RAIN.rssi=12; tsen.RAIN.id1=0; tsen.RAIN.id2=1; tsen.RAIN.rainrateh=0; tsen.RAIN.rainratel=0; int tr10=int((float(RainCount)*10.0f)); tsen.RAIN.raintotal1=0; tsen.RAIN.raintotal2=(BYTE)(tr10/256); tr10-=(tsen.RAIN.raintotal2*256); tsen.RAIN.raintotal3=(BYTE)(tr10); sDecodeRXMessage(this, (const unsigned char *)&tsen.RAIN, NULL, 255); } } } //Visibility if (root["currently"]["visibility"].empty()==false) { if ((root["currently"]["visibility"] != "N/A") && (root["currently"]["visibility"] != "--")) { float visibility = static_cast<float>(atof(root["currently"]["visibility"].asString().c_str()))*1.60934f; //miles to km if (visibility>=0) { _tGeneralDevice gdevice; gdevice.subtype=sTypeVisibility; gdevice.floatval1=visibility; sDecodeRXMessage(this, (const unsigned char *)&gdevice, NULL, 255); } } } //Solar Radiation if (root["currently"]["ozone"].empty()==false) { if ((root["currently"]["ozone"] != "N/A") && (root["currently"]["ozone"] != "--")) { float radiation = static_cast<float>(atof(root["currently"]["ozone"].asString().c_str())); if (radiation>=0.0f) { SendCustomSensor(1, 0, 255, radiation, "Ozone Sensor", "DU"); //(dobson units) } } } }
void CToonThermostat::GetMeterDetails() { if (m_UserName.size()==0) return; if (m_Password.size()==0) return; std::string sResult; if (m_bDoLogin) { if (!Login()) return; } std::vector<std::string> ExtraHeaders; Json::Value root; bool bIsValid = false; std::stringstream sstr2; sstr2 << "?clientId=" << m_ClientID << "&clientIdChecksum=" << m_ClientIDChecksum << "&random=" << GetRandom(); std::string szPostdata = sstr2.str(); //Get Data #ifdef DEBUG_ToonThermostat sResult = ReadFile("E:\\toonresult_001.txt"); #else std::string sURL = TOON_HOST + TOON_UPDATE_PATH + szPostdata; if (!HTTPClient::GET(sURL, ExtraHeaders, sResult)) { _log.Log(LOG_ERROR, "ToonThermostat: Error getting current state!"); m_bDoLogin = true; return; } #endif #ifdef DEBUG_ToonThermostatW char szFileName[MAX_PATH]; static int sNum = 1; sprintf_s(szFileName, "E:\\toonresult_%03d.txt", sNum++); SaveString2Disk(sResult, szFileName); #endif Json::Reader jReader; if (!jReader.parse(sResult, root)) { _log.Log(LOG_ERROR, "ToonThermostat: Invalid data received!"); m_bDoLogin = true; return; } if (root["success"].empty() == true) { _log.Log(LOG_ERROR, "ToonThermostat: ToonState request not successful, restarting..!"); m_bDoLogin = true; return; } if (root["success"].asBool() == false) { _log.Log(LOG_ERROR, "ToonThermostat: ToonState request not successful, restarting..!"); m_bDoLogin = true; return; } //check if we have all required data fields, if not retry with a shorter interval if (root["thermostatInfo"].empty() == false) { if (root["powerUsage"].empty() == false) { if (root["gasUsage"].empty() == false) { bIsValid = true; } } } if (!bIsValid) { m_retry_counter++; m_poll_counter = TOON_POLL_INTERVAL_SHORT; return; } m_retry_counter = 0; ParseThermostatData(root); ParsePowerUsage(root); ParseGasUsage(root); ParseDeviceStatusData(root); }
bool CToonThermostat::Login() { if (m_ClientID != "") { Logout(); } m_ClientID = ""; std::stringstream sstr; sstr << "username="******"&password="******"ToonThermostat: Error login!"); return false; } #ifdef DEBUG_ToonThermostatW char szFileName[MAX_PATH]; static int lNum = 1; sprintf_s(szFileName, "E:\\toonlogin_%03d.txt", lNum++); SaveString2Disk(sResult, szFileName); #endif Json::Value root; Json::Reader jReader; if (!jReader.parse(sResult, root)) { _log.Log(LOG_ERROR, "ToonThermostat: Invalid data received, or invalid username/password!"); return false; } if (root["clientId"].empty() == true) { _log.Log(LOG_ERROR, "ToonThermostat: Invalid data received, or invalid username/password!"); return false; } m_ClientID = root["clientId"].asString(); if (root["clientIdChecksum"].empty() == true) { _log.Log(LOG_ERROR, "ToonThermostat: Invalid data received, or invalid username/password!"); return false; } m_ClientIDChecksum = root["clientIdChecksum"].asString(); std::string agreementId; std::string agreementIdChecksum; if (root["agreements"].empty() == true) { _log.Log(LOG_ERROR, "ToonThermostat: Invalid data received, or invalid username/password!"); return false; } if (root["agreements"].size() < (size_t)(m_Agreement+1)) { _log.Log(LOG_ERROR, "ToonThermostat: Agreement not found, did you setup your toon correctly?"); return false; } agreementId = root["agreements"][m_Agreement]["agreementId"].asString(); agreementIdChecksum = root["agreements"][m_Agreement]["agreementIdChecksum"].asString(); std::stringstream sstr2; sstr2 << "clientId=" << m_ClientID << "&clientIdChecksum=" << m_ClientIDChecksum << "&agreementId=" << agreementId << "&agreementIdChecksum=" << agreementIdChecksum << "&random=" << GetRandom(); szPostdata = sstr2.str(); sResult = ""; sURL = TOON_HOST + TOON_AGREEMENT_PATH; if (!HTTPClient::POST(sURL, szPostdata, ExtraHeaders, sResult)) { _log.Log(LOG_ERROR, "ToonThermostat: Error login!"); return false; } #ifdef DEBUG_ToonThermostatW char szFileName2[MAX_PATH]; static int l2Num = 1; sprintf_s(szFileName2, "E:\\toonlogin_authstart_%03d.txt", l2Num++); SaveString2Disk(sResult, szFileName2); #endif root.clear(); if (!jReader.parse(sResult, root)) { _log.Log(LOG_ERROR, "ToonThermostat: Invalid data received!"); return false; } if (root["success"].empty() == true) { _log.Log(LOG_ERROR, "ToonThermostat: Invalid data received!"); return false; } if (root["success"] == true) { m_bDoLogin = false; return true; } return false; }
void CDaikin::GetSensorInfo() { std::string sResult; #ifdef DEBUG_DaikinR sResult = ReadFile("E:\\Daikin_get_sensor_info.txt"); #else std::stringstream szURL; if (m_Password.empty()) { szURL << "http://" << m_szIPAddress << ":" << m_usIPPort; } else { szURL << "http://" << m_Username << ":" << m_Password << "@" << m_szIPAddress << ":" << m_usIPPort; } szURL << "/aircon/get_sensor_info"; if (!HTTPClient::GET(szURL.str(), sResult)) { _log.Log(LOG_ERROR, "Daikin: Error connecting to: %s", m_szIPAddress.c_str()); return; } #ifdef DEBUG_DaikinW SaveString2Disk(sResult, "E:\\Daikin_get_sensor_info.txt"); #endif #endif if (sResult.find("ret=OK") == std::string::npos) { _log.Log(LOG_ERROR, "Daikin: Error getting data (check IP/Port)"); return; } std::vector<std::string> results; StringSplit(sResult, ",", results); if (results.size() < 6) { _log.Log(LOG_ERROR, "Daikin: Invalid data received"); return; } float htemp = -1; int hhum = -1; std::vector<std::string>::const_iterator itt; for (itt = results.begin(); itt != results.end(); ++itt) { std::string sVar = *itt; std::vector<std::string> results2; StringSplit(sVar, "=", results2); if (results2.size() != 2) continue; if (results2[0] == "htemp") { htemp = static_cast<float>(atof(results2[1].c_str())); } else if (results2[0] == "hhum") { if (results2[1]!="-") hhum = static_cast<int>(atoi(results2[1].c_str())); } else if (results2[0] == "otemp") { SendTempSensor(11, -1, static_cast<float>(atof(results2[1].c_str())), "Outside Temperature"); } if (htemp != -1) { if (hhum != -1) SendTempHumSensor(10, -1, htemp, hhum, "Home Temp+Hum"); else SendTempSensor(10, -1, htemp, "Home Temperature"); } } }
void CDaikin::GetControlInfo() { std::string sResult; #ifdef DEBUG_DaikinR sResult = ReadFile("E:\\Daikin_get_control_info.txt"); #else std::stringstream szURL; if (m_Password.empty()) { szURL << "http://" << m_szIPAddress << ":" << m_usIPPort; } else { szURL << "http://" << m_Username << ":" << m_Password << "@" << m_szIPAddress << ":" << m_usIPPort; } szURL << "/aircon/get_control_info"; if (!HTTPClient::GET(szURL.str(), sResult)) { _log.Log(LOG_ERROR, "Daikin: Error connecting to: %s", m_szIPAddress.c_str()); return; } #ifdef DEBUG_DaikinW SaveString2Disk(sResult, "E:\\Daikin_get_control_info.txt"); #endif #endif if (sResult.find("ret=OK") == std::string::npos) { _log.Log(LOG_ERROR, "Daikin: Error getting data (check IP/Port)"); return; } std::vector<std::string> results; StringSplit(sResult, ",", results); if (results.size() < 8) { _log.Log(LOG_ERROR, "Daikin: Invalid data received"); return; } std::vector<std::string>::const_iterator itt; for (itt = results.begin(); itt != results.end(); ++itt) { std::string sVar = *itt; std::vector<std::string> results2; StringSplit(sVar, "=", results2); if (results2.size() != 2) continue; if (results2[0] == "mode") { //0-1-7 auto //2 dehum //3 cooling //4 heating //6 fan } else if (results2[0] == "stemp") { //Target Temperature SendSetPointSensor(1, 1, 1, static_cast<float>(atof(results2[1].c_str())), "Target Temperature"); } } //UpdateSwitch(1, Idx, (lValue == 1) ? true : false, 100, sstr.str()); }