Розклад та автоматизація IoT-пристроїв через мобільний додаток
Розклад для IoT-пристрою — «включити світло в 07:00, вимкнути в 23:00 по рабочим дням». Автоматизація складніше: «якщо температура упала нижче +18°C і час між 22:00 та 08:00 — включити обігрівач». Обі задачі вирішуються на рівні бекенду, але мобільний додаток має надати UI для їх створення та редагування без інструкції.
Розклад: модель даних та UI
Типовий Schedule:
{
"device_id": "abc123",
"action": "turn_on",
"days_of_week": [1, 2, 3, 4, 5],
"time": "07:00",
"timezone": "Europe/Moscow",
"enabled": true
}
Часовой пояс — обов'язкове поле. Без нього розклад сработає неправильно після перелету або при користувачах з різних регіонів. Зберігайте на сервері у UTC, конвертуйте при відображенні у timezone пристрою/користувача.
UI вибору часу на Android Compose — Material3 TimePicker або TimePickerDialog. Вибір днів тижня — горизонтальний ряд чипів з множественним вибором:
val days = listOf("Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс")
var selectedDays by remember { mutableStateOf(setOf<Int>()) }
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
days.forEachIndexed { index, label ->
FilterChip(
selected = index + 1 in selectedDays,
onClick = {
selectedDays = if (index + 1 in selectedDays)
selectedDays - (index + 1)
else
selectedDays + (index + 1)
},
label = { Text(label) }
)
}
}
Список розкладів — LazyColumn з можливістю включити/вимкнути кожний через Switch без відкриття редактора. PATCH-запит лише поля enabled = false — не весь об'єкт.
Автоматизації: модель умов та дій
Автоматизації будуються за моделлю ECA (Event-Condition-Action):
- Event (триггер): значення датчика перетнуло поріг, наступив час, пристрій змінив статус
- Condition (умова): поточний час у діапазоні, інший пристрій онлайн
- Action (дія): відправити команду пристрою, відправити повідомлення, викликати webhook
Зберігайте як JSON на сервері:
{
"trigger": {
"type": "sensor_value",
"device_id": "temp_sensor_1",
"parameter": "temperature",
"operator": "lt",
"value": 18
},
"conditions": [
{
"type": "time_range",
"from": "22:00",
"to": "08:00"
}
],
"actions": [
{
"type": "device_command",
"device_id": "heater_1",
"command": "turn_on"
}
]
}
Виконання логіки — на сервері. Мобільний додаток лише створює та редагує автоматизації.
UI конструктора автоматизаційnull
Drag-and-drop конструктор — складно та надмірно для більшості сценаріїв. Простіше: пошаговий wizard.
Крок 1 — Триггер. Вибір пристрою → вибір параметра → умова (більше/менше/дорівнює) → значення. Або вибір «По розкладу».
Крок 2 — Умови (опціонально). «Додати умову» → вибір типу (час, день тижня, статус іншого пристрою).
Крок 3 — Дія. Вибір пристрою → вибір команди. Можливість додати кілька дій.
Крок 4 — Назва та збереження.
Кожен крок валідується окремо. Не можна перейти до наступного без заповнення обов'язкових полів — показувати inline помилку, не блокувати весь додаток.
Список автоматизаційn та відладка
Користувач створює автоматизацію та не розуміє, чому вона не спрацювала. Лог виконання — обов'язкова фіча. Кожен тригер → запис у історію: спрацював/не спрацював, чому, яка дія була виконана.
14:32 · Температура упала до 16.8°C
✓ Умова: час 22:00–08:00 — не виконана (зараз 14:32)
✗ Автоматизація не спрацювала
Такий лог зменшує кількість звернень у підтримку в рази.
Конфлікти розкладів
Два розклади на один пристрій можуть конфліктувати: перший включає в 07:00, другий вимикає в 07:30, третій включає в 07:15. На сервері потрібна логіка розв'язання конфліктів — остання за часом команда побеждает. У UI — попередження при створенні пересічних розкладів.
Реалізація розкладів з пошаговим wizard: 3–4 тижні. Повний конструктор автоматизаційn з умовами та логом виконання: 6–8 тижнів. Стоимость рассчитывается индивидуально.







