コード例 #1
0
        public override void StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last)
        {
            List <Field> Fields = new List <Field>();

            this.AppendFields(ThingReference, Fields, Request, this.value, Prefix);
            Request.ReportFields(Last, Fields.ToArray());
        }
コード例 #2
0
        public Task StartReadout(ISensorReadout Request)
        {
            try
            {
                Log.Informational("Performing readout.", this.LogId, Request.Actor);

                List <Field> Fields = new List <Field>();
                DateTime     Now    = DateTime.Now;

                if (Request.IsIncluded(FieldType.Identity))
                {
                    Fields.Add(new StringField(this, Now, "Device ID", App.Instance.DeviceId, FieldType.Identity, FieldQoS.AutomaticReadout));
                }

                if (App.Instance.Output.HasValue)
                {
                    Fields.Add(new BooleanField(this, Now, "Output", App.Instance.Output.Value,
                                                FieldType.Momentary, FieldQoS.AutomaticReadout, true));
                }

                Request.ReportFields(true, Fields);
            }
            catch (Exception ex)
            {
                Log.Critical(ex);
            }

            return(Task.CompletedTask);
        }
コード例 #3
0
        public Task StartReadout(ISensorReadout Request)
        {
            try
            {
                if (this.pin is null)
                {
                    if (!this.Controller.TryOpenPin(this.PinNr, GpioSharingMode.SharedReadOnly, out this.pin, out GpioOpenStatus Status))
                    {
                        string Id = Status.ToString();
                        string s  = this.GetStatusMessage(Status);

                        this.LogErrorAsync(Id, s);

                        Request.ReportErrors(true, new ThingError(this, s));
                        return(Task.CompletedTask);
                    }

                    this.pin.ValueChanged += Pin_ValueChanged;

                    this.SetDriveMode(this.mode);
                }

                List <Field> Fields = new List <Field>();
                DateTime     Now    = DateTime.Now;

                if (Request.IsIncluded(FieldType.Momentary))
                {
                    Fields.Add(new BooleanField(this, Now, "Value", this.pin.Read() == GpioPinValue.High, FieldType.Momentary, FieldQoS.AutomaticReadout,
                                                typeof(Controller).Namespace, 12));
                }

                if (Request.IsIncluded(FieldType.Identity))
                {
                    Fields.Add(new Int32Field(this, Now, "Pin Number", this.PinNr, FieldType.Identity, FieldQoS.AutomaticReadout,
                                              typeof(Controller).Namespace, 13));

                    this.AddIdentityReadout(Fields, Now);
                }

                if (Request.IsIncluded(FieldType.Status))
                {
                    Fields.Add(new TimeField(this, Now, "Debounce Timeout", this.pin.DebounceTimeout, FieldType.Status, FieldQoS.AutomaticReadout,
                                             typeof(Controller).Namespace, 14));

                    Fields.Add(new EnumField(this, Now, "Sharing Mode", this.pin.SharingMode, FieldType.Status, FieldQoS.AutomaticReadout,
                                             typeof(Controller).Namespace, 15));

                    Fields.Add(new EnumField(this, Now, "Drive Mode", this.pin.GetDriveMode(), FieldType.Status, FieldQoS.AutomaticReadout,
                                             typeof(Controller).Namespace, 16));
                }

                Request.ReportFields(true, Fields);
            }
            catch (Exception ex)
            {
                Request.ReportErrors(true, new ThingError(this, ex.Message));
            }

            return(Task.CompletedTask);
        }
コード例 #4
0
        protected void Add(List <Field> Fields, Field Field, ISensorReadout Request)
        {
            if (Fields.Count > 50)
            {
                Request.ReportFields(false, Fields.ToArray());
                Fields.Clear();
            }

            Fields.Add(Field);
        }
