Bläddra i källkod

1. Check Online Status:
-調整 心跳包更新時間點在三天內的範圍
-根據電樁heartbeatintervel 判斷online狀態

Jessica Tseng 2 år sedan
förälder
incheckning
581cc87ff4

+ 147 - 133
EVCB_OCPP.TaskScheduler/Jobs/CheckEVSEOnlineJob.cs

@@ -37,192 +37,201 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
 
         public async Task Execute(IJobExecutionContext context)
         {
-           // logger.Debug(this.ToString() + " :Starting........");
-
-
-            List<EVSECurrentStatus> _EVSEs = GetEVSEs();
-
-            foreach (var evse in _EVSEs)
+            logger.Debug(this.ToString() + " :Starting........");
+            try
             {
-                latestHeartbeatTime = evse.HeartbeatUpdatedOn;
-                if (IsOnlineNow(evse))
+                List<EVSECurrentStatus> _EVSEs = GetEVSEs();
+                var checktime = DateTime.UtcNow.AddDays(-3);
+                _EVSEs = _EVSEs.Where(x =>  x.HeartbeatUpdatedOn > checktime).ToList();
+
+                foreach (var evse in _EVSEs)
                 {
-                    if (evse.Online)
+                    latestHeartbeatTime = evse.HeartbeatUpdatedOn;
+                    if (IsOnlineNow(evse))
                     {
-
-                        if (latestHeartbeatTime.Minute % 10 == 0)
+                        if (evse.Online)
                         {
-                            //on-on
-                            //現在是整點,找上一筆填入end time and insert start time 
-
-                            //  var _pickDate = currentTime.AddHours(-1);
-                            var _pickDate = latestHeartbeatTime;
-                            bool isCrossDay = false;
-                            int _startHour = _pickDate.AddHours(-6).Hour; //往回巡視六個小時前紀錄
-
 
-
-                            //跨日處理
-                            if (_startHour > _pickDate.Hour)
+                            if (latestHeartbeatTime.Minute % 10 == 0)
                             {
-                                isCrossDay = true;
+                                //on-on
+                                //現在是整點,找上一筆填入end time and insert start time 
 
-                            }
+                                //  var _pickDate = currentTime.AddHours(-1);
+                                var _pickDate = latestHeartbeatTime;
+                                bool isCrossDay = false;
+                                int _startHour = _pickDate.AddHours(-6).Hour; //往回巡視六個小時前紀錄
 
-                            var _picks =await GetOnlineRecords(_pickDate, evse.CustomerId.ToString(), evse.ChargeBoxId, isCrossDay ? 0 : _startHour, _pickDate.Hour);
 
-                            if (isCrossDay)
-                            {
-                               var _picksCrossData = await GetOnlineRecords(_pickDate.AddHours(-6), evse.CustomerId.ToString(), evse.ChargeBoxId, _startHour, 23);
-                                _picks.AddRange(_picksCrossData);
-                            }
 
-                            _picks = _picks.OrderBy(x => x.OnlineTime).ToList();
+                                //跨日處理
+                                if (_startHour > _pickDate.Hour)
+                                {
+                                    isCrossDay = true;
 
-                            bool _isIgnore = true;
+                                }
 
-                            for (int i = 0; i < _picks.Count; i++)
-                            {
-                                if (_picks[i].HourIndex != evse.HeartbeatUpdatedOn.Hour && _picks[i].OfflineTime == DefaultSetting.DefaultNullTime)
+                                var _picks = await GetOnlineRecords(_pickDate, evse.CustomerId.ToString(), evse.ChargeBoxId, isCrossDay ? 0 : _startHour, _pickDate.Hour);
+
+                                if (isCrossDay)
                                 {
-                                    _picks[i].OfflineTime = new DateTime(_picks[i].OnlineTime.AddHours(1).Year,
-                                        _picks[i].OnlineTime.AddHours(1).Month, _picks[i].OnlineTime.AddHours(1).Day, _picks[i].OnlineTime.AddHours(1).Hour, 0, 0);
+                                    var _picksCrossData = await GetOnlineRecords(_pickDate.AddHours(-6), evse.CustomerId.ToString(), evse.ChargeBoxId, _startHour, 23);
+                                    _picks.AddRange(_picksCrossData);
+                                }
 
-                                    _picks[i].TotalMinute = (int)_picks[i].OfflineTime.Subtract(_picks[i].OnlineTime).TotalMinutes;
-                                    updateData.Add(_picks[i]);
+                                _picks = _picks.OrderBy(x => x.OnlineTime).ToList();
 
-                                    var checkTime = _picks[i].OfflineTime;
-                                    while ((int)latestHeartbeatTime.Subtract(checkTime).TotalHours > 0)
+                                bool _isIgnore = true;
+
+                                for (int i = 0; i < _picks.Count; i++)
+                                {
+                                    if (_picks[i].HourIndex != evse.HeartbeatUpdatedOn.Hour && _picks[i].OfflineTime == DefaultSetting.DefaultNullTime)
                                     {
-                                        var _existedCount = _picks.Where(x => x.HourIndex == checkTime.Hour).ToList().Count;
+                                        _picks[i].OfflineTime = new DateTime(_picks[i].OnlineTime.AddHours(1).Year,
+                                            _picks[i].OnlineTime.AddHours(1).Month, _picks[i].OnlineTime.AddHours(1).Day, _picks[i].OnlineTime.AddHours(1).Hour, 0, 0);
 
-                                        if (_existedCount == 0)
+                                        _picks[i].TotalMinute = (int)_picks[i].OfflineTime.Subtract(_picks[i].OnlineTime).TotalMinutes;
+                                        updateData.Add(_picks[i]);
+
+                                        var checkTime = _picks[i].OfflineTime;
+                                        while ((int)latestHeartbeatTime.Subtract(checkTime).TotalHours > 0)
                                         {
-                                            insertData.Add(new EVSEOnlineRecord()
+                                            var _existedCount = _picks.Where(x => x.HourIndex == checkTime.Hour).ToList().Count;
+
+                                            if (_existedCount == 0)
                                             {
-                                                CustomerId = evse.CustomerId,
-                                                StationId = "0",
-                                                HourIndex = checkTime.Hour,
-                                                ChargeBoxId = evse.ChargeBoxId,
-                                                OnlineTime = new DateTime(checkTime.Year, checkTime.Month, checkTime.Day, checkTime.Hour, 0, 0),
-                                                OfflineTime = new DateTime(checkTime.AddHours(1).Year, checkTime.AddHours(1).Month, checkTime.AddHours(1).Day, checkTime.AddHours(1).Hour, 0, 0),
-                                                TotalMinute = 60
-
-                                            });
-                                            checkTime = checkTime.AddHours(1);
+                                                insertData.Add(new EVSEOnlineRecord()
+                                                {
+                                                    CustomerId = evse.CustomerId,
+                                                    StationId = "0",
+                                                    HourIndex = checkTime.Hour,
+                                                    ChargeBoxId = evse.ChargeBoxId,
+                                                    OnlineTime = new DateTime(checkTime.Year, checkTime.Month, checkTime.Day, checkTime.Hour, 0, 0),
+                                                    OfflineTime = new DateTime(checkTime.AddHours(1).Year, checkTime.AddHours(1).Month, checkTime.AddHours(1).Day, checkTime.AddHours(1).Hour, 0, 0),
+                                                    TotalMinute = 60
+
+                                                });
+                                                checkTime = checkTime.AddHours(1);
+                                            }
                                         }
                                     }
-                                }
 
-                            }
+                                }
 
-                            _isIgnore = _picks.Where(x => x.HourIndex == latestHeartbeatTime.Hour).ToList().Count == 0 ? false : true;
+                                _isIgnore = _picks.Where(x => x.HourIndex == latestHeartbeatTime.Hour).ToList().Count == 0 ? false : true;
 
-                            if (!_isIgnore)
-                            {
-                                insertData.Add(new EVSEOnlineRecord()
+                                if (!_isIgnore)
                                 {
-                                    CustomerId = evse.CustomerId,
-                                    StationId = "0",
-                                    HourIndex = evse.HeartbeatUpdatedOn.Hour,
-                                    ChargeBoxId = evse.ChargeBoxId,
-                                    OnlineTime = new DateTime(latestHeartbeatTime.Year,
-                                            latestHeartbeatTime.Month, latestHeartbeatTime.Day, latestHeartbeatTime.Hour, 0, 0),
-                                    OfflineTime = DefaultSetting.DefaultNullTime
-
-                                });
-                            }
-                        }
+                                    insertData.Add(new EVSEOnlineRecord()
+                                    {
+                                        CustomerId = evse.CustomerId,
+                                        StationId = "0",
+                                        HourIndex = evse.HeartbeatUpdatedOn.Hour,
+                                        ChargeBoxId = evse.ChargeBoxId,
+                                        OnlineTime = new DateTime(latestHeartbeatTime.Year,
+                                                latestHeartbeatTime.Month, latestHeartbeatTime.Day, latestHeartbeatTime.Hour, 0, 0),
+                                        OfflineTime = DefaultSetting.DefaultNullTime
 
-                    }
-                    else
-                    {
-                        //off - on 
-                       // logger.Debug(string.Format("Chargeboxid:{0} HeartbeatUpdatedOn:{1} Online:{2}", evse.ChargeBoxId, evse.HeartbeatUpdatedOn,true));
-                        UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, true, DefaultSetting.DefaultNullTime);
+                                    });
+                                }
+                            }
 
