Серия из четырех частей.

Часть 4. Развертывание - создание и мониторинг доступной солнечной системы с батареями с помощью Raspberry Pi

Постройте мощную солнечную батарею с системой мониторинга потока энергии менее чем за 150 фунтов стерлингов ... О, и получайте удовольствие!

Серии

Эта серия состоит из четырех частей. Если вы здесь новичок, я предлагаю начать с части 1 для некоторого контекста.

Часть 1

Введение в солнечную энергию, перечень деталей оборудования и технические характеристики системы.



Часть 2

Обзор концептуальных схем, принципиальной схемы системы и построения системы.



Часть 3.

Подробное описание программного обеспечения, используемого в системе .



Часть 4

Подробные инструкции по развертыванию Raspberry Pi.



Ранее в этой серии руководств мы обсудили детали физического оборудования электрической системы и глубоко погрузились в код. Итак, теперь, предположив, что электрическая система настроена, и мы понимаем, какой код нам понадобится, мы переходим к развертыванию. Мы так близко, что я почти чувствую его вкус!

Поскольку для развертывания этой системы требуется много шагов, я буду краток и не буду все подробно описывать. Скорее, я дам указание на те части, которые я нашел более сложными, и предоставлю (отличные) ресурсы, которые я использовал. В конце концов, это познавательный опыт!

Эта часть руководства объединяет все эти ресурсы в полезный порядок, чтобы помочь нам развернуть эту систему и приступить к работе! Здесь можно продемонстрировать самые разные навыки, от настройки баз данных и навыков работы с Linux до планирования задач и визуализации данных. В любом случае, хватит разговоров - пора гулять.

Шаги

Давайте сначала рассмотрим основные вещи, которые нам нужно будет сделать на Raspberry Pi в приблизительном хронологическом порядке:

  • Установите Raspberry Pi OS и обновите
  • Настроить доступ по SSH
  • Включить доступ Git (Hub)
  • Установить и настроить InfluxDB
  • Установить Grafana
  • Установите пакеты Python
  • Настроить и протестировать код Python
  • Подключите InfluxDB к Grafana и создайте пользователей и панель управления
  • Настройте Rclone для монтирования каталога Google Диска
  • Настройка заданий Cron для reboot.sh, reboot1.sh и midnight.sh

Кажется разумным, правда? Хорошо, теперь мы рассмотрим каждый «шаг» более подробно.

ОС Raspberry Pi и SSH

У Raspberry Pi есть собственная поддерживаемая ОС, основанная на версии Linux Debian (которая называется Raspberry Pi OS, кто бы мог подумать?). Обратите внимание: когда я упоминаю Raspberry Pi, в данном случае я имею в виду Raspberry Pi Zero W, но это не должно иметь никакого значения.

Чтобы установить его, нам нужно сделать следующие шаги:

  1. Установите Lite версию RPOS на SD-карту с помощью Raspberry Pi Imager - это просто означает, что у него нет среды рабочего стола. Таким образом, вместо этого мы получим доступ к нему через SSH (Secure Shell) на другом компьютере, а это значит, что нам не нужно подключать экран или какие-либо периферийные устройства к Raspberry Pi.
  2. Убедитесь, что SSH включен на Raspberry Pi - прочтите разделы ПРИМЕЧАНИЕ и ПРЕДУПРЕЖДЕНИЕ по ссылке для настройки без подключения к сети.
  3. Убедитесь, что он может автоматически подключаться к Wi-Fi при первой загрузке.
  4. Включить беспарольный доступ - (необязательно) на вашем персональном компьютере генерируется SSH-ключ, который вы будете использовать для доступа к Raspberry Pi без необходимости каждый раз указывать имя пользователя и пароль. Если вы решите не делать этого, убедитесь, что вы изменили пароль по умолчанию.

Все идет нормально. После того, как вы вставили SD-карту и Raspberry Pi загрузился в первый раз, мы сможем подключиться к Raspberry Pi по SSH с помощью команды Linux, например ssh raspberrypi.local или ssh pi@<IP> (замените ‹IP› на IP-адрес Raspberry Pi ). Если вам нужно узнать свой IP-адрес Raspberry Pi, см. Здесь.