コード例 #5
0
ファイル: DateTimeData.cs プロジェクト: live0717/IoTGateway
 public override void StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last)
 {
     if (this.value.TimeOfDay == TimeSpan.Zero)
     {
         Request.ReportFields(Last, new DateField(ThingReference, this.timestamp, this.Append(Prefix, "Value"),
                                                  this.value, FieldType.Momentary, FieldQoS.AutomaticReadout));
     }
     else
     {
         Request.ReportFields(Last, new DateTimeField(ThingReference, this.timestamp, this.Append(Prefix, "Value"),
                                                      this.value, FieldType.Momentary, FieldQoS.AutomaticReadout));
     }
 }
コード例 #6
0
        public Task StartReadout(ISensorReadout Request)
        {
            try
            {
                RemoteDevice Device = this.Device;
                if (Device is null)
                {
                    throw new Exception("Device not ready.");
                }

                List <Field> Fields = new List <Field>();
                DateTime     Now    = DateTime.Now;

                if (!this.initialized)
                {
                    this.Initialize();
                }

                if (Request.IsIncluded(FieldType.Momentary))
                {
                    Fields.Add(new BooleanField(this, Now, "Value", Device.digitalRead(this.PinNr) == PinState.HIGH, FieldType.Momentary, FieldQoS.AutomaticReadout,
                                                typeof(Module).Namespace, 13));
                }

                if (Request.IsIncluded(FieldType.Identity))
                {
                    Fields.Add(new Int32Field(this, Now, "Pin Number", this.PinNr, FieldType.Identity, FieldQoS.AutomaticReadout,
                                              typeof(Module).Namespace, 14));

                    this.AddIdentityReadout(Fields, Now);
                }

                if (Request.IsIncluded(FieldType.Status))
                {
                    Fields.Add(new EnumField(this, Now, "Drive Mode", Device.getPinMode(this.PinNr), FieldType.Status, FieldQoS.AutomaticReadout,
                                             typeof(Module).Namespace, 15));
                }

                Request.ReportFields(true, Fields);
            }
            catch (Exception ex)
            {
                Request.ReportErrors(true, new ThingError(this, ex.Message));
            }

            return(Task.CompletedTask);
        }
コード例 #7
0
ファイル: AnalogInput.cs プロジェクト: markchipman/IoTGateway
        public void StartReadout(ISensorReadout Request)
        {
            try
            {
                RemoteDevice Device = this.Device;
                if (Device == null)
                {
                    throw new Exception("Device not ready.");
                }

                List <Field> Fields = new List <Field>();
                DateTime     Now    = DateTime.Now;

                if (!this.initialized)
                {
                    this.Initialize();
                }

                if (Request.IsIncluded(FieldType.Momentary))
                {
                    ushort Raw = Device.analogRead(this.PinNrStr);
                    this.CalcMomentary(Fields, Now, Raw);
                }

                if (Request.IsIncluded(FieldType.Status))
                {
                    Fields.Add(new EnumField(this, Now, "Drive Mode", Device.getPinMode(this.PinNr), FieldType.Status, FieldQoS.AutomaticReadout,
                                             typeof(Module).Namespace, 15));
                }

                if (Request.IsIncluded(FieldType.Identity))
                {
                    Fields.Add(new Int32Field(this, Now, "Pin Number", this.PinNr, FieldType.Identity, FieldQoS.AutomaticReadout,
                                              typeof(Module).Namespace, 14));

                    this.AddIdentityReadout(Fields, Now);
                }

                Request.ReportFields(true, Fields);
            }
            catch (Exception ex)
            {
                Request.ReportErrors(true, new ThingError(this, ex.Message));
            }
        }