-                        insertData.Add(new EVSEOnlineRecord()
+                        }
+                        else
                         {
-                            CustomerId = evse.CustomerId,
-                            StationId = "0",
-                            HourIndex = evse.HeartbeatUpdatedOn.Hour,
-                            ChargeBoxId = evse.ChargeBoxId,
-                            OnlineTime = evse.HeartbeatUpdatedOn,
+                            //off - on 
+                              UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, true, DefaultSetting.DefaultNullTime);
 
-                        });
+                            insertData.Add(new EVSEOnlineRecord()
+                            {
+                                CustomerId = evse.CustomerId,
+                                StationId = "0",
+                                HourIndex = evse.HeartbeatUpdatedOn.Hour,
+                                ChargeBoxId = evse.ChargeBoxId,
+                                OnlineTime = evse.HeartbeatUpdatedOn,
 
+                            });
 
-                    }
-                }
-                else
-                {
 
-                    if (evse.Online)
+                        }
+                    }
+                    else
                     {
-                        Console.WriteLine(string.Format("***** Chargeboxid:{0} HeartbeatUpdatedOn:{1} Online:{2}", evse.ChargeBoxId, evse.HeartbeatUpdatedOn, false));
-                        //on -off  
-                        UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, false, evse.HeartbeatUpdatedOn);
 