Затем мы обновим и обновим RPOS, чтобы убедиться, что на нем установлена ​​последняя версия: sudo apt update, затем sudo apt full-upgrade.

GitHub

Мы будем использовать Git, в частности GitHub, для хранения, организации и передачи всего нашего исходного кода на Raspberry Pi. Это означает, что мы можем писать / редактировать код, как обычно на нашем персональном компьютере, git push на GitHub и git pull с GitHub на Raspberry Pi для загрузки файлов с версией.

Чтобы настроить Raspberry Pi с помощью GitHub и подключить его к нашей собственной учетной записи GitHub, выполните следующие действия:

  1. Убедитесь, что на Raspberry Pi установлен Git с sudo apt install git - он уже должен быть установлен вместе с git как часть ОС, но всегда полезно проверить!
  2. Настройте Git на аутентификацию через SSH - сначала проверьте, есть ли у вас SSH-ключ на Raspberry Pi, сгенерируйте его (если нет), добавьте его в свою учетную запись GitHub, затем протестируйте связь. Это позволяет вам получать доступ и выполнять действия с вашей учетной записью GitHub через командную строку без необходимости вводить свое имя пользователя и личный токен доступа при каждом посещении (конечно, аналогично SSH-доступу без пароля для Raspberry Pi).

Теперь мы можем разветвить репозиторий Github и вытащить код, который нам понадобится, в корневой каталог Raspberry Pi с помощью SSH.

Это все для GitHub. Это позволит нам выполнять команды Git в сценариях bash и просто позволит нам быстрее получать исходный код без необходимости каждый раз вводить имя пользователя и пароль!

Установить InfluxDB

Вот тут-то и начинается пикантность - базы данных - это бизнес!

InfluxDB предлагает базу данных временных рядов с открытым исходным кодом, которая идеально подходит для нашего случая использования, с несколькими датчиками и точками данных, которые измеряются и отправляются в базу данных через регулярные промежутки времени. Они также предлагают облачный продукт с уровнем бесплатного пользования, если вы хотите поиграть с размещенной базой данных.

В этом руководстве мы установим InfluxDB v1.8.5 (я знаю, что версия 2.0 была выпущена недавно), поскольку я реализовал и протестировал версию 1.8.5 в своей настройке (и я считаю, что для версии 2.0 требуется 64-разрядная операционная система, которые мы не установили). Я обновился до v1.8.9 (самая последняя версия v1.8.x), но у меня возникли проблемы с запуском, поэтому мне пришлось вернуться к версии v1.8.5 - я рекомендую вам придерживаться версии v1.8.5 для этого руководства.

Итак, чтобы установить InfluxDB v1.8.5 (Debian), мы запускаем:

wget -qO- https://repos.influxdata.com/influxdb.key | gpg --dearmor > /etc/apt/trusted.gpg.d/influxdb.gpg
export DISTRIB_ID=$(lsb_release -si); export DISTRIB_CODENAME=$(lsb_release -sc)
echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" > /etc/apt/sources.list.d/influxdb.list

Что добавляет репозиторий InfluxData для ключа (эти команды берутся прямо со страницы их установки). Затем мы устанавливаем и запускаем сервис методом загрузки файлов (но с использованием v1.8.5):

wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.5_armhf.deb
sudo dpkg -i influxdb_1.8.5_armhf.deb
sudo systemctl unmask influxdb.service
sudo systemctl start influxdb
sudo systemctl enable influxdb.service

Теперь мы создадим две базы данных - pi_energy и pi_energy_3_year. pi_energy будет иметь политику хранения на 2 недели, а непрерывный запрос будет выполняться каждые 15 минут, чтобы уменьшить и усреднить детализированные 3-секундные данные за 15 минут. Затем он вставит эти данные в pi_energy_3_year базу данных (срок хранения которой составляет 3 года), чтобы у нас был менее детальный, но долгосрочный обзор системы. Я решил хранить подробные и сокращенные данные в двух разных базах данных для лучшего разделения данных и избыточности.

