SmartChargingProfileHandler.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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 Microsoft.EntityFrameworkCore;
  8. using Newtonsoft.Json;
  9. using OCPPServer.Protocol;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Threading.Tasks;
  14. namespace EVCB_OCPP.WSServer.Message
  15. {
  16. internal partial class ProfileHandler
  17. {
  18. internal async void SetChargingProfile(string chargeBoxId, decimal value, ChargingRateUnitType unit)
  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}
  34. },
  35. duration = 86400,
  36. },
  37. recurrencyKind = Packet.Messages.SubTypes.RecurrencyKindType.Daily,
  38. stackLevel = 1,
  39. }
  40. };
  41. await mainDbService.AddServerMessage(
  42. ChargeBoxId: chargeBoxId,
  43. CreatedBy: "Server",
  44. CreatedOn: DateTime.UtcNow,
  45. OutAction: _setProfileRequest.Action.ToString(),
  46. OutRequest: JsonConvert.SerializeObject(_setProfileRequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None })
  47. );
  48. }
  49. internal async void ClearChargingProfile(string chargeBoxId)
  50. {
  51. var _clearProfileRequest = new ClearChargingProfileRequest()
  52. {
  53. connectorId = 0,
  54. chargingProfilePurpose = ChargingProfilePurposeType.ChargePointMaxProfile,
  55. };
  56. await mainDbService.AddServerMessage(new ServerMessage()
  57. {
  58. ChargeBoxId = chargeBoxId,
  59. CreatedBy = "Server",
  60. CreatedOn = DateTime.UtcNow,
  61. OutAction = _clearProfileRequest.Action.ToString(),
  62. OutRequest = JsonConvert.SerializeObject(_clearProfileRequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None })
  63. });
  64. }
  65. internal async Task<MessageResult> ExecuteSmartChargingConfirm(Actions action, ClientData session, IConfirmation confirm, string requestId)
  66. {
  67. MessageResult result = new MessageResult() { Success = true };
  68. switch (action)
  69. {
  70. case Actions.ClearChargingProfile:
  71. {
  72. ClearChargingProfileConfirmation _confirm = confirm as ClearChargingProfileConfirmation;
  73. ClearChargingProfileRequest _request = _confirm.GetRequest() as ClearChargingProfileRequest;
  74. using (var db = maindbContextFactory.CreateDbContext())
  75. {
  76. var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  77. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
  78. if (operation != null)
  79. {
  80. operation.FinishedOn = DateTime.UtcNow;
  81. operation.Status = 1;//電樁有回覆
  82. operation.EVSE_Status = (int)_confirm.status;//OK
  83. operation.EVSE_Value = _confirm.status.ToString();
  84. db.SaveChanges();
  85. }
  86. }
  87. }
  88. break;
  89. case Actions.SetChargingProfile:
  90. {
  91. SetChargingProfileConfirmation _confirm = confirm as SetChargingProfileConfirmation;
  92. SetChargingProfileRequest _request = _confirm.GetRequest() as SetChargingProfileRequest;
  93. using (var db = maindbContextFactory.CreateDbContext())
  94. {
  95. var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  96. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
  97. if (operation != null)
  98. {
  99. operation.FinishedOn = DateTime.UtcNow;
  100. operation.Status = 1;//電樁有回覆
  101. operation.EVSE_Status = (int)_confirm.status;//OK
  102. operation.EVSE_Value = _confirm.status.ToString();
  103. db.SaveChanges();
  104. }
  105. }
  106. }
  107. break;
  108. case Actions.GetCompositeSchedule:
  109. {
  110. GetCompositeScheduleConfirmation _confirm = confirm as GetCompositeScheduleConfirmation;
  111. GetCompositeScheduleRequest _request = _confirm.GetRequest() as GetCompositeScheduleRequest;
  112. using (var db = maindbContextFactory.CreateDbContext())
  113. {
  114. var operation = await db.MachineOperateRecord
  115. .Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0)
  116. .FirstOrDefaultAsync();
  117. if (operation != null)
  118. {
  119. operation.FinishedOn = DateTime.UtcNow;
  120. operation.Status = 1;//電樁有回覆
  121. operation.EVSE_Status = (int)_confirm.status;//OK
  122. operation.EVSE_Value = JsonConvert.SerializeObject(_confirm.chargingSchedule, Formatting.None);
  123. db.SaveChanges();
  124. }
  125. }
  126. }
  127. break;
  128. default:
  129. {
  130. Console.WriteLine(string.Format("Not Implement {0} Logic", confirm.GetType().ToString().Replace("OCPPPackage.Messages.RemoteTrigger.", "")));
  131. }
  132. break;
  133. }
  134. return result;
  135. }
  136. internal async Task<MessageResult> ReceivedSmartChargingError(Actions action, string errorMsg, ClientData session, string requestId)
  137. {
  138. MessageResult result = new MessageResult() { Success = true };
  139. switch (action)
  140. {
  141. case Actions.ClearChargingProfile:
  142. case Actions.SetChargingProfile:
  143. case Actions.GetCompositeSchedule:
  144. {
  145. using (var db = maindbContextFactory.CreateDbContext())
  146. {
  147. var operation = await db.MachineOperateRecord
  148. .Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0)
  149. .FirstOrDefaultAsync();
  150. if (operation != null)
  151. {
  152. operation.FinishedOn = DateTime.UtcNow;
  153. operation.Status = 1;//電樁有回覆
  154. operation.EVSE_Status = (int)255;//錯誤
  155. operation.EVSE_Value = errorMsg;
  156. db.SaveChanges();
  157. }
  158. }
  159. }
  160. break;
  161. default:
  162. {
  163. Console.WriteLine(string.Format("Not Implement {0} Logic", action));
  164. }
  165. break;
  166. }
  167. return result;
  168. }
  169. }
  170. }