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()); }
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); }
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); }
protected void Add(List <Field> Fields, Field Field, ISensorReadout Request) { if (Fields.Count > 50) { Request.ReportFields(false, Fields.ToArray()); Fields.Clear(); } Fields.Add(Field); }
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)); } }
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(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 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)); }
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()); } } }
public void StartReadout(ISensorReadout Request) { Task.Run(() => this.StartReadout(this.node, Request, string.Empty, true)); }
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 abstract void StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last);
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); } } } }
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); }
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)); } }