Skip to content

Commit

Permalink
- Changed the base image of the add-on from [Docker Hub](https://hub.…
Browse files Browse the repository at this point in the history
…docker.com/r/homeassistant/amd64-base/tags) to [GitHub Container Registry](https://github.com/home-assistant/docker-base/pkgs/container/amd64-base).

- Updated the add-on runtime to .NET 8 LTS.
- Nuget package update
  • Loading branch information
hsakoh committed Aug 9, 2024
1 parent 9edaae0 commit 666ec3b
Show file tree
Hide file tree
Showing 21 changed files with 146 additions and 111 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,6 @@ Enhanced HAN」※2 対応のものは<br>コマンドの引数や使い方が
* Windows上では、AddOnの構成ファイル`/data/options.json`にアクセスできないと思われるので、<br>`appsettings.Development.json`に構成を行ってください。
* 発行時は、ridで`win-x64`等を指定してください。<br> [.NET Runtime Identifier (RID) カタログ | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/core/rid-catalog)
* [.NET での汎用ホスト 既定の builder 設定](https://learn.microsoft.com/ja-jp/dotnet/core/extensions/generic-host#default-builder-settings)の通り、<br>環境変数やコマンドライン引数からも読み込み可能です<br>(階層は`BRoute:Id`等コロンを含めて表現が必要です)
* Wi-SUN USBスティックとのやり取りは、[NuGet Gallery | System.IO.Ports 6.0.0](https://www.nuget.org/packages/System.IO.Ports/6.0.0)を使用しています。
* Wi-SUN USBスティックとのやり取りは、[NuGet Gallery | System.IO.Ports 8.0.0](https://www.nuget.org/packages/System.IO.Ports/8.0.0)を使用しています。
* Linux等向けは動作環境毎の発行が必要となる場合があります。(`linux-arm64``linux-musl-arm64`の違いとか)
* 参考:[System.IO.Ports.SerialPort not working on Linux arm64 · Issue #74332 · dotnet/runtime](https://github.com/dotnet/runtime/issues/74332)
4 changes: 2 additions & 2 deletions _build_on_haos/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
ARG BUILD_FROM
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine as builder
FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine as builder

WORKDIR /src
COPY /src .
Expand All @@ -15,7 +15,7 @@ ENV BUILD_ARCH=$BUILD_ARCH
# Install requirements for add-on
RUN \
apk add --no-cache \
gcompat bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib dotnet6-runtime
bash ca-certificates-bundle libgcc libssl3 libstdc++ zlib dotnet8-runtime

COPY --from=builder /app/$BUILD_ARCH /app
ENTRYPOINT ["/app/BRouteMqttApp"]
2 changes: 1 addition & 1 deletion _build_on_haos/config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: "BRoute-Mqtt"
description: "Wi-SUNドングル/ECHONETLiteプロトコルを通じて、低圧スマート電力量メータをHome AssistantのMQTTにデバイス/センサーとして統合するアドオン"
version: "1.0.1"
version: "1.0.4"
slug: "broute_mqtt"
url: "https://github.com/hsakoh/broutemqtt-mqtt"
startup: application
Expand Down
2 changes: 1 addition & 1 deletion _compile_self/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ ENV BUILD_ARCH=$BUILD_ARCH
# Install requirements for add-on
RUN \
apk add --no-cache \
gcompat bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib dotnet6-runtime
bash ca-certificates-bundle libgcc libssl3 libstdc++ zlib dotnet8-runtime

COPY /$BUILD_ARCH /app
ENTRYPOINT ["/app/BRouteMqttApp"]
2 changes: 1 addition & 1 deletion _compile_self/config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: "BRoute-Mqtt"
description: "Wi-SUNドングル/ECHONETLiteプロトコルを通じて、低圧スマート電力量メータをHome AssistantのMQTTにデバイス/センサーとして統合するアドオン"
version: "1.0.1"
version: "1.0.4"
slug: "broute_mqtt"
url: "https://github.com/hsakoh/broutemqtt-mqtt"
startup: application
Expand Down
13 changes: 7 additions & 6 deletions src/BRouteController/BRouteController.csproj
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RuntimeIdentifiers>linux-musl-arm64;linux-musl-x64</RuntimeIdentifiers>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="EndianBitConverter" Version="1.1.0" />
</ItemGroup>

Expand Down
4 changes: 3 additions & 1 deletion src/BRouteController/BRouteControllerService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,9 @@ private async Task ReadAllPropertyMapAsync(CancellationToken ct)
}
}

#pragma warning disable IDE0060 // 未使用のパラメーターを削除します
private async Task<(EchoNode node, EchoObjectInstance device)> ReadAllPropertiesAsync(CancellationToken cs)
#pragma warning restore IDE0060 // 未使用のパラメーターを削除します
{
//Bルートなので、低圧スマート電力量メータ以外のデバイスは存在しない前提
var node = _echoClient.NodeList.First();
Expand All @@ -272,7 +274,7 @@ private async Task ReadAllPropertyMapAsync(CancellationToken ct)
//まとめてもできるけど、大量に指定するとこけるのでプロパティ毎に
foreach (var prop in device.GETProperties)
{
await ReadPropertyWithRetry(node, device, new EchoPropertyInstance[] { prop });
await ReadPropertyWithRetry(node, device, [prop]);
}
return (node, device);
}
Expand Down
2 changes: 1 addition & 1 deletion src/BRouteMqttApp/BRouteMqttApp.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Worker">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RuntimeIdentifiers>linux-musl-arm64;linux-musl-x64</RuntimeIdentifiers>
Expand Down
4 changes: 2 additions & 2 deletions src/BRouteMqttApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ public static void Main(string[] args)
{
var config = context.Configuration.Get<CommonOptions>();
loggingBuilder
.AddFilter(string.Empty, config.LogLevel)
.AddFilter(string.Empty, config!.LogLevel)
.AddSimpleConsole(options =>
{
options.IncludeScopes = true;
options.SingleLine = true;
options.TimestampFormat = "HH:mm:ss ";
options.TimestampFormat = "yyyy/MM/dd HH:mm:ss ";
});

})
Expand Down
119 changes: 54 additions & 65 deletions src/BRouteMqttApp/Worker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,16 @@

namespace BRouteMqttApp;

public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly BRouteControllerService _bRouteControllerService;
private readonly MqttService _mqttService;

public Worker(
ILogger<Worker> logger
public class Worker(
ILogger<Worker> logger
, BRouteControllerService bRouteControllerService
, MqttService mqttService
)
{
_logger = logger;
_bRouteControllerService = bRouteControllerService;
_mqttService = mqttService;
}

) : BackgroundService
{
public override async Task StartAsync(CancellationToken cancellationToken)
{
await _mqttService.StartAsync();
await _bRouteControllerService.InitalizeAsync(cancellationToken);
await mqttService.StartAsync();
await bRouteControllerService.InitalizeAsync(cancellationToken);

await PublishDeviceConfigsAsync();

Expand All @@ -34,27 +23,27 @@ public override async Task StartAsync(CancellationToken cancellationToken)
await PublishDeviceStaticStatusAsync();
SubscribeCommandTopic();

_bRouteControllerService.ActivePropertiesReadedCallback = PublishDeviceActiveStatusAsync;
_bRouteControllerService.PassivePropertiesReadedCallback = PublishDevicePassiveStatusAsync;
_bRouteControllerService.PassivePropertiesOnTimeCallback = PublishDevicePassiveOnTimeStatusAsync;
bRouteControllerService.ActivePropertiesReadedCallback = PublishDeviceActiveStatusAsync;
bRouteControllerService.PassivePropertiesReadedCallback = PublishDevicePassiveStatusAsync;
bRouteControllerService.PassivePropertiesOnTimeCallback = PublishDevicePassiveOnTimeStatusAsync;

await base.StartAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await _bRouteControllerService.PollAsync(stoppingToken);
await bRouteControllerService.PollAsync(stoppingToken);
}

public override async Task StopAsync(CancellationToken cancellationToken)
{
await _mqttService.StopAsync();
await mqttService.StopAsync();
await base.StopAsync(cancellationToken);
}

#region Configure Senser
private async Task PublishDeviceConfigsAsync()
{
var serial = _bRouteControllerService.Meter.製造番号!;
var serial = bRouteControllerService.Meter.製造番号!;
await PublishSensorConfigAsync(serial, "placement", "設置場所", "static", icon: "mdi:map-marker");
await PublishSensorConfigAsync(serial, "version", "規格Version情報", "static", icon: "mdi:information");
await PublishSensorConfigAsync(serial, "makercode", "メーカコード", "static", icon: "mdi:factory");
Expand Down Expand Up @@ -106,7 +95,7 @@ private async Task PublishSensorConfigAsync(
name = nameof(低圧スマート電力量メータ),
},
};
await _mqttService.PublishAsync($"homeassistant/sensor/{type}_{serial}/config", payload, true);
await mqttService.PublishAsync($"homeassistant/sensor/{type}_{serial}/config", payload, true);
}

private async Task SendButtonConfigAsync(string serial, string type, string name, string device_class)
Expand All @@ -125,96 +114,96 @@ private async Task SendButtonConfigAsync(string serial, string type, string name
name = nameof(低圧スマート電力量メータ),
},
};
await _mqttService.PublishAsync($"homeassistant/button/btn_{type}_{serial}/config", payload, true);
await mqttService.PublishAsync($"homeassistant/button/btn_{type}_{serial}/config", payload, true);
}
#endregion