Мы настроим непрерывные запросы и политики хранения после того, как впервые добавим данные в базу данных с помощью Python main.py script. А пока создадим базы данных и пользователя, который нам понадобится.

Мы подключаемся к оболочке InfluxDB с помощью:

influx

Затем создайте базы данных pi_energy и pi_energy_3_year с помощью:

create database pi_energy
create database pi_energymidnight.shyear

Затем создайте пользователя с именем piscript (или как хотите), который сможет вставлять данные в базу данных из скрипта python - убедитесь, что вы вставили свой собственный пароль вместо <passwordhere>:

create user piscript with password '<passwordhere>' with all privileges

Теперь мы назначим эти права пользователя обеим базам данных, сначала «выбрав» базу данных с помощью команды use, а затем применив привилегии:

use pi_energy
grant all privileges on pi_energy to piscript
use pi_energymidnight.shyear
grant all privileges on pi_energymidnight.shyear to piscript

Конечно, предоставление всех привилегий означает, что этот пользователь имеет полный контроль над базой данных. Если вы предпочитаете ограничить это, вы можете ограничить ЧТЕНИЕ или ЗАПИСЬ для пользователей без прав администратора.

Измерения (таблицы базы данных) будут автоматически созданы с помощью скрипта Python для pi_energy (energy_system2) и с помощью непрерывного запроса для pi_energy_3_year (energy_system2).

Отлично, мы вернемся к InfluxDB позже, чтобы настроить политики хранения и непрерывный запрос.

Найдите минутку, чтобы оценить, как далеко мы продвинулись 🏖️!

Установить Grafana

Grafana предлагает инструмент визуализации данных с открытым исходным кодом, используемый для создания ваших собственных пользовательских информационных панелей с легкодоступными данными, которые вам нужны.

Вот как мы будем просматривать все данные, которые мы измеряем - вы видели это в первой части серии! Я использую v7.4.0, так как это была самая последняя версия, когда я настраивал свою систему. v8.1 - это текущая версия, которая включает в себя несколько крутых новых функций. Я рекомендую установить последнюю версию, так как в ней не должно быть критических изменений, но вернитесь к v7.4.0, если у вас возникнут проблемы.

Их руководство очень хорошо описывает процесс установки Raspberry Pi, так что проверьте его и встретитесь здесь, когда закончите. Процесс аналогичен InfluxDB. Сначала добавьте ключ APT и репозиторий, используемый для аутентификации пакетов, затем установите Grafana, включите и запустите сервер. См. Руководство по удобным командам интерфейса командной строки!

Затем вам просто нужно будет войти в Grafana на своем персональном компьютере по адресу <Raspberry Pi IP>:3000 (имя пользователя: admin, пароль: admin). Измените пароль администратора по умолчанию в профиле пользователя в левом нижнем углу интерфейса!

Мы вернемся к Grafana позже, чтобы подключить источник данных (InfluxDB) и настроить панель (и).

Мы уже в этом разбираемся!

Пакеты Python

Я использую Python 3.7 для запуска main.py, но он должен работать с последней версией Python. Итак, чтобы установить последнюю стабильную версию Python 3.x (сначала попробуйте), используйте:

sudo apt-get install python3

Или, чтобы установить Python 3.7 (возможно, если у вас возникли проблемы с совместимостью пакетов), используйте:

sudo apt-get install python3.7

Затем мы установим диспетчер пакетов (pip3), который будет использоваться для установки пакетов Python для сценария main.py:

sudo apt-get install python3-pip

Теперь мы можем установить все пакеты Python, которые нам понадобятся для main.py скрипта:

pip3 install gpiozero
pip3 install influxdb
pip3 install pi-ina219
pip3 install psutil
pip3 install Adafruit-DHT

Вот и все, что касается пакетов Python - переходим к коду!

Настроить и протестировать код Python

