bool CToonThermostat::ParseDeviceStatusData(const Json::Value &root) { //ZWave Devices if (root["deviceStatusInfo"].empty()) return false; if (root["deviceStatusInfo"]["device"].empty()) return 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 false; } } UpdateSwitch(Idx, state != 0, deviceName); if (root["deviceStatusInfo"]["device"][ii]["currentUsage"].empty() == false) { double currentUsage = root["deviceStatusInfo"]["device"][ii]["currentUsage"].asDouble(); double DayCounter = root["deviceStatusInfo"]["device"][ii]["dayUsage"].asDouble(); //double ElecOffset = GetElectricOffset(Idx, DayCounter); double OldDayCounter = m_LastElectricCounter[Idx]; if (DayCounter < OldDayCounter) { //daily counter went to zero m_OffsetElectricUsage[Idx] += OldDayCounter; } m_LastElectricCounter[Idx] = DayCounter; SendKwhMeterOldWay(Idx, 1, 255, currentUsage / 1000.0, (m_OffsetElectricUsage[Idx] + m_LastElectricCounter[Idx]) / 1000.0, deviceName); } } return true; }
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); } } }