From a3b317c67fbfd16f17f481350d96323cc9adb9f7 Mon Sep 17 00:00:00 2001 From: zivillian Date: Sun, 7 May 2023 19:29:14 +0200 Subject: [PATCH 01/15] increase tcp timeout --- src/ism7config/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ism7config/Program.cs b/src/ism7config/Program.cs index 243a63d..9d012d3 100644 --- a/src/ism7config/Program.cs +++ b/src/ism7config/Program.cs @@ -59,7 +59,7 @@ static async Task Main(string[] args) var unitOfWork = new InMemoryDatabase(); var textService = new TextService(); - var nc = new NetworkConnector(unitOfWork, textService, new NetworkConnectorSettings{TcpClientConnectTimeoutMs = 1000}, new BusconfigPendingGatewaysSingleton()); + var nc = new NetworkConnector(unitOfWork, textService, new NetworkConnectorSettings{TcpClientConnectTimeoutMs = 10000}, new BusconfigPendingGatewaysSingleton()); var streamHandler = new XplatStreamHandler(); var gw = new GatewayBO From 3200a9e0491c7050e98b355ed05dcbdd5de7d2a0 Mon Sep 17 00:00:00 2001 From: zivillian Date: Sun, 7 May 2023 19:32:00 +0200 Subject: [PATCH 02/15] enable dotnet action for tgb2 --- .github/workflows/dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 380a0ca..6ceed9f 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -4,7 +4,7 @@ on: push: branches: [ master ] pull_request: - branches: [ master ] + branches: [ master, tgb2 ] jobs: build: From 24f01098e22339a48cc3feab39468702c4d3ec12 Mon Sep 17 00:00:00 2001 From: zivillian Date: Sun, 7 May 2023 20:16:49 +0200 Subject: [PATCH 03/15] let's get insane --- src/ism7config/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ism7config/Program.cs b/src/ism7config/Program.cs index 9d012d3..b2643cd 100644 --- a/src/ism7config/Program.cs +++ b/src/ism7config/Program.cs @@ -59,7 +59,7 @@ static async Task Main(string[] args) var unitOfWork = new InMemoryDatabase(); var textService = new TextService(); - var nc = new NetworkConnector(unitOfWork, textService, new NetworkConnectorSettings{TcpClientConnectTimeoutMs = 10000}, new BusconfigPendingGatewaysSingleton()); + var nc = new NetworkConnector(unitOfWork, textService, new NetworkConnectorSettings{TcpClientConnectTimeoutMs = 60000}, new BusconfigPendingGatewaysSingleton()); var streamHandler = new XplatStreamHandler(); var gw = new GatewayBO From 2265a29177301b8c794a9808af17d07b819bb815 Mon Sep 17 00:00:00 2001 From: zivillian Date: Sun, 7 May 2023 21:37:10 +0200 Subject: [PATCH 04/15] log XplatStreamHandler exceptions --- src/ism7config/XplatStreamHandler.cs | 48 ++++++++++++++++------------ 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/ism7config/XplatStreamHandler.cs b/src/ism7config/XplatStreamHandler.cs index ccf10b7..6c11ca3 100644 --- a/src/ism7config/XplatStreamHandler.cs +++ b/src/ism7config/XplatStreamHandler.cs @@ -16,30 +16,38 @@ public XplatStreamHandler() } public async Task GetStream(TcpClient tcpClient, int port) { - var certificate = (X509Certificate)_loadCertMethodInfo.Invoke(new SslStreamHandler(), null); - var ssl = new SslStream(tcpClient.GetStream(), false, (a, b, c, d) => true); - - var sslOptions = new SslClientAuthenticationOptions - { - TargetHost = "ism7.server", - ClientCertificates = new X509Certificate2Collection(new X509Certificate2(certificate)), - }; - if (!OperatingSystem.IsWindows()) + try { - try + var certificate = (X509Certificate)_loadCertMethodInfo.Invoke(new SslStreamHandler(), null); + var ssl = new SslStream(tcpClient.GetStream(), false, (a, b, c, d) => true); + + var sslOptions = new SslClientAuthenticationOptions { - sslOptions.CipherSuitesPolicy = new CipherSuitesPolicy(new[] - { - TlsCipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256 - }); - } - catch (PlatformNotSupportedException) + TargetHost = "ism7.server", + ClientCertificates = new X509Certificate2Collection(new X509Certificate2(certificate)), + }; + if (!OperatingSystem.IsWindows()) { - //older linux or mac https://github.com/dotnet/runtime/issues/33649 + try + { + sslOptions.CipherSuitesPolicy = new CipherSuitesPolicy(new[] + { + TlsCipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256 + }); + } + catch (PlatformNotSupportedException) + { + //older linux or mac https://github.com/dotnet/runtime/issues/33649 + } } + using var cts = new CancellationTokenSource(5000); + await ssl.AuthenticateAsClientAsync(sslOptions, cts.Token); + return ssl; + } + catch (Exception ex) + { + Console.WriteLine(ex); + throw; } - using var cts = new CancellationTokenSource(5000); - await ssl.AuthenticateAsClientAsync(sslOptions, cts.Token); - return ssl; } } \ No newline at end of file From 0e63ae133af9db7d640b2abf900bd4f1362802b2 Mon Sep 17 00:00:00 2001 From: zivillian Date: Sun, 7 May 2023 21:54:35 +0200 Subject: [PATCH 05/15] increase SSL handshake timeout to 60 seconds --- src/ism7config/XplatStreamHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ism7config/XplatStreamHandler.cs b/src/ism7config/XplatStreamHandler.cs index 6c11ca3..b70022f 100644 --- a/src/ism7config/XplatStreamHandler.cs +++ b/src/ism7config/XplatStreamHandler.cs @@ -40,7 +40,7 @@ public async Task GetStream(TcpClient tcpClient, int port) //older linux or mac https://github.com/dotnet/runtime/issues/33649 } } - using var cts = new CancellationTokenSource(5000); + using var cts = new CancellationTokenSource(60000); await ssl.AuthenticateAsClientAsync(sslOptions, cts.Token); return ssl; } From 62ee8624d65da9250ec1ab6aa00591075fd8cc2d Mon Sep 17 00:00:00 2001 From: zivillian Date: Tue, 9 May 2023 19:06:50 +0200 Subject: [PATCH 06/15] skip complex min & max value conditions --- src/ism7mqtt/HomeAssistant/HaDiscovery.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ism7mqtt/HomeAssistant/HaDiscovery.cs b/src/ism7mqtt/HomeAssistant/HaDiscovery.cs index 5ec8194..b4b68be 100644 --- a/src/ism7mqtt/HomeAssistant/HaDiscovery.cs +++ b/src/ism7mqtt/HomeAssistant/HaDiscovery.cs @@ -167,10 +167,10 @@ private string GetHomeAssistantType(ParameterDescriptor descriptor) case NumericParameterDescriptor numeric: if (numeric.IsWritable) { - if (numeric.MinValueCondition != null) - yield return("min", Double.Parse(numeric.MinValueCondition)); - if (numeric.MaxValueCondition != null) - yield return ("max", Double.Parse(numeric.MaxValueCondition)); + if (numeric.MinValueCondition != null && Double.TryParse(numeric.MinValueCondition, out var min)) + yield return("min", min); + if (numeric.MaxValueCondition != null && Double.TryParse(numeric.MaxValueCondition, out var max)) + yield return ("max", max); if (numeric.StepWidth != null) yield return ("step", numeric.StepWidth); } From 796f68ff33f12bc5b120bd3914bbdd8e5d93490d Mon Sep 17 00:00:00 2001 From: zivillian Date: Wed, 10 May 2023 22:15:52 +0200 Subject: [PATCH 07/15] add extracted WriteBusAddress to parameter.json --- src/ism7config/Config.cs | 2 ++ src/ism7config/Program.cs | 1 + src/ism7mqtt/ISM7/Config/ParameterConfig.cs | 2 ++ src/ism7mqtt/ISM7/Ism7Config.cs | 8 ++++---- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/ism7config/Config.cs b/src/ism7config/Config.cs index 0213fa2..031c0fd 100644 --- a/src/ism7config/Config.cs +++ b/src/ism7config/Config.cs @@ -14,6 +14,8 @@ class Device public string ReadBusAddress { get; set; } + public string WriteBusAddress { get; set; } + public int DeviceTemplateId { get; set; } [JsonIgnore] diff --git a/src/ism7config/Program.cs b/src/ism7config/Program.cs index b2643cd..3315d87 100644 --- a/src/ism7config/Program.cs +++ b/src/ism7config/Program.cs @@ -141,6 +141,7 @@ static async Task Main(string[] args) { Id = device.Id, ReadBusAddress = device.ReadBusAddress, + WriteBusAddress = device.WriteBusAddress, DeviceTemplateId = device.DeviceTemplateId, Parameters = parameterStore.Parameters .Where(x=>x.Value.DeviceId == device.Id) diff --git a/src/ism7mqtt/ISM7/Config/ParameterConfig.cs b/src/ism7mqtt/ISM7/Config/ParameterConfig.cs index ff48d3c..4f3f168 100644 --- a/src/ism7mqtt/ISM7/Config/ParameterConfig.cs +++ b/src/ism7mqtt/ISM7/Config/ParameterConfig.cs @@ -12,6 +12,8 @@ public class ConfigDevice { public string ReadBusAddress { get; set; } + public string WriteBusAddress { get; set; } + public int DeviceTemplateId { get; set; } public List Parameter { get; set; } diff --git a/src/ism7mqtt/ISM7/Ism7Config.cs b/src/ism7mqtt/ISM7/Ism7Config.cs index 8212c83..0462e37 100644 --- a/src/ism7mqtt/ISM7/Ism7Config.cs +++ b/src/ism7mqtt/ISM7/Ism7Config.cs @@ -75,7 +75,7 @@ public bool AddDevice(string ip, string ba) { var device = _deviceTemplates.First(x => x.DTID == configDevice.DeviceTemplateId); var tids = configDevice.Parameter.ToHashSet(); - devices.Add(new RunningDevice(device.Name, ip, ba, _parameterTemplates.Where(x => tids.Contains(x.PTID)), _converterTemplates.Where(x => tids.Contains(x.CTID)))); + devices.Add(new RunningDevice(device.Name, ip, ba, configDevice.WriteBusAddress, _parameterTemplates.Where(x => tids.Contains(x.PTID)), _converterTemplates.Where(x => tids.Contains(x.CTID)))); } return true; } @@ -154,13 +154,13 @@ public class RunningDevice { private readonly List _parameter; - public RunningDevice(string name, string ip, string ba, IEnumerable parameter, IEnumerable converter) + public RunningDevice(string name, string ip, string readBa, string writeBa, IEnumerable parameter, IEnumerable converter) { Name = name; IP = ip; - WriteAddress = $"0x{(Converter.FromHex(ba) - 5):X2}"; - MqttTopic = $"Wolf/{ip}/{name}_{ba}"; + WriteAddress = writeBa; + MqttTopic = $"Wolf/{ip}/{name}_{readBa}"; _parameter = new List(); foreach (var descriptor in parameter) From 4fcb0502aaa46488f14e2959dfad245d5e9ad34f Mon Sep 17 00:00:00 2001 From: zivillian Date: Thu, 11 May 2023 00:05:02 +0200 Subject: [PATCH 08/15] add debug logging for unparseable min/max values --- src/ism7mqtt/HomeAssistant/HaDiscovery.cs | 28 +++++++++++++++++++---- src/ism7mqtt/Program.cs | 6 ++--- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/ism7mqtt/HomeAssistant/HaDiscovery.cs b/src/ism7mqtt/HomeAssistant/HaDiscovery.cs index b4b68be..2733ef4 100644 --- a/src/ism7mqtt/HomeAssistant/HaDiscovery.cs +++ b/src/ism7mqtt/HomeAssistant/HaDiscovery.cs @@ -11,6 +11,8 @@ public class HaDiscovery { private readonly Ism7Config _config; + public bool EnableDebug { get; set; } + public HaDiscovery(Ism7Config config) { _config = config; @@ -167,10 +169,28 @@ private string GetHomeAssistantType(ParameterDescriptor descriptor) case NumericParameterDescriptor numeric: if (numeric.IsWritable) { - if (numeric.MinValueCondition != null && Double.TryParse(numeric.MinValueCondition, out var min)) - yield return("min", min); - if (numeric.MaxValueCondition != null && Double.TryParse(numeric.MaxValueCondition, out var max)) - yield return ("max", max); + if (numeric.MinValueCondition != null) + { + if (Double.TryParse(numeric.MinValueCondition, out var min)) + { + yield return("min", min); + } + else if (EnableDebug) + { + Console.WriteLine($"Cannot parse MinValueCondition '{numeric.MinValueCondition}' for PTID {descriptor.PTID}"); + } + } + if (numeric.MaxValueCondition != null) + { + if (Double.TryParse(numeric.MaxValueCondition, out var max)) + { + yield return ("max", max); + } + else if (EnableDebug) + { + Console.WriteLine($"Cannot parse MaxValueCondition '{numeric.MaxValueCondition}' for PTID {descriptor.PTID}"); + } + } if (numeric.StepWidth != null) yield return ("step", numeric.StepWidth); } diff --git a/src/ism7mqtt/Program.cs b/src/ism7mqtt/Program.cs index e7b8355..b4265de 100644 --- a/src/ism7mqtt/Program.cs +++ b/src/ism7mqtt/Program.cs @@ -126,7 +126,7 @@ static async Task Main(string[] args) if (_discoveryId != null) { - client.OnInitializationFinishedAsync = (config, c) => PublishDiscoveryInfo(config, mqttClient, c); + client.OnInitializationFinishedAsync = (config, c) => PublishDiscoveryInfo(config, mqttClient, enableDebug, c); } await client.RunAsync(password, cts.Token); } @@ -168,9 +168,9 @@ private static int GetEnvInt32(string name, int defaultValue = default) return (int)parsed; } - private static async Task PublishDiscoveryInfo(Ism7Config config, IMqttClient mqttClient, CancellationToken cancellationToken) + private static async Task PublishDiscoveryInfo(Ism7Config config, IMqttClient mqttClient, bool debug, CancellationToken cancellationToken) { - var discovery = new HaDiscovery(config); + var discovery = new HaDiscovery(config) { EnableDebug = debug }; foreach (var message in discovery.GetDiscoveryInfo(_discoveryId)) { var data = JsonSerializer.Serialize(message.Content); From 0feed6b3ddfb208bd958aa2e2b3c152660a82723 Mon Sep 17 00:00:00 2001 From: zivillian Date: Thu, 11 May 2023 18:23:23 +0200 Subject: [PATCH 09/15] fix number parsing on non english unix --- src/ism7mqtt/HomeAssistant/HaDiscovery.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ism7mqtt/HomeAssistant/HaDiscovery.cs b/src/ism7mqtt/HomeAssistant/HaDiscovery.cs index 2733ef4..f17bc90 100644 --- a/src/ism7mqtt/HomeAssistant/HaDiscovery.cs +++ b/src/ism7mqtt/HomeAssistant/HaDiscovery.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Text.Json.Nodes; using System.Text.RegularExpressions; @@ -171,7 +172,7 @@ private string GetHomeAssistantType(ParameterDescriptor descriptor) { if (numeric.MinValueCondition != null) { - if (Double.TryParse(numeric.MinValueCondition, out var min)) + if (Double.TryParse(numeric.MinValueCondition, NumberStyles.Number, CultureInfo.InvariantCulture, out var min)) { yield return("min", min); } @@ -182,7 +183,7 @@ private string GetHomeAssistantType(ParameterDescriptor descriptor) } if (numeric.MaxValueCondition != null) { - if (Double.TryParse(numeric.MaxValueCondition, out var max)) + if (Double.TryParse(numeric.MaxValueCondition, NumberStyles.Number, CultureInfo.InvariantCulture, out var max)) { yield return ("max", max); } From 66550b3dfb5b749046c0050c6380666d3170df5f Mon Sep 17 00:00:00 2001 From: zivillian Date: Fri, 12 May 2023 20:18:10 +0200 Subject: [PATCH 10/15] Revert "add extracted WriteBusAddress to parameter.json" This reverts commit c0733d5a711aa4949e64215da88962ca02a252de. --- src/ism7config/Config.cs | 2 -- src/ism7config/Program.cs | 1 - src/ism7mqtt/ISM7/Config/ParameterConfig.cs | 2 -- src/ism7mqtt/ISM7/Ism7Config.cs | 8 ++++---- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/ism7config/Config.cs b/src/ism7config/Config.cs index 031c0fd..0213fa2 100644 --- a/src/ism7config/Config.cs +++ b/src/ism7config/Config.cs @@ -14,8 +14,6 @@ class Device public string ReadBusAddress { get; set; } - public string WriteBusAddress { get; set; } - public int DeviceTemplateId { get; set; } [JsonIgnore] diff --git a/src/ism7config/Program.cs b/src/ism7config/Program.cs index 3315d87..b2643cd 100644 --- a/src/ism7config/Program.cs +++ b/src/ism7config/Program.cs @@ -141,7 +141,6 @@ static async Task Main(string[] args) { Id = device.Id, ReadBusAddress = device.ReadBusAddress, - WriteBusAddress = device.WriteBusAddress, DeviceTemplateId = device.DeviceTemplateId, Parameters = parameterStore.Parameters .Where(x=>x.Value.DeviceId == device.Id) diff --git a/src/ism7mqtt/ISM7/Config/ParameterConfig.cs b/src/ism7mqtt/ISM7/Config/ParameterConfig.cs index 4f3f168..ff48d3c 100644 --- a/src/ism7mqtt/ISM7/Config/ParameterConfig.cs +++ b/src/ism7mqtt/ISM7/Config/ParameterConfig.cs @@ -12,8 +12,6 @@ public class ConfigDevice { public string ReadBusAddress { get; set; } - public string WriteBusAddress { get; set; } - public int DeviceTemplateId { get; set; } public List Parameter { get; set; } diff --git a/src/ism7mqtt/ISM7/Ism7Config.cs b/src/ism7mqtt/ISM7/Ism7Config.cs index 0462e37..8212c83 100644 --- a/src/ism7mqtt/ISM7/Ism7Config.cs +++ b/src/ism7mqtt/ISM7/Ism7Config.cs @@ -75,7 +75,7 @@ public bool AddDevice(string ip, string ba) { var device = _deviceTemplates.First(x => x.DTID == configDevice.DeviceTemplateId); var tids = configDevice.Parameter.ToHashSet(); - devices.Add(new RunningDevice(device.Name, ip, ba, configDevice.WriteBusAddress, _parameterTemplates.Where(x => tids.Contains(x.PTID)), _converterTemplates.Where(x => tids.Contains(x.CTID)))); + devices.Add(new RunningDevice(device.Name, ip, ba, _parameterTemplates.Where(x => tids.Contains(x.PTID)), _converterTemplates.Where(x => tids.Contains(x.CTID)))); } return true; } @@ -154,13 +154,13 @@ public class RunningDevice { private readonly List _parameter; - public RunningDevice(string name, string ip, string readBa, string writeBa, IEnumerable parameter, IEnumerable converter) + public RunningDevice(string name, string ip, string ba, IEnumerable parameter, IEnumerable converter) { Name = name; IP = ip; - WriteAddress = writeBa; - MqttTopic = $"Wolf/{ip}/{name}_{readBa}"; + WriteAddress = $"0x{(Converter.FromHex(ba) - 5):X2}"; + MqttTopic = $"Wolf/{ip}/{name}_{ba}"; _parameter = new List(); foreach (var descriptor in parameter) From ddee9c98a677a805faef324253bedf1137ac139b Mon Sep 17 00:00:00 2001 From: zivillian Date: Fri, 12 May 2023 21:48:31 +0200 Subject: [PATCH 11/15] hard code se attribute for cgs-2l --- src/ism7mqtt/ISM7/Ism7Config.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ism7mqtt/ISM7/Ism7Config.cs b/src/ism7mqtt/ISM7/Ism7Config.cs index 8212c83..d145497 100644 --- a/src/ism7mqtt/ISM7/Ism7Config.cs +++ b/src/ism7mqtt/ISM7/Ism7Config.cs @@ -227,7 +227,7 @@ public IEnumerable GetWriteRequest(ReadOnlyMemory propertyPar foreach (var result in results) { result.BusAddress = WriteAddress; - result.Seq = ""; + result.Seq = "A;142"; yield return result; } } @@ -240,7 +240,7 @@ public IEnumerable GetWriteRequest(JsonObject data) foreach (var result in results) { result.BusAddress = WriteAddress; - result.Seq = ""; + result.Seq = "A;142"; yield return result; } } From 882aac305c026cda3ecd6da2a0f1f4dea4e8056e Mon Sep 17 00:00:00 2001 From: zivillian Date: Sat, 13 May 2023 00:09:52 +0200 Subject: [PATCH 12/15] fix bn attribute to "1099" for cgs-2l debugging --- src/ism7mqtt/ISM7/Ism7Client.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ism7mqtt/ISM7/Ism7Client.cs b/src/ism7mqtt/ISM7/Ism7Client.cs index 3811adb..298c7be 100644 --- a/src/ism7mqtt/ISM7/Ism7Client.cs +++ b/src/ism7mqtt/ISM7/Ism7Client.cs @@ -131,7 +131,7 @@ private async Task OnCommandAsync(List writeRequests, CancellationTok var request = new TelegramBundleReq { AbortOnError = true, - BundleId = NextBundleId(), + BundleId = "1099", GatewayId = "1", TelegramBundleType = TelegramBundleType.write, InfoWriteTelegrams = writeRequests From 641f25d49c1761764bfa8054406208936c000978 Mon Sep 17 00:00:00 2001 From: zivillian Date: Sat, 13 May 2023 00:31:12 +0200 Subject: [PATCH 13/15] suppress namespaces in xml output --- src/ism7mqtt/ISM7/Protocol/XmlPayload.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ism7mqtt/ISM7/Protocol/XmlPayload.cs b/src/ism7mqtt/ISM7/Protocol/XmlPayload.cs index c7e9974..fbb50f8 100644 --- a/src/ism7mqtt/ISM7/Protocol/XmlPayload.cs +++ b/src/ism7mqtt/ISM7/Protocol/XmlPayload.cs @@ -17,7 +17,12 @@ public byte[] Serialize() var xmlWriter = XmlWriter.Create(sw, new XmlWriterSettings {Indent = false}); var serializer = _serializers.GetOrAdd(GetType(), x => new XmlSerializer(x)); - serializer.Serialize(xmlWriter, this); + + //suppress xmlns:xsi and xmlns:xsd + XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); + ns.Add("",""); + + serializer.Serialize(xmlWriter, this, ns); sw.Flush(); var xml = sw.ToString(); return Encoding.UTF8.GetBytes(xml); From e7cb67b54e423457e1771d3a47fe9536dc701889 Mon Sep 17 00:00:00 2001 From: zivillian Date: Sat, 13 May 2023 20:45:24 +0200 Subject: [PATCH 14/15] use utf-8 encoding --- src/ism7mqtt/ISM7/Protocol/XmlPayload.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ism7mqtt/ISM7/Protocol/XmlPayload.cs b/src/ism7mqtt/ISM7/Protocol/XmlPayload.cs index fbb50f8..7ba5f3c 100644 --- a/src/ism7mqtt/ISM7/Protocol/XmlPayload.cs +++ b/src/ism7mqtt/ISM7/Protocol/XmlPayload.cs @@ -13,7 +13,7 @@ public abstract class XmlPayload : IPayload public byte[] Serialize() { - using var sw = new StringWriter(); + using var sw = new Utf8StringWriter(); var xmlWriter = XmlWriter.Create(sw, new XmlWriterSettings {Indent = false}); var serializer = _serializers.GetOrAdd(GetType(), x => new XmlSerializer(x)); @@ -29,5 +29,10 @@ public byte[] Serialize() } public abstract PayloadType Type { get; } + + class Utf8StringWriter : StringWriter + { + public override Encoding Encoding => Encoding.UTF8; + } } } \ No newline at end of file From 9c752b3347d30c1bf64b98dca8d9d54000491b4a Mon Sep 17 00:00:00 2001 From: zivillian Date: Sun, 14 May 2023 20:43:31 +0200 Subject: [PATCH 15/15] send push for erd during initialization --- src/ism7mqtt/ISM7/Ism7Client.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/ism7mqtt/ISM7/Ism7Client.cs b/src/ism7mqtt/ISM7/Ism7Client.cs index 298c7be..412ac70 100644 --- a/src/ism7mqtt/ISM7/Ism7Client.cs +++ b/src/ism7mqtt/ISM7/Ism7Client.cs @@ -276,9 +276,11 @@ private async Task OnPushResponseAsync(IResponse response, CancellationToken can private async Task LoadInitialValuesAsync(CancellationToken cancellationToken) { + var visibleDevices = new List(); foreach (var device in _devices.Values) { if (!_config.AddDevice(_ipAddress.ToString(), device.Ba)) continue; + visibleDevices.Add(device.Ba); var infoReads = _config.GetInfoReadForDevice(device.Ba).ToList(); var bundleId = NextBundleId(); _dispatcher.SubscribeOnce( @@ -306,6 +308,19 @@ await SendAsync(new TelegramBundleReq { await OnInitializationFinishedAsync(_config, cancellationToken); } + var bn = NextBundleId(); + await SendAsync(new TelegramBundleReq + { + AbortOnError = false, + BundleId = bn, + GatewayId = "1", + TelegramBundleType = TelegramBundleType.push, + EStRead = new TelegramBundleReq.ErrorStateRead + { + Seq = bn, + VisibleDeviceAdresses = String.Join(',', visibleDevices) + } + }, cancellationToken); } private async Task OnInitialValuesAsync(IResponse response, CancellationToken cancellationToken)