MQTTspB exercices and configuration
Tutorials → Tutorial | MQTT | How-to Guide | MQTT Tools Reference
Info | ||
---|---|---|
| ||
If you are creating tags manually, instead of mapping directly from the Data Explorer, It is important to note that when using MQTT SpB, all the tag must be in a structure. It means that you need to create a user type and use the root level of the user type in the communication. |
Edge AI with ML.NET (Tutorial) demonstrates using ML.NET 4.0 for real-time anomaly detection on sensor data using Script Tasks.
Prerequisites:
Table of Contents maxLevel 2 minLevel 2 indent 10px exclude Steps style none
Scripts → Tutorial | Concept | How-to Guide | Reference
Tag.SensorValue
(Double) - Current readingTag.AnomalyScore
(Double) - Detection scoreTag.IsAnomaly
(Boolean) - Alert flagTag.Threshold
(Double) - Detection threshold (default: 0.3)AnomalyDetector
csharp
// Simple spike detection using ML.NET
using Microsoft.ML;
using Microsoft.ML.Data;
// Static ML context (initialized once)
if (@Tag.MLContext == null)
{
@Tag.MLContext = new MLContext(seed: 0);
@Tag.DetectionEngine = InitializeDetector();
}
// Data class for ML model
public class SensorData
{
public float Value { get; set; }
}
public class AnomalyPrediction
{
[VectorType(3)]
public double[] Prediction { get; set; }
}
// Initialize detector (runs once)
private ITransformer InitializeDetector()
{
var dataView = @Tag.MLContext.Data.LoadFromEnumerable(new List<SensorData>());
var pipeline = @Tag.MLContext.Transforms
.DetectSpikeBySsa(
outputColumnName: "Prediction",
inputColumnName: "Value",
confidence: 95,
pvalueHistoryLength: 30,
trainingWindowSize: 90,
seasonalityWindowSize: 30);
return pipeline.Fit(dataView);
}
// Detection logic (runs every second)
var currentValue = (float)@Tag.SensorValue;
var data = new SensorData { Value = currentValue };
var prediction = @Tag.DetectionEngine.Transform(
@Tag.MLContext.Data.LoadFromEnumerable(new[] { data }));
var result = @Tag.MLContext.Data
.CreateEnumerable<AnomalyPrediction>(prediction, false)
.First();
// Update tags with results
@Tag.AnomalyScore = result.Prediction[0]; // Spike score
@Tag.IsAnomaly = result.Prediction[0] > @Tag.Threshold;
// Log anomalies
if (@Tag.IsAnomaly)
{
@Alarm.GlobalSettings.AuditTrail.AddCustomMessage(
$"Anomaly detected: Sensor={currentValue:F2}, Score={result.Prediction[0]:F3}");
}
SensorSimulator
csharp
// Simulate normal sensor data with occasional spikes
Random rand = new Random();
double baseValue = 50.0;
double noise = rand.NextDouble() * 5 - 2.5;
// Inject anomaly occasionally (5% chance)
if (rand.NextDouble() < 0.05)
{
@Tag.SensorValue = baseValue + (rand.NextDouble() * 30 + 20); // Spike
}
else
{
@Tag.SensorValue = baseValue + noise; // Normal variation
}
Page Tree | ||||
---|---|---|---|---|
|