Пришло время проверить то, что мы уже сделали, добавив наши первые измерения в базу данных! Сначала мы добавим имя пользователя и пароль пользователя InfluxDB, которые мы создали ранее, в сценарий main.py. Вы можете помнить этот раздел main.py:

# influx configuration
ifuser = ""
ifpass = ""
ifdb = "pi_energy"
ifhost = "localhost"
ifport = 8086
measurement_name = "energy_system2" # influxdb measurement table

Нам нужно добавить параметры ifuser и ifpass. Это можно сделать на Raspberry Pi с помощью редактора Vi или Nano или просто обновив его на своем персональном компьютере и отправив изменения в Raspberry Pi через GitHub.

Если вы использовали те же имена баз данных, которые использовались до сих пор, и сохранили порт InfluxDB по умолчанию, ничего, кроме ifpass, не нужно изменять в main.py. Итак, теперь пора впервые запустить main.py! Перейдите в его каталог и выполните эту команду:

python3 main.py

Если вы получаете ошибку переполнения, убедитесь, что вы правильно настроили Raspberry Pi в соответствии со схемой в Части 2. Есть вероятность, что шунтирующие провода могут быть отсоединены или не обеспечивают достаточного контакта. Если у вас нет вывода командной строки, это хорошо! Я удалил операторы печати, чтобы все было готово. Давайте проверим, что мы вставляем некоторые значения в базу данных и что они выглядят разумно:

influx
use pi_energy
SELECT * FROM energy_system2 LIMIT 5

У нас должно получиться что-то вроде этого:

Отлично, наш код работает! Все, что нам нужно сделать сейчас, это сделать его красивым в Grafana и настроить автоматизацию!

Конфигурация InfluxDB и Grafana

Мы вернемся в InfluxDB, чтобы установить политики хранения и непрерывный запрос, теперь, когда у нас есть несколько полей и значений в нашей energy_system2 таблице измерений.

Непрерывный запрос задается с помощью следующей команды:

influx
use pi_energy
CREATE CONTINUOUS QUERY "cq_15m" ON "pi_energy" BEGIN SELECT mean("bat_pwr") AS "mean_bat_pwr", mean("bat_shnt_v") AS "mean_bat_shnt_v", mean("bus_v_avg") AS "mean_bus_v_avg", mean("cpu_temp") AS "mean_cpu_temp", mean("curr_cpu_perc") AS "mean_curr_cpu_perc", mean("disk_used_perc") AS "mean_disk_used_perc", mean("hum") AS "mean_hum", mean("min15_ld_avg") AS "mean_min15_ld_avg", mean("min1_ld_avg") AS "mean_min1_ld_avg", mean("min5_ld_avg") AS "mean_min5_ld_avg", mean("ram_used_perc") AS "mean_ram_used_perc", mean("slr_prod") AS "mean_slr_prod", mean("slr_pwr") AS "mean_slr_pwr", mean("slr_shnt_v") AS "mean_slr_shnt_v", mean("temp") AS "mean_temp" INTO "pi_energymidnight.shyear"."autogen"."energy_system2" FROM "pi_energy"."autogen"."energy_system2" GROUP BY time(15m) END

Знаю, знаю ... Это зверюга. Давайте немного разберемся ...

Мы создаем непрерывный запрос с именем cq_15m, который берет каждое поле из таблицы измерений energy_system2 в базе данных pi_energy и усредняет (принимает среднее значение) за 15 минут. Затем он создает новую таблицу измерений в pi_energy_3_year с именем energy_system2 и вставляет каждое усредненное значение поля под новым именем с префиксом mean_ (например, bat_pwr в pi_energy соответствует mean_bat_pwr в pi_energy_3_year). Вот и все!

Теперь мы установим правила хранения. Они считаются хорошей практикой и предназначены для ограничения размера базы данных, чтобы они не становились неуправляемыми. Я бы рекомендовал установить политику хранения для детальной pi_energy базы данных, но трехлетняя политика для pi_energy_3_year необязательна. Учтите, что количество подробных трехсекундных данных составляет 28 800 строк базы данных, добавляемых в день, тогда как данные, сокращенные за 15 минут, составляют всего 96 строк, добавляемых в день (в 300 раз меньше). Для справки: полная резервная копия моего 10-месячного набора данных составляет примерно 38 МБ - это 2 недели pi_energy данных и 10 месяцев pi_energy_3_year данных.

