Реалізація AI-детекції аномалій IoT-датчиків у мобільному додатку
Порог-алерт «якщо температура > 80°C» спрацьовує пізно: до моменту перевищення порога проблема уже сформувалась. Аномалія — це відхилення від нормального паттерну, яке може бути помітно за години або дні до досягнення критичного значення. Мотор, який зазвичай розігрівається до 45°C за 20 хвилин, сьогодні розігрівається до 45°C за 8 хвилин — це аномалія, хоча температура в нормі.
Алгоритми: що застосовно в мобільному контексті
Для IoT-аномалій у реальному часі на мобільному пристрої потрібні алгоритми з малим споживанням пам'яті та швидким інференсом. Не все, що працює в Jupyter Notebook з повним датасетом, годиться для онлайн-детекції.
Z-score з адаптивним baseline. Не фіксований mean/std за весь період, а ковзаюче вікно (Exponentially Weighted Moving Average). Працює на пристрої без моделі:
class EWMAnomalyDetector(
private val alpha: Double = 0.1, // коефіцієнт згладжування
private val threshold: Double = 3.0 // кількість сигм
) {
private var ewma: Double? = null
private var ewmVar: Double = 0.0
fun detect(value: Double): AnomalyResult {
val mean = ewma ?: run { ewma = value; return AnomalyResult.Normal(value, 0.0) }
val deviation = value - mean
ewmVar = alpha * deviation * deviation + (1 - alpha) * ewmVar
val sigma = sqrt(ewmVar).coerceAtLeast(1e-9)
val zScore = abs(deviation) / sigma
ewma = alpha * value + (1 - alpha) * mean
return if (zScore > threshold) {
AnomalyResult.Anomaly(value, zScore, deviation > 0)
} else {
AnomalyResult.Normal(value, zScore)
}
}
}
Isolation Forest. Навчається офлайн, інференс швидкий. Для багатовимірних даних (кілька датчиків одночасно) — найкращий варіант без нейросетей. Модель конвертується в TFLite через ONNX або через sklearn2pmml + кастомний конвертор.
LSTM Autoencoder. Найкращий для часових рядів з паттернами (добова цикличність споживання, виробничі зміни). Навчається відновлювати нормальні послідовності; висока reconstruction error = аномалія. На пристрої — TFLite LSTM операції з квантизацією int8 для зниження споживання пам'яті з ~15 МБ до ~4 МБ.
// iOS: LSTM Autoencoder інференс через Core ML
class LSTMAnomalyDetector {
let model: SensorAnomalyDetector // сгенерований Core ML клас
private let windowSize = 60 // 60 семплів = 1 хвилина при 1 Гц
private var buffer: [[Double]] = []
func process(reading: SensorReading) -> AnomalyScore? {
buffer.append(reading.toFeatureVector())
guard buffer.count >= windowSize else { return nil }
let window = Array(buffer.suffix(windowSize))
let input = try? MLMultiArray(shape: [1, NSNumber(value: windowSize), NSNumber(value: reading.dimensions)],
dataType: .double)
// заповнюємо input...
guard let prediction = try? model.prediction(input: input!),
let reconstructed = prediction.output as? MLMultiArray else { return nil }
let mse = computeMSE(original: window, reconstructed: reconstructed)
buffer.removeFirst() // sliding window
return AnomalyScore(mse: mse, isAnomaly: mse > model.threshold)
}
}
Багаторівнева детекція: пристрій + сервер
Оптимальна архітектура — двохрівнева. На пристрої: легкий EWMA або простий пороговий детектор для миттєвої реакції (< 100 мс). На сервері: тяжка модель (Isolation Forest, LSTM AE) з повним історичним контекстом для точної класифікації.
Мобільний додаток отримує події обох рівнів:
- Пристрій → прямий локальний пуш, якщо додаток запущено
- Сервер → FCM/APNs з підтвердженою аномалією та класифікацією
@Serializable
data class AnomalyEvent(
val sensorId: String,
val sensorName: String,
val timestamp: Long,
val value: Double,
val baseline: Double,
val deviationPercent: Double,
val anomalyType: AnomalyType, // SPIKE, DRIFT, PATTERN_BREAK, FLATLINE
val severity: Severity, // LOW, MEDIUM, HIGH, CRITICAL
val possibleCause: String? // заповнюється сервером через LLM
)
Аналітика аномалій: паттерни та кластеризація
Одинока аномалія може бути випадковим викидом. Систематичні аномалії за розписанням — проблема. Екран аналітики показує:
- Heatmap аномалій по датчикам та часу доби
- Кластери аномалій за типом (DBSCAN на серверній стороні)
- Кореляції між датчиками: «аномалії на датчику T-3 завжди передують аномаліям на P-7 через 15 хвилин»
Ці інсайти з'являються тільки при накопленні даних за кілька тижнів — важливо одразу закладати зберігання всіх аномалій з контекстом.
Управління ложними срабатуваннями
Перша претензія до системи детекції аномалій: «занадто багато ложних алертів». Інструменти управління:
- Feedback loop: кнопка «Це нормально» на карточці аномалії — відправляє negative sample, сервер враховує при дообученні
- Suppressions: «не сигналізувати по датчику T-5 з 06:00 до 08:00 — це плановий прогрів»
- Confidence threshold: показувати тільки аномалії з confidence > 0.8
Розробка модуля детекції аномалій для мобільного IoT-додатку з двохрівневою архітектурою та feedback loop: 5–8 тижнів. Стоимість розраховується індивідуально.







