3using System.Threading.Tasks;
22 private readonly
INode node;
23 private readonly
string action;
46 if (!(this.node is
ISensor Sensor))
51 foreach (
string Part
in this.action.Split(
' '))
53 switch (Part.Trim().ToLower())
84 FieldTypes |=
FieldType.AllExceptHistorical;
93 int TimestampIndex = 0;
104 Dictionary<DateTime, TimestampRec> TimestampNodes =
new Dictionary<DateTime, TimestampRec>();
108 DateTime Timestamp = DateTime.MinValue;
109 TimestampRec TimestampRec =
null;
111 TaskCompletionSource<bool> ReadoutCompleted =
new TaskCompletionSource<bool>();
116 foreach (
Field F
in e.Fields)
118 if (TimestampRec is null || F.Timestamp != Timestamp)
120 Timestamp = F.Timestamp;
121 if (!TimestampNodes.TryGetValue(Timestamp, out TimestampRec))
123 TimestampNodes[Timestamp] = TimestampRec = new TimestampRec()
125 Node = new BlankNode(
"n" + Guid.NewGuid().ToString()),
126 Fields = new BlankNode(
"n" + Guid.NewGuid().ToString()),
130 Result.Add(Timestamps, Rdf.ListItem(++TimestampIndex), TimestampRec.Node);
131 Result.Add(TimestampRec.Node, IoTSensorData.timestamp, Timestamp);
132 Result.Add(TimestampRec.Node, IoTSensorData.fields, TimestampRec.Fields);
133 Result.Add(TimestampRec.Fields, Rdf.type, Rdf.Seq);
139 Result.Add(TimestampRec.Fields,
Rdf.
ListItem(++TimestampRec.FieldIndex), FieldNode);
141 string LocalizedName;
143 if (F.StringIdSteps is
null || F.StringIdSteps.Length == 0)
144 LocalizedName =
null;
147 Namespace BaseModule;
149 if (string.IsNullOrEmpty(F.Module))
152 BaseModule = await Language.GetNamespaceAsync(F.Module);
154 LocalizedName = await LocalizationStep.TryGetLocalization(Language, BaseModule, F.StringIdSteps);
157 if (
string.IsNullOrEmpty(LocalizedName))
159 else if (LocalizedName == F.Name)
163 Result.Add(FieldNode, RdfSchema.label, F.Name);
164 Result.Add(FieldNode, RdfSchema.label, LocalizedName, Language.Code);
169 if (F.QoS.HasFlag(
FieldQoS.Missing))
171 Result.Add(FieldNode, IoTSensorData.qos,
172 nameof(FieldQoS.Missing), IoTSensorData.qos);
175 if (F.QoS.HasFlag(
FieldQoS.InProgress))
177 Result.Add(FieldNode, IoTSensorData.qos,
178 nameof(FieldQoS.InProgress), IoTSensorData.qos);
181 if (F.QoS.HasFlag(
FieldQoS.AutomaticEstimate))
183 Result.Add(FieldNode, IoTSensorData.qos,
184 nameof(FieldQoS.AutomaticEstimate), IoTSensorData.qos);
187 if (F.QoS.HasFlag(
FieldQoS.ManualEstimate))
189 Result.Add(FieldNode, IoTSensorData.qos,
190 nameof(FieldQoS.ManualEstimate), IoTSensorData.qos);
193 if (F.QoS.HasFlag(
FieldQoS.ManualReadout))
195 Result.Add(FieldNode, IoTSensorData.qos,
196 nameof(FieldQoS.ManualReadout), IoTSensorData.qos);
199 if (F.QoS.HasFlag(
FieldQoS.AutomaticReadout))
201 Result.Add(FieldNode, IoTSensorData.qos,
202 nameof(FieldQoS.AutomaticReadout), IoTSensorData.qos);
205 if (F.QoS.HasFlag(
FieldQoS.TimeOffset))
207 Result.Add(FieldNode, IoTSensorData.qos,
208 nameof(FieldQoS.TimeOffset), IoTSensorData.qos);
211 if (F.QoS.HasFlag(
FieldQoS.Warning))
213 Result.Add(FieldNode, IoTSensorData.qos,
214 nameof(FieldQoS.Warning), IoTSensorData.qos);
219 Result.Add(FieldNode, IoTSensorData.qos,
220 nameof(FieldQoS.Error), IoTSensorData.qos);
225 Result.Add(FieldNode, IoTSensorData.qos,
226 nameof(FieldQoS.Signed), IoTSensorData.qos);
229 if (F.QoS.HasFlag(
FieldQoS.Invoiced))
231 Result.Add(FieldNode, IoTSensorData.qos,
232 nameof(FieldQoS.Invoiced), IoTSensorData.qos);
235 if (F.QoS.HasFlag(
FieldQoS.EndOfSeries))
237 Result.Add(FieldNode, IoTSensorData.qos,
238 nameof(FieldQoS.EndOfSeries), IoTSensorData.qos);
241 if (F.QoS.HasFlag(
FieldQoS.PowerFailure))
243 Result.Add(FieldNode, IoTSensorData.qos,
244 nameof(FieldQoS.PowerFailure), IoTSensorData.qos);
247 if (F.QoS.HasFlag(
FieldQoS.InvoiceConfirmed))
249 Result.Add(FieldNode, IoTSensorData.qos,
250 nameof(FieldQoS.InvoiceConfirmed), IoTSensorData.qos);
257 Result.Add(FieldNode, Rdf.type,
258 nameof(FieldType.Momentary), IoTSensorData.fieldType);
263 Result.Add(FieldNode, Rdf.type,
264 nameof(FieldType.Identity), IoTSensorData.fieldType);
269 Result.Add(FieldNode, Rdf.type,
270 nameof(FieldType.Status), IoTSensorData.fieldType);
275 Result.Add(FieldNode, Rdf.type,
276 nameof(FieldType.Computed), IoTSensorData.fieldType);
281 Result.Add(FieldNode, Rdf.type,
282 nameof(FieldType.Peak), IoTSensorData.fieldType);
285 if (F.Type.HasFlag(
FieldType.Historical))
287 Result.Add(FieldNode, Rdf.type,
288 nameof(FieldType.Historical), IoTSensorData.fieldType);
293 ReadoutCompleted.TrySetResult(
true);
301 Result.Add(Errors,
Rdf.
ListItem(++ErrorIndex), ErrorNode);
305 if (!
string.IsNullOrEmpty(Error.
NodeId))
308 if (!
string.IsNullOrEmpty(Error.
SourceId))
311 if (!
string.IsNullOrEmpty(Error.
Partition))
316 ReadoutCompleted.TrySetResult(
true);
318 return Task.CompletedTask;
321 Task Timeout = Task.Delay(60000);
322 Task T = await Task.WhenAny(ReadoutCompleted.Task, Timeout);
324 if (!ReadoutCompleted.Task.IsCompleted)
328 Result.Add(Errors,
Rdf.
ListItem(++ErrorIndex), ErrorNode);
334 private class TimestampRec
338 public int FieldIndex;
static readonly Uri Seq
URI representing rdf:Seq, an ordered container.
static readonly Uri type
URI representing rdf:type
static Uri ListItem(int Index)
URI representing an item in a list.
static readonly Uri label
http://www.w3.org/2000/01/rdf-schema#label
Static class managing the runtime environment of the IoT Gateway.
static ConcentratorServer ConcentratorServer
XMPP Concentrator Server.
The server understood the request, but is refusing to fulfill it. Authorization will not help and the...
Contains information about what sensor data readout parameters have been approved.
FieldType FieldTypes
Approved types to read.
string[] FieldNames
Approved field names to read.
IThingReference[] Nodes
Approved nodes to read.
Manages a chat sensor data readout request.
Contains information about a language.
string Code
Language code.
Tokens available in request.
IoT Concentrator Ontology
static readonly Uri isControllable
urn:nf:iot:concentrator:1.0:isControllable
static readonly Uri sourceId
urn:nf:iot:concentrator:1.0:sourceId
static readonly Uri partition
urn:nf:iot:concentrator:1.0:partition
static readonly Uri nodeId
urn:nf:iot:concentrator:1.0:nodeId
static readonly Uri timestamp
urn:nf:iot:sd:1.0:timestamp
static readonly Uri timestamps
urn:nf:iot:sd:1.0:timestamps
static readonly Uri value
urn:nf:iot:concentrator:1.0:value
static readonly Uri errors
urn:nf:iot:sd:1.0:errros
Makes harmonized data sources and nodes available as semantic information.
static Uri GetNodeUri(INode Node)
Gets the Graph URI for a node.
Dynamic graph of a node node action.
NodeReadActionGraph(INode Node, string Action)
Dynamic graph of a node node action.
async Task GenerateGraph(InMemorySemanticCube Result, Language Language, RequestOrigin Caller)
Generates the semantic graph.
Base class for all sensor data fields.
Contains information about an error on a thing
DateTime Timestamp
Timestamp of error.
string ErrorMessage
Error message.
string Partition
Optional partition in which the Node ID is unique.
string SourceId
Optional ID of source containing node.
Interface for nodes that are published through the concentrator interface.
Interface for sensor nodes.
Interface for thing references.
Interface for dynamic graphs.
FieldQoS
Field Quality of Service flags
FieldType
Field Type flags