huawei_client 0.0.2

Huawei Client for FusionSolar API
Documentation
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
    }
}