use serde::de::{DeserializeOwned};
use serde::{Deserialize, Serialize};
use serde_json::{Value};
use crate::api_requests::{DeviceType, GetDevListRequest, GetDevRealKpiRequest, GetStationRealKpiDataRequest};
#[derive(Deserialize, Debug)]
pub struct Empty {}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct RootResponse<D, R> {
pub fail_code: u16,
pub message: Option<String>,
pub success: bool,
pub params: R,
pub data: Option<Vec<D>>,
}
pub type LoginResponse = RootResponse<Empty, Empty>;
pub type LogoutResponse = LoginResponse;
pub type GetStationRealKpiResponse =
RootResponse<GetStationRealKpiData, GetStationRealKpiDataRequest>;
pub type GetDevRealKpiResponse<ITEM> =
RootResponse<GetDevRealKpiDataResponse<ITEM>, GetDevRealKpiRequest>;
pub type GetStationListResponse = RootResponse<GetStationData, Empty>;
pub type GetDevListResponse = RootResponse<GetDevListData, GetDevListRequest>;
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct GetStationRealKpiData {
pub station_code: String,
pub data_item_map: RealtimeData,
}
#[derive(Clone, Debug, Deserialize)]
pub struct RealtimeData {
pub total_income: f32,
pub total_power: f32,
pub day_power: f32,
pub day_income: f32,
pub real_health_state: f32,
pub month_power: f32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetStationData {
pub aid_type: i64,
pub build_state: Value,
pub capacity: f64,
pub combine_type: Value,
pub linkman_pho: String,
pub station_addr: String,
pub station_code: String,
pub station_linkman: String,
pub station_name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetDevListData {
pub dev_name: String,
pub dev_type_id: DeviceType,
pub esn_code: Value,
pub id: i64,
pub inv_type: Value,
pub latitude: f64,
pub longitude: f64,
pub optimizer_number: Value,
pub software_version: Value,
pub station_code: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetDevRealKpiDataResponse<ITEM> {
pub dev_id: i64,
pub data_item_map: ITEM,
}
pub trait GetDevRealKpiDataItem: DeserializeOwned + Clone + Sized {
fn get_device_type() -> DeviceType;
}
pub type GetDevRealKpiInverterData = GetDevRealKpiDataResponse<GetDevRealKpiDataInverterItem>;
pub type GetDevRealKpiPowerSensorData = GetDevRealKpiDataResponse<GetDevRealKpiDataPowerSensorItem>;
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetDevRealKpiDataInverterItem {
#[serde(rename = "pv1_u")]
pub pv1_u: f64,
#[serde(rename = "pv2_u")]
pub pv2_u: f64,
#[serde(rename = "pv3_u")]
pub pv3_u: f64,
#[serde(rename = "pv4_u")]
pub pv4_u: f64,
#[serde(rename = "pv5_u")]
pub pv5_u: f64,
#[serde(rename = "pv6_u")]
pub pv6_u: f64,
#[serde(rename = "power_factor")]
pub power_factor: f64,
#[serde(rename = "pv7_u")]
pub pv7_u: f64,
#[serde(rename = "pv8_u")]
pub pv8_u: f64,
#[serde(rename = "open_time")]
pub open_time: i64,
#[serde(rename = "inverter_state")]
pub inverter_state: f64,
#[serde(rename = "a_i")]
pub a_i: f64,
#[serde(rename = "total_cap")]
pub total_cap: f64,
#[serde(rename = "c_i")]
pub c_i: f64,
#[serde(rename = "mppt_3_cap")]
pub mppt_3_cap: f64,
#[serde(rename = "b_i")]
pub b_i: f64,
#[serde(rename = "reactive_power")]
pub reactive_power: f64,
#[serde(rename = "a_u")]
pub a_u: f64,
pub temperature: f64,
#[serde(rename = "c_u")]
pub c_u: f64,
#[serde(rename = "b_u")]
pub b_u: f64,
#[serde(rename = "bc_u")]
pub bc_u: f64,
#[serde(rename = "elec_freq")]
pub elec_freq: f64,
#[serde(rename = "mppt_4_cap")]
pub mppt_4_cap: f64,
pub efficiency: f64,
#[serde(rename = "day_cap")]
pub day_cap: f64,
#[serde(rename = "mppt_power")]
pub mppt_power: f64,
#[serde(rename = "run_state")]
pub run_state: i64,
#[serde(rename = "mppt_1_cap")]
pub mppt_1_cap: f64,
#[serde(rename = "close_time")]
pub close_time: i64,
#[serde(rename = "pv1_i")]
pub pv1_i: f64,
#[serde(rename = "pv2_i")]
pub pv2_i: f64,
#[serde(rename = "pv3_i")]
pub pv3_i: f64,
#[serde(rename = "mppt_2_cap")]
pub mppt_2_cap: f64,
#[serde(rename = "pv4_i")]
pub pv4_i: f64,
#[serde(rename = "active_power")]
pub active_power: f64,
#[serde(rename = "pv5_i")]
pub pv5_i: f64,
#[serde(rename = "pv6_i")]
pub pv6_i: f64,
#[serde(rename = "ca_u")]
pub ca_u: f64,
#[serde(rename = "ab_u")]
pub ab_u: f64,
#[serde(rename = "pv7_i")]
pub pv7_i: f64,
#[serde(rename = "pv8_i")]
pub pv8_i: f64,
}
impl GetDevRealKpiDataItem for GetDevRealKpiDataInverterItem {
fn get_device_type() -> DeviceType {
DeviceType::ResidentialInverter
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetDevRealKpiDataPowerSensorItem {
#[serde(rename = "meter_status")]
pub meter_status: f64,
#[serde(rename = "active_cap")]
pub active_cap: f64,
#[serde(rename = "meter_i")]
pub meter_i: f64,
#[serde(rename = "reverse_active_cap")]
pub reverse_active_cap: f64,
#[serde(rename = "reactive_power")]
pub reactive_power: f64,
#[serde(rename = "power_factor")]
pub power_factor: f64,
#[serde(rename = "active_power")]
pub active_power: f64,
#[serde(rename = "run_state")]
pub run_state: i64,
#[serde(rename = "meter_u")]
pub meter_u: f64,
#[serde(rename = "grid_frequency")]
pub grid_frequency: f64,
}
impl GetDevRealKpiDataItem for GetDevRealKpiDataPowerSensorItem {
fn get_device_type() -> DeviceType {
DeviceType::PowerSensor
}
}