Releases: smdn/Smdn.Net.EchonetLite
Releases · smdn/Smdn.Net.EchonetLite
Smdn.Net.EchonetLite.RouteB.SkStackIP version 2.0.1
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2025-06-23 update assembly version
- 2025-06-23 fix to unset panaSessionInfo if session has expired or terminated
- 2025-06-23 throw more specific exception type when PANA session has expired or terminated
- 2025-06-22 set SkStackRouteBHandler.{Local|Peer}Address null after disconnection
- 2025-06-14 enable PackageValidationBaselineVersion
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.EchonetLite.RouteB.SkStackIP/Smdn.Net.EchonetLite.RouteB.SkStackIP-net8.0.apilist.cs b/doc/api-list/Smdn.Net.EchonetLite.RouteB.SkStackIP/Smdn.Net.EchonetLite.RouteB.SkStackIP-net8.0.apilist.cs
index fe951a7..d34051a 100644
--- a/doc/api-list/Smdn.Net.EchonetLite.RouteB.SkStackIP/Smdn.Net.EchonetLite.RouteB.SkStackIP-net8.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.EchonetLite.RouteB.SkStackIP/Smdn.Net.EchonetLite.RouteB.SkStackIP-net8.0.apilist.cs
@@ -1,161 +1,161 @@
-// Smdn.Net.EchonetLite.RouteB.SkStackIP.dll (Smdn.Net.EchonetLite.RouteB.SkStackIP-2.0.0)
+// Smdn.Net.EchonetLite.RouteB.SkStackIP.dll (Smdn.Net.EchonetLite.RouteB.SkStackIP-2.0.1)
// Name: Smdn.Net.EchonetLite.RouteB.SkStackIP
-// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0+b8918b93e150de00661851f24d5e87d139805913
+// AssemblyVersion: 2.0.1.0
+// InformationalVersion: 2.0.1+d43a3f8ed071ed5e6ac93fdfd72d49d75ba986c5
// TargetFramework: .NETCoreApp,Version=v8.0
// Configuration: Release
// Referenced assemblies:
// Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Options, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Polly.Core, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
// Polly.Extensions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
// Smdn.Extensions.Polly.KeyedRegistry, Version=1.2.0.0, Culture=neutral
// Smdn.Net.EchonetLite.Primitives, Version=2.0.0.0, Culture=neutral
// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.1.0.0, Culture=neutral
-// Smdn.Net.SkStackIP, Version=1.2.0.0, Culture=neutral
+// Smdn.Net.SkStackIP, Version=1.5.2.0, Culture=neutral
// System.Collections, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ComponentModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Memory, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// System.Net.NetworkInformation, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Net.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Threading, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
#nullable enable annotations
using System;
using System.Buffers;
using System.Net;
using System.Net.NetworkInformation;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Polly;
using Polly.DependencyInjection;
using Polly.Registry;
using Polly.Registry.KeyedRegistry;
using Smdn.Net.EchonetLite.RouteB.Credentials;
using Smdn.Net.EchonetLite.RouteB.DependencyInjection;
using Smdn.Net.EchonetLite.RouteB.Transport;
using Smdn.Net.EchonetLite.RouteB.Transport.SkStackIP;
using Smdn.Net.SkStackIP;
namespace Smdn.Net.EchonetLite.RouteB.DependencyInjection {
public static class SkStackRouteBHandlerFactoryBuilderExtensions {
public static TSkStackRouteBHandlerFactoryBuilder PostConfigureClient<TSkStackRouteBHandlerFactoryBuilder, TServiceKey>(this TSkStackRouteBHandlerFactoryBuilder builder, Action<SkStackClient> postConfigureClient) where TSkStackRouteBHandlerFactoryBuilder : SkStackRouteBHandlerFactoryBuilder<TServiceKey> {}
}
public abstract class SkStackRouteBHandlerFactoryBuilder<TServiceKey> {
internal protected SkStackRouteBHandlerFactoryBuilder(IServiceCollection services, TServiceKey serviceKey, Func<TServiceKey, string?> selectOptionsNameForServiceKey) {}
public TServiceKey ServiceKey { get; }
public IServiceCollection Services { get; }
protected abstract SkStackRouteBHandlerFactory Build(IServiceProvider serviceProvider, SkStackRouteBSessionOptions sessionOptions, Action<SkStackClient>? postConfigureClient);
public SkStackRouteBHandlerFactory Build(IServiceProvider serviceProvider) {}
protected TOption GetOption<TOption>(IServiceProvider serviceProvider) {}
}
public static class SkStackRouteBServiceBuilderExtensions {
public static IRouteBServiceBuilder<TServiceKey> AddResiliencePipelineSkStackHandlerAuthenticate<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SkStackRouteBHandler.ResiliencePipelineKeyPair<TServiceKey>>> configure) {}
public static IRouteBServiceBuilder<TServiceKey> AddResiliencePipelineSkStackHandlerSendFrame<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SkStackRouteBHandler.ResiliencePipelineKeyPair<TServiceKey>>> configure) {}
public static IRouteBServiceBuilder<TServiceKey> AddSkStackHandler<TServiceKey, THandlerFactoryBuilder>(this IRouteBServiceBuilder<TServiceKey> builder, Action<SkStackRouteBSessionOptions> configureSessionOptions, Func<IServiceCollection, TServiceKey, Func<TServiceKey, string?>, THandlerFactoryBuilder> createHandlerFactoryBuilder) where THandlerFactoryBuilder : SkStackRouteBHandlerFactoryBuilder<TServiceKey> {}
}
}
namespace Smdn.Net.EchonetLite.RouteB.Transport.SkStackIP {
public abstract class SkStackRouteBHandler : RouteBEchonetLiteHandler {
public static class ResiliencePipelineKeys {
public static readonly string Authenticate = "SkStackRouteBHandler.resiliencePipelineAuthenticate";
public static readonly string Send = "SkStackRouteBHandler.resiliencePipelineSend";
}
public readonly struct ResiliencePipelineKeyPair<TServiceKey> :
IEquatable<ResiliencePipelineKeyPair<TServiceKey>>,
IResiliencePipelineKeyPair<TServiceKey, string>
{
[CompilerGenerated]
public static bool operator == (SkStackRouteBHandler.ResiliencePipelineKeyPair<TServiceKey> left, SkStackRouteBHandler.ResiliencePipelineKeyPair<TServiceKey> right) {}
[CompilerGenerated]
public static bool operator != (SkStackRouteBHandler.ResiliencePipelineKeyPair<TServiceKey> left, SkStackRouteBHandler.ResiliencePipelineKeyPair<TServiceKey> right) {}
public ResiliencePipelineKeyPair(TServiceKey serviceKey, string pipelineKey) {}
public string PipelineKey { get; }
public TServiceKey ServiceKey { get; }
[CompilerGenerated]
public bool Equals(SkStackRouteBHandler.ResiliencePipelineKeyPair<TServiceKey> other) {}
[CompilerGenerated]
public override bool Equals(object obj) {}
[CompilerGenerated]
public override int GetHashCode() {}
public override string ToString() {}
}
public static readonly ResiliencePropertyKey<SkStackRouteBHandler?> ResiliencePropertyKeyForInstance; // = "SkStackRouteBHandler.ResiliencePropertyKeyForInstance"
protected SkStackClient Client { get; }
public override IPAddress? LocalAddress { get; }
public override IPAddress? PeerAddress { get; }
protected SkStackRouteBSessionOptions SessionOptions { get; }
protected override async ValueTask ConnectAsyncCore(IRouteBCredential credential, CancellationToken cancellationToken) {}
protected override async ValueTask DisconnectAsyncCore(CancellationToken cancellationToken) {}
protected override void Dispose(bool disposing) {}
protected override async ValueTask DisposeAsyncCore() {}
protected override ValueTask<IPAddress> ReceiveAsyncCore(IBufferWriter<byte> buffer, CancellationToken cancellationToken) {}
protected override ValueTask SendAsyncCore(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken) {}
protected override ValueTask SendToAsyncCore(IPAddress remoteAddress, ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken) {}
[MemberNotNull("client")]
protected override void ThrowIfDisposed() {}
}
public abstract class SkStackRouteBHandlerFactory : IRouteBEchonetLiteHandlerFactory {
protected SkStackRouteBHandlerFactory(IServiceProvider serviceProvider, object? routeBServiceKey, SkStackRouteBSessionOptions sessionOptions, Action<SkStackClient>? postConfigureClient) {}
protected Action<SkStackClient>? PostConfigureClient { get; }
public object? RouteBServiceKey { get; }
public IServiceProvider ServiceProvider { get; }
protected SkStackRouteBSessionOptions SessionOptions { get; }
public V...Smdn.Net.SmartMeter.Extensions.Munin version 2.0.0
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2025-06-15 import Smdn.Net.SmartMeter.Extensions.Munin
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.SmartMeter.Extensions.Munin/Smdn.Net.SmartMeter.Extensions.Munin-net8.0.apilist.cs b/doc/api-list/Smdn.Net.SmartMeter.Extensions.Munin/Smdn.Net.SmartMeter.Extensions.Munin-net8.0.apilist.cs
new file mode 100644
index 0000000..aaac1a8
--- /dev/null
+++ b/doc/api-list/Smdn.Net.SmartMeter.Extensions.Munin/Smdn.Net.SmartMeter.Extensions.Munin-net8.0.apilist.cs
@@ -0,0 +1,209 @@
+// Smdn.Net.SmartMeter.Extensions.Munin.dll (Smdn.Net.SmartMeter.Extensions.Munin-2.0.0)
+// Name: Smdn.Net.SmartMeter.Extensions.Munin
+// AssemblyVersion: 2.0.0.0
+// InformationalVersion: 2.0.0+af25552aabd41ce54db2ed417a0dc9390a5dbadf
+// TargetFramework: .NETCoreApp,Version=v8.0
+// Configuration: Release
+// Referenced assemblies:
+// Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.Hosting.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Smdn.Net.EchonetLite, Version=2.1.0.0, Culture=neutral
+// Smdn.Net.EchonetLite.RouteB, Version=2.1.0.0, Culture=neutral
+// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.1.0.0, Culture=neutral
+// Smdn.Net.MuninNode, Version=2.5.0.0, Culture=neutral
+// Smdn.Net.MuninNode.Hosting, Version=3.1.0.0, Culture=neutral
+// Smdn.Net.SmartMeter, Version=2.1.0.0, Culture=neutral
+// System.Collections, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Collections.Concurrent, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.ComponentModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Linq, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Net.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Threading, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+#nullable enable annotations
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Net;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using Smdn.Net.EchonetLite.RouteB;
+using Smdn.Net.EchonetLite.RouteB.DependencyInjection;
+using Smdn.Net.MuninNode;
+using Smdn.Net.MuninNode.DependencyInjection;
+using Smdn.Net.MuninNode.Hosting;
+using Smdn.Net.MuninNode.Transport;
+using Smdn.Net.MuninPlugin;
+using Smdn.Net.SmartMeter;
+using Smdn.Net.SmartMeter.MuninNode;
+using Smdn.Net.SmartMeter.MuninNode.Hosting;
+using Smdn.Net.SmartMeter.MuninNode.Hosting.Systemd;
+using Smdn.Net.SmartMeter.MuninPlugin;
+
+namespace Smdn.Net.MuninNode.DependencyInjection {
+ public static class IMuninServiceBuilderExtensions {
+ public static SmartMeterMuninNodeBuilder AddSmartMeterMuninNode(this IMuninServiceBuilder builder, Action<MuninNodeOptions> configureMuninNodeOptions, Action<IRouteBServiceBuilder<string>> configureRouteBServices) {}
+ }
+}
+
+namespace Smdn.Net.SmartMeter.MuninNode {
+ public sealed class SmartMeterMuninNode : LocalNode {
+ public event EventHandler<Exception>? UnhandledAggregationException { add; remove; }
+
+ public override string HostName { get; }
+ public override IPluginProvider PluginProvider { get; }
+
+ protected override void Dispose(bool disposing) {}
+ protected override async ValueTask DisposeAsyncCore() {}
+ protected override EndPoint GetLocalEndPointToBind() {}
+ protected override ValueTask StartedAsync(CancellationToken cancellationToken) {}
+ protected override async ValueTask StartingAsync(CancellationToken cancellationToken) {}
+ protected override async ValueTask StoppedAsync(CancellationToken cancellationToken) {}
+ }
+
+ public sealed class SmartMeterMuninNodeBuilder : MuninNodeBuilder {
+ protected override IMuninNode Build(IPluginProvider pluginProvider, IMuninNodeListenerFactory? listenerFactory, IServiceProvider serviceProvider) {}
+ }
+
+ public static class SmartMeterMuninNodeBuilderExtensions {
+ public static SmartMeterMuninNodeBuilder AddCumulativeElectricEnergyAtEvery30MinPlugin(this SmartMeterMuninNodeBuilder builder, bool enableNormalDirection = true, bool enableReverseDirection = false, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddCumulativeElectricEnergyAtEvery30MinPlugin(this SmartMeterMuninNodeBuilder builder, string name, bool enableNormalDirection = true, bool enableReverseDirection = false, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddDailyCumulativeElectricEnergyPlugin(this SmartMeterMuninNodeBuilder builder, bool enableNormalDirection = true, bool enableReverseDirection = false, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddDailyCumulativeElectricEnergyPlugin(this SmartMeterMuninNodeBuilder builder, string name, bool enableNormalDirection = true, bool enableReverseDirection = false, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddInstantaneousCurrentPlugin(this SmartMeterMuninNodeBuilder builder, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddInstantaneousCurrentPlugin(this SmartMeterMuninNodeBuilder builder, TimeSpan aggregationInterval, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddInstantaneousCurrentPlugin(this SmartMeterMuninNodeBuilder builder, string name, TimeSpan aggregationInterval, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddInstantaneousElectricPowerPlugin(this SmartMeterMuninNodeBuilder builder, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddInstantaneousElectricPowerPlugin(this SmartMeterMuninNodeBuilder builder, TimeSpan aggregationInterval, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddInstantaneousElectricPowerPlugin(this SmartMeterMuninNodeBuilder builder, string name, TimeSpan aggregationInterval, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddMonthlyCumulativeElectricEnergyPlugin(this SmartMeterMuninNodeBuilder builder, bool enableNormalDirection = true, bool enableReverseDirection = false, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddMonthlyCumulativeElectricEnergyPlugin(this SmartMeterMuninNodeBuilder builder, string name, bool enableNormalDirection = true, bool enableReverseDirection = false, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddWeeklyCumulativeElectricEnergyPlugin(this SmartMeterMuninNodeBuilder builder, DayOfWeek firstDayOfWeek = DayOfWeek.Sunday, bool enableNormalDirection = true, bool enableReverseDirection = false, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ public static SmartMeterMuninNodeBuilder AddWeeklyCumulativeElectricEnergyPlugin(this SmartMeterMuninNodeBuilder builder, string name, DayOfWeek firstDayOfWeek = DayOfWeek.Sunday, bool enableNormalDirection = true, bool enableReverseDirection = false, Action<PluginGraphAttributesBuilder>? configureGraphAttributes = null) {}
+ }
+}
+
+namespace Smdn.Net.SmartMeter.MuninNode.Hosting {
+ public static class IServiceCollectionExtensions {
+ public static IServiceCollection AddHostedSmartMeterMuninNodeService(this IServiceCollection services, Action<IRouteBServiceBuilder<string>> configureRouteBServices, Action<MuninNodeOptions> configureMuninNodeOptions, Action<SmartMeterMuninNodeBuilder> configureSmartMeterMuninNode) {}
+ public static IServiceCollection AddHostedSmartMeterMuninNodeService<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TSmartMeterMuninNodeService>(this IServiceCollection services, Action<IRouteBServiceBuilder<string>> configureRouteBServices, Action<MuninNodeOptions> configureMuninNodeOptions, Action<SmartMeterMuninNodeBuilder> configureSmartMeterMuninNode) where TSmartMeterMuninNodeService : SmartMeterMuninNodeService {}
+ }
+
+ public class SmartMeterMuninNodeService : MuninNodeBackgroundService {
+ public SmartMeterMuninNodeService(SmartMeterMuninNode smartMeterMuninNode, ILogger<SmartMeterMuninNodeService>? logger = null) {}
+
+ [MemberNotNullWhen(true, "unhandledAggregationException")]
+ protected bool HasAggregationHalted { [MemberNotNullWhen(true, "unhandledAggregationException")] get; }
+
+ public override void Dispose() {}
+ protected override async Task Execut...Smdn.Net.SmartMeter version 2.1.0
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2025-06-14 update package version
- 2025-06-14 improve support for null service keys with ResiliencePipelineProvider
- 2025-06-11 add extension methods for configuring ResiliencePipelines for SmartMeterDataAggregator
- 2025-06-10 simplify implementation by using record struct
- 2025-06-09 add API for registering and retrieving ResiliencePipelineProvider by specifying a service key
- 2025-06-06 fix typo and replace to more better word
- 2025-06-06 add DI extension methods for configuring ResiliencePipelines
- 2025-04-21 fix typo in comment
- 2025-01-12 enable PackageValidationBaselineVersion
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.SmartMeter/Smdn.Net.SmartMeter-net8.0.apilist.cs b/doc/api-list/Smdn.Net.SmartMeter/Smdn.Net.SmartMeter-net8.0.apilist.cs
index 71ae204..5f327e5 100644
--- a/doc/api-list/Smdn.Net.SmartMeter/Smdn.Net.SmartMeter-net8.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.SmartMeter/Smdn.Net.SmartMeter-net8.0.apilist.cs
@@ -1,140 +1,213 @@
-// Smdn.Net.SmartMeter.dll (Smdn.Net.SmartMeter-2.0.0)
+// Smdn.Net.SmartMeter.dll (Smdn.Net.SmartMeter-2.1.0)
// Name: Smdn.Net.SmartMeter
-// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0+1702d101b7d7da969b9b6258406b4aea5a1b98b4
+// AssemblyVersion: 2.1.0.0
+// InformationalVersion: 2.1.0+01af802c78a13826892462d3e0ae20ee33327eb5
// TargetFramework: .NETCoreApp,Version=v8.0
// Configuration: Release
// Referenced assemblies:
-// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Polly.Core, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
-// Smdn.Net.EchonetLite, Version=2.0.0.0, Culture=neutral
-// Smdn.Net.EchonetLite.RouteB, Version=2.0.0.0, Culture=neutral
-// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.0.0.0, Culture=neutral
+// Polly.Extensions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
+// Smdn.Extensions.Polly.KeyedRegistry, Version=1.2.0.0, Culture=neutral
+// Smdn.Net.EchonetLite, Version=2.1.0.0, Culture=neutral
+// Smdn.Net.EchonetLite.RouteB, Version=2.1.0.0, Culture=neutral
+// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.1.0.0, Culture=neutral
// System.Collections, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ComponentModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ComponentModel.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Linq, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ObjectModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Threading, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
#nullable enable annotations
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+using Polly;
+using Polly.DependencyInjection;
using Polly.Registry;
+using Polly.Registry.KeyedRegistry;
using Smdn.Net.EchonetLite.RouteB;
using Smdn.Net.EchonetLite.RouteB.Credentials;
using Smdn.Net.EchonetLite.RouteB.Transport;
using Smdn.Net.SmartMeter;
+namespace Smdn.Net.EchonetLite.RouteB.DependencyInjection {
+ public static class SmartMeterDataAggregatorRouteBServiceBuilderExtensions {
+ public static IRouteBServiceBuilder<TServiceKey> AddResiliencePipelineAggregationDataAcquisition<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>> configure) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddResiliencePipelineDataAggregationTask<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>> configure) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddResiliencePipelineSmartMeterConnection<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>> configure) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddResiliencePipelineSmartMeterReadProperty<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>> configure) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddResiliencePipelineSmartMeterReconnection<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>> configure) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddResiliencePipelineSmartMeterWriteProperty<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>> configure) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddResiliencePipelineUpdatingElectricEnergyBaseline<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>> configure) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddRetryAggregationDataAcquisitionTimeout<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, int maxRetryAttempt, TimeSpan delay, Action<RetryStrategyOptions, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>>? configureRetryOptions = null, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>>? configurePipeline = null) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddRetryDataAggregationTaskException<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, int maxRetryAttempt, TimeSpan delay, Action<PredicateBuilder> configureExceptionPredicates, Action<RetryStrategyOptions, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>>? configureRetryOptions = null, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>>? configurePipeline = null) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddRetrySmartMeterConnectionTimeout<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, int maxRetryAttempt, TimeSpan delay, Action<RetryStrategyOptions, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>>? configureRetryOptions = null, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>>? configurePipeline = null) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddRetrySmartMeterReadPropertyException<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, int maxRetryAttempt, TimeSpan delay, Action<PredicateBuilder> configureExceptionPredicates, Action<RetryStrategyOptions, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>>? configureRetryOptions = null, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>>? configurePipeline = null) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddRetrySmartMeterReconnectionTimeout<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder, int maxRetryAttempt, TimeSpan delay, Action<RetryStrategyOptions, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>>? configureRetryOptions = null, Action<ResiliencePipelineBuilder, AddResiliencePipelineContext<SmartMeterDataAggregator.ResiliencePipelineKeyPair<TServiceKey>>>? configurePipeline = null) {}
+ public static IRouteBServiceBuilder<TServiceKey> AddRetrySmartMeterWriteProper...Smdn.Net.EchonetLite.RouteB.SkStackIP version 2.0.0
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2025-06-14 update package version
- 2025-06-14 improve support for null service keys with ResiliencePipelineProvider
- 2025-06-14 define keys for ResiliencePipeline in individual class
- 2025-06-11 shorten and simplify class names
- 2025-06-11 add API for registering and retrieving ResiliencePipelineProvider by specifying a service key, for SkStackIP
- 2025-06-11 add AddSkStackHandler extension method to support adding handler factory builder to the IRouteBServiceBuilder
- 2025-06-11 add builder class for SkStackRouteBEchonetLiteHandlerFactory and BP35A1RouteBEchonetLiteHandlerFactory
- 2025-06-11 redesign API of SkStackRouteBEchonetLiteHandlerFactory
- 2025-06-11 add routeBServiceKey to constructor parameter list
- 2025-06-06 add support for registering the IRouteBCredentialProvider alongside the service key
- 2025-06-04 rename from SkStackRouteBSessionConfiguration to SkStackRouteBSessionOptions
- 2025-06-04 improve names for ResiliencePropertyKey to reduce the possibility of duplication by including type names
- 2025-04-21 fix typo in comment
- 2025-04-17 stop using ResiliencePipeline<T> since supporting fallback in PANA authentication is a wrong approach
- 2025-04-17 improve logging of PANA authentication progress
- 2025-04-17 avoid repeating unnecessary PrepareSessionAsync calls
- 2025-04-17 move workaround for PANA auth to BP35A1RouteBEchonetLiteHandler to simplify the implementation
- 2025-04-16 remove unnecessary 'virtual' modifier
- 2025-04-16 change to use ResiliencePipeline<object?> since non-generic FallbackStrategyOptions do not exist and cannot be used
- 2025-01-09 simplify factory APIs for creating RouteBEchonetLiteHandler
- 2025-01-09 remove duplicate status checks
- 2024-12-10 add todo
- 2024-12-04 drop target framework net6.0
- 2024-11-16 replace event IEchonetLiteHandler.Received with callback delegate ReceiveCallback
- 2024-11-06 throw ObjectDisposedException properly
- 2024-11-05 collapse null with ResiliencePipeline.Empty
- 2024-11-02 add IServiceCollection extension method for applying workaround for PANA authentication failure with BP35A1
- 2024-11-02 improve to be able to get ILogger via ResilienceContext
- 2024-11-02 improve object construction to have ILogger in EchonetLiteHandler
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.EchonetLite.RouteB.SkStackIP/Smdn.Net.EchonetLite.RouteB.SkStackIP-net6.0.apilist.cs b/doc/api-list/Smdn.Net.EchonetLite.RouteB.SkStackIP/Smdn.Net.EchonetLite.RouteB.SkStackIP-net6.0.apilist.cs
deleted file mode 100644
index d6a2c77..0000000
--- a/doc/api-list/Smdn.Net.EchonetLite.RouteB.SkStackIP/Smdn.Net.EchonetLite.RouteB.SkStackIP-net6.0.apilist.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-// Smdn.Net.EchonetLite.RouteB.SkStackIP.dll (Smdn.Net.EchonetLite.RouteB.SkStackIP-2.0.0-preview3)
-// Name: Smdn.Net.EchonetLite.RouteB.SkStackIP
-// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0-preview3+370bdac018b42e5e04f531669d50f03b3bb6922f
-// TargetFramework: .NETCoreApp,Version=v6.0
-// Configuration: Release
-// Referenced assemblies:
-// Microsoft.Extensions.DependencyInjection, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
-// Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
-// Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
-// Polly.Core, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
-// Smdn.Net.EchonetLite.Primitives, Version=2.0.0.0, Culture=neutral
-// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.0.0.0, Culture=neutral
-// Smdn.Net.SkStackIP, Version=1.2.0.0, Culture=neutral
-// System.ComponentModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-// System.ComponentModel.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-// System.Memory, 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.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-// System.Threading, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-#nullable enable annotations
-
-using System;
-using System.Buffers;
-using System.ComponentModel;
-using System.Net;
-using System.Net.NetworkInformation;
-using System.Threading;
-using System.Threading.Tasks;
-using Microsoft.Extensions.DependencyInjection;
-using Polly;
-using Smdn.Net.EchonetLite.RouteB.Credentials;
-using Smdn.Net.EchonetLite.RouteB.Transport;
-using Smdn.Net.EchonetLite.RouteB.Transport.SkStackIP;
-using Smdn.Net.SkStackIP;
-
-namespace Smdn.Net.EchonetLite.RouteB.Transport.SkStackIP {
- public interface ISkStackRouteBEchonetLiteHandlerFactory : IRouteBEchonetLiteHandlerFactory {
- Action<SkStackRouteBSessionConfiguration>? ConfigureRouteBSessionConfiguration { get; set; }
- Action<SkStackClient>? ConfigureSkStackClient { get; set; }
- }
-
- public enum SkStackRouteBTransportProtocol : int {
- Tcp = 0,
- Udp = 1,
- }
-
- public abstract class SkStackRouteBEchonetLiteHandler : RouteBEchonetLiteHandler {
- public static readonly string ResiliencePipelineKeyForAuthenticate = "SkStackRouteBEchonetLiteHandler.resiliencePipelineAuthenticate";
- public static readonly string ResiliencePipelineKeyForSend = "SkStackRouteBEchonetLiteHandler.resiliencePipelineSend";
- public static readonly ResiliencePropertyKey<SkStackClient?> ResiliencePropertyKeyForClient; // = "ResiliencePropertyKeyForClient"
-
- public override IPAddress? LocalAddress { get; }
- public override IPAddress? PeerAddress { get; }
- public override ISynchronizeInvoke? SynchronizingObject { get; set; }
-
- protected override ValueTask ConnectAsyncCore(IRouteBCredential credential, CancellationToken cancellationToken) {}
- protected override async ValueTask DisconnectAsyncCore(CancellationToken cancellationToken) {}
- protected override void Dispose(bool disposing) {}
- protected override async ValueTask DisposeAsyncCore() {}
- protected override ValueTask<IPAddress> ReceiveAsyncCore(IBufferWriter<byte> buffer, CancellationToken cancellationToken) {}
- protected override ValueTask SendAsyncCore(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken) {}
- protected override ValueTask SendToAsyncCore(IPAddress remoteAddress, ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken) {}
- [MemberNotNull("client")]
- protected override void ...Smdn.Net.EchonetLite.RouteB.Primitives version 2.1.0
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2025-06-14 update package version
- 2025-06-11 add IRouteBServiceBuilder<TServiceKey> to support configuration of Route-B services using the builder pattern
- 2025-06-06 add support for registering the IRouteBCredentialProvider alongside the service key
- 2025-04-21 fix typo in comment
- 2025-01-12 enable PackageValidationBaselineVersion
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.EchonetLite.RouteB.Primitives/Smdn.Net.EchonetLite.RouteB.Primitives-net8.0.apilist.cs b/doc/api-list/Smdn.Net.EchonetLite.RouteB.Primitives/Smdn.Net.EchonetLite.RouteB.Primitives-net8.0.apilist.cs
index 69197c3..88c8726 100644
--- a/doc/api-list/Smdn.Net.EchonetLite.RouteB.Primitives/Smdn.Net.EchonetLite.RouteB.Primitives-net8.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.EchonetLite.RouteB.Primitives/Smdn.Net.EchonetLite.RouteB.Primitives-net8.0.apilist.cs
@@ -1,68 +1,81 @@
-// Smdn.Net.EchonetLite.RouteB.Primitives.dll (Smdn.Net.EchonetLite.RouteB.Primitives-2.0.0)
+// Smdn.Net.EchonetLite.RouteB.Primitives.dll (Smdn.Net.EchonetLite.RouteB.Primitives-2.1.0)
// Name: Smdn.Net.EchonetLite.RouteB.Primitives
-// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0+7829b96052cff6b82bd3e68fb0ced5454037c338
+// AssemblyVersion: 2.1.0.0
+// InformationalVersion: 2.1.0+8350a1992a3cc375c86febf128c7a1ab32401211
// TargetFramework: .NETCoreApp,Version=v8.0
// Configuration: Release
// Referenced assemblies:
// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Smdn.Net.EchonetLite.Primitives, Version=2.0.0.0, Culture=neutral
// System.ComponentModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Memory, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// System.Net.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
#nullable enable annotations
using System;
using System.Buffers;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Smdn.Net.EchonetLite.RouteB.Credentials;
using Smdn.Net.EchonetLite.RouteB.Transport;
using Smdn.Net.EchonetLite.Transport;
namespace Smdn.Net.EchonetLite.RouteB.Credentials {
public interface IRouteBCredential : IDisposable {
void WriteIdTo(IBufferWriter<byte> buffer);
void WritePasswordTo(IBufferWriter<byte> buffer);
}
public interface IRouteBCredentialIdentity {
}
public interface IRouteBCredentialProvider {
IRouteBCredential GetCredential(IRouteBCredentialIdentity identity);
}
public static class RouteBCredentials {
public const int AuthenticationIdLength = 32;
public const int PasswordLength = 12;
}
}
+namespace Smdn.Net.EchonetLite.RouteB.DependencyInjection {
+ public interface IRouteBServiceBuilder<TServiceKey> {
+ Func<TServiceKey, string?>? OptionsNameSelector { get; }
+ TServiceKey ServiceKey { get; }
+ IServiceCollection Services { get; }
+ }
+
+ public static class IRouteBServiceBuilderExtensions {
+ public static string? GetOptionsName<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder) {}
+ }
+}
+
namespace Smdn.Net.EchonetLite.RouteB.Transport {
+ [Obsolete("Use IRouteBServiceBuilder instead.")]
public interface IRouteBEchonetLiteHandlerBuilder {
IServiceCollection Services { get; }
}
public interface IRouteBEchonetLiteHandlerFactory {
ValueTask<RouteBEchonetLiteHandler> CreateAsync(CancellationToken cancellationToken);
}
public abstract class RouteBEchonetLiteHandler : EchonetLiteHandler {
protected RouteBEchonetLiteHandler(ILogger? logger, IServiceProvider? serviceProvider) {}
public abstract IPAddress? PeerAddress { get; }
public ValueTask ConnectAsync(IRouteBCredential credential, CancellationToken cancellationToken = default) {}
protected abstract ValueTask ConnectAsyncCore(IRouteBCredential credential, CancellationToken cancellationToken);
public ValueTask DisconnectAsync(CancellationToken cancellationToken = default) {}
protected abstract ValueTask DisconnectAsyncCore(CancellationToken cancellationToken);
}
}
// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.5.0.0.
// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.3.1.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.Net.EchonetLite.RouteB.Primitives/Smdn.Net.EchonetLite.RouteB.Primitives-netstandard2.1.apilist.cs b/doc/api-list/Smdn.Net.EchonetLite.RouteB.Primitives/Smdn.Net.EchonetLite.RouteB.Primitives-netstandard2.1.apilist.cs
index 6bd7124..1ddd9f9 100644
--- a/doc/api-list/Smdn.Net.EchonetLite.RouteB.Primitives/Smdn.Net.EchonetLite.RouteB.Primitives-netstandard2.1.apilist.cs
+++ b/doc/api-list/Smdn.Net.EchonetLite.RouteB.Primitives/Smdn.Net.EchonetLite.RouteB.Primitives-netstandard2.1.apilist.cs
@@ -1,65 +1,78 @@
-// Smdn.Net.EchonetLite.RouteB.Primitives.dll (Smdn.Net.EchonetLite.RouteB.Primitives-2.0.0)
+// Smdn.Net.EchonetLite.RouteB.Primitives.dll (Smdn.Net.EchonetLite.RouteB.Primitives-2.1.0)
// Name: Smdn.Net.EchonetLite.RouteB.Primitives
-// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0+7829b96052cff6b82bd3e68fb0ced5454037c338
+// AssemblyVersion: 2.1.0.0
+// InformationalVersion: 2.1.0+8350a1992a3cc375c86febf128c7a1ab32401211
// TargetFramework: .NETStandard,Version=v2.1
// Configuration: Release
// Referenced assemblies:
// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Smdn.Net.EchonetLite.Primitives, Version=2.0.0.0, Culture=neutral
// netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
#nullable enable annotations
using System;
using System.Buffers;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Smdn.Net.EchonetLite.RouteB.Credentials;
using Smdn.Net.EchonetLite.RouteB.Transport;
using Smdn.Net.EchonetLite.Transport;
namespace Smdn.Net.EchonetLite.RouteB.Credentials {
public interface IRouteBCredential : IDisposable {
void WriteIdTo(IBufferWriter<byte> buffer);
void WritePasswordTo(IBufferWriter<byte> buffer);
}
public interface IRouteBCredentialIdentity {
}
public interface IRouteBCredentialProvider {
IRouteBCredential GetCredential(IRouteBCredentialIdentity identity);
}
public static class RouteBCredentials {
public const int AuthenticationIdLength = 32;
public const int PasswordLength = 12;
}
}
+namespace Smdn.Net.EchonetLite.RouteB.DependencyInjection {
+ public interface IRouteBServiceBuilder<TServiceKey> {
+ Func<TServiceKey, string?>? OptionsNameSelector { get; }
+ TServiceKey ServiceKey { get; }
+ IServiceCollection Services { get; }
+ }
+
+ public static class IRouteBServiceBuilderExtensions {
+ public static string? GetOptionsName<TServiceKey>(this IRouteBServiceBuilder<TServiceKey> builder) {}
+ }
+}
+
namespace Smdn.Net.EchonetLite.RouteB.Transport {
+ [Obsolete("Use IRouteBServiceBuilder instead.")]
public interface IRouteBEchonetLiteHandlerBuilder {
IServiceCollection Services { get; }
}
public interface IRouteBEchonetLiteHandlerFactory {
ValueTask<RouteBEchonetLiteHandler> CreateAsync(CancellationToken cancellationToken);
}
public abstract class RouteBEchonetLiteHandler : EchonetLiteHandler {
protected RouteBEchonetLiteHandler(ILogger? logger, IServiceProvider? serviceProvider) {}
public abstract IPAddress? PeerAddress { get; }
public ValueTask ConnectAsync(IRouteBCredential credential, CancellationToken cancellationToken = default) {}
protected abstract ValueTask ConnectAsyncCore(IRouteBCredential credential, CancellationToken cancellationToken);
public ValueTask DisconnectAsync(CancellationToken cancellationToken = default) {}
protected abstract ValueTask DisconnectAsyncCore(CancellationToken cancellationToken);
}
}
// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.5.0.0.
// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.3.1.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)Full changes
Full changes in this release:
diff --git a/src/Smdn.Net.EchonetLite.RouteB.Primitives/Smdn.Net.EchonetLite.RouteB.DependencyInjection/IRouteBServiceBuilder.cs b/src/Smdn.Net.EchonetLite.RouteB.P...Smdn.Net.EchonetLite.RouteB version 2.1.0
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2025-06-14 update package version
- 2025-06-11 add extension methods to add IRouteBCredentialProvider via IRouteBServiceBuilder
- 2025-06-11 add IRouteBServiceBuilder<TServiceKey> to support configuration of Route-B services using the builder pattern
- 2025-06-06 fix typo and replace to more better word
- 2025-06-06 add support for registering the IRouteBCredentialProvider alongside the service key
- 2025-04-21 fix typo in comment
- 2025-01-12 enable PackageValidationBaselineVersion
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.EchonetLite.RouteB/Smdn.Net.EchonetLite.RouteB-net8.0.apilist.cs b/doc/api-list/Smdn.Net.EchonetLite.RouteB/Smdn.Net.EchonetLite.RouteB-net8.0.apilist.cs
index 697fa32..182cf32 100644
--- a/doc/api-list/Smdn.Net.EchonetLite.RouteB/Smdn.Net.EchonetLite.RouteB-net8.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.EchonetLite.RouteB/Smdn.Net.EchonetLite.RouteB-net8.0.apilist.cs
@@ -1,158 +1,176 @@
-// Smdn.Net.EchonetLite.RouteB.dll (Smdn.Net.EchonetLite.RouteB-2.0.0)
+// Smdn.Net.EchonetLite.RouteB.dll (Smdn.Net.EchonetLite.RouteB-2.1.0)
// Name: Smdn.Net.EchonetLite.RouteB
-// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0+3138f40758ea06ba8f2c2eee70c4237b7f1411d1
+// AssemblyVersion: 2.1.0.0
+// InformationalVersion: 2.1.0+befaca421b43357fbc3b9cbd7d5824a66044d7c6
// TargetFramework: .NETCoreApp,Version=v8.0
// Configuration: Release
// Referenced assemblies:
-// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Polly.Core, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
-// Smdn.Net.EchonetLite, Version=2.0.0.0, Culture=neutral
+// Smdn.Net.EchonetLite, Version=2.1.0.0, Culture=neutral
// Smdn.Net.EchonetLite.Primitives, Version=2.0.0.0, Culture=neutral
-// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.0.0.0, Culture=neutral
+// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.1.0.0, Culture=neutral
// System.Collections, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ComponentModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ComponentModel.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Linq, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Memory, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// System.Net.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
#nullable enable annotations
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Polly;
using Smdn.Net.EchonetLite;
using Smdn.Net.EchonetLite.ObjectModel;
using Smdn.Net.EchonetLite.RouteB;
using Smdn.Net.EchonetLite.RouteB.Credentials;
+using Smdn.Net.EchonetLite.RouteB.DependencyInjection;
using Smdn.Net.EchonetLite.RouteB.Transport;
namespace Smdn.Net.EchonetLite.RouteB {
public class HemsController :
IAsyncDisposable,
IDisposable,
IRouteBCredentialIdentity
{
public HemsController(IRouteBEchonetLiteHandlerFactory echonetLiteHandlerFactory, IRouteBCredentialProvider routeBCredentialProvider, ILogger? logger, ILoggerFactory? loggerFactoryForEchonetClient) {}
public HemsController(IServiceProvider serviceProvider) {}
protected EchonetClient Client { get; }
public EchonetObject Controller { get; }
[MemberNotNullWhen(true, "client")]
[MemberNotNullWhen(true, "smartMeterObject")]
public bool IsConnected { [MemberNotNullWhen(true, "client"), MemberNotNullWhen(true, "smartMeterObject")] get; }
[MemberNotNullWhen(false, "echonetLiteHandler")]
protected bool IsDisposed { [MemberNotNullWhen(false, "echonetLiteHandler")] get; }
protected ILogger? Logger { get; }
public LowVoltageSmartElectricEnergyMeter SmartMeter { get; }
public ISynchronizeInvoke? SynchronizingObject { get; set; }
public TimeSpan TimeoutWaitingProactiveNotification { get; set; }
public TimeSpan TimeoutWaitingResponse1 { get; set; }
public TimeSpan TimeoutWaitingResponse2 { get; set; }
public ValueTask ConnectAsync(ResiliencePipeline? resiliencePipelineForServiceRequest = null, CancellationToken cancellationToken = default) {}
public async ValueTask DisconnectAsync(CancellationToken cancellationToken = default) {}
protected virtual void Dispose(bool disposing) {}
public void Dispose() {}
public async ValueTask DisposeAsync() {}
protected virtual async ValueTask DisposeAsyncCore() {}
public ValueTask<TResult> RunWithResponseWaitTimer1Async<TResult>(Func<CancellationToken, ValueTask<TResult>> asyncAction, TResult resultForTimeout, CancellationToken cancellationToken = default) {}
public ValueTask<TResult> RunWithResponseWaitTimer1Async<TResult>(Func<CancellationToken, ValueTask<TResult>> asyncAction, string? messageForTimeoutException = null, CancellationToken cancellationToken = default) {}
public ValueTask<TResult> RunWithResponseWaitTimer2Async<TResult>(Func<CancellationToken, ValueTask<TResult>> asyncAction, string? messageForTimeoutException = null, CancellationToken cancellationToken = default) {}
[MemberNotNull("client")]
[MemberNotNull("smartMeterObject")]
protected void ThrowIfDisconnected() {}
[MemberNotNull("echonetLiteHandler")]
protected void ThrowIfDisposed() {}
}
public sealed class LowVoltageSmartElectricEnergyMeter : DeviceSuperClass {
public IEchonetPropertyGetAccessor<int> Coefficient { get; }
public IEchonetPropertyGetAccessor<IReadOnlyList<(MeasurementValue<ElectricEnergyValue> NormalDirection, MeasurementValue<ElectricEnergyValue> ReverseDirection)>> CumulativeElectricEnergyLog2 { get; }
public IEchonetPropertySetGetAccessor<DateTime> DayForTheHistoricalDataOfCumulativeElectricEnergy1 { get; }
public IEchonetPropertySetGetAccessor<(DateTime DateAndTime, int NumberOfItems)> DayForTheHistoricalDataOfCumulativeElectricEnergy2 { get; }
public IEchonetPropertyGetAccessor<(ElectricCurrentValue RPhase, ElectricCurrentValue TPhase)> InstantaneousCurrent { get; }
public IEchonetPropertyGetAccessor<int> InstantaneousElectricPower { get; }
public IEchonetPropertyGetAccessor<ElectricEnergyValue> NormalDirectionCumulativeElectricEnergy { get; }
public IEchonetPropertyGetAccessor<MeasurementValue<ElectricEnergyValue>> NormalDirectionCumulativeElectricEnergyAtEvery30Min { get; }
public IEchonetPropertyGetAccessor<IReadOnlyList<MeasurementValue<ElectricEnergyValue>>> NormalDirectionCumulativeElectricEnergyLog1 { get; }
public IEchonetPropertyGetAccessor<int> NumberOfEffectiveDigitsCumulativeElectricEnergy { get; }
public IEchonetPropertyGetAccessor<(MeasurementValue<ElectricEnergyValue> NormalDirection, MeasurementValue<ElectricEnergyValue> ReverseDirection)> OneMinuteMeasuredCumulativeAmountsOfElectricEnergy { get; }
public IEchonetPropertyGetAccessor<ElectricEnergyValue> ReverseDirectionCumulativeElectricEnergy { get; }
public IEchonetPropertyGetAccessor<MeasurementValue<ElectricEnergyValue>> ReverseDirectionCumulativeElectricEnergyAtEvery30Min { get; }
public IEchonetPropertyGetAccessor<IReadOnlyList<MeasurementValue<ElectricEnergyValue>>> ReverseDirectionCumulativeElectricEnergyLog1 { get; }
public IEchonetPropertyGetAccessor<ReadOnlyMemory<byte>> RouteBIdentificationNumber { get; }
public IEchonetPropertyGetAccessor<decimal> UnitForCumulativeElectricEnergy { get; }
}
public static class MeasurementValue {
public static MeasurementValue<TValue> Create<TValue>(TValue @value, DateTime measuredAt) where TValue : struct {}
}
public sealed class RouteBDeviceFactory : IEchonetDeviceFactory {
public static RouteBDeviceFactory Instance { get; }
public RouteBDeviceFactory() {}
public EchonetDevice? Create(byte classGroupCode, byte classCode, byte instanceCode) {}
}
public readonly struct ElectricCurrentValue {
public ElectricCurrentValue(short rawValue) {}
public decimal Amperes { get; }
public bool IsValid { get; }
public short RawValue { get; }
public override string ToString() {}
}
public readonly struct ElectricEnergyValue {
...Smdn.Net.EchonetLite.Primitives version 2.0.1
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2025-06-14 fix assembly version
- 2025-06-14 update package version
- 2025-06-06 fix typo and replace to more better word
- 2025-04-21 fix typo in comment
- 2025-01-12 enable PackageValidationBaselineVersion
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.EchonetLite.Primitives/Smdn.Net.EchonetLite.Primitives-net8.0.apilist.cs b/doc/api-list/Smdn.Net.EchonetLite.Primitives/Smdn.Net.EchonetLite.Primitives-net8.0.apilist.cs
index a27e627..b9b16e7 100644
--- a/doc/api-list/Smdn.Net.EchonetLite.Primitives/Smdn.Net.EchonetLite.Primitives-net8.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.EchonetLite.Primitives/Smdn.Net.EchonetLite.Primitives-net8.0.apilist.cs
@@ -1,92 +1,92 @@
-// Smdn.Net.EchonetLite.Primitives.dll (Smdn.Net.EchonetLite.Primitives-2.0.0)
+// Smdn.Net.EchonetLite.Primitives.dll (Smdn.Net.EchonetLite.Primitives-2.0.1)
// Name: Smdn.Net.EchonetLite.Primitives
-// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0+e711220aebaba7dfe17051eed5e6dd8890ffd4d1
+// AssemblyVersion: 2.0.1.0
+// InformationalVersion: 2.0.1+a1a02047fb738e30ac5001d6149f8cc18eef4ee6
// TargetFramework: .NETCoreApp,Version=v8.0
// Configuration: Release
// Referenced assemblies:
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// System.ComponentModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Memory, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// System.Net.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
#nullable enable annotations
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Smdn.Net.EchonetLite;
namespace Smdn.Net.EchonetLite {
public interface IEchonetLiteHandler {
Func<IPAddress, ReadOnlyMemory<byte>, CancellationToken, ValueTask>? ReceiveCallback { get; set; }
ValueTask SendAsync(ReadOnlyMemory<byte> data, CancellationToken cancellationToken);
ValueTask SendToAsync(IPAddress remoteAddress, ReadOnlyMemory<byte> data, CancellationToken cancellationToken);
}
public interface IEchonetObjectSpecification {
byte ClassCode { get; }
byte ClassGroupCode { get; }
IEnumerable<IEchonetPropertySpecification> Properties { get; }
}
public interface IEchonetPropertySpecification {
bool CanAnnounceStatusChange { get; }
bool CanGet { get; }
bool CanSet { get; }
byte Code { get; }
bool IsAcceptableValue(ReadOnlySpan<byte> edt);
}
}
namespace Smdn.Net.EchonetLite.Transport {
public abstract class EchonetLiteHandler :
IAsyncDisposable,
IDisposable,
IEchonetLiteHandler
{
protected class ReceivedFromUnknownAddressException : InvalidOperationException {
public ReceivedFromUnknownAddressException() {}
public ReceivedFromUnknownAddressException(string message) {}
public ReceivedFromUnknownAddressException(string message, Exception? innerException) {}
}
public const int DefaultPort = 3610;
protected EchonetLiteHandler(ILogger? logger, IServiceProvider? serviceProvider) {}
protected bool IsDisposed { get; }
[MemberNotNullWhen(true, "taskReceiveEchonetLite")]
protected bool IsReceiving { [MemberNotNullWhen(true, "taskReceiveEchonetLite")] get; }
public abstract IPAddress? LocalAddress { get; }
protected ILogger? Logger { get; }
public Func<IPAddress, ReadOnlyMemory<byte>, CancellationToken, ValueTask>? ReceiveCallback { get; set; }
protected virtual void Dispose(bool disposing) {}
public void Dispose() {}
public async ValueTask DisposeAsync() {}
protected virtual async ValueTask DisposeAsyncCore() {}
protected virtual bool HandleReceiveTaskException(Exception exception) {}
protected abstract ValueTask<IPAddress> ReceiveAsyncCore(IBufferWriter<byte> buffer, CancellationToken cancellationToken);
public ValueTask SendAsync(ReadOnlyMemory<byte> data, CancellationToken cancellationToken) {}
protected abstract ValueTask SendAsyncCore(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken);
public ValueTask SendToAsync(IPAddress remoteAddress, ReadOnlyMemory<byte> data, CancellationToken cancellationToken) {}
protected abstract ValueTask SendToAsyncCore(IPAddress remoteAddress, ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken);
protected void StartReceiving() {}
protected void StartReceiving(TaskFactory? taskFactoryForReceiving) {}
protected async ValueTask StopReceivingAsync() {}
protected virtual void ThrowIfDisposed() {}
[MemberNotNull("taskReceiveEchonetLite")]
protected void ThrowIfNotReceiving() {}
protected void ThrowIfReceiving() {}
}
}
// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.5.0.0.
// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.3.1.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.Net.EchonetLite.Primitives/Smdn.Net.EchonetLite.Primitives-netstandard2.1.apilist.cs b/doc/api-list/Smdn.Net.EchonetLite.Primitives/Smdn.Net.EchonetLite.Primitives-netstandard2.1.apilist.cs
index 3a1be73..f0081cc 100644
--- a/doc/api-list/Smdn.Net.EchonetLite.Primitives/Smdn.Net.EchonetLite.Primitives-netstandard2.1.apilist.cs
+++ b/doc/api-list/Smdn.Net.EchonetLite.Primitives/Smdn.Net.EchonetLite.Primitives-netstandard2.1.apilist.cs
@@ -1,86 +1,86 @@
-// Smdn.Net.EchonetLite.Primitives.dll (Smdn.Net.EchonetLite.Primitives-2.0.0)
+// Smdn.Net.EchonetLite.Primitives.dll (Smdn.Net.EchonetLite.Primitives-2.0.1)
// Name: Smdn.Net.EchonetLite.Primitives
-// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0+e711220aebaba7dfe17051eed5e6dd8890ffd4d1
+// AssemblyVersion: 2.0.1.0
+// InformationalVersion: 2.0.1+a1a02047fb738e30ac5001d6149f8cc18eef4ee6
// TargetFramework: .NETStandard,Version=v2.1
// Configuration: Release
// Referenced assemblies:
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
#nullable enable annotations
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Smdn.Net.EchonetLite;
namespace Smdn.Net.EchonetLite {
public interface IEchonetLiteHandler {
Func<IPAddress, ReadOnlyMemory<byte>, CancellationToken, ValueTask>? ReceiveCallback { get; set; }
ValueTask SendAsync(ReadOnlyMemory<byte> data, CancellationToken cancellationToken);
ValueTask SendToAsync(IPAddress remoteAddress, ReadOnlyMemory<byte> data, CancellationToken cancellationToken);
}
public interface IEchonetObjectSpecification {
byte ClassCode { get; }
byte ClassGroupCode { get; }
IEnumerable<IEchonetPropertySpecification> Properties { get; }
}
public interface IEchonetPropertySpecification {
bool CanAnnounceStatusChange { get; }
bool CanGet { get; }
bool CanSet { get; }
byte Code { get; }
bool IsAcceptableValue(ReadOnlySpan<byte> edt);
}
}
namespace Smdn.Net.EchonetLite.Transport {
public abstract class EchonetLiteHandler :
IAsyncDisposable,
IDisposable,
IEchonetLiteHandler
{
protected class ReceivedFromUnknownAddressException : InvalidOperationException {
public ReceivedFromUnknownAddressException() {}
public ReceivedFromUnknownAddressException(string message) {}
public ReceivedFromUnknownAddressException(string message, Exception? innerException) {}
}
public const int DefaultPort = 3610;
protected EchonetLiteHandler(ILogger? logger, IServiceProvider? serviceProvider) {}
protected bool IsDisposed { get; }
protected bool IsReceiving { get; }
public abstract IPAddress? LocalAddress { get; }
protected ILogger? Logger { get; }
public Func<IPAddress, ReadOnlyMemory<byte>, CancellationToken, ValueTask>? ReceiveCallback { get; set; }
protected virtual void Dispose(bool disposing) {}
public void Dispose() {}
public async ValueTask DisposeAsync() {}
protected virtual async ValueTask DisposeAsyncCore() {}
protected virtual bool HandleReceiveTaskException(Exception exception) {}
protected abstract ValueTask<IPAddress> ReceiveAsyncCore(IBufferWriter<byte> buffer, CancellationToken cancellationToken);
public ValueTask SendAsync(ReadOnlyMemory<byte> data, CancellationToken cancellationToken) {}
protected abstract ValueTask SendAsyncCore(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken);
public V...Smdn.Net.EchonetLite version 2.1.0
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2025-06-14 update package version
- 2025-06-06 fix typo and replace to more better word
- 2025-06-06 add support for registering the IRouteBCredentialProvider alongside the service key
- 2025-06-04 improve names for ResiliencePropertyKey to reduce the possibility of duplication by including type names
- 2025-06-04 add utility methods for acquiring resilience context properties
- 2025-06-04 improve setting ResilienceContext to include ILogger
- 2025-06-04 commonize initializing ResilienceContext and its properties
- 2025-04-21 fix typo in comment
- 2025-01-12 enable PackageValidationBaselineVersion
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite-net8.0.apilist.cs b/doc/api-list/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite-net8.0.apilist.cs
index fe746b7..29e9e67 100644
--- a/doc/api-list/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite-net8.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite-net8.0.apilist.cs
@@ -1,411 +1,416 @@
-// Smdn.Net.EchonetLite.dll (Smdn.Net.EchonetLite-2.0.0)
+// Smdn.Net.EchonetLite.dll (Smdn.Net.EchonetLite-2.1.0)
// Name: Smdn.Net.EchonetLite
-// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0+2bb1851c89ba40ded2eeae51a98f8f88d864931f
+// AssemblyVersion: 2.1.0.0
+// InformationalVersion: 2.1.0+a1a02047fb738e30ac5001d6149f8cc18eef4ee6
// TargetFramework: .NETCoreApp,Version=v8.0
// Configuration: Release
// Referenced assemblies:
// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Polly.Core, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
// Smdn.Net.EchonetLite.Primitives, Version=2.0.0.0, Culture=neutral
// System.Collections, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Collections.Concurrent, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ComponentModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ComponentModel.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Linq, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Memory, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// System.Net.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ObjectModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Threading, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
#nullable enable annotations
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Polly;
using Smdn.Net.EchonetLite;
using Smdn.Net.EchonetLite.ObjectModel;
using Smdn.Net.EchonetLite.Protocol;
namespace Smdn.Net.EchonetLite {
public interface IEchonetDeviceFactory {
EchonetDevice? Create(byte classGroupCode, byte classCode, byte instanceCode);
}
public enum EchonetServicePropertyResult : int {
Accepted = 1,
NotAccepted = 2,
Unavailable = 0,
}
public class EchonetClient :
IAsyncDisposable,
IDisposable
{
- public static readonly ResiliencePropertyKey<ESV> ResiliencePropertyKeyForRequestServiceCode; // = "ResiliencePropertyKeyForRequestServiceCode"
- public static readonly ResiliencePropertyKey<ESV> ResiliencePropertyKeyForResponseServiceCode; // = "ResiliencePropertyKeyForResponseServiceCode"
+ public static readonly ResiliencePropertyKey<ILogger?> ResiliencePropertyKeyForLogger; // = "EchonetClient.ResiliencePropertyKeyForLogger"
+ public static readonly ResiliencePropertyKey<ESV> ResiliencePropertyKeyForRequestServiceCode; // = "EchonetClient.ResiliencePropertyKeyForRequestServiceCode"
+ public static readonly ResiliencePropertyKey<ESV> ResiliencePropertyKeyForResponseServiceCode; // = "EchonetClient.ResiliencePropertyKeyForResponseServiceCode"
+
+ public static ILogger? GetLoggerForResiliencePipeline(ResilienceContext resilienceContext) {}
+ public static bool TryGetRequestServiceCodeForResiliencePipeline(ResilienceContext resilienceContext, out ESV serviceCode) {}
+ public static bool TryGetResponseServiceCodeForResiliencePipeline(ResilienceContext resilienceContext, out ESV serviceCode) {}
public event EventHandler<EchonetNodeEventArgs>? InstanceListUpdated;
public event EventHandler<EchonetNodeEventArgs>? InstanceListUpdating;
public event EventHandler<EchonetObjectEventArgs>? PropertyMapAcquired;
public event EventHandler<EchonetObjectEventArgs>? PropertyMapAcquiring;
public EchonetClient(EchonetNode selfNode, IEchonetLiteHandler echonetLiteHandler, bool shouldDisposeEchonetLiteHandler = false, EchonetNodeRegistry? nodeRegistry = null, IEchonetDeviceFactory? deviceFactory = null, ResiliencePipeline? resiliencePipelineForSendingResponseFrame = null, ILogger? logger = null, IServiceProvider? serviceProvider = null) {}
public EchonetClient(IEchonetLiteHandler echonetLiteHandler, bool shouldDisposeEchonetLiteHandler = false, IServiceProvider? serviceProvider = null) {}
public EchonetClient(IEchonetLiteHandler echonetLiteHandler, bool shouldDisposeEchonetLiteHandler, EchonetNodeRegistry? nodeRegistry, IEchonetDeviceFactory? deviceFactory, IServiceProvider? serviceProvider = null) {}
protected ILogger? Logger { get; }
public EchonetNodeRegistry NodeRegistry { get; }
public EchonetNode SelfNode { get; }
public ISynchronizeInvoke? SynchronizingObject { get; set; }
public async ValueTask<EchonetServiceResponse> AcquirePropertyMapsAsync(EchonetObject device, IEnumerable<byte>? extraPropertyCodes = null, ResiliencePipeline? resiliencePipelineForServiceRequest = null, CancellationToken cancellationToken = default) {}
protected virtual void Dispose(bool disposing) {}
public void Dispose() {}
public async ValueTask DisposeAsync() {}
protected virtual async ValueTask DisposeAsyncCore() {}
internal protected IPAddress? GetSelfNodeAddress() {}
protected virtual async ValueTask HandleFormat1MessageAsync(IPAddress address, int id, Format1Message message, CancellationToken cancellationToken) {}
protected virtual ValueTask HandleFormat2MessageAsync(IPAddress address, int id, ReadOnlyMemory<byte> edata, CancellationToken cancellationToken) {}
protected void InvokeEvent<TEventArgs>(EventHandler<TEventArgs>? eventHandler, TEventArgs e) where TEventArgs : EventArgs {}
public async ValueTask<EchonetServiceResponse> NotifyAsync(EOJ sourceObject, IEnumerable<PropertyValue> properties, IPAddress destinationNodeAddress, EOJ destinationObject, ResiliencePipeline? resiliencePipeline = null, CancellationToken cancellationToken = default) {}
public async ValueTask NotifyInstanceListAsync(ResiliencePipeline? resiliencePipelineForServiceRequest = null, CancellationToken cancellationToken = default) {}
public async ValueTask NotifyOneWayAsync(EOJ sourceObject, IEnumerable<PropertyValue> properties, IPAddress? destinationNodeAddress, EOJ destinationObject, ResiliencePipeline? resiliencePipeline = null, CancellationToken cancellationToken = default) {}
protected virtual void OnInstanceListUpdated(EchonetNodeEventArgs e) {}
protected virtual void OnInstanceListUpdating(EchonetNodeEventArgs e) {}
protected virtual void OnPropertyMapAcquired(EchonetObjectEventArgs e) {}
protected virtual void OnPropertyMapAcquiring(EchonetObjectEventArgs e) {}
public Task RequestNotifyInstanceListAsync(IPAddress? destinationNodeAddress, Func<EchonetNode, bool> onInstanceListUpdated, ResiliencePipeline? resiliencePipelineForServiceRequest = null, CancellationToken cancellationToken = default) {}
public ValueTask RequestNotifyInstanceListAsync(IPAddress? destinationNodeAddress = null, ResiliencePipeline? resiliencePipelineForServiceRequest = null, CancellationToken cancellationToken = default) {}
public async Task RequestNotifyInstanceListAsync<TState>(IPAddress? destinationNodeAddress, Func<EchonetNode, TState, bool> onInstanceListUpdated, TState state, ResiliencePipeline? resiliencePipelineForServiceRequest = null, CancellationToken cancellationToken = ...Smdn.Net.EchonetLite.RouteB.BP35XX version 2.0.0-preview5
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2025-06-14 update package version
- 2025-06-11 shorten and simplify class names
- 2025-06-11 add API for registering and retrieving ResiliencePipelineProvider by specifying a service key, for BP35A1
- 2025-06-11 add AddBP35A1Handler extension method to support adding handler factory builder to the IRouteBServiceBuilder
- 2025-06-11 add builder class for SkStackRouteBEchonetLiteHandlerFactory and BP35A1RouteBEchonetLiteHandlerFactory
- 2025-06-11 redesign API of SkStackRouteBEchonetLiteHandlerFactory
- 2025-06-11 add routeBServiceKey to constructor parameter list
- 2025-06-10 improve exception message when serial port name is invalid
- 2025-06-10 bump Smdn.Devices.BP35XX and use BP35A1Options instead of obsolete BP35A1Configurations
- 2025-06-06 fix typo and replace to more better word
- 2025-06-04 rename from SkStackRouteBSessionConfiguration to SkStackRouteBSessionOptions
- 2025-04-21 fix typo in comment
- 2025-04-17 stop using ResiliencePipeline<T> since supporting fallback in PANA authentication is a wrong approach
- 2025-04-17 move workaround for PANA auth to BP35A1RouteBEchonetLiteHandler to simplify the implementation
- 2025-04-16 improve AddResiliencePipelineBP35A1PanaAuthenticationWorkaround to allow more flexible ResiliencePipeline configuration
- 2025-01-09 simplify factory APIs for creating RouteBEchonetLiteHandler
- 2024-12-04 drop target framework net6.0
- 2024-11-05 use generic version of ServiceDescriptor.Singleton
- 2024-11-02 add overload to support configuring with ResiliencePipelineBuilder
- 2024-11-02 add IServiceCollection extension method for applying workaround for PANA authentication failure with BP35A1
- 2024-11-02 improve object construction to have ILogger in EchonetLiteHandler
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.EchonetLite.RouteB.BP35XX/Smdn.Net.EchonetLite.RouteB.BP35XX-net6.0.apilist.cs b/doc/api-list/Smdn.Net.EchonetLite.RouteB.BP35XX/Smdn.Net.EchonetLite.RouteB.BP35XX-net6.0.apilist.cs
deleted file mode 100644
index ae61224..0000000
--- a/doc/api-list/Smdn.Net.EchonetLite.RouteB.BP35XX/Smdn.Net.EchonetLite.RouteB.BP35XX-net6.0.apilist.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-// Smdn.Net.EchonetLite.RouteB.BP35XX.dll (Smdn.Net.EchonetLite.RouteB.BP35XX-2.0.0-preview4)
-// Name: Smdn.Net.EchonetLite.RouteB.BP35XX
-// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0-preview4+c7a206f316403313ee223391269df5de9d965d32
-// TargetFramework: .NETCoreApp,Version=v6.0
-// Configuration: Release
-// Referenced assemblies:
-// Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
-// Smdn.Devices.BP35XX, Version=1.0.0.0, Culture=neutral
-// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.0.0.0, Culture=neutral
-// Smdn.Net.EchonetLite.RouteB.SkStackIP, Version=2.0.0.0, Culture=neutral
-// Smdn.Net.SkStackIP, Version=1.2.0.0, Culture=neutral
-// System.ComponentModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-// System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-#nullable enable annotations
-
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Microsoft.Extensions.DependencyInjection;
-using Smdn.Devices.BP35XX;
-using Smdn.Net.EchonetLite.RouteB.Transport;
-using Smdn.Net.EchonetLite.RouteB.Transport.SkStackIP;
-using Smdn.Net.SkStackIP;
-
-namespace Smdn.Net.EchonetLite.RouteB.Transport.BP35XX {
- public sealed class BP35A1RouteBEchonetLiteHandlerFactory : SkStackRouteBEchonetLiteHandlerFactory {
- public BP35A1RouteBEchonetLiteHandlerFactory(IServiceCollection services, Action<BP35A1Configurations> configure) {}
-
- protected override SkStackRouteBTransportProtocol TransportProtocol { get; }
-
- protected override async ValueTask<SkStackClient> CreateClientAsync(IServiceProvider serviceProvider, CancellationToken cancellationToken) {}
- }
-
- public static class IRouteBEchonetLiteHandlerBuilderExtensions {
- public static ISkStackRouteBEchonetLiteHandlerFactory AddBP35A1(this IRouteBEchonetLiteHandlerBuilder builder, Action<BP35A1Configurations> configure) {}
- }
-}
-// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.4.1.0.
-// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.3.1.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.Net.EchonetLite.RouteB.BP35XX/Smdn.Net.EchonetLite.RouteB.BP35XX-net8.0.apilist.cs b/doc/api-list/Smdn.Net.EchonetLite.RouteB.BP35XX/Smdn.Net.EchonetLite.RouteB.BP35XX-net8.0.apilist.cs
index 2cd12b0..dbad983 100644
--- a/doc/api-list/Smdn.Net.EchonetLite.RouteB.BP35XX/Smdn.Net.EchonetLite.RouteB.BP35XX-net8.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.EchonetLite.RouteB.BP35XX/Smdn.Net.EchonetLite.RouteB.BP35XX-net8.0.apilist.cs
@@ -1,40 +1,69 @@
-// Smdn.Net.EchonetLite.RouteB.BP35XX.dll (Smdn.Net.EchonetLite.RouteB.BP35XX-2.0.0-preview4)
+// Smdn.Net.EchonetLite.RouteB.BP35XX.dll (Smdn.Net.EchonetLite.RouteB.BP35XX-2.0.0-preview5)
// Name: Smdn.Net.EchonetLite.RouteB.BP35XX
// AssemblyVersion: 2.0.0.0
-// InformationalVersion: 2.0.0-preview4+c7a206f316403313ee223391269df5de9d965d32
+// InformationalVersion: 2.0.0-preview5+00af253682c17171aae1d68f04e3b98b34db2d4f
// TargetFramework: .NETCoreApp,Version=v8.0
// Configuration: Release
// Referenced assemblies:
// Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
-// Smdn.Devices.BP35XX, Version=1.0.0.0, Culture=neutral
-// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.0.0.0, Culture=neutral
+// Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.Options, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Polly.Core, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
+// Polly.Extensions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
+// Smdn.Devices.BP35XX, Version=2.2.0.0, Culture=neutral
+// Smdn.Net.EchonetLite.Primitives, Version=2.0.0.0, Culture=neutral
+// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.1.0.0, Culture=neutral
// Smdn.Net.EchonetLite.RouteB.SkStackIP, Version=2.0.0.0, Culture=neutral
-// Smdn.Net.SkStackIP, Version=1.2.0.0, Culture=neutral
+// Smdn.Net.SkStackIP, Version=1.4.0.0, Culture=neutral
// System.ComponentModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Linq, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Net.NetworkInformation, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Net.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
#nullable enable annotations
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
+using Polly;
+using Polly.DependencyInjection;
+using Polly.Retry;
using Smdn.Devices.BP35XX;
+using Smdn.Net.EchonetLite.RouteB.DependencyInjection;
using Smdn.Net.EchonetLite.RouteB.Transport;
using Smdn.Net.EchonetLite.RouteB.Transport.SkStackIP;
using Smdn.Net.SkStackIP;
+namespace Smdn.Net.EchonetLite.RouteB.DependencyInjection {
+ public sealed class B...Smdn.Net.SmartMeter version 2.0.0
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2025-01-12 update assembly version
- 2025-01-08 disable waring CS0419
- 2025-01-04 add SmartMeterDataAggregator.IsRunning
- 2024-12-17 add SmartMeterDataAggregator.HandleAggregationTaskException
- 2024-12-17 avoid refering disconnected smart meter object
- 2024-12-10 rename from Smdn.Net.EchonetLite.RouteB.DataAggregation to Smdn.Net.SmartMeter
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.SmartMeter/Smdn.Net.SmartMeter-net8.0.apilist.cs b/doc/api-list/Smdn.Net.SmartMeter/Smdn.Net.SmartMeter-net8.0.apilist.cs
new file mode 100644
index 0000000..71ae204
--- /dev/null
+++ b/doc/api-list/Smdn.Net.SmartMeter/Smdn.Net.SmartMeter-net8.0.apilist.cs
@@ -0,0 +1,140 @@
+// Smdn.Net.SmartMeter.dll (Smdn.Net.SmartMeter-2.0.0)
+// Name: Smdn.Net.SmartMeter
+// AssemblyVersion: 2.0.0.0
+// InformationalVersion: 2.0.0+1702d101b7d7da969b9b6258406b4aea5a1b98b4
+// TargetFramework: .NETCoreApp,Version=v8.0
+// Configuration: Release
+// Referenced assemblies:
+// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Polly.Core, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
+// Smdn.Net.EchonetLite, Version=2.0.0.0, Culture=neutral
+// Smdn.Net.EchonetLite.RouteB, Version=2.0.0.0, Culture=neutral
+// Smdn.Net.EchonetLite.RouteB.Primitives, Version=2.0.0.0, Culture=neutral
+// System.Collections, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.ComponentModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.ComponentModel.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Linq, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.ObjectModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Threading, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+#nullable enable annotations
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
+using Polly.Registry;
+using Smdn.Net.EchonetLite.RouteB;
+using Smdn.Net.EchonetLite.RouteB.Credentials;
+using Smdn.Net.EchonetLite.RouteB.Transport;
+using Smdn.Net.SmartMeter;
+
+namespace Smdn.Net.SmartMeter {
+ public sealed class CumulativeElectricEnergyAggregation : PeriodicCumulativeElectricEnergyAggregation {
+ public CumulativeElectricEnergyAggregation(bool aggregateNormalDirection, bool aggregateReverseDirection) {}
+
+ public override TimeSpan DurationOfMeasurementPeriod { get; }
+ public override DateTime StartOfMeasurementPeriod { get; }
+
+ protected override bool TryGetBaselineValue(bool normalOrReverseDirection, out MeasurementValue<ElectricEnergyValue> @value) {}
+ }
+
+ public sealed class DailyCumulativeElectricEnergyAggregation : PeriodicCumulativeElectricEnergyAggregation {
+ public DailyCumulativeElectricEnergyAggregation(bool aggregateNormalDirection, bool aggregateReverseDirection) {}
+
+ public override TimeSpan DurationOfMeasurementPeriod { get; }
+ public override DateTime StartOfMeasurementPeriod { get; }
+ }
+
+ [TupleElementNames(new string[] { "RPhase", "TPhase" })]
+ public class InstantaneousCurrentAggregation : MeasurementValueAggregation<(ElectricCurrentValue, ElectricCurrentValue)> {
+ public static readonly TimeSpan DefaultAggregationInterval; // = "00:01:00"
+
+ public InstantaneousCurrentAggregation() {}
+ public InstantaneousCurrentAggregation(TimeSpan aggregationInterval) {}
+ }
+
+ public class InstantaneousElectricPowerAggregation : MeasurementValueAggregation<int> {
+ public static readonly TimeSpan DefaultAggregationInterval; // = "00:01:00"
+
+ public InstantaneousElectricPowerAggregation() {}
+ public InstantaneousElectricPowerAggregation(TimeSpan aggregationInterval) {}
+ }
+
+ public abstract class MeasurementValueAggregation<TMeasurementValue> : SmartMeterDataAggregation {
+ public TimeSpan AggregationInterval { get; }
+ public DateTime LatestMeasurementTime { get; }
+ public TMeasurementValue LatestValue { get; }
+
+ internal protected virtual void OnLatestValueUpdated() {}
+ }
+
+ public sealed class MonthlyCumulativeElectricEnergyAggregation : PeriodicCumulativeElectricEnergyAggregation {
+ public MonthlyCumulativeElectricEnergyAggregation(bool aggregateNormalDirection, bool aggregateReverseDirection) {}
+
+ public override TimeSpan DurationOfMeasurementPeriod { get; }
+ public override DateTime StartOfMeasurementPeriod { get; }
+ }
+
+ public abstract class PeriodicCumulativeElectricEnergyAggregation : SmartMeterDataAggregation {
+ protected PeriodicCumulativeElectricEnergyAggregation(bool aggregateNormalDirection, bool aggregateReverseDirection) {}
+
+ public bool AggregateNormalDirection { get; }
+ public bool AggregateReverseDirection { get; }
+ public abstract TimeSpan DurationOfMeasurementPeriod { get; }
+ public decimal NormalDirectionValueInKiloWattHours { get; }
+ public decimal ReverseDirectionValueInKiloWattHours { get; }
+ public abstract DateTime StartOfMeasurementPeriod { get; }
+
+ protected virtual void OnNormalDirectionBaselineValueUpdated() {}
+ internal protected virtual void OnNormalDirectionLatestValueUpdated() {}
+ protected virtual void OnNormalDirectionValueChanged() {}
+ protected virtual void OnReverseDirectionBaselineValueUpdated() {}
+ internal protected virtual void OnReverseDirectionLatestValueUpdated() {}
+ protected virtual void OnReverseDirectionValueChanged() {}
+ protected virtual bool TryGetBaselineValue(bool normalOrReverseDirection, out MeasurementValue<ElectricEnergyValue> @value) {}
+ public virtual bool TryGetCumulativeValue(bool normalOrReverseDirection, out decimal valueInKiloWattHours, out DateTime measuredAt) {}
+ }
+
+ public abstract class SmartMeterDataAggregation : INotifyPropertyChanged {
+ public event PropertyChangedEventHandler? PropertyChanged;
+
+ protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) {}
+ }
+
+ public class SmartMeterDataAggregator : HemsController {
+ public static readonly string ResiliencePipelineKeyForAcquirePropertyValuesForAggregatingData = "SmartMeterDataAggregator.resiliencePipelineAcquirePropertyValuesForAggregatingData";
+ public static readonly string ResiliencePipelineKeyForRunAggregationTask = "SmartMeterDataAggregator.resiliencePipelineRunAggregationTask";
+ public static readonly string ResiliencePipelineKeyForSmartMeterConnection = "SmartMeterDataAggregator.resiliencePipelineConnectToSmartMeter";
+ public static readonly string ResiliencePipelineKeyForSmartMeterPropertyValueReadService = "SmartMeterDataAggregator.ResiliencePipelineReadSmartMeterPropertyValue";
+ public static readonly string ResiliencePipelineKeyForSmartMeterPropertyValueWriteService = "SmartMeterDataAggregator.ResiliencePipelineWriteSmartMeterPropertyValue";
+ public static readonly string ResiliencePipelineKeyForSmartMeterReconnection = "SmartMeterDataAggregator.resiliencePipelineReconnectToSmartMeter";
+ public static readonly string ResiliencePipelineKeyForUpdatePeriodicCumulativeElectricEnergyBaselineValue = "SmartMeterDataAggregator.resiliencePipelineUpdatePeriodicCumulativeElectricEnergyBaselineValue";
+
+ public SmartMeterDataAggregator(IEnumerable<SmartMeterDataAggregation> dataAggregations, IRouteBEchonetLiteHandlerFactory echonetLiteHandlerFactory, IRouteBCredentialProvider routeBCredentialProvider, ResiliencePipelineProvider<string>? resiliencePipelineProvider, ILogger? logger, ILoggerFactory? loggerFactoryForEchonetClient) {}
+ public SmartMeterDataAggregator(IEnumerable<SmartMeterDataAggregation> dataAggregations, IServiceProvider serviceProvider) {}
+
+ public IReadOnlyCollection<SmartMeterDataAggregation> DataAggregations { get; }
+ public bool IsRunning { get; }
+
+ protected override void Dispose(bool disposing) {}
+ protected virtual bool HandleAggregationTaskException(Exception exception) {}
+ public ValueTask StartAsync(CancellationToken cancellationToken = default) {}
+ public async ValueTask StartAsync(TaskFactory? aggregationTaskFactory, CancellationToken cancellationToken = default) {}
+ public async ValueTask StopAsync(CancellationToken cancellationToken) {}
+ }
+
+ public sealed class WeeklyCumulativeElectricEnergyAggregation : PeriodicCumulativeElectricEnergyAggregation {
+ public WeeklyCumulativeElectricEnergyAggregation(bool aggregateNormalDirection, bool aggregateReverseDirection, DayOfWeek firstDayOfWeek)...