using System.Reactive.Linq; using System.Text.Json; using Flurl.Http; using InnovEnergy.S3.Drivers; using InnovEnergy.Lib.Utils; using static System.StringSplitOptions; namespace InnovEnergy.Meiringen; /* dotnet publish Meiringen.csproj -c Release -r linux-arm -p:PublishSingleFile=true --self-contained false && \ rsync -av bin/Release/net5.0/linux-arm/publish/ debian@10.2.1.87:/home/debian/Monitor && \ ssh debian@10.2.1.87 /home/debian/Monitor/Meiringen /home/debian/trumpf/csvData */ class Program { //private static UdpClient _incomingSocket = new UdpClient(Settings.IncomingEndPoint); private static readonly S3Config S3Config = new S3Config { Bucket = "meiringen", Region = "sos-ch-dk-2", Provider = "exo.io", ContentType = "text/plain; charset=utf-8", //Key = "EXO821fc7a9a3ea6d7365b0c6b8", //Secret = "xiCpn5f9sFeyXL81CG7iTqDGkTekNsrJ-_bJRiyRp9Q" Key = "EXO36c6c169fbe39800742f4f56", Secret = "MA5svEdwwNF9XaLO-8PKj_P325Ovog5aeihPAc88R1w" }; public static void Main(String[] args) { var path = args.FirstOrDefault() ?? "."; Console.WriteLine("Starting"); Observable.Interval(TimeSpan.FromSeconds(2)) .SelectMany(_ => TryUploadData(path)) .Subscribe(Console.WriteLine); Console.ReadLine(); } private static async Task TryUploadData(String path) { try { return await UploadData(path); } catch (Exception e) { return e.ToString(); } } private static async Task UploadData(String path) { // var pv = ReadFile(path, "PV.csv").FirstOrDefault(); // var grid = ReadFile(path, "gridPower.csv").FirstOrDefault(); // var inverter = -ReadFile(path, "inverterPower.csv").FirstOrDefault(); // var acLoad = ReadFile(path, "loadPower.csv").FirstOrDefault(); // var socBattery = ReadFile(path, "battery.csv"); // // var soc = socBattery.ElementAtOrDefault(0); // var battery = -socBattery.ElementAtOrDefault(1); var battery = 0; var soc = 1; var pv = 2; var grid = 3; var inverter = 4; var acLoad = 5; var data = new { battery, soc, pv, grid, inverter, acLoad, }; var json = JsonSerializer.Serialize(data); var unixTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() / 2 * 2; var s3Path = "/" + unixTime; var request = S3Config.CreatePutRequest(s3Path); var response = await request.PutAsync(new StringContent(json)); if (response.StatusCode == 200) return "PUT " + s3Path; var error = await response.GetStringAsync(); return "ERROR: " + error; } private static IReadOnlyList ReadFile(String path, String file) { var fullPath = Path.Combine(path, file); return File .ReadAllText(fullPath) .Trim() .Split(',', TrimEntries | RemoveEmptyEntries) .Select(ParseDouble) .ToList(); Double ParseDouble(String s) => Double.TryParse(s, out var value) ? value : 0; } private static IEnumerable FakeDataSource(Double min, Double max) { var amplitude = (max - min)/2; return EnumerableUtils .InfinitelyMany(0) .Select(_ => Random.Shared.NextDouble() * 2 - 1) .IntegrateNormalize() .Select(x => x * .5) // those constants have been drawn out of thin air to make it look good .IntegrateNormalize() .Select(x => x * .1) .IntegrateNormalize() .Select(x => (x + 1) * amplitude + min); } }