Releases: smdn/Smdn.TPSmartHomeDevices
Releases · smdn/Smdn.TPSmartHomeDevices
Smdn.TPSmartHomeDevices version 1.0.0-preview2
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2023-03-13 update package version
- 2023-03-13 respect AddressFamily specified by EndPoint
- 2023-03-13 clarify the purpose of the code
- 2023-03-13 retry after re-establish session when SecurePassThroughInvalidPaddingException is thrown
- 2023-03-13 introduce SecurePassThroughInvalidPaddingException to report 'invalid padding' exceptions in SecurePassThroughJsonConverterFactory
- 2023-03-13 retry after recreate client when KasaIncompleteResponseException is thrown
- 2023-03-13 introduce KasaIncompleteResponseException and throw when received message body falls short of the length that indicated in the header
- 2023-03-13 log exception details
- 2023-03-12 retry sending request after re-create HTTP client when error code -1301 occurred
- 2023-03-12 simplify setting of key and IV for AES
- 2023-03-12 use AES with PKCS #7 padding mode
- 2023-03-12 improve exception handling in TapoDevice.SendRequestAsyncCore
- 2023-03-12 retry after re-establish session if Tapo ErrorResponseException is thrown
- 2023-03-12 add TapoClient.CloseSession()
- 2023-03-12 improve logging
- 2023-03-12 reuse pre-allocated ArrayBufferWriter instead of allocating for each KasaClient's to reduce allocations
- 2023-03-12 improve exception handling and logging
- 2023-03-12 introduce KasaDisconnectedException to handle the case when the connection is dropped or disconnected by the device
- 2023-03-09 downgrade the minimum version of depending packages
- 2023-03-09 use more specific version of Smdn.Fundamental.PrintableEncoding.Hexadecimal
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.TPSmartHomeDevices/Smdn.TPSmartHomeDevices-net6.0.apilist.cs b/doc/api-list/Smdn.TPSmartHomeDevices/Smdn.TPSmartHomeDevices-net6.0.apilist.cs
index b39f5e0..719cc72 100644
--- a/doc/api-list/Smdn.TPSmartHomeDevices/Smdn.TPSmartHomeDevices-net6.0.apilist.cs
+++ b/doc/api-list/Smdn.TPSmartHomeDevices/Smdn.TPSmartHomeDevices-net6.0.apilist.cs
@@ -1,695 +1,723 @@
-// Smdn.TPSmartHomeDevices.dll (Smdn.TPSmartHomeDevices-1.0.0-preview1)
+// Smdn.TPSmartHomeDevices.dll (Smdn.TPSmartHomeDevices-1.0.0-preview2)
// Name: Smdn.TPSmartHomeDevices
// AssemblyVersion: 1.0.0.0
-// InformationalVersion: 1.0.0-preview1+e06e7ca85c2de4ff93d0da638a7853e7f837e6ce
+// InformationalVersion: 1.0.0-preview2+81e3802b1dec05701f67b90fc3e31867a1d3af11
// TargetFramework: .NETCoreApp,Version=v6.0
// Configuration: Release
// Referenced assemblies:
-// Microsoft.Extensions.DependencyInjection.Abstractions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
-// Microsoft.Extensions.Http, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
-// Microsoft.Extensions.Logging.Abstractions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.Http, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Win32.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// Smdn.Fundamental.PrintableEncoding.Hexadecimal, Version=3.0.1.0, Culture=neutral
// Smdn.Net.AddressResolution, Version=1.0.0.0, Culture=neutral
// System.Collections, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ComponentModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Linq, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Memory, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// System.Net.Http, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-// System.Net.Http.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
+// System.Net.Http.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// System.Net.NetworkInformation, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Net.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Net.Sockets, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Security.Cryptography.Algorithms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Security.Cryptography.Encoding, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Security.Cryptography.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-// System.Text.Encodings.Web, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
-// System.Text.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
+// System.Text.Encodings.Web, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
+// System.Text.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
#nullable enable annotations
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Net;
using System.Net.Http;
using System.Net.NetworkInformation;
using System.Security.Cryptography;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Smdn.Net.AddressResolution;
using Smdn.TPSmartHomeDevices;
using Smdn.TPSmartHomeDevices.Kasa;
using Smdn.TPSmartHomeDevices.Kasa.Protocol;
using Smdn.TPSmartHomeDevices.Tapo;
using Smdn.TPSmartHomeDevices.Tapo.Protocol;
namespace Smdn.TPSmartHomeDevices {
public interface IDeviceEndPointProvider {
bool IsStaticEndPoint { get; }
ValueTask<EndPoint?> GetEndPointAsync(CancellationToken cancellationToken = default);
}
public class DeviceEndPointResolutionException : Exception {
public DeviceEndPointResolutionException(IDeviceEndPointProvider deviceEndPointProvider) {}
public DeviceEndPointResolutionException(IDeviceEndPointProvider deviceEndPointProvider, string message, Exception? innerException) {}
public IDeviceEndPointProvider EndPointProvider { get; }
}
public class MacAddressDeviceEndPointFactory : IDisposable {
protected class MacAddressDeviceEndPointProvider : IDeviceEndPointProvider {
public MacAddressDeviceEndPointProvider(IAddressResolver<PhysicalAddress, IPAddress> resolver, PhysicalAddress address, int port) {}
public bool IsStaticEndPoint { get; }
public async ValueTask<EndPoint?> GetEndPointAsync(CancellationToken cancellationToken) {}
}
protected MacAddressDeviceEndPointFactory(IAddressResolver<PhysicalAddress, IPAddress> resolver, IServiceProvider? serviceProvider = null) {}
public MacAddressDeviceEndPointFactory(MacAddressResolver resolver, IServiceProvider? serviceProvider = null) {}
public MacAddressDeviceEndPointFactory(MacAddressResolverOptions? options = null, IServiceProvider? serviceProvider = null) {}
public virtual IDeviceEndPointProvider Create(PhysicalAddress address, int port = 0) {}
protected virtual void Dispose(bool disposing) {}
public void Dispose() {}
protected void ThrowIfDisposed() {}
}
}
namespace Smdn.TPSmartHomeDevices.Kasa {
pub...
Smdn.TPSmartHomeDevices version 1.0.0-preview1
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2023-03-07 add Tapo implementations
- 2023-03-07 import Kasa implementations rewritten from TPLinkKasaClient (https://smdn.jp/electronics/TPLinkKasaClient/)
- 2023-03-07 add types common to the Kasa and Tapo implementations
- 2023-03-07 add address resolution APIs common to the Kasa and Tapo implementations
- 2023-03-07 add shims
- 2023-03-07 add project and license files
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.TPSmartHomeDevices/Smdn.TPSmartHomeDevices-net6.0.apilist.cs b/doc/api-list/Smdn.TPSmartHomeDevices/Smdn.TPSmartHomeDevices-net6.0.apilist.cs
new file mode 100644
index 0000000..b39f5e0
--- /dev/null
+++ b/doc/api-list/Smdn.TPSmartHomeDevices/Smdn.TPSmartHomeDevices-net6.0.apilist.cs
@@ -0,0 +1,695 @@
+// Smdn.TPSmartHomeDevices.dll (Smdn.TPSmartHomeDevices-1.0.0-preview1)
+// Name: Smdn.TPSmartHomeDevices
+// AssemblyVersion: 1.0.0.0
+// InformationalVersion: 1.0.0-preview1+e06e7ca85c2de4ff93d0da638a7853e7f837e6ce
+// TargetFramework: .NETCoreApp,Version=v6.0
+// Configuration: Release
+// Referenced assemblies:
+// Microsoft.Extensions.DependencyInjection.Abstractions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.Http, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.Logging.Abstractions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Win32.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// Smdn.Fundamental.PrintableEncoding.Hexadecimal, Version=3.0.1.0, Culture=neutral
+// Smdn.Net.AddressResolution, Version=1.0.0.0, Culture=neutral
+// System.Collections, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.ComponentModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Linq, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Memory, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
+// System.Net.Http, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Net.Http.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
+// System.Net.NetworkInformation, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Net.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Net.Sockets, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Security.Cryptography.Algorithms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Security.Cryptography.Encoding, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Security.Cryptography.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Text.Encodings.Web, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
+// System.Text.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
+#nullable enable annotations
+
+using System;
+using System.Buffers;
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Net;
+using System.Net.Http;
+using System.Net.NetworkInformation;
+using System.Security.Cryptography;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Smdn.Net.AddressResolution;
+using Smdn.TPSmartHomeDevices;
+using Smdn.TPSmartHomeDevices.Kasa;
+using Smdn.TPSmartHomeDevices.Kasa.Protocol;
+using Smdn.TPSmartHomeDevices.Tapo;
+using Smdn.TPSmartHomeDevices.Tapo.Protocol;
+
+namespace Smdn.TPSmartHomeDevices {
+ public interface IDeviceEndPointProvider {
+ bool IsStaticEndPoint { get; }
+
+ ValueTask<EndPoint?> GetEndPointAsync(CancellationToken cancellationToken = default);
+ }
+
+ public class DeviceEndPointResolutionException : Exception {
+ public DeviceEndPointResolutionException(IDeviceEndPointProvider deviceEndPointProvider) {}
+ public DeviceEndPointResolutionException(IDeviceEndPointProvider deviceEndPointProvider, string message, Exception? innerException) {}
+
+ public IDeviceEndPointProvider EndPointProvider { get; }
+ }
+
+ public class MacAddressDeviceEndPointFactory : IDisposable {
+ protected class MacAddressDeviceEndPointProvider : IDeviceEndPointProvider {
+ public MacAddressDeviceEndPointProvider(IAddressResolver<PhysicalAddress, IPAddress> resolver, PhysicalAddress address, int port) {}
+
+ public bool IsStaticEndPoint { get; }
+
+ public async ValueTask<EndPoint?> GetEndPointAsync(CancellationToken cancellationToken) {}
+ }
+
+ protected MacAddressDeviceEndPointFactory(IAddressResolver<PhysicalAddress, IPAddress> resolver, IServiceProvider? serviceProvider = null) {}
+ public MacAddressDeviceEndPointFactory(MacAddressResolver resolver, IServiceProvider? serviceProvider = null) {}
+ public MacAddressDeviceEndPointFactory(MacAddressResolverOptions? options = null, IServiceProvider? serviceProvider = null) {}
+
+ public virtual IDeviceEndPointProvider Create(PhysicalAddress address, int port = 0) {}
+ protected virtual void Dispose(bool disposing) {}
+ public void Dispose() {}
+ protected void ThrowIfDisposed() {}
+ }
+}
+
+namespace Smdn.TPSmartHomeDevices.Kasa {
+ public class HS105 : KasaDevice {
+ public HS105(IDeviceEndPointProvider deviceEndPointProvider, IServiceProvider? serviceProvider = null) {}
+ public HS105(IPAddress ipAddress, IServiceProvider? serviceProvider = null) {}
+ public HS105(string hostName, IServiceProvider? serviceProvider = null) {}
+
+ public Task<bool> GetOnOffStateAsync(CancellationToken cancellationToken = default) {}
+ public Task SetOnOffStateAsync(bool newOnOffState, CancellationToken cancellationToken = default) {}
+ public Task TurnOffAsync(CancellationToken cancellationToken = default) {}
+ public Task TurnOnAsync(CancellationToken cancellationToken = default) {}
+ }
+
+ public class KL130 : KasaDevice {
+ public KL130(IDeviceEndPointProvider deviceEndPointProvider, IServiceProvider? serviceProvider = null) {}
+ public KL130(IPAddress ipAddress, IServiceProvider? serviceProvider = null) {}
+ public KL130(string hostName, IServiceProvider? serviceProvider = null) {}
+
+ public Task<KL130LightState> GetLightStateAsync(CancellationToken cancellationToken = default) {}
+ public Task<bool> GetOnOffStateAsync(CancellationToken cancellationToken = default) {}
+ public Task SetColorAsync(int hue, int saturation, int? brightness = null, TimeSpan? transitionPeriod = null, CancellationToken cancellationToken = default) {}
+ public Task SetColorTemperatureAsync(int colorTemperature, int? brightness = null, TimeSpan? transitionPeriod = null, CancellationToken cancellationToken = default) {}
+ public Task SetOnOffStateAsync(bool newOnOffState, TimeSpan? transitionPeriod = null, CancellationToken cancellationToken = default) {}
+ public Task TurnOffAsync(TimeSpan? transitionPeriod = null, CancellationToken cancellationToken = default) {}
+ public Task TurnOnAsync(TimeSpan? transitionPeriod = null, CancellationToken cancellationToken = default) {}
+ }
+
+ public class KasaDevice : IDisposable {
+ protected readonly struct NullParameter {
+ }
+
+ protected static readonly JsonEncodedText MethodTextGetSysInfo;
+ protected static readonly JsonEncodedText ModuleTextSystem;
+
+ public static KasaDevice Create(IDeviceEndPointProvider deviceEndPointProvider, IServiceProvider? serviceProvider = null) {}
+ public static KasaDevice Create(IPAddress deviceAddress, IServiceProvider? serviceProvider = null) {}
+ public static KasaDevice Create(string hostName, IServiceProvider? serviceProvider = null) {}
+
+ protected KasaDevice(IDeviceEndPointProvider deviceEndPointProvider, IServiceProvider? serviceProvider = null) {}
+ protected KasaDevice(IPAddress ipAddress, IServiceProvider? serviceProvider = null) {}
+ protected KasaDevice(string hostName, IServiceProvider? serviceProvider = null) {}
+
+ public bool IsConnected { get; }
+ protected bool IsDisposed { get; }
+
+ protected virtual void Dispose(bool disposing) {}
+ public void Dispose() {}
+ public ValueTask<EndPoint> ResolveEndPointAsync(CancellationToken cancellationToken = default) {}
+ protected Task SendRequestAsync<TMethodParameter>(JsonEncodedText module, JsonEncodedText method, TMethodParameter parameters, CancellationToken cancellationToken) {}
+ protected Task<TMethodResult...