コード例 #8
0
ファイル: MqttTopic.cs プロジェクト: robinreigns/IoTGateway
        public async Task StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last)
        {
            try
            {
                MqttTopic[] ChildNodes = this.GetChildNodes();

                if (ChildNodes != null && ChildNodes.Length > 0)
                {
                    foreach (MqttTopic ChildTopic in ChildNodes)
                    {
                        await ChildTopic.StartReadout(ThingReference, Request,
                                                      string.IsNullOrEmpty(Prefix)?ChildTopic.LocalTopic : Prefix + ", " + ChildTopic.LocalTopic, false);
                    }
                }

                if (this.ex != null)
                {
                    Request.ReportErrors(Last, new ThingError(ThingReference, this.exTP, this.ex.Message));
                }
                else if (this.data == null)
                {
                    if (Last)
                    {
                        Request.ReportFields(true);
                    }
                }
                else
                {
                    this.data.StartReadout(ThingReference, Request, Prefix, Last);
                }

                await this.node.RemoveErrorAsync("Readout");
            }
            catch (Exception ex)
            {
                Request.ReportErrors(Last, new ThingError(ThingReference, DateTime.Now, ex.Message));
                await this.node.LogErrorAsync("Readout", ex.Message);
            }
        }
コード例 #9
0
ファイル: StringData.cs プロジェクト: live0717/IoTGateway
 public override void StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last)
 {
     Request.ReportFields(Last, new StringField(ThingReference, this.timestamp, this.Append(Prefix, "Value"),
                                                this.value, FieldType.Momentary, FieldQoS.AutomaticReadout));
 }
