Example #1
0
        public string HandleMeterValues(OCPPMessage msgIn, OCPPMessage msgOut)
        {
            string errorCode = null;
            MeterValuesResponse meterValuesResponse = new MeterValuesResponse();

            int?   connectorId   = null;
            string msgMeterValue = string.Empty;

            try
            {
                Logger.LogTrace("Processing meter values...");
                MeterValuesRequest meterValueRequest = JsonConvert.DeserializeObject <MeterValuesRequest>(msgIn.JsonPayload);
                Logger.LogTrace("MeterValues => Message deserialized");

                connectorId = meterValueRequest.ConnectorId;

                if (ChargePointStatus != null)
                {
                    // Known charge station => process meter values
                    double currentChargeKW = -1;
                    double meterKWH        = -1;
                    double stateOfCharge   = -1;
                    foreach (MeterValue meterValue in meterValueRequest.MeterValue)
                    {
                        foreach (SampledValue sampleValue in meterValue.SampledValue)
                        {
                            Logger.LogTrace("MeterValues => Context={0} / Format={1} / Value={2} / Unit={3} / Location={4} / Measurand={5} / Phase={6}",
                                            sampleValue.Context, sampleValue.Format, sampleValue.Value, sampleValue.Unit, sampleValue.Location, sampleValue.Measurand, sampleValue.Phase);

                            if (sampleValue.Measurand == SampledValueMeasurand.Power_Active_Import)
                            {
                                // current charging power
                                if (double.TryParse(sampleValue.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out currentChargeKW))
                                {
                                    if (sampleValue.Unit == SampledValueUnit.W ||
                                        sampleValue.Unit == SampledValueUnit.VA ||
                                        sampleValue.Unit == SampledValueUnit.Var ||
                                        sampleValue.Unit == null)
                                    {
                                        Logger.LogTrace("MeterValues => Charging '{0:0.0}' W", currentChargeKW);
                                        // convert W => kW
                                        currentChargeKW = currentChargeKW / 1000;
                                    }
                                    else if (sampleValue.Unit == SampledValueUnit.KW ||
                                             sampleValue.Unit == SampledValueUnit.KVA ||
                                             sampleValue.Unit == SampledValueUnit.Kvar)
                                    {
                                        // already kW => OK
                                        Logger.LogTrace("MeterValues => Charging '{0:0.0}' kW", currentChargeKW);
                                    }
                                    else
                                    {
                                        Logger.LogWarning("MeterValues => Charging: unexpected unit: '{0}' (Value={1})", sampleValue.Unit, sampleValue.Value);
                                    }
                                }
                                else
                                {
                                    Logger.LogError("MeterValues => Charging: invalid value '{0}' (Unit={1})", sampleValue.Value, sampleValue.Unit);
                                }
                            }
                            else if (sampleValue.Measurand == SampledValueMeasurand.Energy_Active_Import_Register ||
                                     sampleValue.Measurand == null)
                            {
                                // charged amount of energy
                                if (double.TryParse(sampleValue.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out meterKWH))
                                {
                                    if (sampleValue.Unit == SampledValueUnit.Wh ||
                                        sampleValue.Unit == SampledValueUnit.Varh ||
                                        sampleValue.Unit == null)
                                    {
                                        Logger.LogTrace("MeterValues => Value: '{0:0.0}' Wh", meterKWH);
                                        // convert Wh => kWh
                                        meterKWH = meterKWH / 1000;
                                    }
                                    else if (sampleValue.Unit == SampledValueUnit.KWh ||
                                             sampleValue.Unit == SampledValueUnit.Kvarh)
                                    {
                                        // already kWh => OK
                                        Logger.LogTrace("MeterValues => Value: '{0:0.0}' kWh", meterKWH);
                                    }
                                    else
                                    {
                                        Logger.LogWarning("MeterValues => Value: unexpected unit: '{0}' (Value={1})", sampleValue.Unit, sampleValue.Value);
                                    }
                                }
                                else
                                {
                                    Logger.LogError("MeterValues => Value: invalid value '{0}' (Unit={1})", sampleValue.Value, sampleValue.Unit);
                                }
                            }
                            else if (sampleValue.Measurand == SampledValueMeasurand.SoC)
                            {
                                // state of charge (battery status)
                                if (double.TryParse(sampleValue.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out stateOfCharge))
                                {
                                    Logger.LogTrace("MeterValues => SoC: '{0:0.0}'%", stateOfCharge);
                                }
                                else
                                {
                                    Logger.LogError("MeterValues => invalid value '{0}' (SoC)", sampleValue.Value);
                                }
                            }
                        }
                    }

                    // write charging/meter data in chargepoint status
                    ChargingData chargingData = null;
                    if (currentChargeKW >= 0 || meterKWH >= 0 || stateOfCharge >= 0)
                    {
                        chargingData = new ChargingData();
                        if (currentChargeKW >= 0)
                        {
                            chargingData.ChargeRateKW = currentChargeKW;
                        }
                        if (meterKWH >= 0)
                        {
                            chargingData.MeterKWH = meterKWH;
                        }
                        if (stateOfCharge >= 0)
                        {
                            chargingData.SoC = stateOfCharge;
                        }

                        if (currentChargeKW >= 0)
                        {
                            chargingData.ChargeRateKW = currentChargeKW;
                        }
                        msgMeterValue = $"Meter (kWh): {meterKWH} | Charge (kW): {currentChargeKW} | SoC (%): {stateOfCharge}";
                    }
                    if (connectorId > 1)
                    {
                        // second connector (or higher!?)
                        ChargePointStatus.ChargingDataEVSE2 = chargingData;
                    }
                    else
                    {
                        // first connector
                        ChargePointStatus.ChargingDataEVSE1 = chargingData;
                    }
                }
                else
                {
                    // Unknown charge station
                    errorCode = ErrorCodes.GenericError;
                }

                msgOut.JsonPayload = JsonConvert.SerializeObject(meterValuesResponse);
                Logger.LogTrace("MeterValues => Response serialized");
            }
            catch (Exception exp)
            {
                Logger.LogError(exp, "MeterValues => Exception: {0}", exp.Message);
                errorCode = ErrorCodes.InternalError;
            }

            WriteMessageLog(ChargePointStatus.Id, connectorId, msgIn.Action, msgMeterValue, errorCode);
            return(errorCode);
        }
        public string HandleMeterValues(OCPPMessage msgIn, OCPPMessage msgOut)
        {
            string errorCode = null;
            MeterValuesResponse meterValuesResponse = new MeterValuesResponse();

            meterValuesResponse.CustomData          = new CustomDataType();
            meterValuesResponse.CustomData.VendorId = VendorId;

            int?   connectorId   = null;
            string msgMeterValue = string.Empty;

            try
            {
                Logger.LogTrace("Processing meter values...");
                MeterValuesRequest meterValueRequest = JsonConvert.DeserializeObject <MeterValuesRequest>(msgIn.JsonPayload);
                Logger.LogTrace("MeterValues => Message deserialized");

                connectorId = meterValueRequest.EvseId;

                if (ChargePointStatus != null)
                {
                    // Known charge station => extract meter values with correct scale
                    double currentChargeKW = -1;
                    double meterKWH        = -1;
                    double stateOfCharge   = -1;
                    GetMeterValues(meterValueRequest.MeterValue, out meterKWH, out currentChargeKW, out stateOfCharge);

                    // write charging/meter data in chargepoint status
                    ChargingData chargingData = null;
                    if (currentChargeKW >= 0 || meterKWH >= 0 || stateOfCharge >= 0)
                    {
                        chargingData = new ChargingData();
                        if (currentChargeKW >= 0)
                        {
                            chargingData.ChargeRateKW = currentChargeKW;
                        }
                        if (meterKWH >= 0)
                        {
                            chargingData.MeterKWH = meterKWH;
                        }
                        if (stateOfCharge >= 0)
                        {
                            chargingData.SoC = stateOfCharge;
                        }

                        msgMeterValue = $"Meter (kWh): {meterKWH} | Charge (kW): {currentChargeKW} | SoC (%): {stateOfCharge}";
                    }
                    if (connectorId > 1)
                    {
                        // second connector (odr higher!?)
                        ChargePointStatus.ChargingDataEVSE2 = chargingData;
                    }
                    else
                    {
                        // first connector
                        ChargePointStatus.ChargingDataEVSE1 = chargingData;
                    }
                }
                else
                {
                    // Unknown charge station
                    errorCode = ErrorCodes.GenericError;
                }

                msgOut.JsonPayload = JsonConvert.SerializeObject(meterValuesResponse);
                Logger.LogTrace("MeterValues => Response serialized");
            }
            catch (Exception exp)
            {
                Logger.LogError(exp, "MeterValues => Exception: {0}", exp.Message);
                errorCode = ErrorCodes.InternalError;
            }

            WriteMessageLog(ChargePointStatus.Id, connectorId, msgIn.Action, msgMeterValue, errorCode);
            return(errorCode);
        }