/// <summary>
        /// Try to parse the given XML representation of an OICP push EVSE status request.
        /// </summary>
        /// <param name="PushEVSEStatusXML">The XML to parse.</param>
        /// <param name="PushEVSEStatus">The parsed push EVSE status request.</param>
        /// <param name="CustomOperatorEVSEStatusParser">A delegate to parse custom OperatorEVSEStatus XML elements.</param>
        /// <param name="CustomEVSEStatusRecordParser">A delegate to parse custom EVSEStatusRecord XML elements.</param>
        /// <param name="OnException">An optional delegate called whenever an exception occured.</param>
        ///
        /// <param name="Timestamp">The optional timestamp of the request.</param>
        /// <param name="CancellationToken">An optional token to cancel this request.</param>
        /// <param name="EventTrackingId">An optional event tracking identification for correlating this request with other events.</param>
        /// <param name="RequestTimeout">An optional timeout for this request.</param>
        public static Boolean TryParse(XElement PushEVSEStatusXML,
                                       out PushEVSEStatusRequest PushEVSEStatus,
                                       CustomXMLParserDelegate <OperatorEVSEStatus> CustomOperatorEVSEStatusParser = null,
                                       CustomXMLParserDelegate <EVSEStatusRecord> CustomEVSEStatusRecordParser     = null,
                                       OnExceptionDelegate OnException = null,

                                       DateTime?Timestamp = null,
                                       CancellationToken?CancellationToken = null,
                                       EventTracking_Id EventTrackingId    = null,
                                       TimeSpan?RequestTimeout             = null)

        {
            try
            {
                if (PushEVSEStatusXML.Name != OICPNS.EVSEStatus + "eRoamingPushEvseStatus")
                {
                    PushEVSEStatus = null;
                    return(false);
                }

                PushEVSEStatus = new PushEVSEStatusRequest(

                    OperatorEVSEStatus.Parse(PushEVSEStatusXML.ElementOrFail(OICPNS.EVSEStatus + "OperatorEvseStatus"),
                                             CustomOperatorEVSEStatusParser,
                                             CustomEVSEStatusRecordParser,
                                             OnException),

                    PushEVSEStatusXML.MapValueOrFail(OICPNS.EVSEStatus + "ActionType",
                                                     ActionTypesExtentions.Parse),

                    Timestamp,
                    CancellationToken,
                    EventTrackingId,
                    RequestTimeout

                    );

                return(true);
            }
            catch (Exception e)
            {
                OnException?.Invoke(DateTime.UtcNow, PushEVSEStatusXML, e);

                PushEVSEStatus = null;
                return(false);
            }
        }
        /// <summary>
        /// Create an OICP PushEVSEStatus XML/SOAP request.
        /// </summary>
        /// <param name="OperatorEVSEStatus">An operator EVSE status.</param>
        /// <param name="Action">The server-side data management operation.</param>
        ///
        /// <param name="Timestamp">The optional timestamp of the request.</param>
        /// <param name="CancellationToken">An optional token to cancel this request.</param>
        /// <param name="EventTrackingId">An optional event tracking identification for correlating this request with other events.</param>
        /// <param name="RequestTimeout">An optional timeout for this request.</param>
        public PushEVSEStatusRequest(OperatorEVSEStatus OperatorEVSEStatus,
                                     ActionTypes Action = ActionTypes.update,

                                     DateTime?Timestamp = null,
                                     CancellationToken?CancellationToken = null,
                                     EventTracking_Id EventTrackingId    = null,
                                     TimeSpan?RequestTimeout             = null)

            : base(Timestamp,
                   CancellationToken,
                   EventTrackingId,
                   RequestTimeout)

        {
            this.OperatorEVSEStatus = OperatorEVSEStatus ?? throw new ArgumentNullException(nameof(OperatorEVSEStatus), "The given OperatorEVSEStatus must not be null!");
            this.Action             = Action;
        }
        PushEVSEStatus(this ICPOClient ICPOClient,
                       OperatorEVSEStatus OperatorEVSEStatus,
                       ActionTypes Action = ActionTypes.update,

                       DateTime?Timestamp = null,
                       CancellationToken?CancellationToken = null,
                       EventTracking_Id EventTrackingId    = null,
                       TimeSpan?RequestTimeout             = null)


        => ICPOClient.PushEVSEStatus(new PushEVSEStatusRequest(OperatorEVSEStatus,
                                                               Action,

                                                               Timestamp,
                                                               CancellationToken,
                                                               EventTrackingId,
                                                               RequestTimeout ?? ICPOClient.RequestTimeout));
        /// <summary>
        /// Return a XML representation of this object.
        /// </summary>
        /// <param name="CustomPushEVSEStatusRequestSerializer">A delegate to customize the serialization of PushEVSEStatus requests.</param>
        /// <param name="OperatorEVSEStatusXName">The OperatorEVSEStatus XML name to use.</param>
        /// <param name="CustomOperatorEVSEStatusSerializer">A delegate to serialize custom OperatorEVSEStatus XML elements.</param>
        /// <param name="EVSEStatusRecordXName">The EVSEStatusRecord XML name to use.</param>
        /// <param name="CustomEVSEStatusRecordSerializer">A delegate to serialize custom EVSEStatusRecord XML elements.</param>
        public XElement ToXML(CustomXMLSerializerDelegate <PushEVSEStatusRequest> CustomPushEVSEStatusRequestSerializer = null,
                              XName OperatorEVSEStatusXName = null,
                              CustomXMLSerializerDelegate <OperatorEVSEStatus> CustomOperatorEVSEStatusSerializer = null,
                              XName EVSEStatusRecordXName = null,
                              CustomXMLSerializerDelegate <EVSEStatusRecord> CustomEVSEStatusRecordSerializer = null)

        {
            var XML = new XElement(OICPNS.EVSEStatus + "eRoamingPushEvseStatus",

                                   new XElement(OICPNS.EVSEStatus + "ActionType", Action.AsString()),

                                   OperatorEVSEStatus.ToXML(OperatorEVSEStatusXName,
                                                            CustomOperatorEVSEStatusSerializer,
                                                            EVSEStatusRecordXName,
                                                            CustomEVSEStatusRecordSerializer)

                                   );

            return(CustomPushEVSEStatusRequestSerializer != null
                       ? CustomPushEVSEStatusRequestSerializer(this, XML)
                       : XML);
        }