Skip to content

akarnaukh/PZEM_004T_Systemd

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PZEM-004T Monitor & Log Service

Описание

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 (ошибка последовательного порта)

Использование FIFO для внешних сервисов

  • Сервис создает named pipe для реальной передачи данных:
# Чтение данных в реальном времени ( /tmp/pzem_data_{config_name} )
tail -f /tmp/pzem_data_phase1

# Использование в скриптах
while read line; do
    echo "Received: $line"
    # Обработка данных...
done < /tmp/pzem_data_phase1

Примеры использования

Для мониторинга одной фазы:

sudo systemctl start pzem@default
sudo journalctl -u pzem@default -f

Для трехфазной системы:

sudo systemctl start pzem@phase1
sudo systemctl start pzem@phase2  
sudo systemctl start pzem@phase3
sudo systemctl enable pzem@phase1 pzem@phase2 pzem@phase3

Для embedded устройства (минимальная нагрузка):

# В конфиге
# Опрашиваем 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}

Высокая нагрузка CPU

  • Увеличьте poll_interval_ms в конфигурации (рекомендуется 500-1000ms)

Authors

About

PZEM-004T Systemd service linux. Monitoring & log

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published