コード例 #10
0
        private void AppendFields(ThingReference ThingReference, List <Field> Fields, ISensorReadout Request, object Value, string Prefix)
        {
            if (Value is Dictionary <string, object> Object)
            {
                if (string.IsNullOrEmpty(Prefix))
                {
                    foreach (KeyValuePair <string, object> P in Object)
                    {
                        this.AppendFields(ThingReference, Fields, Request, P.Value, P.Key);
                    }
                }
                else
                {
                    foreach (KeyValuePair <string, object> P in Object)
                    {
                        this.AppendFields(ThingReference, Fields, Request, P.Value, Prefix + ", " + P.Key);
                    }
                }
            }
            else if (Value is IEnumerable Array && !(Value is string))
            {
                int i = 1;

                if (string.IsNullOrEmpty(Prefix))
                {
                    foreach (object Item in Array)
                    {
                        this.AppendFields(ThingReference, Fields, Request, Item, "#" + (i++).ToString());
                    }
                }
                else
                {
                    foreach (object Item in Array)
                    {
                        this.AppendFields(ThingReference, Fields, Request, Item, Prefix + " #" + (i++).ToString());
                    }
                }
            }
コード例 #11
0
ファイル: MqttTopic.cs プロジェクト: robinreigns/IoTGateway
 public void StartReadout(ISensorReadout Request)
 {
     Task.Run(() => this.StartReadout(this.node, Request, string.Empty, true));
 }
コード例 #12
0
        public async Task StartReadout(ISensorReadout Request)
        {
            try
            {
                Log.Informational("Performing readout.", this.LogId, Request.Actor);

                List <Field> Fields = new List <Field>();
                DateTime     Now    = DateTime.Now;

                if (Request.IsIncluded(FieldType.Identity))
                {
                    Fields.Add(new StringField(this, Now, "Device ID", App.Instance.DeviceId, FieldType.Identity, FieldQoS.AutomaticReadout));
                }

                if (App.Instance.Light.HasValue)
                {
                    Fields.Add(new QuantityField(this, Now, "Light", App.Instance.Light.Value, 2, "%",
                                                 FieldType.Momentary, FieldQoS.AutomaticReadout));
                }

                if (App.Instance.Motion.HasValue)
                {
                    Fields.Add(new BooleanField(this, Now, "Motion", App.Instance.Motion.Value,
                                                FieldType.Momentary, FieldQoS.AutomaticReadout));
                }

                if (Request.IsIncluded(FieldType.Historical))
                {
                    Request.ReportFields(false, Fields);                          // Allows for immediate response of momentary values.
                    Fields.Clear();

                    foreach (LastMinute Rec in await Database.Find <LastMinute>(new FilterAnd(
                                                                                    new FilterFieldGreaterOrEqualTo("Timestamp", Request.From),
                                                                                    new FilterFieldLesserOrEqualTo("Timestamp", Request.To)),
                                                                                "Timestamp"))
                    {
                        if (Fields.Count > 50)
                        {
                            Request.ReportFields(false, Fields);
                            Fields.Clear();
                        }

                        if (Rec.AvgLight.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.Timestamp, "Light, Minute, Average",
                                                         Rec.AvgLight.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }

                        if (Rec.AvgMotion.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.Timestamp, "Motion, Minute, Average",
                                                         Rec.AvgMotion.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }

                        if (Rec.MinLight.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.MinLightAt, "Light, Minute, Minimum",
                                                         Rec.MinLight.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }

                        if (Rec.MaxLight.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.MaxLightAt, "Light, Minute, Maximum",
                                                         Rec.MaxLight.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }
                    }

                    if (Fields.Count > 0)
                    {
                        Request.ReportFields(false, Fields);
                        Fields.Clear();
                    }

                    foreach (LastHour Rec in await Database.Find <LastHour>(new FilterAnd(
                                                                                new FilterFieldGreaterOrEqualTo("Timestamp", Request.From),
                                                                                new FilterFieldLesserOrEqualTo("Timestamp", Request.To)),
                                                                            "Timestamp"))
                    {
                        if (Fields.Count > 50)
                        {
                            Request.ReportFields(false, Fields);
                            Fields.Clear();
                        }

                        if (Rec.AvgLight.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.Timestamp, "Light, Hour, Average",
                                                         Rec.AvgLight.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }

                        if (Rec.AvgMotion.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.Timestamp, "Motion, Hour, Average",
                                                         Rec.AvgMotion.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }

                        if (Rec.MinLight.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.MinLightAt, "Light, Hour, Minimum",
                                                         Rec.MinLight.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }

                        if (Rec.MaxLight.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.MaxLightAt, "Light, Hour, Maximum",
                                                         Rec.MaxLight.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }
                    }

                    foreach (LastDay Rec in await Database.Find <LastDay>(new FilterAnd(
                                                                              new FilterFieldGreaterOrEqualTo("Timestamp", Request.From),
                                                                              new FilterFieldLesserOrEqualTo("Timestamp", Request.To)),
                                                                          "Timestamp"))
                    {
                        if (Fields.Count > 50)
                        {
                            Request.ReportFields(false, Fields);
                            Fields.Clear();
                        }

                        if (Rec.AvgLight.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.Timestamp, "Light, Day, Average",
                                                         Rec.AvgLight.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }

                        if (Rec.AvgMotion.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.Timestamp, "Motion, Day, Average",
                                                         Rec.AvgMotion.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }

                        if (Rec.MinLight.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.MinLightAt, "Light, Day, Minimum",
                                                         Rec.MinLight.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }

                        if (Rec.MaxLight.HasValue)
                        {
                            Fields.Add(new QuantityField(this, Rec.MaxLightAt, "Light, Day, Maximum",
                                                         Rec.MaxLight.Value, 2, "%", FieldType.Computed | FieldType.Historical, FieldQoS.AutomaticReadout));
                        }
                    }
                }

                Request.ReportFields(true, Fields);
            }
            catch (Exception ex)
            {
                Request.ReportErrors(true, new ThingError(this, ex.Message));
            }
        }
コード例 #13
0
 public abstract void StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last);
