diff --git a/projects/IoT.Shared/Application/Domain/Entities/Device.cs b/projects/IoT.Shared/Application/Domain/Entities/Device.cs index 528dd0ca..6bf8ddae 100644 --- a/projects/IoT.Shared/Application/Domain/Entities/Device.cs +++ b/projects/IoT.Shared/Application/Domain/Entities/Device.cs @@ -80,9 +80,20 @@ namespace Application.Domain.Entities return this.GetData(key)?.Value; } - public Data CreateData(string key, object value, DeviceDataType type, string name, string unit = null, string description = null, bool hidden = false) + public Data CreateData(string key, object value, DeviceDataType type, string name, string unit = null, string description = null, bool hidden = false, long timestamp = 0) { - return new Data { DeviceId = this.Id, Key = key, Value = Convert.ToString(value), Type = type, Name = name, Unit = unit, Description = description, Hidden = hidden }; + return new Data + { + DeviceId = this.Id, + Key = key, + Value = Convert.ToString(value), + Type = type, + Name = name, + Unit = unit, + Description = description, + Hidden = hidden, + Timestamp = timestamp == 0 ? DateTimeOffset.Now.ToUnixTimeMilliseconds() : timestamp + }; } public Data AddorUpdateData(Data data) @@ -94,10 +105,14 @@ namespace Application.Domain.Entities } else { - oldData.Name = data.Name; - oldData.Value = data.Value; - oldData.Unit = data.Unit; - oldData.Description = data.Description; + if (oldData.Name != data.Name || oldData.Value != data.Value || oldData.Unit != data.Unit || oldData.Description != data.Description) + { + oldData.Name = data.Name; + oldData.Value = data.Value; + oldData.Unit = data.Unit; + oldData.Description = data.Description; + oldData.Timestamp = data.Timestamp; + } } return oldData; } diff --git a/projects/IoTCenter/Controllers/AppController.cs b/projects/IoTCenter/Controllers/AppController.cs index e29f92c2..ab29143b 100644 --- a/projects/IoTCenter/Controllers/AppController.cs +++ b/projects/IoTCenter/Controllers/AppController.cs @@ -269,6 +269,7 @@ namespace IoTCenter.Controllers var measurementName = "data"; var list = new List(); var labels = new List(); + var hours = Convert.ToInt32(DateTime.Now.ToString("%z")); using (var client = new InfluxClient(new Uri(url), usr, pwd)) { var fileds = String.Join(',', device.Data.Where(o => o.Type == DeviceDataType.Int || o.Type == DeviceDataType.Float).Select(o => o.Key)); @@ -284,14 +285,14 @@ namespace IoTCenter.Controllers list.Add(new { label = data.Name, - data = rows != null ? rows.Where(o => o.Fields.ContainsKey(data.Key)).Select(o => o.GetField(data.Key)).ToList() : new List(), + data = rows != null ? rows.Select(o => o.Fields.ContainsKey(data.Key) ? o.GetField(data.Key) : null).ToList() : new List(), backgroundColor = this.GetColor(data.Key), fill = false }); } if (rows != null) { - labels = rows.Select(o => o.Timestamp.Value).Select(o => o.ToString("MM-dd hh:mm")).Distinct().ToList(); + labels = rows.Select(o => o.Timestamp.Value).Select(o => o.AddHours(hours).ToString("MM-dd HH:mm:ss")).ToList(); } } var model = new diff --git a/projects/IoTCenter/Services/IoTCenterEventHandler.cs b/projects/IoTCenter/Services/IoTCenterEventHandler.cs index 0af813fa..6fe3a83e 100644 --- a/projects/IoTCenter/Services/IoTCenterEventHandler.cs +++ b/projects/IoTCenter/Services/IoTCenterEventHandler.cs @@ -315,7 +315,7 @@ namespace IoTCenter.Services await client.CreateDatabaseAsync(dbName); var row = new DynamicInfluxRow { - Timestamp = DateTime.UtcNow + Timestamp = DateTimeOffset.FromUnixTimeMilliseconds(data.Timestamp).DateTime }; row.Fields.Add("DeviceNumber", device.Number); row.Fields.Add("DeviceName", device.Name); diff --git a/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/node.js b/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/node.js index e4ddc717..f9fd2633 100644 --- a/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/node.js +++ b/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/node.js @@ -17,12 +17,14 @@ function UpdateChart(deviceNumber) { var number = canvas.id; if (!deviceNumber || deviceNumber === number) { var device = vm.GetDevice(number); - var time = time || '30d'; + var time = time || '1d'; var url = iotCenter + '/App/GetChartData?time=' + time + '+&number=' + number + "&token=" + token + "&connectionId=" + connectionId; axios.post(url, { crossDomain: true }) .then(function (response) { var data = response.data; UpdateChartInternal(canvas, device.DisplayName, data); + console.log('折线图更新成功'); + toastr.success('折线图更新成功'); }) .catch(function (error) { console.log(error); @@ -298,6 +300,9 @@ function onMessage(method, json, to, from) { if (device) { updateItem(device.Data, item); toastr.info(device.DisplayName + '更新'); + if ($('canvas#' + device.Number).length) { + UpdateChart(device.Number); + } } } } diff --git a/projects/IoTNode/DeviceServices/FBee/FBeeService.cs b/projects/IoTNode/DeviceServices/FBee/FBeeService.cs index 76552f63..c5075442 100644 --- a/projects/IoTNode/DeviceServices/FBee/FBeeService.cs +++ b/projects/IoTNode/DeviceServices/FBee/FBeeService.cs @@ -406,6 +406,7 @@ namespace IoTNode.DeviceServices.FBee { try { + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); using (var ms = new MemoryStream(data)) { var responseType = ms.ReadByte(); @@ -497,64 +498,74 @@ namespace IoTNode.DeviceServices.FBee } device.IsOnline = isOnline != 0x00; - var dataList = new List(); - device.AddorUpdateData(device.CreateData(Keys.DeviceId, deviceId, DeviceDataType.Int, Keys.DeviceId, hidden: true)); - device.AddorUpdateData(device.CreateData(Keys.Address, address, DeviceDataType.String, Keys.Address, hidden: true)); - device.AddorUpdateData(device.CreateData(Keys.EndPoint, endpoint, DeviceDataType.Int, Keys.EndPoint, hidden: true)); + var dataList = new List(); + device.AddorUpdateData(device.CreateData(Keys.DeviceId, deviceId, DeviceDataType.Int, Keys.DeviceId, hidden: true, timestamp: timestamp)); + device.AddorUpdateData(device.CreateData(Keys.Address, address, DeviceDataType.String, Keys.Address, hidden: true, timestamp: timestamp)); + device.AddorUpdateData(device.CreateData(Keys.EndPoint, endpoint, DeviceDataType.Int, Keys.EndPoint, hidden: true, timestamp: timestamp)); if (new int[] { 0x0002, 0x0009, 0x0081, 0x0202, 0x0220, 0x0051 }.Contains(deviceId)) { if (deviceId == 0x202) { } - var state = device.CreateData(Keys.State, switchState == 0 ? "关" : (switchState == 1 ? "开" : "停"), DeviceDataType.String, "状态"); - device.AddorUpdateData(state); - dataList.Add(state.To()); + var state = device.CreateData(Keys.State, switchState == 0 ? "关" : (switchState == 1 ? "开" : "停"), DeviceDataType.String, "状态", timestamp: timestamp); + if (!device.Data.Any(o => o.Key == Keys.State)) + { + device.AddorUpdateData(state); + dataList.Add(state); + } } var battery = ms.ReadByte(); - device.AddorUpdateData(device.CreateData(Keys.Battery, battery, DeviceDataType.Int, Keys.Battery, hidden: true)); + device.AddorUpdateData(device.CreateData(Keys.Battery, battery, DeviceDataType.Int, Keys.Battery, hidden: true, timestamp: timestamp)); var epCount = ms.ReadByte(); - device.AddorUpdateData(device.CreateData(Keys.EndPointCount, battery, DeviceDataType.Int, Keys.EndPointCount, hidden: true)); + device.AddorUpdateData(device.CreateData(Keys.EndPointCount, battery, DeviceDataType.Int, Keys.EndPointCount, hidden: true, timestamp: timestamp)); if (device.Name == "光强检测器") { ms.Read(2); var light = BitConverter.ToInt16(ms.Read(2)); var desc = this.GetDescription(Keys.Light, light); - var deviceData = device.CreateData(Keys.Light, light, DeviceDataType.Int, "光照度", "lux", desc); - device.AddorUpdateData(deviceData); - var dataDto = deviceData.To(); - dataList.Add(dataDto); + var deviceData = device.CreateData(Keys.Light, light, DeviceDataType.Int, "光照度", "lux", desc, timestamp: timestamp); + if (!device.Data.Any(o => o.Key == Keys.Light)) + { + device.AddorUpdateData(deviceData); + dataList.Add(deviceData); + } } else if (device.Name == "温湿度传感器") { var temperature = BitConverter.ToInt16(ms.Read(2)) / 100f; - var data1 = device.CreateData(Keys.Temperature, temperature, DeviceDataType.Float, "温度", "℃", this.GetDescription(Keys.Temperature, temperature)); - device.AddorUpdateData(data1); - var dto1 = data1.To(); - dataList.Add(dto1); + var data1 = device.CreateData(Keys.Temperature, temperature, DeviceDataType.Float, "温度", "℃", this.GetDescription(Keys.Temperature, temperature), timestamp: timestamp); + if (!device.Data.Any(o => o.Key == Keys.Temperature)) + { + device.AddorUpdateData(data1); + dataList.Add(data1); + } var humidity = BitConverter.ToInt16(ms.Read(2)) / 100f; - var data2 = device.CreateData(Keys.Humidity, humidity, DeviceDataType.Float, "湿度", "RH%", this.GetDescription(Keys.Humidity, humidity)); - device.AddorUpdateData(data2); - var dto2 = data2.To(); - dataList.Add(dto2); + var data2 = device.CreateData(Keys.Humidity, humidity, DeviceDataType.Float, "湿度", "RH%", this.GetDescription(Keys.Humidity, humidity), timestamp: timestamp); + if (!device.Data.Any(o => o.Key == Keys.Humidity)) + { + device.AddorUpdateData(data2); + dataList.Add(data2); + } } else if (device.Name == "烟雾报警器" || device.Name == "人体感应器") { var state = BitConverter.ToInt16(ms.Read(2)); - var data1 = device.CreateData(Keys.Warning, state == 1 ? "警报" : "正常", DeviceDataType.String, "状态"); - device.AddorUpdateData(data1); - var dto1 = data1.To(); - device.AddorUpdateData(data1); - dataList.Add(dto1); + var data1 = device.CreateData(Keys.Warning, state == 1 ? "警报" : "正常", DeviceDataType.String, "状态", timestamp: timestamp); + if (!device.Data.Any(o => o.Key == Keys.Warning)) + { + device.AddorUpdateData(data1); + dataList.Add(data1); + } } //var historyData = ms.ReadHexString((int)(ms.Length - ms.Position)); //device.AddorUpdateData(device.CreateData(Keys.Data, historyData, DeviceDataType.String, Keys.Data, hidden: true)); - device.AddorUpdateData(device.CreateData(Keys.ZoneType, zoneType, DeviceDataType.String, Keys.ZoneType, hidden: true)); + device.AddorUpdateData(device.CreateData(Keys.ZoneType, zoneType, DeviceDataType.String, Keys.ZoneType, hidden: true, timestamp: timestamp)); deviceRepo.SaveChanges(); var deviceDto = device.To(); this.SendToServer(Methods.EditDevice, deviceDto); - foreach (var item in device.Data.Where(o => !o.Hidden)) + foreach (var item in dataList) { this.SendDataToServer(item); } @@ -683,6 +694,7 @@ namespace IoTNode.DeviceServices.FBee /// private void X07(string sn, byte[] data) { + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); using (var ms = new MemoryStream(data)) { var responseType = ms.ReadByte(); @@ -701,20 +713,20 @@ namespace IoTNode.DeviceServices.FBee { if (endpoint == 0x10) { - device.AddorUpdateData(device.CreateData(Keys.L1State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L1状态")); + device.AddorUpdateData(device.CreateData(Keys.L1State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L1状态", timestamp: timestamp)); } else if (endpoint == 0x11) { - device.AddorUpdateData(device.CreateData(Keys.L2State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L2状态")); + device.AddorUpdateData(device.CreateData(Keys.L2State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L2状态", timestamp: timestamp)); } else if (endpoint == 0x12) { - device.AddorUpdateData(device.CreateData(Keys.L3State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L3状态")); + device.AddorUpdateData(device.CreateData(Keys.L3State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L3状态", timestamp: timestamp)); } } else { - device.AddorUpdateData(device.CreateData(Keys.State, switchState == 0 ? "关" : (switchState == 1 ? "开" : "停"), DeviceDataType.String, "状态")); + device.AddorUpdateData(device.CreateData(Keys.State, switchState == 0 ? "关" : (switchState == 1 ? "开" : "停"), DeviceDataType.String, "状态", timestamp: timestamp)); } deviceRepo.SaveChanges(); foreach (var item in device.Data.Where(o => !o.Hidden)) @@ -753,6 +765,7 @@ namespace IoTNode.DeviceServices.FBee /// private void X08(string sn, byte[] data) { + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); using (var ms = new MemoryStream(data)) { var responseType = ms.ReadByte(); @@ -765,7 +778,7 @@ namespace IoTNode.DeviceServices.FBee var device = this.GetDeviceByAddress(deviceRepo, sn, address); if (device != null) { - device.AddorUpdateData(device.CreateData(Keys.Brightness, ms.ReadByte(), DeviceDataType.Int, "亮度")); + device.AddorUpdateData(device.CreateData(Keys.Brightness, ms.ReadByte(), DeviceDataType.Int, "亮度", timestamp: timestamp)); deviceRepo.SaveChanges(); this.SendDataToServer(device.Data.FirstOrDefault(o => o.Key == Keys.Brightness)); } @@ -798,6 +811,7 @@ namespace IoTNode.DeviceServices.FBee /// private void X09(string sn, byte[] data) { + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); using (var ms = new MemoryStream(data)) { var responseType = ms.ReadByte(); @@ -810,7 +824,7 @@ namespace IoTNode.DeviceServices.FBee var device = this.GetDeviceByAddress(deviceRepo, sn, address); if (device != null) { - device.AddorUpdateData(device.CreateData(Keys.Hue, ms.ReadByte(), DeviceDataType.Int, "色调")); + device.AddorUpdateData(device.CreateData(Keys.Hue, ms.ReadByte(), DeviceDataType.Int, "色调", timestamp: timestamp)); deviceRepo.SaveChanges(); this.SendDataToServer(device.Data.FirstOrDefault(o => o.Key == Keys.Hue)); } @@ -829,6 +843,7 @@ namespace IoTNode.DeviceServices.FBee /// private void X0A(string sn, byte[] data) { + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); using (var ms = new MemoryStream(data)) { var responseType = ms.ReadByte(); @@ -841,7 +856,7 @@ namespace IoTNode.DeviceServices.FBee var device = this.GetDeviceByAddress(deviceRepo, sn, address); if (device != null) { - device.AddorUpdateData(device.CreateData(Keys.Saturation, ms.ReadByte(), DeviceDataType.Int, "饱和度")); + device.AddorUpdateData(device.CreateData(Keys.Saturation, ms.ReadByte(), DeviceDataType.Int, "饱和度", timestamp: timestamp)); deviceRepo.SaveChanges(); this.SendDataToServer(device.Data.FirstOrDefault(o => o.Key == Keys.Saturation)); } @@ -928,6 +943,7 @@ namespace IoTNode.DeviceServices.FBee /// private void X15(string sn, byte[] data) { + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); using (var ms = new MemoryStream(data)) { var responseType = ms.ReadByte(); @@ -949,8 +965,8 @@ namespace IoTNode.DeviceServices.FBee gateway.UserName = ms.ReadASIIString(20); gateway.Password = ms.ReadASIIString(20); - gateway.AddorUpdateData(gateway.CreateData(Keys.Version, version, DeviceDataType.String, "版本")); - gateway.AddorUpdateData(gateway.CreateData(Keys.DeviceCount, ms.ReadByte(), DeviceDataType.Int, "设备数量")); + gateway.AddorUpdateData(gateway.CreateData(Keys.Version, version, DeviceDataType.String, "版本", timestamp: timestamp)); + gateway.AddorUpdateData(gateway.CreateData(Keys.DeviceCount, ms.ReadByte(), DeviceDataType.Int, "设备数量", timestamp: timestamp)); gatewayRepo.SaveChanges(); this.SendDataToServer(gateway.Data.FirstOrDefault(o => o.Key == Keys.Version)); this.SendDataToServer(gateway.Data.FirstOrDefault(o => o.Key == Keys.DeviceCount)); @@ -991,6 +1007,7 @@ namespace IoTNode.DeviceServices.FBee /// private void X27(string sn, byte[] data) { + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); using (var ms = new MemoryStream(data)) { var responseType = ms.ReadByte(); @@ -1003,7 +1020,7 @@ namespace IoTNode.DeviceServices.FBee var device = this.GetDeviceByAddress(deviceRepo, sn, address); if (device != null) { - device.AddorUpdateData(device.CreateData(Keys.ColorTemperature, ms.ReadInt(), DeviceDataType.Int, "色温")); + device.AddorUpdateData(device.CreateData(Keys.ColorTemperature, ms.ReadInt(), DeviceDataType.Int, "色温", timestamp: timestamp)); deviceRepo.SaveChanges(); this.SendDataToServer(device.Data.FirstOrDefault(o => o.Key == Keys.ColorTemperature)); } @@ -1146,6 +1163,7 @@ namespace IoTNode.DeviceServices.FBee /// private void X70(string sn, byte[] data) { + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); using (var ms = new MemoryStream(data)) { var responseType = ms.ReadByte(); @@ -1222,7 +1240,7 @@ namespace IoTNode.DeviceServices.FBee { var light = BitConverter.ToInt16(props[0x0000]); var desc = this.GetDescription(Keys.Light, light); - var deviceData = device.CreateData(Keys.Light, light, DeviceDataType.Int, "光照度", "lux", desc); + var deviceData = device.CreateData(Keys.Light, light, DeviceDataType.Int, "光照度", "lux", desc, timestamp: timestamp); device.AddorUpdateData(deviceData); var dataDto = deviceData.To(); dataList.Add(dataDto); @@ -1230,7 +1248,7 @@ namespace IoTNode.DeviceServices.FBee else if (clusterId == ClusterId.alarm) { var state = BitConverter.ToInt16(props[0x0080]); - var data1 = device.CreateData(Keys.Warning, state == 1 ? "警报" : "正常", DeviceDataType.String, "状态"); + var data1 = device.CreateData(Keys.Warning, state == 1 ? "警报" : "正常", DeviceDataType.String, "状态", timestamp: timestamp); var dto1 = data1.To(); device.AddorUpdateData(data1); dataList.Add(dto1); @@ -1247,8 +1265,8 @@ namespace IoTNode.DeviceServices.FBee var pm1d0 = BitConverter.ToInt16(props[0x0002]); var pm10 = BitConverter.ToInt16(props[0x0001]); - var data1 = device.CreateData(Keys.PM25, pm2d5, DeviceDataType.Int, "PM2.5", "μg/m³", this.GetDescription(Keys.PM25, pm2d5)); - var data2 = device.CreateData(Keys.PM100, pm1d0, DeviceDataType.Int, "PM10", "μg/m³", this.GetDescription(Keys.PM100, pm1d0)); + var data1 = device.CreateData(Keys.PM25, pm2d5, DeviceDataType.Int, "PM2.5", "μg/m³", this.GetDescription(Keys.PM25, pm2d5), timestamp: timestamp); + var data2 = device.CreateData(Keys.PM100, pm1d0, DeviceDataType.Int, "PM10", "μg/m³", this.GetDescription(Keys.PM100, pm1d0), timestamp: timestamp); var data3 = device.CreateData(Keys.PM10, pm10, DeviceDataType.Int, "PM1.0", "μg/m³"); device.AddorUpdateData(data1); device.AddorUpdateData(data2); @@ -1264,7 +1282,7 @@ namespace IoTNode.DeviceServices.FBee { var temperature = BitConverter.ToInt16(props[0x0000]) / 100f; var desc = this.GetDescription(Keys.Temperature, temperature); - var data1 = device.CreateData(Keys.Temperature, temperature, DeviceDataType.Float, "温度", "℃", desc); + var data1 = device.CreateData(Keys.Temperature, temperature, DeviceDataType.Float, "温度", "℃", desc, timestamp: timestamp); device.AddorUpdateData(data1); var dto1 = data1.To(); dataList.Add(dto1); @@ -1273,14 +1291,14 @@ namespace IoTNode.DeviceServices.FBee { var humidity = BitConverter.ToInt16(props[0x0000]) / 100f; var desc = this.GetDescription(Keys.Humidity, humidity); - var data1 = device.CreateData(Keys.Humidity, humidity, DeviceDataType.Float, "湿度", "RH%", desc); + var data1 = device.CreateData(Keys.Humidity, humidity, DeviceDataType.Float, "湿度", "RH%", desc, timestamp: timestamp); device.AddorUpdateData(data1); var dto1 = data1.To(); dataList.Add(dto1); } else if (clusterId == ClusterId.voltage) { - var data1 = device.CreateData(Keys.Voltage, props[0x21][0] / 2f, DeviceDataType.Float, "电量", hidden: true); + var data1 = device.CreateData(Keys.Voltage, props[0x21][0] / 2f, DeviceDataType.Float, "电量", hidden: true, timestamp: timestamp); device.AddorUpdateData(data1); var dto1 = data1.To(); dataList.Add(dto1); @@ -1295,7 +1313,7 @@ namespace IoTNode.DeviceServices.FBee tempBytes.Add(0x00); var electricity = BitConverter.ToInt64(tempBytes.ToArray()) / 1000f; - var data1 = device.CreateData(Keys.Electricity, electricity, DeviceDataType.Float, "电量", "kWh"); + var data1 = device.CreateData(Keys.Electricity, electricity, DeviceDataType.Float, "电量", "kWh", timestamp: timestamp); device.AddorUpdateData(data1); var dto1 = data1.To(); dataList.Add(dto1); @@ -1311,7 +1329,7 @@ namespace IoTNode.DeviceServices.FBee var irVersion = BitConverter.ToString((props[0x400a].Skip(3).Take(6).ToArray())).Replace("-", "").ToLower(); if (!string.IsNullOrEmpty(irVersion)) { - var data1 = device.CreateData(Keys.Version, irVersion, DeviceDataType.String, "红外版本"); + var data1 = device.CreateData(Keys.Version, irVersion, DeviceDataType.String, "红外版本", timestamp: timestamp); device.AddorUpdateData(data1); var dto1 = data1.To(); dataList.Add(dto1); @@ -1326,7 +1344,7 @@ namespace IoTNode.DeviceServices.FBee if (irDeviceType == 0x01) { var keyCode = BitConverter.ToInt16(irdata.Skip(12).Take(2).ToArray()); - var data1 = device.CreateData(Keys.KeyPress, keyCode, DeviceDataType.Int, "按键"); + var data1 = device.CreateData(Keys.KeyPress, keyCode, DeviceDataType.Int, "按键", timestamp: timestamp); device.AddorUpdateData(data1); var dto1 = data1.To(); dataList.Add(dto1); diff --git a/projects/IoTNode/Program.cs b/projects/IoTNode/Program.cs index 85f3408b..6e4792ea 100644 --- a/projects/IoTNode/Program.cs +++ b/projects/IoTNode/Program.cs @@ -34,7 +34,7 @@ namespace IoTNode new EFConfigurationValue { Id = "server.urls", Value= "http://*:8002" }, new EFConfigurationValue { Id = "notify:enabled", Value= "true"}, new EFConfigurationValue { Id = "notify:host", Value= $"{host}:8011"}, - new EFConfigurationValue { Id = "timer.seconds", Value="60"}, + new EFConfigurationValue { Id = "timer.seconds", Value="600"}, new EFConfigurationValue { Id = "onvif.timer", Value="1"}, new EFConfigurationValue { Id = "onvif.speed", Value="0.2"}, new EFConfigurationValue { Id = "camera.usr", Value="admin"},