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); }
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); } }
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); }
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)); } }
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)); } }
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)); } }