コード例 #14
0
ファイル: XmlData.cs プロジェクト: robinreigns/IoTGateway
        private void AppendFields(ThingReference ThingReference, List <Field> Fields, ISensorReadout Request, XmlElement Value, string Prefix)
        {
            foreach (XmlAttribute Attribute in Value.Attributes)
            {
                if (string.IsNullOrEmpty(Prefix))
                {
                    this.Add(ThingReference, Fields, Attribute.Name, Attribute.Value, Request);
                }
                else
                {
                    this.Add(ThingReference, Fields, this.Append(Prefix, Attribute.Name), Attribute.Value, Request);
                }
            }

            Dictionary <string, int> Repetitions = null;
            string s;

            foreach (XmlNode N in Value)
            {
                if (N is XmlElement ChildElement)
                {
                    s = ChildElement.LocalName;

                    if (Repetitions == null)
                    {
                        Repetitions = new Dictionary <string, int>();
                    }

                    if (Repetitions.TryGetValue(s, out int i))
                    {
                        Repetitions[s] = i - 1;
                    }
                    else
                    {
                        Repetitions[s] = 0;
                    }
                }
            }

            foreach (XmlNode N in Value)
            {
                if (N is XmlElement ChildElement)
                {
                    s = ChildElement.LocalName;

                    if (Repetitions.TryGetValue(s, out int i))
                    {
                        if (i < 0)
                        {
                            Repetitions[s] = i = 1;
                        }
                        else if (i > 0)
                        {
                            Repetitions[s] = ++i;
                        }

                        if (i != 0)
                        {
                            s += ", #" + i.ToString();
                        }
                    }

                    if (string.IsNullOrEmpty(Prefix))
                    {
                        this.AppendFields(ThingReference, Fields, Request, ChildElement, s);
                    }
                    else
                    {
                        this.AppendFields(ThingReference, Fields, Request, ChildElement, Prefix + ", " + s);
                    }
                }
                else if (N is XmlText XmlText)
                {
                    if (string.IsNullOrEmpty(Prefix))
                    {
                        this.Add(ThingReference, Fields, "Value", XmlText.InnerText, Request);
                    }
                    else
                    {
                        this.Add(ThingReference, Fields, Prefix, XmlText.InnerText, Request);
                    }
                }
            }
        }
