Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
        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));
            }
        }
Ejemplo n.º 5
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));
            }
        }
Ejemplo n.º 6
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));
            }
        }