PZEM-004T Monitor - это системный сервис для мониторинга электроэнергии с помощью датчиков PZEM-004T через интерфейс UART / Modbus-RTU. Сервис предназначен для работы на embedded Linux системах (Raspberry Pi, Orange Pi, Luckfox Pico и др.). Для 3х фазного - PZEM_6L24_Systemd
- Мониторинг параметров: напряжение, ток, частота, мощность
- Минимальный период опроса 100мс, вывод предуреждения в syslog
- Пороговые значения: настраиваемые пределы с состояниями H/L/N
- Автоматическое логирование: запись данных в CSV-файлы
- Буферизация: эффективное сохранение данных с минимальным IO
- Real-time данные: передача через FIFO для других сервисов
- Автовосстановление: автоматическое переподключение при ошибках
- Гибкая конфигурация: отдельные конфиги для каждого экземпляра
- Время периода опроса учитвает реальное затраченое время на сам запрос и выполнеие всех расчетов
В каталоге /Graph_html простой HTML файл для построения графика из лог файла.
# Установка зависимостей (Debian/Ubuntu)
sudo apt update
sudo apt install build-essential libmodbus-dev
# Или для Alpine Linux
sudo apk add build-base libmodbus-dev- Клонирование или создание структуры проекта:
git clone https://github.com/akarnaukh/PZEM_004T_Systemd.git
cd ./PZEM_004T_Systemd- Размещение файлов:
src/pzem_monitor.h - заголовочный файл
src/pzem_monitor.c - основной код
config/pzem_default.conf - конфигурация по умолчанию
systemd/pzem@.service - systemd сервис
Makefile - система сборки
- Сборка проекта:
# Стандартная сборка с шаблонами
make
# Сборка с отладочной информацией
make debug
# Только создание шаблонов конфигурации
make templates- Установка в систему:
sudo make install# Полное удаление из системы
sudo make uninstall
# Логи и конфиги не удаляються автоматически
# Ручное удаление логов и конфигов
sudo rm -rf /etc/pzem
sudo rm -rf /var/log/pzem # или как указано в конфигурации- Основной конфигурационный файл создается автоматически в /etc/pzem/default.conf:
# PZEM-004T Default Configuration
# Serial port settings
tty_port = /dev/ttyS1
baudrate = 9600
slave_addr = 1
# Период опроса в мс (допустимый диапазон 50 - 10000мс)
poll_interval_ms = 500
# Logging settings
log_dir = /var/log/pzem
# Размер буфера логов в строках (1-25)
log_buffer_size = 10
# Sensitivity settings
# Чувствительность, на какие значения должны измениться данные
# Чтобы считать, что они изменились
voltage_sensitivity = 0.1
current_sensitivity = 0.001
frequency_sensitivity = 0.1
power_sensitivity = 1.0
# Voltage thresholds (0 = disabled)
# Пороговые значения, по которым выставляются статусы H, L, N
voltage_high_alarm = 245
voltage_high_warning = 240
voltage_low_warning = 210
voltage_low_alarm = 200
# Frequency thresholds (0 = disabled)
frequency_high_alarm = 52
frequency_high_warning = 51
frequency_low_warning = 49
frequency_low_alarm = 48- Создание дополнительных конфигураций:
sudo cp /etc/pzem/default.conf /etc/pzem/phase1.conf
sudo cp /etc/pzem/default.conf /etc/pzem/phase2.conf
sudo nano /etc/pzem/phase1.conf # редактирование настроек# Запуск сервиса с разными конфигурациями
sudo systemctl start pzem@default
sudo systemctl start pzem@phase1
sudo systemctl start pzem@phase2
# Автозагрузка при старте системы
sudo systemctl enable pzem@phase1
# Просмотр статуса
sudo systemctl status pzem@phase1
# Просмотр логов
sudo journalctl -u pzem@phase1 -f
# Остановка сервиса
sudo systemctl stop pzem@phase1- Лог-файлы создаются в директории указанной в конфигурации (default /var/log/pzem/) в формате:
pzem_<config>_YYYY-MM-DD.log
/var/log/pzem/
├── pzem_default_2024-01-15.log
├── pzem_phase1_2024-01-15.log
└── pzem_phase2_2024-01-15.log
- Формат данных в логе (CSV):
дата,время,напряжение,состояние_напряжения,ток,состояние_тока,частота,состояние_частоты,мощность,статус
2024-01-15,14:30:25,230.1,N,1.345,N,50.02,N,150.5,0
2024-01-15,14:30:26,229.8,N,1.342,N,49.98,N,148.2,0
- N - норма (в пределах порогов)
- H - высокое значение (превышение верхнего порога)
- L - низкое значение (ниже нижнего порога)
- 0 - OK (данные успешно прочитаны)
- 1 - DEVICE_ERROR (ошибка устройства)
- 2 - PORT_ERROR (ошибка последовательного порта)
- Сервис создает named pipe для реальной передачи данных:
# Чтение данных в реальном времени ( /tmp/pzem_data_{config_name} )
tail -f /tmp/pzem_data_phase1
# Использование в скриптах
while read line; do
echo "Received: $line"
# Обработка данных...
done < /tmp/pzem_data_phase1sudo systemctl start pzem@default
sudo journalctl -u pzem@default -fsudo systemctl start pzem@phase1
sudo systemctl start pzem@phase2
sudo systemctl start pzem@phase3
sudo systemctl enable pzem@phase1 pzem@phase2 pzem@phase3# В конфиге
# Опрашиваем 1 раз в секунду
poll_interval_ms = 1000
# Буфер на 10 строк
log_buffer_size = 10- Проверьте правильность пути к serial порту в конфиге
- Убедитесь что порт доступен:
ls -la /dev/ttyS* - Проверьте права:
sudo usermod -a -G dialout $USER`
- Проверьте подключение PZEM-004T
- Убедитесь в правильности slave address
- Проверьте логи:
sudo journalctl -u pzem@{config_name}
- Увеличьте
poll_interval_msв конфигурации (рекомендуется 500-1000ms)