-                        var _pickDate = evse.HeartbeatUpdatedOn.Date;
-                        var _picks = await GetOnlineRecords(_pickDate, evse.CustomerId.ToString(), evse.ChargeBoxId, _pickDate.Hour, evse.HeartbeatUpdatedOn.Hour);
-                         _picks = (List<EVSEOnlineRecord>)_picks.Where(x => x.OfflineTime == DefaultSetting.DefaultNullTime);
-
-                        foreach (var item in _picks)
+                        if (evse.Online)
                         {
-                            if (evse.HeartbeatUpdatedOn.Hour - item.OnlineTime.Hour > 0)
-                            {
-                                item.OfflineTime = new DateTime(item.OnlineTime.AddHours(1).Year, item.OnlineTime.AddHours(1).Month, item.OnlineTime.AddHours(1).Day, item.OnlineTime.AddHours(1).Hour, 0, 0);
-                                item.TotalMinute = (int)item.OfflineTime.Subtract(item.OnlineTime).TotalMinutes;
-                                updateData.Add(item);
+                          
+                            //on -off  
+                            UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, false, evse.HeartbeatUpdatedOn);
 
-                                var checkTime = item.OfflineTime;
-                                while (evse.HeartbeatUpdatedOn.Hour - checkTime.Hour >= 0)
+                            var _pickDate = evse.HeartbeatUpdatedOn.Date;
+                            var _picks = await GetOnlineRecords(_pickDate, evse.CustomerId.ToString(), evse.ChargeBoxId, _pickDate.Hour, evse.HeartbeatUpdatedOn.Hour);
+                            _picks = _picks.Where(x => x.OfflineTime == DefaultSetting.DefaultNullTime).ToList();
+
+                            foreach (var item in _picks)
+                            {
+                                if (evse.HeartbeatUpdatedOn.Hour - item.OnlineTime.Hour > 0)
                                 {
-                                    insertData.Add(new EVSEOnlineRecord()
+                                    item.OfflineTime = new DateTime(item.OnlineTime.AddHours(1).Year, item.OnlineTime.AddHours(1).Month, item.OnlineTime.AddHours(1).Day, item.OnlineTime.AddHours(1).Hour, 0, 0);
+                                    item.TotalMinute = (int)item.OfflineTime.Subtract(item.OnlineTime).TotalMinutes;
+                                    updateData.Add(item);
+
+                                    var checkTime = item.OfflineTime;
+                                    while (evse.HeartbeatUpdatedOn.Hour - checkTime.Hour >= 0)
                                     {
-                                        CustomerId = evse.CustomerId,
-                                        StationId = "0",
-                                        HourIndex = checkTime.Hour,
-                                        ChargeBoxId = evse.ChargeBoxId,
-                                        OnlineTime = checkTime,
-                                        OfflineTime = evse.HeartbeatUpdatedOn.Hour == checkTime.Hour ? evse.HeartbeatUpdatedOn : new DateTime(checkTime.AddHours(1).Year, checkTime.AddHours(1).Month, checkTime.AddHours(1).Day, checkTime.AddHours(1).Hour, 0, 0)
+                                        insertData.Add(new EVSEOnlineRecord()
+                                        {
+                                            CustomerId = evse.CustomerId,
+                                            StationId = "0",
+                                            HourIndex = checkTime.Hour,
+                                            ChargeBoxId = evse.ChargeBoxId,
+                                            OnlineTime = checkTime,
+                                            OfflineTime = evse.HeartbeatUpdatedOn.Hour == checkTime.Hour ? evse.HeartbeatUpdatedOn : new DateTime(checkTime.AddHours(1).Year, checkTime.AddHours(1).Month, checkTime.AddHours(1).Day, checkTime.AddHours(1).Hour, 0, 0)
+
+                                        });
+                                        checkTime = evse.HeartbeatUpdatedOn.Hour == checkTime.Hour ? insertData.LastOrDefault().OfflineTime.AddHours(1) : insertData.LastOrDefault().OfflineTime;
+                                    }
 
-                                    });
-                                    checkTime = evse.HeartbeatUpdatedOn.Hour == checkTime.Hour ? insertData.LastOrDefault().OfflineTime.AddHours(1) : insertData.LastOrDefault().OfflineTime;
                                 }
+                                else
+                                {
+                                    item.OfflineTime = evse.HeartbeatUpdatedOn;
+                                    item.TotalMinute = (int)item.OfflineTime.Subtract(item.OnlineTime).TotalMinutes;
+                                    updateData.Add(item);
 
-                            }
-                            else
-                            {
-                                item.OfflineTime = evse.HeartbeatUpdatedOn;
-                                item.TotalMinute = (int)item.OfflineTime.Subtract(item.OnlineTime).TotalMinutes;
-                                updateData.Add(item);
+                                }
 
                             }
 
                         }
