Skip to main content

tapo/api/child_devices/
power_strip_plug_energy_monitoring_handler.rs

1use crate::error::{Error, TapoResponseError};
2use crate::requests::{
3    EmptyParams, EnergyDataInterval, GetEnergyDataParams, GetPowerDataParams, PowerDataInterval,
4    TapoParams, TapoRequest,
5};
6use crate::responses::{
7    CurrentPowerResult, DeviceUsageEnergyMonitoringResult, EnergyDataResult, EnergyDataResultRaw,
8    EnergyUsageResult, PowerDataResult, PowerDataResultRaw, PowerStripPlugEnergyMonitoringResult,
9};
10
11tapo_child_handler! {
12    /// Handler for the [P304M](https://www.tp-link.com/uk/search/?q=P304M) and
13    /// [P316M](https://www.tp-link.com/us/search/?q=P316M) child plugs.
14    PowerStripPlugEnergyMonitoringHandler(PowerStripPlugEnergyMonitoringResult),
15    on_off,
16}
17
18impl PowerStripPlugEnergyMonitoringHandler {
19    /// Returns *current power* as [`CurrentPowerResult`].
20    pub async fn get_current_power(&self) -> Result<CurrentPowerResult, Error> {
21        let request = TapoRequest::GetCurrentPower(TapoParams::new(EmptyParams));
22
23        self.client
24            .read()
25            .await
26            .control_child(self.device_id.clone(), request)
27            .await?
28            .ok_or_else(|| Error::Tapo(TapoResponseError::EmptyResult))
29    }
30
31    /// Returns *device usage* as [`DeviceUsageEnergyMonitoringResult`].
32    pub async fn get_device_usage(&self) -> Result<DeviceUsageEnergyMonitoringResult, Error> {
33        let request = TapoRequest::GetDeviceUsage(TapoParams::new(EmptyParams));
34
35        self.client
36            .read()
37            .await
38            .control_child(self.device_id.clone(), request)
39            .await?
40            .ok_or_else(|| Error::Tapo(TapoResponseError::EmptyResult))
41    }
42
43    /// Returns *energy usage* as [`EnergyUsageResult`].
44    pub async fn get_energy_usage(&self) -> Result<EnergyUsageResult, Error> {
45        let request = TapoRequest::GetEnergyUsage(TapoParams::new(EmptyParams));
46
47        self.client
48            .read()
49            .await
50            .control_child(self.device_id.clone(), request)
51            .await?
52            .ok_or_else(|| Error::Tapo(TapoResponseError::EmptyResult))
53    }
54
55    /// Returns *energy data* as [`EnergyDataResult`].
56    pub async fn get_energy_data(
57        &self,
58        interval: EnergyDataInterval,
59    ) -> Result<EnergyDataResult, Error> {
60        let params = GetEnergyDataParams::new(interval);
61        let request = TapoRequest::GetEnergyData(TapoParams::new(params));
62
63        self.client
64            .read()
65            .await
66            .control_child::<EnergyDataResultRaw>(self.device_id.clone(), request)
67            .await?
68            .ok_or_else(|| Error::Tapo(TapoResponseError::EmptyResult))
69            .map(|result| result.try_into())?
70    }
71
72    /// Returns *power data* as [`PowerDataResult`].
73    pub async fn get_power_data(
74        &self,
75        interval: PowerDataInterval,
76    ) -> Result<PowerDataResult, Error> {
77        let params = GetPowerDataParams::new(interval);
78        let request = TapoRequest::GetPowerData(TapoParams::new(params));
79
80        self.client
81            .read()
82            .await
83            .control_child::<PowerDataResultRaw>(self.device_id.clone(), request)
84            .await?
85            .ok_or_else(|| Error::Tapo(TapoResponseError::EmptyResult))
86            .map(|result| result.try_into())?
87    }
88}