#include "Device.h" #include "common/Spdlogger.h" #include "common/Utils.h" #include "protocol/CommEntity.h" #include "common/JsonN.h" //int DeviceEntity::getAttrInt(std::string key) //{ // auto iter = mapAttrs.find(key); // if (iter == mapAttrs.end()) { return 0; } // return Utils::toInt(iter->second); //} // //float DeviceEntity::getAttrFloat(std::string key) //{ // auto iter = mapAttrs.find(key); // if (iter == mapAttrs.end()) { return 0.0f; } // return Utils::toFloat(iter->second); //} // //double DeviceEntity::getAttrDouble(std::string key) //{ // auto iter = mapAttrs.find(key); // if (iter == mapAttrs.end()) { return 0.0; } // return Utils::toDouble(iter->second); //} // //std::string DeviceEntity::getAttrStr(std::string key) //{ // auto iter = mapAttrs.find(key); // if (iter == mapAttrs.end()) { return ""; } // return iter->second; //} int Device::startComm() { if (!isOpen) { if (commEntity && commEntity->alive) { commEntity->close(); } return 0; } //// 从属性列表中获取通讯方式和通讯地址、端口 //std::string commType = attrs.value("commType"); // //// 如果entity的通讯协议类型当前配置不一致,需要关闭连接删除通讯后创建新的通讯 //if (commEntity && commEntity->type != commType) //{ // commEntity->close(); // commEntity = nullptr; //} //// 创建新的通讯 //if (!commEntity) //{ // commEntity = CommEntity::create(attrs); // if (!commEntity) { return -1; } //} //commEntity->start(); return 0; } void Device::getRuntimeParams(std::vector>& params) { params.push_back({"额定电压", "0.0V"}); params.push_back({"实时电压", "0.0V"}); params.push_back({"额定电流", "0.0A"}); params.push_back({"实时电流", "0.0A"}); params.push_back({"额定功率", "0.0kW"}); params.push_back({"实时功率", "0.0A"}); } void Device::getCacheVoltage(std::vector& vec) { vec.resize(mapCacheVoltage.size()); int i = 0; for (auto iter = mapCacheVoltage.begin(); iter != mapCacheVoltage.end(); ++iter) { vec[i] = Utils::toStr(iter->second); i++; } } void Device::getCacheCurrent(std::vector& vec) { vec.resize(mapCacheCurrent.size()); int i = 0; for (auto iter = mapCacheCurrent.begin(); iter != mapCacheCurrent.end(); ++iter) { vec[i] = Utils::toStr(iter->second); i++; } } void Device::getCachePower(std::vector& vec) { vec.resize(mapCachePower.size()); int i = 0; for (auto iter = mapCachePower.begin(); iter != mapCachePower.end(); ++iter) { vec[i] = Utils::toStr(iter->second); i++; } } std::shared_ptr Device::create(Fields& fields) { auto device = std::make_shared(); device->deviceId = fields.get("device_id"); device->type = fields.get("type"); device->name = fields.value("name"); device->code = fields.value("code"); device->isOpen = fields.get("is_open"); device->attrsJson = fields.value("attrs"); device->category = fields.get("category"); // 解析属性的JSON字符串,转换成键值对 njson jsonroot; bool ret = JSON::parse(device->attrsJson, jsonroot); if (!ret) // 解析错误 { spdlog::error("[device] device attr json parse error, device_id={}", device->deviceId); } else { for (auto& [key, val] : jsonroot.items()) { std::string valType = val.type_name(); if (valType == "string") { device->attrs.set(key, val.get()); } else if (valType == "number") { device->attrs.set(key, val.get()); } else { spdlog::error("[device] device attr unknown type: key={}, valtype={}", key, valType); } } } int step = 600; for (int i = 0; i*600<86400; ++i) { double voltage = double(Utils::random(20000, 30000))*0.01; double current = double(Utils::random(1000, 2000))*0.01; device->mapCacheVoltage[i*step] = voltage; device->mapCacheCurrent[i*step] = current; device->mapCachePower[i*step] = voltage * current; } // 启动通讯,该函数中会自动判断isOpen状态,选择是否进行通讯连接 //device->startComm(); return device; }