MQTT, Zigbee, PHP, MySQL. Без YAML. Только сценарии.
🔧 Система: что есть
- Датчики: DHT22 (T, RH), MH-Z19B (CO₂), датчик открытия ворот, датчик протечки, Zigbee-кнопка
- Исполнительные: Вентиляторы (приток/вытяжка), сервоприводы (байпас, пассивный клапан), фильтр (HEPA+уголь)
- MQTT топики:
- garage/sensor/temperature
- garage/sensor/humidity
- garage/sensor/co2
- garage/door/state
- outside/air_quality_pm25
- outside/weather/temp
- API: OpenWeatherMap, AQICN (через PHP-запросы раз в 10 мин)
- Режимы: passive, filtered, recuperation, bypass, emergency
📌 Сценарий 1: Пассивная вентиляция (самотёк)
Условия включения:
- Разница T_гараж - T_улица > 15 °C
- PM2.5 < 25 µg/m³
- CO₂ < 800 ppm
- Ворота закрыты
- Нет дождя (по API)
Действия:
- MQTT:
garage/vent/mode → passive
- Открыть пассивный клапан:
servo/passive_damper → 100
- Закрыть байпас:
servo/bypass_damper → 0
- Выключить все вентиляторы:
fan/intake → off
, fan/exhaust → off
Частота проверки: каждые 10 минут
📌 Сценарий 2: Фильтрация (загрязнение воздуха)
Условия включения:
- PM2.5 > 35 µg/m³ (из API)
- ИЛИ дым на улице (по API или ручной сигнал)
- ИЛИ пожар в регионе (wildfire_alert = 1)
Действия:
- MQTT:
garage/vent/mode → filtered
- Закрыть пассивный клапан:
servo/passive_damper → 0
- Включить фильтр:
filter/hepa → on
- Включить приток:
fan/intake → on
(50%)
- Включить вытяжку:
fan/exhaust → on
(50%)
Выключение: когда PM2.5 < 20 и прошло 30 мин
📌 Сценарий 3: Рекуперация (зима, тепло)
Условия включения:
- T_улица < +5 °C
- CO₂ > 900 ppm
- Ворота закрыты
- Нет обмерзания (нет конденсата на дренаже ИЛИ T_выхода > -2 °C)
Действия:
- MQTT:
garage/vent/mode → recuperation
- Открыть рекуператор:
servo/bypass_damper → 0
- Включить вентиляторы:
fan/intake → on
, fan/exhaust → on
(60–80%)
- Проверять каждые 5 мин: если дренаж = "протечка" → перейти в bypass
📌 Сценарий 4: Байпас (обход рекуператора)
Условия включения:
- Ворота открыты
- ИЛИ обмерзание (конденсат + T < -15 °C)
- ИЛИ CO₂ > 1200 ppm (нужна быстрая вентиляция)
Действия:
- MQTT:
garage/vent/mode → bypass
- Открыть байпас:
servo/bypass_damper → 100
- Включить вытяжку на 100%
- Выключить приток (или включить на 30%, если нужно)
Вернуться в recuperation: если ворота закрыты, T_гараж - T_улица > 10 °C, нет льда
📌 Сценарий 5: Аварийный режим (CO₂, дым, взрыв)
Условия включения:
- CO₂ > 1500 ppm
- ИЛИ smoke_inside = 1
- ИЛИ button_emergency = 1 (кнопка на стене)
Действия:
- MQTT:
garage/vent/mode → emergency
- Открыть байпас: 100%
- Включить все вентиляторы: 100%
- Включить свет в гараже
- Отправить в Telegram: "АВАРИЯ: высокий CO₂ или дым!"
- Через 5 мин: если CO₂ < 800 → вернуться в предыдущий режим
📌 Сценарий 6: Летний режим (охлаждение от земли)
Условия включения:
- T_гараж > T_улица + 8 °C
- Влажность < 70%
Действия:
- MQTT:
garage/vent/mode → ground_cooling
- Переключить приток на земляной теплообменник
- Включить приток и вытяжку на 70%
- Открыть вентиляцию в подвале
📌 Сценарий 7: Ночной режим (тихий, экономный)
Условия: 22:00 – 07:00 И нет движения
Действия:
- Если CO₂ < 900 → перейти в passive или off
- Если CO₂ > 900 → включить filtered на 30%
- Отключить все звуки и уведомления (кроме emergency)
⚙️ Как проверять условия (PHP-логика)
Пример псевдокода:
// Каждые 5–10 минут
$co2 = mqtt_get('garage/sensor/co2');
$pm25 = api_get('https://api.waqi.info/...');
$temp_diff = $inside_temp - $outside_temp;
$door_open = mqtt_get('garage/door/state');
if ($pm25 > 35) {
set_mode('filtered');
} elseif ($temp_diff > 15 && $pm25 < 25 && $door_open == 'off') {
set_mode('passive');
} elseif ($outside_temp < 5 && $co2 > 900) {
set_mode('recuperation');
}
// ... и так далее
💾 Режимы в MySQL (пример таблицы)
CREATE TABLE vent_modes (
id INT AUTO_INCREMENT PRIMARY KEY,
mode VARCHAR(20), -- passive, filtered, recuperation...
activated_at DATETIME,
reason TEXT -- "high PM2.5", "temp diff >15"
);
Комментарии
Пока нет комментариев. Будьте первым!