Чтобы установить политику хранения на 2 недели (336 часов) на pi_energy, мы используем эту команду:

influx 
use pi_energy
CREATE RETENTION POLICY "rp_336h" ON "pi_energy" DURATION 336h

Установка трехлетней политики для pi_energy_3_year будет похожей историей, если вы решите это сделать.

Потрясающие! Теперь у нас есть все данные для подключения к Grafana.

Сначала войдите в профиль пользователя (или администратора), который вы создали ранее на <Raspberry Pi IP>:3000 на своем персональном компьютере. Затем перейдите к ConfigurationData Sources в Графане.

Помните, что у нас есть два источника данных для подключения, поскольку у нас есть две базы данных. Начиная с pi_energy, weAdd data source, выберите опцию типа InfluxDB и настройте параметры, как это:

Установка полей Name, Query Language, URL, Access, Database, User, Password и HTTP Method. Затем просто Save & Test, промойте и повторите для pi_energy_3_year источника данных, установив Name на Energy Monitor Longterm и отменив выбор параметра Default.

Отлично. Источники данных отсортированы. Теперь вы можете продолжить и настроить панель (-ы) по своему усмотрению. В качестве отправной точки я рекомендую вам импортировать шаблоны (energy_monitoring.json и energy_monitoring_longterm.json), которые я предоставил в репозитории GitHub, и настроить их оттуда. Позаботьтесь о том, как структурированы запросы к источникам данных для каждой панели, отредактировав их - вы должны найти что-то вроде этого:

Здесь измерение energy_system2 доступно через Energy Monitor (pi_energy), затем autogen и, наконец, energy_system2. В данном случае это поле slr_prod, и значение делится на 1000 для преобразования из милливатт в ватты с помощью math(/1000).

Вы можете изменить временной интервал с помощью удобного раскрывающегося списка в правом верхнем углу панели инструментов:

Примечание. Если вы не видите данные из долгосрочной панели мониторинга сразу, помните, что непрерывный запрос выполняется каждые 15 минут. В этой базе данных не будет никаких данных, пока не пройдет хотя бы это время после настройки непрерывного запроса.

Узнайте больше о создании панелей управления Grafana, чтобы вы могли создавать и редактировать по своему усмотрению.

И вот мы уже куда-то идем - столько разноцветных коробок! Осталось только установить резервную копию и настроить автоматизацию!

Rclone

Rclone - это проект с открытым исходным кодом, позволяющий эффективно управлять файлами в облачном хранилище. В этом примере мы будем использовать его для монтирования удаленного каталога Google Диска, но не стесняйтесь использовать предпочитаемого облачного провайдера - Rclone поддерживает много из них.

Цель этого раздела - создать смонтированный каталог gdrive с именем InfluxDB-Backup для резервного копирования баз данных InfluxDB в. Это упрощенная файловая структура из корневого каталога:

.
└── mnt
    └── gdrive
        └── InfluxDB-Backup

Это фантастическое руководство, которое я использовал для установки Google Диска на моем Raspberry Pi - следите за ним до раздела Automatically Mounting Google Drive , а потом мы перегруппируемся здесь. Спасибо, Артур Клаузер!

Цель нашего reboot1.sh скрипта - смонтировать каталог gdrive при запуске с помощью задач Cron Job. Это альтернатива настройке Systemd, которую я обнаружил непоследовательной.

С учетом сказанного, пора настроить задачи Cron Job.

Конфигурация задания Cron

Мы идем прямо домой! Остался еще один маленький раздел!

Cron - это служебная программа для систем на базе Linux, которая позволяет пользователям вводить команды для планирования задач в определенное время, временные интервалы или при заранее определенных событиях. Он работает на демоне Cron, чтобы команды могли выполняться в фоновом режиме без вмешательства пользователя.

