qcells 0.1.1

A Rust Q.HOME+ESS - QCELLS API client.
Documentation
use crate::battery::Battery;
use crate::models::InverterStateResponse;

#[derive(Debug)]
pub struct Inverter {
    pub battery: Option<Battery>,
    pub array_power: f64,
    pub grid_power_import: f64,
    pub grid_power_export: f64,
    pub power: f64,
}

impl Inverter {
    pub(crate) fn from_inverter_state(state: InverterStateResponse) -> Inverter {
        let mut import = 0.0;
        let mut export = 0.0;
        if state.grid_power < 0.0 {
            import = state.grid_power.abs()
        } else {
            export = state.grid_power.abs()
        }
        let mut battery: Option<Battery> = None;
        if state.battery_voltage.is_some() {
            battery = Some(Battery {
                capacity: state.battery_capacity.unwrap(),
                temperature_high: state.battery_temperature_high.unwrap(),
                temperature_low: state.battery_temperature_low.unwrap(),
                voltage: state.battery_voltage.unwrap(),
            })
        }

        let array_power: f64 = state.first_array_power.unwrap_or(0.0) +
            state.second_array_power.unwrap_or(0.0) +
            state.third_array_power.unwrap_or(0.0) +
            state.fourth_array_power.unwrap_or(0.0) +
            state.fifth_array_power.unwrap_or(0.0) +
            state.sixth_array_power.unwrap_or(0.0) +
            state.seventh_array_power.unwrap_or(0.0) +
            state.eighth_array_power.unwrap_or(0.0) +
            state.ninth_array_power.unwrap_or(0.0) +
            state.tenth_array_power.unwrap_or(0.0) +
            state.eleventh_array_power.unwrap_or(0.0) +
            state.twelfth_array_power.unwrap_or(0.0);

        let power: f64 = state.first_inverter_power.unwrap_or(0.0) +
            state.second_inverter_power.unwrap_or(0.0) +
            state.third_inverter_power.unwrap_or(0.0);

        return Inverter {
            array_power,
            power,
            grid_power_export: export,
            grid_power_import: import,
            battery,
        };
    }
}


#[cfg(test)]
mod tests {
    use crate::*;

    #[test]
    fn test_get_inverters() {
        let client = Client::new(
            "guest",
            "solax123456",
        );
        let client = match client {
            Ok(client) => client,
            Err(err) => panic!("{}", err.message)
        };
        let sites = client.user.get_sites();
        let sites = match sites {
            Ok(sites) => sites,
            Err(err) => panic!("{}", err.message)
        };
        assert!(!sites.is_empty());
        for site in sites {
            let inverter = match site.get_inverter() {
                Ok(inv) => inv,
                Err(err) => panic!("{}", err.message)
            };
            println!("{:#?}", inverter);
            if inverter.battery.is_some() {
                let battery = inverter.battery.unwrap();
                assert_ne!(battery.capacity, 0.0);
                assert_ne!(battery.temperature_high, 0.0);
                assert_ne!(battery.temperature_low, 0.0);
            }
        }
    }
}