/*using System.Reactive.Linq; using InnovEnergy.Lib.Devices.IEM3kGridMeter; using InnovEnergy.Lib.Protocols.DBus; using InnovEnergy.Lib.Protocols.Modbus.Clients; using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Utils.Reflection; using InnovEnergy.Lib.Victron.VeDBus; namespace InnovEnergy.App.SchneiderDriver; public static class SchneiderMeterDriver { public static Task Run(String hostName, Bus dbusAddress) { return Run(hostName, ModbusTcpClient.DefaultPort, dbusAddress); } public static async Task Run(String hostName, UInt16 port, Bus dbusAddress) { // var ep = new UnixDomainSocketEndPoint("/home/eef/graber_dbus.sock"); // var auth = AuthenticationMethod.ExternalAsRoot(); // dbusAddress = new Bus(ep, auth); var schneider = new Iem3KGridMeterDevice(hostName, port, Config.ModbusNodeId); var schneiderStatus = Observable .Interval(Config.UpdatePeriod) .Select(_ => schneider.Read()) .Publish(); var x = schneider.Read(); x?.ActivePowerL1.WriteLine(); x?.ActivePowerL2.WriteLine(); x?.ActivePowerL3.WriteLine(); var poller = schneiderStatus.Connect(); var properties = Config.DefaultProperties; foreach (var p in properties) { p.WriteLine(" Signal"); } // Step 1: Access Config.Signals var signalsCollection = Config.Signals; foreach (var s in signalsCollection) { s.WriteLine(" Signal"); } var signals = Config .Signals .Select(signal => schneiderStatus.Select(signal.ToVeProperty)) .Merge() .Do(p => properties.Set(p)); // TODO: remove when possible // Apparently some VE services need to be periodically reminded that // this service is /Connected schneiderStatus.Subscribe(_ => properties.Set("/Connected", 1)); // Wait until status is read once to make sure all // properties are set when we go onto the bus. var dbus = schneiderStatus .Skip(1) .Take(1) .SelectMany(_ => PublishPropertiesOnDBus(properties, dbusAddress)); return await signals .MergeErrors(dbus) .Finally(poller.Dispose) .SelectErrors(); } private static Task PublishPropertiesOnDBus(VeProperties properties, Bus bus) { Console.WriteLine($"Connecting to DBus {bus}"); return properties.PublishOnDBus(bus, Config.BusName); } }*/ using System; using System.Reactive.Linq; using InnovEnergy.Lib.Devices.IEM3kGridMeter; using InnovEnergy.Lib.Protocols.DBus; using InnovEnergy.Lib.Protocols.Modbus.Clients; using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Victron.VeDBus; namespace InnovEnergy.App.SchneiderDriver { public static class SchneiderMeterDriver { public static Task Run(string hostName, Bus dbusAddress) { return Run(hostName, ModbusTcpClient.DefaultPort, dbusAddress); } public static async Task Run(string hostName, ushort port, Bus dbusAddress) { var schneider = new Iem3KGridMeterDevice(hostName, port, Config.ModbusNodeId); var schneiderStatus = Observable .Interval(Config.UpdatePeriod) .Select(_ => { var status = schneider.Read(); if (status == null) { Console.WriteLine("Failed to read data from Iem3KGridMeterDevice"); } return status; }) .Where(status => status != null) // Ignore null readings .Publish(); var poller = schneiderStatus.Connect(); var properties = Config.DefaultProperties; var signals = Config .Signals .Select(signal => schneiderStatus.Select(signal.ToVeProperty)) .Merge() .Do(p => properties.Set(p)); schneiderStatus.Subscribe(_ => properties.Set("/Connected", 1)); var dbus = schneiderStatus .Skip(1) .Take(1) .SelectMany(_ => PublishPropertiesOnDBus(properties, dbusAddress)); return await signals .MergeErrors(dbus) .Finally(poller.Dispose) .SelectErrors(); } private static Task PublishPropertiesOnDBus(VeProperties properties, Bus bus) { Console.WriteLine($"Connecting to DBus {bus}"); return properties.PublishOnDBus(bus, Config.BusName); } } }