Всем привет. В статье о компьютерщики Я рассказал как подключиться к электросчетчику Eastron SDM220-Modbus и собирать с него данные по шине RS-485. Сегодня я хочу поговорить о сборе и анализе статистических данных о потреблении электроэнергии в доме.
Я использовал тонкий клиент в качестве домашнего хаба для сбора данных.
Центрм GI-945 .
Его преимущества - архитектура x86 (атом 1,6 ГГц), 5 USB, 1G Ethernet, mini-pcie (я в него вставил wifi-карту).
Ubuntu Server 14.04 загружается с флэшки.
Через USB-RS485 Адаптер подключается к «серверу» со счетчиком электроэнергии.
Счетчик опрашивается скриптом на Python, основанным на этот пример .
Скрипту нужна библиотека для запуска pyModbus Установка библиотеки sudo add-apt-repository ppa:fkrull/deadsnakes-python2.7 обновление sudo apt-get обновление sudo apt-get apt-get -y установить python-pip apt-get установить python2.7-dev pip install -U pymodbus Скрипт запускается хрон раз в минуту собирает данные (напряжение, ток, мощность и зарегистрированная энергия) со счетчика и отправляет их на сайт ВещьГоворить .
Сначала необходимо зарегистрироваться на сайте и создать собственный канал передачи данных.
канал и назовите поля поля .
Также для записи данных в канал вам понадобится написать ключ API .
Код сценария Python #!/usr/bin/python2
структура импорта
импортировать pymodbus.client.sync
импорт бинаскии
время импорта
импортировать систему
импортировать URL-библиотеку
def read_float_reg(client, basereg, unit=1):
resp = client.read_input_registers(basereg,2, unit=1)
если соотв == Нет:
возврат Нет
# согласно спецификации, возвращается каждая пара регистров
# кодирует число с плавающей запятой IEEE754, где первый регистр содержит
# старшие 16 бит, второй регистр содержит
# наименее значимые 16 бит.
return struct.unpack('> f',struct.pack('> HH',*resp.registers))
def fmt_or_dummy(regfmt, val):
если значение равно None:
return '.
'*len(regfmt[2]%(0)) вернуть regfmt[2]%(значение) защита основного(): рег = [ # Формат символа Reg# ( 'V:', 0x00, '%6.2f'), # Напряжение [В] ( 'Curr:', 0x06, '%6.2f'), # Ток [А] ( 'Pact:', 0x0c, '%6.0f'), # Активная мощность ("Wirkleistung") [Вт] ( 'Papp:', 0x12, '%6.0f'), # Полная мощность("Scheinl.") [Вт] ( 'Prea:', 0x18, '%6.0f'), # Реактивная мощность("Слепой") [Вт] ( 'PF:', 0x1e, '%6.3f'), # Коэффициент мощности [1] ( 'Phi:', 0x24, '%6.1f'), # cos(Phi)? [1] ( 'Freq:', 0x46, '%6.2f'), # Частота сети [Гц] ( 'Wact:', 0x0156, '%6.2f'), # Энергия [кВтч] ( 'Wrea:', 0x0158, '%6.2f'), # Реакция энергии [кварх] ] cl = pymodbus.client.sync.ModbusSerialClient('rtu', порт = '/dev/ttyUSB0', скорость передачи данных = 9600, четность = 'N', стоповые биты = 1, тайм-аут = 0,8) значения = [read_float_reg (cl, reg[1], unit=1) для reg в regs] outvals = list((' '.
join([fmt_or_dummy(*t) for t в zip(regs,values)]))).
split()) params = urllib.urlencode({'key': 'xxxxxxxxxxxxxxxx', 'field1': outvals[0], 'field2': outvals[1], 'field3': outvals[2], 'field4': outvals[8] }) f = urllib.urlopen(" api.thingspeak.com/update ", данные=параметры) распечатать (ошибки) sys.stdout.flush() если __name__ == '__main__': основной() Скрипт берет все доступные параметры со счетчика, но на сайт передаются только основные; при желании можно всё перенести.
Результат сразу отобразится на сайте (на экране некоторое время отображается статистика, при первом опросе будет только одна точка со значением)
По умолчанию на графиках отображаются 60 последних показаний, что при опросе раз в минуту дает результат за последний час.
Для каждого графика можно настроить отображение
По напряжению я настроил статистику за 6 часов с усреднением 10 значений и сглаживанием кривой (сплайна).
Видно, что график энергопотребления представляет собой постоянно возрастающую кривую, но хотелось бы видеть потребление в час, день и месяц; для этого на сайте есть аналитика на базе движка MATLAB и возможность триггерить события по времени.
Для сбора почасовой статистики я сделал следующее:
- Создал второй канал PowerStatistic ;
- В Приложения -> Анализ MATLAB создал скрипт, который принимает текущее значение энергии и вычитает из него значение, полученное час назад. Результат заносится в поле канала;
- В Приложения -> Контроль времени создал событие GetPowerPerHour , который будет запускать скрипт Matlab каждый час в 00 минут.
%disp(анализированные данные); Если анализируемые данные содержат одно значение, а не вектор, оно будет записано в первое поле канала.
Чтобы писать в другие поля, вам нужно добавить, например, «Поля»2. %% Запись данных %% thingSpeakWrite (writeChannelID, проанализированные данные, 'WriteKey', writeAPIKey); На сайте неприятный косяк, есть кнопка использовать скрипт Сохранить и запустить , который пишет в канал при каждом запуске, поэтому строку записи лучше закомментировать перед полной отладкой, однако, даже когда скрипт готов, его нельзя просто сохранить без запуска, а запуск скрипта сразу войдет данные в канал.
Вы также не можете удалить отдельные данные из канала.
Этот вопрос уже поднимался на форум проекта , но еще не исправлено.
Настройки запуска по расписанию, скрипт запускается каждый час.
Вы можете игнорировать тот факт, что запуск начнется в 12.00.
Смотрим результат в канале:
Для этого расписания в настройках указано Тип: колонка для отображения энергопотребления по часам.
Всплывающее окно соответствует пику потребления в 12 часов (курсор на экране не отображался).
Аналогичным образом работает скрипт, собирающий статистику за день.
Скрипт запускается каждый день в 00:01 и суммирует 24 показания из почасового архива.
Скрипт PowerPerDay readChannelID = 157182; readAPIKey = 'zzzzzzzzzzzzzzzzzz'; writeChannelID = 157182; writeAPIKey = 'xxxxxxxxxxxxxxxxxxxxxxxx'; %% Чтение данных %% % прочитать последние 24 значения из первого поля канала data =thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'Fields',1, 'NumPoints',24); %% Анализ данных %% %подведем итог анализируемые данные = сумма (данные); %disp(анализированные данные); %% Запись данных %% thingSpeakWrite (writeChannelID, проанализированные данные, 'WriteKey', writeAPIKey, 'Поля', 2); ThingSpeak также имеет приложения для Android. Для просмотра последних значений, которые мне понравились Карманный Интернет вещей , а для графиков - ВещьВью .
Еще есть пара виджетов, но они какие-то кривые.
" Канал Сил-о-Метр " Канал PowerStatistic Пожалуй, это все.
Статья не претендует на звание руководства, так как я только начал знакомиться с возможностями ThingSpeak, любые дополнения, комментарии и правки приветствуются.
Теги: #электросчетчик #Умный дом #sdm220 #Modbus #rs485 #matlab #ThingSpeak #iot #интернет вещей #Интеллектуальный анализ данных #Визуализация данных #Разработка для Интернета вещей
-
Hp Инвестирует $1 Млрд В Облачные Вычисления
19 Oct, 24 -
Разминочный Этап Rcc 2014.
19 Oct, 24 -
Какой 3D-Сканер Выбрать? Топ-4 От 3Dtool
19 Oct, 24 -
Каково Преподавать В It-Курсе?
19 Oct, 24