using Application.Domain.Entities; using Infrastructure.Data; using Infrastructure.Extensions; using IoTCenter.Application.Domain; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using System.Linq; using Vibrant.InfluxDB.Client; using Vibrant.InfluxDB.Client.Rows; namespace IoTCenter.Controllers { [Authorize] //[Device] [ApiExplorerSettings(IgnoreApi = true)] public class HomeController : Controller { private readonly IConfiguration _cfg; private readonly IRepository _sceneRepo; private readonly IRepository _nodeRepo; private readonly IRepository _deviceRepo; private readonly IRepository _dataRepo; private readonly IRepository _categoryRepo; private readonly IRepository _nodeCategoryNodeRepo; public HomeController( IConfiguration cfg, IRepository sceneRepo, IRepository nodeRepo, IRepository deviceRepo, IRepository dataRepo, IRepository categoryRepo, IRepository nodeCategoryNodeRepo) { this._cfg = cfg; this._sceneRepo = sceneRepo; this._nodeRepo = nodeRepo; this._deviceRepo = deviceRepo; this._dataRepo = dataRepo; this._categoryRepo = categoryRepo; this._nodeCategoryNodeRepo = nodeCategoryNodeRepo; } public IActionResult Index() { return View(); } public IActionResult Product() { return View(); } public IActionResult Device(string productNumber) { return View(model: productNumber); } public IActionResult Nodes() { return View(); } public IActionResult Node() { return View(); } [Route("/Device")] public IActionResult Device(Guid id) { var model = this._categoryRepo.ReadOnlyTable() .Where(o => o.Id == id) .SelectMany(o => o.Products) .SelectMany(o => o.Devices); return View(model); } public JsonResult GetNodeList() { var categorys = this._deviceRepo.ReadOnlyTable() .GroupBy(o => o.Product.Category.Name) .Select(g => new { g.Key, Count = g.Count() }); var nodes = this._nodeCategoryNodeRepo.ReadOnlyTable() .Include(o => o.Category) .GroupBy(o => o.Category.Name) .Select(g => new { g.Key, Count = g.Count() }); var energy = this._dataRepo.ReadOnlyTable() .Where(o => o.Key == "Electricity") .Select(o => new { o.Device.Node.Name, o.Value }).ToList() .Select(o => new { o.Name, Value = Convert.ToDouble(o.Value) }) .GroupBy(o => o.Name) .Select(g => new { g.Key, Sum = g.Sum(o => o.Value) }); var model = new { NodeChart = new { total = this._nodeRepo.ReadOnlyTable().Count(), data = nodes.Select(o => o.Count), labels = nodes.Select(o => o.Key) }, DeviceChart = new { total = this._deviceRepo.ReadOnlyTable().Count(), online = this._deviceRepo.ReadOnlyTable().Count(o => o.IsOnline), offline = this._deviceRepo.ReadOnlyTable().Count(o => !o.IsOnline), data = categorys.Select(o => o.Count), labels = categorys.Select(o => o.Key) }, EnergyChart = new { total = energy.Sum(o => o.Sum), data = energy.Select(o => o.Sum), labels = energy.Select(o => o.Key) }, Nodes = this._nodeRepo.ReadOnlyTable().Where(o => !o.Disabled).Include(o => o.Scenes).ToList(), Scenes = this._sceneRepo.ReadOnlyTable().Where(o => o.NodeId == null).ToList() }; return Json(model); } public JsonResult GetChartData(string number, string key, string time) { var device = this._deviceRepo.ReadOnlyTable().Include(o => o.Node).Include(o => o.Data).FirstOrDefault(o => o.Number == number); var url = this._cfg["influxdb:url"]; var usr = this._cfg["influxdb:usr"]; var pwd = this._cfg["influxdb:pwd"]; var dbName = "iot"; var measurementName = "data"; var list = new List(); using var client = new InfluxClient(new Uri(url), usr, pwd); try { var query = $"select {key} from {measurementName} where time>now()-{time} and DeviceNumber = '{device.Number}' limit 10000"; var result = client.ReadAsync(dbName, query).Result; var rows = result.Results.FirstOrDefault()? .Series.FirstOrDefault()? .Rows; var labels = rows?.Select(o => o.Timestamp.Value).Select(o => o.ToString("MM-dd HH:mm")).ToList() ?? new List(); var data = rows?.Select(o => o.GetField(key)).ToList() ?? new List(); var model = new { labels, data }; return Json(model); } catch (Exception ex) { ex.PrintStack(); return Json(null); } } } }