Как уже упоминалось, мы будем использовать задачи Cron Job для планирования сценариев оболочки midnight.sh, reboot.sh и reboot1.sh. Чтобы настроить задачи Cron Job, мы редактируем файл crontab в Raspberry Pi OS и добавляем команды Cron. Необходимые нам команды включены в строку 3 каждого из сценариев оболочки.

Чтобы получить доступ к crontab, перейдите в корневой каталог и используйте эту команду:

crontab -e

Это откроет файл для редактирования в текстовом редакторе по умолчанию. Мы хотим изменить этот файл, чтобы он выглядел примерно так:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
0 0 * * * bash /home/pi/battery-solar-rpi/midnight.sh >> /home/pi/battery-solar-rpi/logs/midnight_cron.log 2>&1
@reboot bash /home/pi/battery-solar-rpi/reboot.sh >> /home/pi/battery-solar-rpi/logs/reboot_cron.log 2>&1
@reboot bash /home/pi/battery-solar-rpi/reboot1.sh >> /home/pi/battery-solar-rpi/logs/reboot1_cron.log 2>&1

SHELL и PATH задают пути к соответствующим исполняемым программам и пакетам.

Расписание можно изменить, поэтому, например, если вы хотите запустить резервное копирование в другое время, вы можете использовать этот отличный инструмент, чтобы определить, какое выражение планирования Cron вам понадобится. Обратите внимание, как мы направляем стандартный вывод в соответствующий файл журнала для каждого скрипта.

Затем просто сохраните и выйдите из редактора, перезагрузите Raspberry Pi, и все готово! Проверьте, запущен ли сценарий main.py с помощью команды htop (после того, как у Raspberry Pi будет несколько минут для запуска). Если да, проверьте, не появляются ли новые значения в панели управления Grafana! Если ваша панель управления Grafana обновляется должным образом, поздравляем! Вы настроили целую систему мониторинга энергии на Raspberry Pi! Если нет, работайте в обратном направлении, проверяя значения базы данных Grafana, InfluxDB и журналы заданий Cron на предмет сообщений об ошибках и т. Д.

Заключение

Черт! Какая поездка. Я знаю, что эта часть развертывания была особенно сложной, но мы справились! Дайте мне знать в комментариях, что вы думаете о процессе.

В общем, мы создали потрясающую солнечную батарею-систему за небольшую часть стоимости имеющихся альтернатив. В нем есть все возможности для мониторинга и аналитики, которые нам могут когда-либо понадобиться, чтобы эффективно управлять солнечной энергией и заряжать все наши устройства. Несмотря на всю проделанную нами фундаментальную работу, есть бесконечные возможности для улучшения этой системы. Как насчет добавления некоторых реле в систему, чтобы включить или выключить дополнительную электронику (вентиляторы?) В зависимости от температуры или количества генерируемой мощности? Или оптимизировать выработку электроэнергии, экспериментируя с размещением солнечных батарей? Или даже разместить свою базу данных в сети и иметь возможность видеть идеи вашего поколения со всего мира?

Что бы вы ни выбрали, не забудьте максимально использовать свою чудесную энергию с почти нулевым выбросом углерода и красиво окрашенные коробки на приборных панелях Grafana. Мне очень приятно сказать, что я смог написать эту серию (как и все остальное за последние 10 месяцев) почти полностью на солнечной энергии, которую я генерировал с помощью системы!

Возможно, я напишу анализ системы через год - следите за обновлениями!

А пока дайте мне знать, как вы подошли к своей солнечно-аккумуляторной системе и как она сработала для вас - я буду рад видеть!

Спасибо, что прочитали всю статью (и серию)! Для меня очень много значит, что вы нашли несколько минут в своем рабочем дне, чтобы обдумать мои идеи :)

Если вы не являетесь участником Medium, но вам понравилось читать, пожалуйста, поддержите меня, подписавшись на Medium по моей реферальной ссылке. Если вы это сделаете, я получу часть ваших членских взносов, и это позволит мне написать больше статей, подобных этой.



Хорошего дня!