У многих дома стоят счётчики воды с импульсным выходом — это два проводка, которые «щёлкают» при прохождении определённого объёма воды (например, 1 литр). Зачем они? Чтобы можно было считывать расход автоматически. Но как из этого сделать что-то полезное — особенно если у тебя своя система на PHP?
Разберём всё по шагам: от железа до mos.ru.
1. Что за провод у счётчика?
Это импульсный выход. Обычно:
- Замыкается контакт каждые N литров (чаще всего 1 имп. = 1 л или 10 л).
- Не Zigbee, не Wi-Fi — просто электрический сигнал.
- Чтобы его «прочитать», нужен микроконтроллер (например, ESP32).
2. Собираем «умный» узел на ESP32
ESP32 — идеален: есть Wi-Fi, GPIO, питание от USB, стоит ~300–500 руб.
Подключение:
- Провод счётчика → GPIO4 (через резистор 10 кОм, если не сухой контакт)
- GND → GND
Код для ESP32 (Arduino IDE):
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "ТВОЙ_SSID";
const char* password = "ТВОЙ_ПАРОЛЬ";
const char* url = "http://твой-сайт.ру/water_meter.php";
const int pulsePin = 4;
volatile unsigned long pulseCount = 0;
unsigned long lastSent = 0;
const float litersPerPulse = 1.0; // Уточни в паспорте счётчика!
void IRAM_ATTR onPulse() {
pulseCount++;
}
void setup() {
Serial.begin(115200);
pinMode(pulsePin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(pulsePin), onPulse, FALLING);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
}
void loop() {
if (millis() - lastSent > 60000) { // раз в минуту
HTTPClient http;
String fullUrl = String(url) + "?counter=hot&liters=" + String(pulseCount * litersPerPulse);
http.begin(fullUrl);
int code = http.GET();
http.end();
if (code == 200) Serial.println("Отправлено");
lastSent = millis();
}
}
3. Приём данных на своём сайте (PHP)
Создай файл water_meter.php:
<?php
$counter = $_GET['counter'] ?? 'unknown';
$liters = $_GET['liters'] ?? null;
if ($liters === null) die('Нет данных');
$pdo = new PDO("mysql:host=localhost;dbname=ваша_бд", "юзер", "пароль");
$stmt = $pdo->prepare("
INSERT INTO water_meters (counter_type, total_liters, updated_at)
VALUES (?, ?, NOW())
ON DUPLICATE KEY UPDATE total_liters = VALUES(total_liters)
");
$stmt->execute([$counter, $liters]);
echo "OK";
?>
И таблицу в БД:
CREATE TABLE water_meters (
counter_type VARCHAR(20) PRIMARY KEY,
total_liters FLOAT NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Теперь на главной странице можно выводить:
$meters = $pdo->query("SELECT * FROM water_meters")->fetchAll(PDO::FETCH_KEY_PAIR);
echo "Горячая: {$meters['hot']} л";
4. А можно ли отправлять сразу на mos.ru?
Краткий ответ: нет, нельзя напрямую.
Сервисы вроде mos.ru, Госуслуги или ЖКХ-порталы:
- Не предоставляют открытый API для передачи показаний.
- Требуют авторизацию через Госуслуги (OAuth2 + CAPTCHA + подтверждение по SMS).
- Часто используют сложные JavaScript-формы и защиту от ботов.
Технически можно попробовать эмулировать браузер (например, через Puppeteer), но:
- Это хрупко — сайт обновится, и скрипт сломается.
- Нарушает правила использования (может привести к блокировке).
- Требует хранения логина/пароля — небезопасно.
Вывод: автоматическая отправка в госсистемы — плохая идея. Лучше:
- Собирать данные у себя.
- Раз в месяц вручную копировать с сайта и отправлять на mos.ru.
- Или использовать официальные мобильные приложения (они иногда позволяют сканировать QR-код со счётчика).
5. Альтернативы: готовые сервисы?
Есть коммерческие решения:
- «Счётчик Онлайн», «Умный Дом ЖКХ» — но они платные и редко интегрируются с самописными системами.
- Home Assistant + MQTT — мощно, но избыточно, если у тебя уже есть PHP-бэкенд.
Поэтому — самописный HTTP-подход самый практичный.
Итог
- Провод от счётчика → ESP32 → HTTP → твой PHP → база → сайт.
- Автоматизация внутри своего домена — легко и надёжно.
- Интеграция с mos.ru — невозможна без ручного вмешательства.
Зато теперь у тебя всегда под рукой актуальные показания — и никаких штрафов за просрочку!
Комментарии
Пока нет комментариев. Будьте первым!