-
+                        else
+                        {
+                            //off-off do nothing
+                        }
                     }
-                    else
+
+                    if ((insertData.Count + updateData.Count) % 100 == 0)
                     {
-                        //off-off do nothing
+                        await UpdateOnlineRecords(updateData, insertData);
+                        ClearCache();
                     }
-                }
 
-                if ((insertData.Count + updateData.Count) % 100 == 0)
-                {
-                   await UpdateOnlineRecords(updateData, insertData);
-                    ClearCache();
+                  
                 }
 
 
-            }
-
+                await UpdateOnlineRecords(updateData, insertData);
+              
 
-            await UpdateOnlineRecords(updateData, insertData);
+            }
+            catch (Exception ex)
+            {
+                logger.Debug("ERROR "+ this.ToString() + ex.ToString());
+            }
 
+          
 
-          //  logger.Debug(this.ToString() + " :Finished........");
+            logger.Debug(this.ToString() + " :Finished........");
 
         }
 
@@ -235,7 +244,9 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
                 using (var dbConn = new SqlConnection(mainDBConnectString))
                 {
                     dbConn.Open();
-                    result = dbConn.Query<EVSECurrentStatus>("SELECT CustomerId,Id,ChargeBoxId,Online,HeartbeatUpdatedOn FROM [dbo].[Machine]").ToList();
+                    string sqlstring = "SELECT m.CustomerId,m.Id,m.ChargeBoxId,m.Online,m.HeartbeatUpdatedOn,MachineConfigurations.ConfigureSetting HeartbeatInterval"
+                   + "  FROM [dbo].[Machine]  m,[dbo].[MachineConfigurations] where MachineConfigurations.ConfigureName = 'HeartbeatInterval' and m.ChargeBoxId = MachineConfigurations.ChargeBoxId";
+                    result = dbConn.Query<EVSECurrentStatus>(sqlstring).ToList();
                 }
 
             }
@@ -394,12 +405,15 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
         private bool IsOnlineNow(EVSECurrentStatus currentEVSE)
         {
             bool isOnline = false;
-            var checkTime = DateTime.UtcNow.AddSeconds(-120);
+            int heartbeatInterval = int.Parse(currentEVSE.HeartbeatInterval);
+            var checkTime = DateTime.UtcNow.AddSeconds(-(heartbeatInterval * 2));
 
             if (currentEVSE.HeartbeatUpdatedOn > checkTime)
             {
                 isOnline = true;
+          
             }
+           
             return isOnline;
 
         }

+ 2 - 1
EVCB_OCPP.TaskScheduler/Models/EVSECurrentStatus.cs

@@ -19,8 +19,9 @@ namespace EVCB_OCPP.TaskScheduler.Models
         public bool Online { get; set; }
      
         public DateTime HeartbeatUpdatedOn { get; set; }
+     
 
-        public DateTime OfflineOn { get; set; }
+        public string HeartbeatInterval { set; get; }