All notable changes to this project will be documented in this file. This change log follows the conventions of keepachangelog.com.
Rust v0.7.16 - 2024-09-27
- Added support for the L535 light bulbs.
- Fixed an issue that was preventing the color from being set properly to the L535 light bulbs.
Python v0.5.1 - 2024-09-27
- Added support for the L535 light bulbs.
- Fixed an issue that was preventing the color from being set properly to the L535 light bulbs.
Rust v0.7.15 - 2024-09-18
- The
LowBatteryvariant has been added to theS200BLogenum.
- The
t310andt315methods ofHubHandlercan now createT31XHandlerhandlers for either of the two device types. - The child device handlers for the H100 hub and the P300 power strip have been redesigned to eliminate the use of lifetimes, to facilitate FFI integrations.
- The comments of
start_timestampandend_timestampfields inEnergyDataResulthave been updated to better describe their purpose. S200BRotationParams's fielddegreeshas been renamed torotation_degrees.
- Fixed an issue with the
Colorpresets that triggered a validation error when attempting to set thecolortoDarkRed.
- The deprecated
past24h,past7d,past30dandpast1yfields have been removed fromEnergyUsageResult. This data is now available exclusively throughget_energy_data'sEnergyDataResultresponse.
Python v0.5.0 - 2024-09-18
- Added full support for the S200B switches through the
S200BHandlerhandler. - Added full support for the T100 sensors through the
T100Handlerhandler. - Added full support for the T110 sensors through the
T110Handlerhandler. - Added full support for the T300 sensors through the
T300Handlerhandler. - Added full support for the T310 and T315 sensors through the
T31XHandlerhandler.
- The comments of
start_timestampandend_timestampfields inEnergyDataResulthave been updated to better describe their purpose.
- Fixed an issue with the
Colorpresets that triggered a validation error when attempting to set thecolortoDarkRed.
Rust v0.7.14 - 2024-08-31
DeviceInfoPlugEnergyMonitoringResulthas been added to support the P110 and P115 devices, which have different responses compared to the P100 and P105 devices.
DeviceInfoPlugResulthas been updated to correctly support the P100 and P105 devices.
Python v0.4.0 - 2024-08-31
DeviceInfoPlugEnergyMonitoringResulthas been added to support the P110 and P115 devices, which have different responses compared to the P100 and P105 devices.
- Resolved an issue that led to unrecoverable process hangs when a device request timed out.
- The concurrency of device handlers has been significantly enhanced by replacing all
Mutexinstances withRwLock. DeviceInfoPlugResulthas been updated to correctly support the P100 and P105 devices.
Rust v0.7.13 - 2024-08-26
- To align with the latest API updates, the
overheatedfield for plugs has been replaced by three enums:overcurrent_status,overheat_status, andpower_protection_status(thanks to @padenot).
Python v0.3.2 - 2024-08-26
- To align with the latest API updates, the
overheatedfield for plugs has been replaced by three enums:overcurrent_status,overheat_status, andpower_protection_status.
Rust v0.7.12 - 2024-06-27
- H100's create child device handler methods now take a
HubDeviceenuminstead of aStringand are nowasyncto allow for more flexibility. This enables the caller to find child devices by either device ID or nickname. PlugIdentifierhas been renamed toPlug.Plug::ByDeviceIdnow verifies that the provided device ID is found and returns anError::DeviceNotFounderror when it's not.HubDevicevariants now take aStringinstead of a&strto allow for more flexibility.Plugvariants now take aStringinstead of a&strto allow for more flexibility.
ColorLightSetDeviceInfoParamshuefield validation has been changed frombetween 1 and 360tobetween 0 and 360to match the device's expected range.- Fixed an issue where the
EnergyDataResult'sstart_timestampandend_timestamp` did not correctly adjust for timezone offsets. - The
chronodependency has been updated to0.4.34to fix the minimum version requirement.
- The
overheatedproperty has been removed fromDeviceInfoGenericResultbecause it's not present in the response of all devices.
Python v0.3.1 - 2024-06-27
ColorLightSetDeviceInfoParamshuefield validation has been changed frombetween 1 and 360tobetween 0 and 360to match the device's expected range.- Fixed an issue where the
EnergyDataResult'sstart_timestampandend_timestamp` did not correctly adjust for timezone offsets. - All handlers are now correctly exported and can be imported from the
tapomodule.
- The
overheatedproperty has been removed fromDeviceInfoGenericResultbecause it's not present in the response of all devices.
Rust v0.7.11 - 2024-05-04
- Added support for the P300 power strip (thanks to @Michal-Szczepaniak).
RgbLightStripHandlerandDeviceInfoRgbLightStripResulthave been added to support the L900 devices separately from the L530 and L630 devices.
ChildDeviceResulthas been renamed toChildDeviceHubResultto facilitate adding support for other devices with children.ColorLightStripHandlerhas been renamed toRgbicLightStripHandlerto better reflect its purpose.DeviceInfoColorLightStripResulthas been renamed toDeviceInfoRgbicLightStripResultto better reflect its purpose.
Python v0.3.0 - 2024-05-04
- Added partial support for the H100 hub and its child devices. Currently, only the
get_device_infofunction is supported for the child devices through the hub'sget_child_device_listmethod.
- A large number of types have been reorganized to me more in line with the Rust library. This includes moving many of them under the
requestsandresponsessub modules.
l900has been removed from theApiClientuntil proper support is added.
Rust v0.7.10 - 2024-04-05
- The implementation of
ApiClient::newhas been improved to allow for the return ofApiClientinstead ofResult<ApiClient, Error>. - The default timeout for all requests has been reduced to 30 seconds from 300 seconds.
ApiClient::with_timeouthas been added to allow for the setting of a custom timeout for all requests (thanks to @skoky).
Python v0.2.1 - 2024-04-05
- The default timeout for all requests has been reduced to 30 seconds from 300 seconds.
- The
timeout_soptional parameter has been added to theApiClientconstructor to allow for the setting of a custom timeout for all requests (thanks to @skoky).
Rust v0.7.9 - 2024-01-27
- The
send()method of the.set()API now takes a reference to the device handler in order to allow for better ergonomics.
- The device info response for the L510, L520, and L610 devices has been fixed.
Python v0.2.0 - 2024-01-27
- Added support for the L530, L630, and L900 color light bulbs.
- Fixed a misconfiguration that was preventing the sdist package from working properly.
- The device info response for the L510, L520, and L610 devices has been fixed.
Rust v0.7.8 - 2024-01-22
- Added the
device_resetmethod to all plugs and lights.
- The device info response for the L510, L520, and L610 devices has been fixed to have the
re_power_typefield as optional.
Python v0.1.5 - 2024-01-22
- Added the
device_resetmethod to all plugs and lights.
- The device info response for the L510, L520, and L610 devices has been fixed to have the
re_power_typefield as optional.
Rust v0.7.7 - 2024-01-13
- The
anyhow::anyhow!("Local hash does not match server hash")error has been replaced with the more specifictapo::TapoResponseError::InvalidCredentialserror.
- The
default_statesfield that's part of the device info response has been changed for the L510, L520, and L610 devices to match the actual response from the device. - A handful of edge cases around the Klap Protocol that were causing panics have been fixed to return
tapo::TapoResponseError::SessionTimeoutortapo::TapoResponseError::InvalidResponseerrors instead.
Python v0.1.4 - 2024-01-13
- The "Local hash does not match server hash" error has been replaced with the more specific
tapo::TapoResponseError::InvalidCredentialserror.
- The
default_statesfield that's part of the device info response has been changed for the L510, L520, and L610 devices to match the actual response from the device. - A handful of edge cases around the Klap Protocol that were causing panics have been fixed to return
tapo::TapoResponseError::SessionTimeoutortapo::TapoResponseError::InvalidResponseerrors instead.
Rust v0.7.6 - 2023-11-25
- Added support for the KE100 thermostatic radiator valve (TRV) devices (thanks to @pwoerndle).
- Fixed an issue that was preventing the
nicknamefield from being decoded in theget_device_inforesults of child devices of the H100 hub.
Rust v0.7.5 - 2023-11-05
- Added support for the T300 water sensor.
- Added a dedicated handler for the L520 devices.
Python v0.1.3 - 2023-11-04
- Added support for the L510, L520 and L610 light bulbs.
- The minimum required version of Python has been changed to 3.8, up from 3.7.
- Fixed an issue that was preventing
get_device_info_jsonfrom working on the plug devices.
Python v0.1.2 - 2023-10-19
- Added support for generic devices.
- Added
get_device_info_jsonto all currently supported devices.
Python v0.1.1 - 2023-10-01
This is the first version of the Python wrapper library. It supports the plug devices P100, P105, P110 and P115.
v0.7.4 - 2023-09-15
- Fixed the minimum version of the chrono dependency by setting it to 0.4.25.
DeviceUsageResulthas been split intoDeviceUsageResultandDeviceUsageEnergyMonitoringResult. The former is now returned for the P100 and P105 devices while the latter is returned for all the other devices that support energy monitoring.EnergyMonitoringPlugHandlerhas been renamed toPlugEnergyMonitoringHandler.- All
___DeviceInfoResultstructs have been renamed toDeviceInfo___Result. - All
___DefaultStatestructs have been renamed toDefault___State.
get_device_usagehas been removed from theGenericDeviceHandlerbecause it is not supported by all devices.
v0.7.3 - 2023-09-14
- Added support for the newly introduced KLAP protocol, which is required to interact with the latest firmware version of multiple devices.
- All uses of
timehave been replaced withchrono:EnergyDataInterval'stime::OffsetDateTimeandtime::Datefields have been replaced withchrono::NaiveDate.EnergyUsageResult::local_timefield is nowchrono::NaiveDateTimeinstead oftime::OffsetDateTime.EnergyDataResult::local_timefield is nowchrono::NaiveDateTimeinstead oftime::OffsetDateTime.TemperatureHumidityRecords's andTemperatureHumidityRecorddatetimefields are nowchrono::DateTime<chrono::Utc>instead oftime::OffsetDateTime.
EnergyDataInterval::Hourly::start_datetimeandEnergyDataInterval::Hourly::end_datetimehave been renamed tostart_dateandend_datebecause the time component is not required.- The
loginfunction on all handlers has been renamed torefresh_sessionto better reflect its purpose and it now takes and returns a&mut selfinstead ofself. L510DeviceInfoResulthas been renamed toLightDeviceInfoResultto better reflect its purpose when used for L510 and L610 devices.L530DeviceInfoResulthas been renamed toColorLightDeviceInfoResultto better reflect its purpose when used for L530, L630 and L900 devices.L930DeviceInfoResulthas been renamed toColorLightStripDeviceInfoResultto better reflect its purpose when used for L920 and L930 devices.- The
default_statesfield ofLightDeviceInfoResult,ColorLightDeviceInfoResult,ColorLightStripDeviceInfoResultandPlugDeviceInfoResultis now a struct instead of an enum.
v0.7.2 - 2023-08-21
- Added
get_current_powerto theP110andP115plugs. (thanks to @Michal-Szczepaniak)
v0.7.1 - 2023-05-30
- Added
get_temperature_humidity_recordsto theT310andT315sensors.
- The creation of device handlers has been simplified.
// old
let device = ApiClient::new(ip_address, tapo_username, tapo_password)?
.l530()
.login()
.await?;
// new
let device = ApiClient::new(tapo_username, tapo_password)?
.l530(ip_address)
.await?;- The creation of child device handlers has been reworked so that they can be created without requiring a call to
get_child_device_listwhen the child Device ID is known. ApiClientnow implementsCloneto allow for a cheaper duplication of the client.
- The
L510andL610devices no longer expose theset()API because changing multiple properties simultaneously does not make sense for these devices.
v0.7.0 - 2023-05-26
- Added initial support for the H100 device, the S200B switch and the T100, T110, T310, T315 sensors. The child devices currently support
get_device_infoandget_trigger_logs. - All responses now derive
serde::Serializeto allow for more straightforward consumer serialisation. (thanks to @ClementNerma) ApiClienthas been marked as bothSendandSyncto allow for sharing between threads. (thanks to @ClementNerma)
GenericDeviceInfoResult'sdevice_onproperty has been made optional to accommodate devices that do not provide this field.
v0.6.0 - 2023-05-08
- Added support for the L920 and L930 light strips. The highlight is the
tapo::ColorLightStripHandler::set_lighting_effectfunction, which supports all the effects that the Tapo app contains alongside user-defined effects. - Added support for the L900 light strips.
- Each supported device now has it's own handler creator.
set_*functions liketapo::requests::ColorLightSetDeviceInfoParams::set_brightnessnow returnSelfinstead ofResult<Self, Error>to allow for better ergonomics. The validations will now run whentapo::requests::ColorLightSetDeviceInfoParams::sendis called.tapo::requests::L510SetDeviceInfoParamshas been renamed totapo::requests::LightSetDeviceInfoParamsto better reflect its purpose when used for L510, L610, and L900 devices.tapo::requests::L530SetDeviceInfoParamshas been renamed totapo::requests::ColorLightSetDeviceInfoParamsto better reflect its purpose when used for L530, L630, L920 and L930 devices.tapo::P100Handlerhas been renamed totapo::PlugHandler.tapo::P110Handlerhas been renamed totapo::EnergyMonitoringPlugHandler.tapo::L510Handlerhas been renamed totapo::LightHandler.tapo::L530Handlerhas been renamed totapo::ColorLightHandler.tapo::L930Handlerhas been renamed totapo::ColorLightStripHandler.
v0.5.0 - 2023-04-16
- The creation of an API Client for a specific device is now done through handler methods on the
ApiClientstruct. This allows for a more ergonomic API. (thanks to Octocrab for inspirations)
// old
let device = ApiClient::<L530>::new(ip_address, tapo_username, tapo_password, true).await?;
// new
let device = ApiClient::new(ip_address, tapo_username, tapo_password)?
.l530()
.login()
.await?;ApiClient::newparameters are nowimpl Into<String>instead ofStringto allow for more flexibility.- Error handling has been reworked. All functions that could error now return a
Result<..., tapo::Error>.
v0.4.0 - 2023-02-25
get_energy_datais now available for the P110 devices. (thanks to @kuhschnappel)
EnergyUsageResult'spast24h,past7d,past30dandpast1yfields are now deprecated.get_energy_datashould be used instead. (thanks to @felixhauptmann)
v0.3.1 - 2023-02-19
examples/tapo_generic_device_toggle.rsdemonstrates howdevice_infocan be used to assess the current status of a generic device and toggle it.
on_timeis now optional for theL510andL530devices because the v2 hardware no longer returns it.
v0.3.0 - 2022-11-20
- The
setAPI allows multiple properties to be set in a single request for the L510 and L530 devices.
tapo::Colorhas been moved totapo::requests::Color.GenericDeviceInfoResult::on_timehas been changed fromu64toOption<u64>because some devices (like L930) do not provide this field.- All response structs have been moved under
tapo::responses. - The docs have been improved.
v0.2.1 - 2022-08-07
latitudeandlongitudeinGenericDeviceInfoResult,L510DeviceInfoResult,L530DeviceInfoResultandPlugDeviceInfoResultare now signed integers to accommodate for incoming responses with negative numbers. (thanks to @JPablomr)
v0.2.0 - 2022-06-13
- Generic Device example.
get_device_usagehas been moved to the base implementation so that all devices have access to it.Colornow implementsserde::Serializeandserde::Deserialize.
TapoDeviceExtis no longer hasDefaultandserde::Serializeas supersets.