#region Notifiy Senser Stauts

public async Task PublishDeviceStaticStatusAsync()
{
var serial = _bRouteControllerService.Meter.製造番号!;
var serial = bRouteControllerService.Meter.製造番号!;
await SendSensorStateAsync(serial, "static", new
{
placement = _bRouteControllerService.Meter.設置場所,
version = _bRouteControllerService.Meter.規格Version情報,
makercode = _bRouteControllerService.Meter.メーカコード,
placement = bRouteControllerService.Meter.設置場所,
version = bRouteControllerService.Meter.規格Version情報,
makercode = bRouteControllerService.Meter.メーカコード,
serialnumber = serial,
});
_logger.LogInformation("ステータス(静的)通知 {a},{b},{c},{d}",
_bRouteControllerService.Meter.設置場所,
_bRouteControllerService.Meter.規格Version情報,
_bRouteControllerService.Meter.メーカコード,
logger.LogInformation("ステータス(静的)通知 {a},{b},{c},{d}",
bRouteControllerService.Meter.設置場所,
bRouteControllerService.Meter.規格Version情報,
bRouteControllerService.Meter.メーカコード,
serial
);
}
public async Task PublishDeviceActiveStatusAsync()
{
var serial = _bRouteControllerService.Meter.製造番号!;
var serial = bRouteControllerService.Meter.製造番号!;
await SendSensorStateAsync(serial, "active", new
{
instantaneous_current_r = _bRouteControllerService.Meter.瞬時電流計測値?.r,
instantaneous_current_t = _bRouteControllerService.Meter.瞬時電流計測値?.t,
instantaneous_electric_power = _bRouteControllerService.Meter.瞬時電力計測値,
timestamp = _bRouteControllerService.Meter.現在年月日時刻
instantaneous_current_r = bRouteControllerService.Meter.瞬時電流計測値?.r,
instantaneous_current_t = bRouteControllerService.Meter.瞬時電流計測値?.t,
instantaneous_electric_power = bRouteControllerService.Meter.瞬時電力計測値,
timestamp = bRouteControllerService.Meter.現在年月日時刻
});
_logger.LogInformation("ステータス(瞬時)通知 {r}A,{t}A,{e}W,{time}",
_bRouteControllerService.Meter.瞬時電流計測値?.r,
_bRouteControllerService.Meter.瞬時電流計測値?.t,
_bRouteControllerService.Meter.瞬時電力計測値,
_bRouteControllerService.Meter.現在年月日時刻
logger.LogInformation("ステータス(瞬時)通知 {r}A,{t}A,{e}W,{time}",
bRouteControllerService.Meter.瞬時電流計測値?.r,
bRouteControllerService.Meter.瞬時電流計測値?.t,
bRouteControllerService.Meter.瞬時電力計測値,
bRouteControllerService.Meter.現在年月日時刻
);
}
public async Task PublishDevicePassiveStatusAsync()
{
var serial = _bRouteControllerService.Meter.製造番号!;
var serial = bRouteControllerService.Meter.製造番号!;
await SendSensorStateAsync(serial, "passive", new
{
cumulative_normal = _bRouteControllerService.Meter.積算電力量計測値_正方向計測値,
cumulative_reverse = _bRouteControllerService.Meter.積算電力量計測値_逆方向計測値,
timestamp = _bRouteControllerService.Meter.現在年月日時刻
cumulative_normal = bRouteControllerService.Meter.積算電力量計測値_正方向計測値,
cumulative_reverse = bRouteControllerService.Meter.積算電力量計測値_逆方向計測値,
timestamp = bRouteControllerService.Meter.現在年月日時刻
});
_logger.LogInformation("ステータス(積算)通知 {n}W,{r}W,{time}",
_bRouteControllerService.Meter.積算電力量計測値_正方向計測値,
_bRouteControllerService.Meter.積算電力量計測値_逆方向計測値,
_bRouteControllerService.Meter.現在年月日時刻
logger.LogInformation("ステータス(積算)通知 {n}W,{r}W,{time}",
bRouteControllerService.Meter.積算電力量計測値_正方向計測値,
bRouteControllerService.Meter.積算電力量計測値_逆方向計測値,
bRouteControllerService.Meter.現在年月日時刻
);
}
public async Task PublishDevicePassiveOnTimeStatusAsync()
{
var serial = _bRouteControllerService.Meter.製造番号!;
var serial = bRouteControllerService.Meter.製造番号!;
await SendSensorStateAsync(serial, "passive", new
{
cumulative_normal = _bRouteControllerService.Meter.定時積算電力量計測値_正方向計測値?.kWh,
cumulative_reverse = _bRouteControllerService.Meter.定時積算電力量計測値_逆方向計測値?.kWh,
timestamp = _bRouteControllerService.Meter.定時積算電力量計測値_逆方向計測値?.datetime,
cumulative_normal = bRouteControllerService.Meter.定時積算電力量計測値_正方向計測値?.kWh,
cumulative_reverse = bRouteControllerService.Meter.定時積算電力量計測値_逆方向計測値?.kWh,
timestamp = bRouteControllerService.Meter.定時積算電力量計測値_逆方向計測値?.datetime,
});
_logger.LogInformation("ステータス(積算-定時)通知 {n}W,{r}W,{time}",
_bRouteControllerService.Meter.定時積算電力量計測値_正方向計測値?.kWh,
_bRouteControllerService.Meter.定時積算電力量計測値_逆方向計測値?.kWh,
_bRouteControllerService.Meter.定時積算電力量計測値_逆方向計測値?.datetime
logger.LogInformation("ステータス(積算-定時)通知 {n}W,{r}W,{time}",
bRouteControllerService.Meter.定時積算電力量計測値_正方向計測値?.kWh,
bRouteControllerService.Meter.定時積算電力量計測値_逆方向計測値?.kWh,
bRouteControllerService.Meter.定時積算電力量計測値_逆方向計測値?.datetime
);
}
private async Task SendSensorStateAsync(
string serial, string subTopic, object payload)
{
await _mqttService.PublishAsync($"homeassistant/sensor/{serial}/state/{subTopic}", payload, false);
await mqttService.PublishAsync($"homeassistant/sensor/{serial}/state/{subTopic}", payload, false);
}
#endregion

private void SubscribeCommandTopic()
{
var serial = _bRouteControllerService.Meter.製造番号!;
_mqttService.Subscribe($"homeassistant/button/{serial}/cmd", async (payload) =>
var serial = bRouteControllerService.Meter.製造番号!;
mqttService.Subscribe($"homeassistant/button/{serial}/cmd", async (payload) =>
{
_logger.LogInformation("コマンドを受信:{payload}", payload);
logger.LogInformation("コマンドを受信:{payload}", payload);
if (payload == "active")
{
await _bRouteControllerService.ReadActivePropertiesAsync();
await bRouteControllerService.ReadActivePropertiesAsync();
}
else if (payload == "passive")
{
await _bRouteControllerService.ReadPassivePropertiesAsync();
await bRouteControllerService.ReadPassivePropertiesAsync();
}
});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
Expand Down
4 changes: 2 additions & 2 deletions src/EchonetLite/EchoDotNetLite/EchoDotNetLite.csproj
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
Expand Down
6 changes: 3 additions & 3 deletions src/EchonetLite/SkstackIpDotNet/SkstackIpDotNet.csproj
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifiers>linux-musl-arm64;linux-musl-x64</RuntimeIdentifiers>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.IO.Ports" Version="6.0.0" />
<PackageReference Include="System.IO.Ports" Version="8.0.0" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
namespace Microsoft.Extensions.Configuration;
using HomeAssistantAddOn.Core;

namespace Microsoft.Extensions.Configuration;

public static class ConfigurationExtensions
{
public static IConfigurationBuilder AddHomeAssistantAddOnConfig(this IConfigurationBuilder builder)
{
return builder.AddJsonFile("/data/options.json", optional: true);
return builder.AddJsonFile($"{Utility.GetBaseDataDirectory()}options.json", optional: true);
}
}
Loading

0 comments on commit 666ec3b

Please sign in to comment.