コード例 #15
0
ファイル: XmlData.cs プロジェクト: robinreigns/IoTGateway
 private void Add(ThingReference ThingReference, List <Field> Fields, string Name, string Value, ISensorReadout Request)
 {
     if (int.TryParse(Value, out int i))
     {
         this.Add(Fields, new Int32Field(ThingReference, this.timestamp, Name, i, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
     }
     else if (long.TryParse(Value, out long l))
     {
         this.Add(Fields, new Int64Field(ThingReference, this.timestamp, Name, l, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
     }
     else if (CommonTypes.TryParse(Value, out bool b))
     {
         this.Add(Fields, new BooleanField(ThingReference, this.timestamp, Name, b, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
     }
     else if (CommonTypes.TryParse(Value, out double d, out byte NrDec))
     {
         this.Add(Fields, new QuantityField(ThingReference, this.timestamp, Name, d, NrDec, string.Empty, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
     }
コード例 #16
0
        public async void StartReadout(ISensorReadout Request)
        {
            try
            {
                Ping Icmp = new Ping();

                PingReply Response = await Icmp.SendPingAsync(this.host, 10000, data, options);

                DateTime Now    = DateTime.Now;
                string   Module = typeof(IpHost).Namespace;

                if (Response.Status == IPStatus.Success)
                {
                    List <Field> Fields = new List <Field>()
                    {
                        new QuantityField(this, Now, "Ping", Response.RoundtripTime, 0, "ms", FieldType.Momentary, FieldQoS.AutomaticReadout, Module, 7)
                    };

                    if (Request.IsIncluded(FieldType.Identity))
                    {
                        Fields.Add(new StringField(this, Now, "IP Address", Response.Address.ToString(), FieldType.Identity, FieldQoS.AutomaticReadout, Module, 8));
                        this.AddIdentityReadout(Fields, Now);
                    }

                    Request.ReportFields(true, Fields);
                }
                else
                {
                    switch (Response.Status)
                    {
                    case IPStatus.BadDestination:
                        Request.ReportErrors(true, new ThingError(this, Now, "Bad destination"));
                        break;

                    case IPStatus.BadHeader:
                        Request.ReportErrors(true, new ThingError(this, Now, "Bad header"));
                        break;

                    case IPStatus.BadOption:
                        Request.ReportErrors(true, new ThingError(this, Now, "Bad option"));
                        break;

                    case IPStatus.BadRoute:
                        Request.ReportErrors(true, new ThingError(this, Now, "Bad route"));
                        break;

                    case IPStatus.DestinationHostUnreachable:
                        Request.ReportErrors(true, new ThingError(this, Now, "Destination host unreachable"));
                        break;

                    case IPStatus.DestinationNetworkUnreachable:
                        Request.ReportErrors(true, new ThingError(this, Now, "Destination network unreachable"));
                        break;

                    case IPStatus.DestinationPortUnreachable:
                        Request.ReportErrors(true, new ThingError(this, Now, "Destination port unreachable"));
                        break;

                    case IPStatus.DestinationProhibited:
                        Request.ReportErrors(true, new ThingError(this, Now, "Destination prohibited"));
                        break;

                    /*
                     * case IPStatus.DestinationProtocolUnreachable:
                     * Request.ReportErrors(true, new ThingError(this, Now, "Destination protocol unreachable"));
                     * break;
                     */
                    case IPStatus.DestinationScopeMismatch:
                        Request.ReportErrors(true, new ThingError(this, Now, "Destination scope mismatch"));
                        break;

                    case IPStatus.DestinationUnreachable:
                        Request.ReportErrors(true, new ThingError(this, Now, "Destination unreachable"));
                        break;

                    case IPStatus.HardwareError:
                        Request.ReportErrors(true, new ThingError(this, Now, "Hardware error"));
                        break;

                    case IPStatus.IcmpError:
                        Request.ReportErrors(true, new ThingError(this, Now, "ICMP error"));
                        break;

                    case IPStatus.NoResources:
                        Request.ReportErrors(true, new ThingError(this, Now, "No resources"));
                        break;

                    case IPStatus.PacketTooBig:
                        Request.ReportErrors(true, new ThingError(this, Now, "Packet too big"));
                        break;

                    case IPStatus.ParameterProblem:
                        Request.ReportErrors(true, new ThingError(this, Now, "Parameter problem"));
                        break;

                    case IPStatus.SourceQuench:
                        Request.ReportErrors(true, new ThingError(this, Now, "Source quench"));
                        break;

                    case IPStatus.TimedOut:
                        Request.ReportErrors(true, new ThingError(this, Now, "Timed out"));
                        break;

                    case IPStatus.TimeExceeded:
                        Request.ReportErrors(true, new ThingError(this, Now, "Time exceeded"));
                        break;

                    case IPStatus.TtlExpired:
                        Request.ReportErrors(true, new ThingError(this, Now, "TTL expired"));
                        break;

                    case IPStatus.TtlReassemblyTimeExceeded:
                        Request.ReportErrors(true, new ThingError(this, Now, "TTL reassembly time exceeded"));
                        break;

                    case IPStatus.UnrecognizedNextHeader:
                        Request.ReportErrors(true, new ThingError(this, Now, "Unrecognized next header"));
                        break;

                    case IPStatus.Unknown:
                    default:
                        Request.ReportErrors(true, new ThingError(this, Now, "Unknown error"));
                        break;
                    }
                }
            }
            catch (PingException ex)
            {
                if (ex.InnerException != null)
                {
                    Request.ReportErrors(true, new ThingError(this, ex.InnerException.Message));
                }
                else
                {
                    Request.ReportErrors(true, new ThingError(this, ex.Message));
                }
            }
            catch (Exception ex)
            {
                Request.ReportErrors(true, new ThingError(this, ex.Message));
            }
        }