SmartChargingProfileHandler.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using EVCB_OCPP.Domain;
  2. using EVCB_OCPP.Domain.Models.Database;
  3. using EVCB_OCPP.Packet.Features;
  4. using EVCB_OCPP.Packet.Messages;
  5. using EVCB_OCPP.Packet.Messages.SmartCharging;
  6. using EVCB_OCPP.Packet.Messages.SubTypes;
  7. using Newtonsoft.Json;
  8. using OCPPServer.Protocol;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. namespace EVCB_OCPP.WSServer.Message
  13. {
  14. internal partial class ProfileHandler
  15. {
  16. internal void SetChargingProfile(string chargeBoxId, decimal value, ChargingRateUnitType unit)
  17. {
  18. using (var db = new MainDBContext())
  19. {
  20. var _setProfileRequest = new SetChargingProfileRequest()
  21. {
  22. connectorId = 0,
  23. csChargingProfiles = new Packet.Messages.SubTypes.csChargingProfiles()
  24. {
  25. chargingProfileId = 1,
  26. chargingProfileKind = Packet.Messages.SubTypes.ChargingProfileKindType.Recurring,
  27. chargingProfilePurpose = Packet.Messages.SubTypes.ChargingProfilePurposeType.ChargePointMaxProfile,
  28. chargingSchedule = new Packet.Messages.SubTypes.ChargingSchedule()
  29. {
  30. chargingRateUnit = unit,
  31. chargingSchedulePeriod = new List<Packet.Messages.SubTypes.ChargingSchedulePeriod>()
  32. {
  33. new Packet.Messages.SubTypes.ChargingSchedulePeriod(){ startPeriod=0, limit=value*1000}
  34. },
  35. duration = 60,
  36. },
  37. recurrencyKind = Packet.Messages.SubTypes.RecurrencyKindType.Daily,
  38. stackLevel = 1,
  39. }
  40. };
  41. db.ServerMessage.Add(new ServerMessage()
  42. {
  43. ChargeBoxId = chargeBoxId,
  44. CreatedBy = "Server",
  45. CreatedOn = DateTime.UtcNow,
  46. OutAction = _setProfileRequest.Action.ToString(),
  47. OutRequest = JsonConvert.SerializeObject(_setProfileRequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
  48. SerialNo = Guid.Empty.ToString(),
  49. InMessage = string.Empty
  50. });
  51. db.SaveChanges();
  52. }
  53. }
  54. internal void ClearChargingProfile(string chargeBoxId)
  55. {
  56. using (var db = new MainDBContext())
  57. {
  58. var _clearProfileRequest = new ClearChargingProfileRequest()
  59. {
  60. connectorId = 0,
  61. chargingProfilePurpose = ChargingProfilePurposeType.ChargePointMaxProfile,
  62. };
  63. db.ServerMessage.Add(new ServerMessage()
  64. {
  65. ChargeBoxId = chargeBoxId,
  66. CreatedBy = "Server",
  67. CreatedOn = DateTime.UtcNow,
  68. OutAction = _clearProfileRequest.Action.ToString(),
  69. OutRequest = JsonConvert.SerializeObject(_clearProfileRequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
  70. SerialNo = Guid.Empty.ToString(),
  71. InMessage = string.Empty
  72. });
  73. db.SaveChanges();
  74. }
  75. }
  76. internal MessageResult ExecuteSmartChargingConfirm(Actions action, ClientData session, IConfirmation confirm, string requestId)
  77. {
  78. MessageResult result = new MessageResult() { Success = true };
  79. switch (action)
  80. {
  81. case Actions.ClearChargingProfile:
  82. {
  83. ClearChargingProfileConfirmation _confirm = confirm as ClearChargingProfileConfirmation;
  84. ClearChargingProfileRequest _request = _confirm.GetRequest() as ClearChargingProfileRequest;
  85. using (var db = new MainDBContext())
  86. {
  87. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  88. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  89. if (operation != null)
  90. {
  91. operation.FinishedOn = DateTime.UtcNow;
  92. operation.Status = 1;//電樁有回覆
  93. operation.EVSE_Status = (int)_confirm.status;//OK
  94. operation.EVSE_Value = _confirm.status.ToString();
  95. db.SaveChanges();
  96. }
  97. }
  98. }
  99. break;
  100. case Actions.SetChargingProfile:
  101. {
  102. SetChargingProfileConfirmation _confirm = confirm as SetChargingProfileConfirmation;
  103. SetChargingProfileRequest _request = _confirm.GetRequest() as SetChargingProfileRequest;
  104. using (var db = new MainDBContext())
  105. {
  106. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  107. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  108. if (operation != null)
  109. {
  110. operation.FinishedOn = DateTime.UtcNow;
  111. operation.Status = 1;//電樁有回覆
  112. operation.EVSE_Status = (int)_confirm.status;//OK
  113. operation.EVSE_Value = _confirm.status.ToString();
  114. db.SaveChanges();
  115. }
  116. }
  117. }
  118. break;
  119. case Actions.GetCompositeSchedule:
  120. {
  121. GetCompositeScheduleConfirmation _confirm = confirm as GetCompositeScheduleConfirmation;
  122. GetCompositeScheduleRequest _request = _confirm.GetRequest() as GetCompositeScheduleRequest;
  123. using (var db = new MainDBContext())
  124. {
  125. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  126. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  127. if (operation != null)
  128. {
  129. operation.FinishedOn = DateTime.UtcNow;
  130. operation.Status = 1;//電樁有回覆
  131. operation.EVSE_Status = (int)_confirm.status;//OK
  132. operation.EVSE_Value = JsonConvert.SerializeObject(_confirm.chargingSchedule, Formatting.None);
  133. db.SaveChanges();
  134. }
  135. }
  136. }
  137. break;
  138. default:
  139. {
  140. Console.WriteLine(string.Format("Not Implement {0} Logic", confirm.GetType().ToString().Replace("OCPPPackage.Messages.RemoteTrigger.", "")));
  141. }
  142. break;
  143. }
  144. return result;
  145. }
  146. internal MessageResult ReceivedSmartChargingError(Actions action, string errorMsg, ClientData session, string requestId)
  147. {
  148. MessageResult result = new MessageResult() { Success = true };
  149. switch (action)
  150. {
  151. case Actions.ClearChargingProfile:
  152. case Actions.SetChargingProfile:
  153. case Actions.GetCompositeSchedule:
  154. {
  155. using (var db = new MainDBContext())
  156. {
  157. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  158. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  159. if (operation != null)
  160. {
  161. operation.FinishedOn = DateTime.UtcNow;
  162. operation.Status = 1;//電樁有回覆
  163. operation.EVSE_Status = (int)255;//錯誤
  164. operation.EVSE_Value = errorMsg;
  165. db.SaveChanges();
  166. }
  167. }
  168. }
  169. break;
  170. default:
  171. {
  172. Console.WriteLine(string.Format("Not Implement {0} Logic", action));
  173. }
  174. break;
  175. }
  176. return result;
  177. }
  178. }
  179. }