Серия из четырех частей.
Часть 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, но это не должно иметь никакого значения.
Чтобы установить его, нам нужно сделать следующие шаги:
- Установите Lite версию RPOS на SD-карту с помощью Raspberry Pi Imager - это просто означает, что у него нет среды рабочего стола. Таким образом, вместо этого мы получим доступ к нему через SSH (Secure Shell) на другом компьютере, а это значит, что нам не нужно подключать экран или какие-либо периферийные устройства к Raspberry Pi.
- Убедитесь, что SSH включен на Raspberry Pi - прочтите разделы ПРИМЕЧАНИЕ и ПРЕДУПРЕЖДЕНИЕ по ссылке для настройки без подключения к сети.
- Убедитесь, что он может автоматически подключаться к Wi-Fi при первой загрузке.
- Включить беспарольный доступ - (необязательно) на вашем персональном компьютере генерируется 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, выполните следующие действия:
- Убедитесь, что на Raspberry Pi установлен Git с
sudo apt install git
- он уже должен быть установлен вместе с git как часть ОС, но всегда полезно проверить! - Настройте 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.debsudo 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.sh
year
Затем создайте пользователя с именем 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.sh
year grant all privileges on pi_energymidnight.sh
year 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.sh
year"."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
на своем персональном компьютере. Затем перейдите к Configuration
›Data 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 по моей реферальной ссылке. Если вы это сделаете, я получу часть ваших членских взносов, и это позволит мне написать больше статей, подобных этой.
Хорошего дня!