protected override async Task ExecuteAsync(CancellationToken stoppingToken) { using (var scope = _serviceProvider.CreateScope()) { dbContext = scope.ServiceProvider.GetService <ApplicationDbContext>(); var test = dbContext.Meters.AsQueryable(); } LogInformation("Background thread started"); var result = await MqttClnt.ConnectAsync(options); LogInformation($"Connection result: {result.ResultCode}"); while (!stoppingToken.IsCancellationRequested) { await Task.Delay(30000, stoppingToken); //Check if we can increase the charge current //Loop through meters foreach (BaseCache cCache in bcLookup.Values) { if (cCache is MeterCache) { MeterCache mc = (MeterCache)cCache; //Get max current we can increase with //Checks all phases LogInformation($"{mc.sName}, checking possible currentChange"); //TODO Check one phase at a time float fSuggestedCurrentChange = mc.GetMaxPhaseAddCurrent(7); //Check all chargers that is connected var connChargers = mc.cChildren.Where(m => m.bConnected); //Set new current //Number of chargers to even out on int iChargers = connChargers.Count(); LogInformation($"{mc.sName}, possible currentChange for {iChargers} chargers: {fSuggestedCurrentChange}A"); fSuggestedCurrentChange = fSuggestedCurrentChange / iChargers; foreach (ChargerCache cc in connChargers) { //TODO Handle the case where one charger uses less current than given. //TODO Distribute to the others. float fNewCurrent = cc.AdjustNewChargeCurrent(fSuggestedCurrentChange); await PostAdjustedCurrent(fNewCurrent, cc); } } } LogInformation($"Background svc loop end"); } stoppingToken.Register(() => LogInformation($" MQTTSvc background task is stopping.")); /* Python rules * client.subscribe("EVCharger/#") * client.subscribe("CurrentMeter/#") * * * if msg.topic == "EVCharger/status/current": * charge_current = float(msg.payload) * print("Charge current %.1f A" % charge_current) * if msg.topic == "CurrentMeter/status/current": * current = float(msg.payload) * mean_current = (9*mean_current + current) / 10 * print("Current %.1f (mean %.1f)" % (current, mean_current)) * if mean_current > max_current: * new_charge_current = charge_current - (mean_current-max_current) * client.publish("EVCharger/set/current", payload=str(int(new_charge_current)), qos=0, retain=False) * if new_charge_current < 2: * client.publish("EVCharger/set/enable", payload=str(0), qos=0, retain=False) * else: * client.publish("EVCharger/set/current", payload=str(int(max_current)), qos=0, retain=False) * client.publish("EVCharger/set/enable", payload=str(1), qos=0, retain=False) */ //MqttClient client=(MqttClient)MqttClnt; //result = await MqttClnt.ConnectAsync(options); /* async Task Handler1(MqttApplicationMessageReceivedEventArgs e) * { * // await client1.PublishAsync($"reply/{eventArgs.ApplicationMessage.Topic}"); * string _logstr=$"{DateTime.Now} {e.ApplicationMessage.Topic} \t {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}"; * //Logger.LogInformation(logstr); * Console.WriteLine(logstr); * } * * client.UseApplicationMessageReceivedHandler(Handler1); * while (!stoppingToken.IsCancellationRequested) * { * await Task.Delay(1000, stoppingToken); * * Console.WriteLine("Background svc looping"); * * } */ Console.WriteLine("Background svc is stopping."); //return Task.CompletedTask; }