use chrono::{NaiveDate, NaiveDateTime};
use serde::Deserialize;
use super::List;
use crate::api::enums::{
BatteryState, EnergyUnit, EquipmentCommunicationMethod, GasEmissionUnit, Measurer, MeterForm, MeterType, PowerFlowElement,
PowerFlowElementStatus, PowerUnit, SensorType, SiteStatus, TimeUnit,
};
use crate::api::{DateSerde, DateTimeSerde, DateTimeSerdeOpt};
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Location {
pub country: String,
pub city: String,
pub address: String,
pub address2: Option<String>,
pub zip: String,
pub time_zone: String,
pub country_code: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Module {
pub manufacturer_name: String,
pub model_name: String,
pub maximum_power: f64,
pub temperature_coef: Option<f64>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
pub struct Uris {
pub details: String,
pub data_period: String,
pub overview: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PublicSettings {
pub name: Option<String>,
pub is_public: Option<bool>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Details {
pub id: u64,
pub name: String,
pub account_id: u64,
pub status: SiteStatus,
pub peak_power: f64,
#[serde(with = "DateTimeSerdeOpt")]
pub last_update_time: Option<NaiveDateTime>,
pub currency: Option<String>,
#[serde(with = "DateTimeSerde")]
pub installation_date: NaiveDateTime,
#[serde(with = "DateTimeSerdeOpt")]
pub pto_date: Option<NaiveDateTime>,
pub notes: Option<String>,
#[serde(rename = "type")]
pub site_type: String,
pub location: Location,
pub primary_module: Module,
pub alert_quantity: Option<u32>,
pub alert_severity: Option<String>,
pub uris: Uris,
pub public_settings: PublicSettings,
}
#[derive(Debug, Deserialize)]
pub struct ListTop {
pub sites: List<Details>,
}
#[derive(Debug, Deserialize)]
pub struct DetailsTop {
pub details: Details,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DataPeriod {
#[serde(with = "DateTimeSerdeOpt")]
pub start_date: Option<NaiveDateTime>,
#[serde(with = "DateTimeSerdeOpt")]
pub end_date: Option<NaiveDateTime>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DataPeriodTop {
pub data_period: DataPeriod,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SiteDataPeriod {
pub site_id: u64,
pub data_period: DataPeriod,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DataPeriodBulkTop {
pub date_period_list: List<SiteDataPeriod>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DateValue {
#[serde(with = "DateTimeSerde")]
pub date: NaiveDateTime,
pub value: Option<f64>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Energy {
pub time_unit: TimeUnit,
pub unit: EnergyUnit,
pub values: Vec<DateValue>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnergyTop {
pub energy: Energy,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnergyValues {
pub values: Vec<DateValue>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SiteEnergyValues {
pub site_id: u64,
pub energy_values: EnergyValues,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnergyBulkList {
pub time_unit: TimeUnit,
pub unit: EnergyUnit,
pub count: usize,
pub site_energy_list: Vec<SiteEnergyValues>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnergyBulkTop {
pub sites_energy: EnergyBulkList,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LifetimeEnergy {
#[serde(with = "DateSerde")]
pub date: NaiveDate,
pub energy: Option<f64>,
pub unit: EnergyUnit,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TimeframeEnergy {
pub energy: Option<f64>,
pub unit: EnergyUnit,
pub measured_by: Option<Measurer>,
pub start_lifetime_energy: LifetimeEnergy,
pub end_lifetime_energy: LifetimeEnergy,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TimeframeEnergyTop {
#[serde(rename = "timeFrameEnergy")]
pub timeframe_energy: TimeframeEnergy,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SiteTimeframeEnergy {
pub site_id: u64,
#[serde(rename = "timeFrameEnergy")]
pub timeframe_energy: TimeframeEnergy,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TimeframeEnergyBulkTop {
#[serde(rename = "timeFrameEnergyList")]
pub timeframe_energy_list: List<SiteTimeframeEnergy>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Power {
pub time_unit: TimeUnit,
pub unit: PowerUnit,
pub values: Vec<DateValue>,
}
#[derive(Debug, Deserialize)]
pub struct PowerTop {
pub power: Power,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SitePowerEnergyValues {
pub site_id: u64,
pub power_data_value_series: EnergyValues,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PowerValueList {
pub time_unit: TimeUnit,
pub unit: PowerUnit,
pub count: usize,
pub site_energy_list: Vec<SitePowerEnergyValues>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PowerBulkTop {
pub power_date_values_list: PowerValueList,
}
#[derive(Debug, Deserialize)]
pub struct LifetimeData {
pub energy: f64,
pub revenue: f64,
}
#[derive(Debug, Deserialize)]
pub struct EnergyData {
pub energy: f64,
}
#[derive(Debug, Deserialize)]
pub struct PowerData {
pub power: f64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Overview {
#[serde(with = "DateTimeSerde")]
pub last_update_time: NaiveDateTime,
#[serde(rename = "lifeTimeData")]
pub lifetime_data: LifetimeData,
pub last_year_data: EnergyData,
pub last_month_data: EnergyData,
pub last_day_data: EnergyData,
pub current_power: PowerData,
pub measured_by: Option<Measurer>,
}
#[derive(Debug, Deserialize)]
pub struct OverviewTop {
pub overview: Overview,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SiteOverview {
pub site_id: u64,
pub site_overview: Overview,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OverviewBulkTop {
pub sites_overviews: List<SiteOverview>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MeterValues {
#[serde(rename = "type")]
pub meter_type: MeterType,
pub values: Vec<DateValue>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PowerDetails {
pub time_unit: TimeUnit,
pub unit: PowerUnit,
pub meters: Vec<MeterValues>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PowerDetailsTop {
pub power_details: PowerDetails,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnergyDetails {
pub time_unit: TimeUnit,
pub unit: EnergyUnit,
pub meters: Vec<MeterValues>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnergyDetailsTop {
pub energy_details: EnergyDetails,
}
#[derive(Debug, Deserialize)]
pub struct PowerConnection {
pub from: PowerFlowElement,
pub to: PowerFlowElement,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PowerFlowEntry {
pub status: PowerFlowElementStatus,
pub current_power: Option<f64>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct StoragePowerFlowEntry {
pub status: PowerFlowElementStatus,
pub current_power: Option<f64>,
pub charge_level: u8,
pub critical: bool,
pub time_left: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct CurrentPowerFlow {
pub unit: PowerUnit,
pub connections: Vec<PowerConnection>,
#[serde(rename = "GRID")]
pub grid: PowerFlowEntry,
#[serde(rename = "LOAD")]
pub load: PowerFlowEntry,
#[serde(rename = "PV")]
pub pv: Option<PowerFlowEntry>,
#[serde(rename = "STORAGE")]
pub storage: Option<StoragePowerFlowEntry>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CurrentPowerFlowTop {
pub site_current_power_flow: CurrentPowerFlow,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BatteryTelemetry {
#[serde(rename = "timeStamp", with = "DateTimeSerde")]
pub timestamp: NaiveDateTime,
pub power: i32,
pub battery_state: BatteryState,
#[serde(rename = "lifeTimeEnergyCharged")]
pub lifetime_energy_charged: u32,
#[serde(rename = "lifeTimeEnergyDischarged")]
pub lifetime_energy_discharged: u32,
pub full_pack_energy_available: u32,
pub internal_temp: u32,
#[serde(rename = "ACGridCharging")]
pub ac_grid_charging: u32,
pub state_of_charge: u8,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct StorageBattery {
pub serial_number: String,
pub nameplate: u32,
pub model_number: String,
pub telemetry_count: usize,
pub telemetries: Vec<BatteryTelemetry>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct StorageDataTop {
pub storage_data: List<StorageBattery>,
}
#[derive(Debug, Deserialize)]
pub struct GasEmissionsSaved {
pub units: GasEmissionUnit,
pub co2: f64,
pub so2: f64,
pub nox: f64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnvBenefits {
pub gas_emission_saved: GasEmissionsSaved,
pub trees_planted: f64,
pub light_bulbs: f64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnvBenefitsTop {
pub env_benefits: EnvBenefits,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Inverter {
pub name: String,
pub manufacturer: String,
pub model: String,
pub cpu_version: String,
pub dsp1_version: Option<String>,
pub dsp2_version: Option<String>,
pub communication_method: EquipmentCommunicationMethod,
#[serde(rename = "SN")]
pub serial_number: String,
pub connected_optimizers: u32,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Meter {
pub name: String,
pub manufacturer: Option<String>,
pub model: Option<String>,
#[serde(rename = "SN")]
pub serial_number: Option<String>,
#[serde(rename = "type")]
pub meter_type: MeterType,
pub firmware_version: Option<String>,
pub connected_to: Option<String>,
#[serde(rename = "connectedSolaredgeDeviceSN")]
pub connected_solaredge_device_sn: Option<String>,
pub form: MeterForm,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Sensor {
#[serde(rename = "connectedSolaredgeDeviceSN")]
pub connected_solaredge_device_sn: String,
pub id: String,
pub connected_to: String,
pub category: SensorType,
#[serde(rename = "type")]
pub sensor_type: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Gateway {
pub name: String,
#[serde(rename = "SN")]
pub serial_number: String,
pub firmware_version: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Battery {
pub name: String,
#[serde(rename = "SN")]
pub serial_number: String,
pub manufacturer: String,
pub model: String,
pub nameplate_capacity: f64,
pub firmware_version: String,
pub connected_to: String,
pub connected_inverter_sn: String,
}
#[derive(Debug, Deserialize)]
pub struct Inventory {
pub inverters: Vec<Inverter>,
pub meters: Vec<Meter>,
pub sensors: Vec<Sensor>,
pub gateways: Vec<Gateway>,
pub batteries: Vec<Battery>,
}
#[derive(Debug, Deserialize)]
pub struct InventoryTop {
#[serde(rename = "Inventory")]
pub inventory: Inventory,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MeterDetail {
pub meter_serial_number: String,
#[serde(rename = "connectedSolaredgeDeviceSN")]
pub connected_solaredge_device_sn: String,
pub model: String,
pub meter_type: MeterType,
pub values: Vec<DateValue>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Meters {
pub time_unit: TimeUnit,
pub unit: EnergyUnit,
pub meters: Vec<MeterDetail>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MetersTop {
pub meter_energy_details: Meters,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SensorTelemetry {
#[serde(with = "DateTimeSerde")]
pub date: NaiveDateTime,
pub ambient_temperature: Option<f64>,
pub module_temperature: Option<f64>,
pub wind_speed: Option<f64>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SensorData {
pub connected_to: String,
pub count: usize,
pub telemetries: Vec<SensorTelemetry>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SensorDataTop {
pub site_sensors: List<SensorData>,
}