среда, 3 июня 2020 г.

Solarhouse python package

Я кроме программирования занимаюсь экодомостроительством о чем пишу в своем отдельном блоге:

http://yaricblog.blogspot.com/

В моем доме применяется солнечная энергия для нагрева воздуха и для получение электрической энергии.

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

Чтобы оценить эффективность того или иного типа солнечного коллектора, а также эффективность формы дома, его размера, утеплителя и массы накопителя тепла внутри дома, для этого был создан программный пакет на python3

https://github.com/yaricp/py-solarhouse

В основе пакета лежат библиотеки:

PyMesh
PVLIB
Pandas

Суть работы пакета в следующем:

Пользователь подготавливает файл описывающий форму дома в формате *.stl или *.obj
Это файл загружается в пакет, также для расчетов указываются параметры дома - масса накопителя тепла, толщина стен дома,  материал утеплителя, площадь пола и окон и тип солнечного коллектора.
Кроме этого указывается расположение дома и период времени.
После этого запускается расчет и в итоге получается файл с данными температур определенных элементов дома в укзанный период.
На базе этих данных строится график температур элементов дома и солнечной энергии получаемой с поверхностей дома.

По этим графикам можно оценить когда можно прекращать отапливать дом электричеством или печью или котлом.

Как это работает:

Перед началом расчетов с помощью библиотеки PVLIB получаем значения солнечной энергии от прямых лучей и от рассеянного солнечного света на один квадратный метр поверхности, которая перпендикулярна солнечным случам. При этом если указано, что нужно учитывать погоду, то извлекаются данные о солнечной радиации с учетом погоды.
Все данные извлекаются для указанной точки на карте (координаты дома указываются перед началом расчета).
Данные получаются в виде таблицы Pandas (библиотека Python).
В этой таблице содержатся три вида солнечной активности и температура окружающей среды для указанной местности.
Затем спомощью библиотеки PyMesh поверхность дома, которая задана в файле *.stl или *.obj, разбивается на треугольники. Также спомощью этой библиотеки вычисляется общая площадь дома, внутренний объем.
Также моделируется внутренний объем дома с учетом толщины стенки (указывается во входных данных).
Для каждого треугольник определяется угол наклона над горизонтом и направление относительно сторон света (Tilt,  Azimuth). После этого спомощью PVLIB для каждого треугольника вычисляется новая таблица Pandas с почасовыми значениями полученной солнечной энергии.
В итоге солнечного расчета мы имеем столько таблиц сколько треугольников в меше дома. Из этих таблиц суммируются мощности и формируется одна выходная таблица Pandas.

После этого выполняется следующий этап - это тепловой расчет дома.

На базе геометрических данных дома вычисляются размеры и тепловые параметры элементов, которые описаны в тепловой моедли дома:

Тепловая модель дома

Далее для каждого часового значения солнечной энергии и температуры окружающей среды вычисляются температура каждого элемента дома.

В итоге мы получаем Pandas таблицу в которой почасовые значения температур элементов дома и значения солнечной энергии.

Как устроен пакет:

В пакете описаны несколько классов

Calculation
Building
ThermoProcess
ThermoModel
ThermoElement

Класс Calculation описывает весь процесс расчета.
В нем подготавливаются таблицы Pandas из библиотеки PVLIB.
Также в нем организована очередность разных расчетов.
Экзепмляру этого класса передаются все необходимые данные для расчетов, в том числе и файл меша форма дома.
Затем вызывается единственный метод: .compute(date) с указанием даты или периода. И в результате получаем таблицу Pandas.

Класс Building описывает всю геометрию дома на базе PyMesh.
В момент инициализации экземпляра класса проверяются все возможные геометрические коллизии, а также оценивается является ли форма дома выпуклой и замкнутой.
Методы класса вычисляют геометрию разных элементов дома.
Также вычисляются объем и масса элементов.

Класс ThermoProcess подготавливает термоэлементы дома согласно выбранной термомодели и запускает тепловой расчет.
Основным параметром класса является объект класса Building.
Согласно упрощенной тепловой модели описанной тут имеется 9 элементов. Все эти элементы описываются при инициализации экземпляра класса. Данные этих элементов вычисляются на базе геометрии из класса Building.
Элементы соединяются в цепочку согласно выбранной тепловой модели.
Тепловая модель описывается классом: ThermoModel
И в итоге вызывается метод compute в котором для каждого значения солнечной энергии и температуры окружающей среды вычисляются температуры элементов дома.
В тепловой расчет мощность солнечной энергии задается с учетом КПД выбранного типа столнечного коллектора.

Класс ThermoModel описывает цепочку термоэлементов (ThermoElement).
Также здесь указывается какой элемент является начальным для теплового расчета и какой конечный. Т.к. расчет идет изнутри наружу то обычно конечными элементами являются температуры окружающей среди.


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

Установка пакета очень проста:

pip install solarhouse


В общем и процесс установки и использование пакета можно прочесть в документации:

Solarhouse

Вот так!



django3-pki

Когда-то на работе понадобилось поднять свой собственный центр сертификации для управления сертификатами для серверов и для клиентов VPN серверов и прочих сервисов.
Т.к. у нас использовался Django в качестве фреймворка для нашей системы управления компьютерами в сети, то я стал искать приложения к Django.
Едиственный нормально проработанный вариант это был django-pki
Это был проект Джанго с встроенным приложением центра сертификации.
Это была версия 1.2 и  тогда не разрабатывали приложения отлельно от самого фреймворками.

Я сделал форк этого проекта и переписал проект с поддержкой Django1.8
Там появилось много удобного и в коде питона и в разметке в шаблонах.

Но вот сейчас опять, теперь уже на другой работе, пришлось создать свой центр сертификации. И я опять вернулся к этому проекту.
Дело в том что до сих пор я не нашел приложний к Django с таким функционалом. Все остальные приложения выглядят очень просто и мало функциональны.

В этот раз я переписал код под Django3 и оформил это в виде отдельного приложения, которое можно установить через pip и потом просто добавить его в INSTALLED_APPS в settings.py

И да! конечно код был переписан на python. Нужно отметить что теперь требования к коду намного более строгие чем тогда когда писались первые версии этого приложения. Это я про то что настроена проверка кода разными валидаторами кода типа flake8, black и isort.

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

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

Теперь про само приложение.
Само приложение представляет собой обертку над библиотекой openssl.
В настройках приложения есть переменная :

PKI_OPENSSL_BIN = getattr(settings, "PKI_OPENSSL_BIN", "/usr/bin/openssl")

Здесь Вы можете указать путь к openssl в вашей системе.

Само приложение управляется через админку Django.

Когда вы нажимаете "Refresh Metadata" на странице приложения создается папка PKI в папке приложения, хотя Вы конечно можете указать и свой путь к папке сертификатов в вашей системе.

Основная конфигурация центра сертификации описана в шаблоне

/templates/pki/openssl.conf.in
На базе этого файла в папке PKI создается openssl.conf

Все сертификаты и корневые и для серверов и для клиентов будут находиться именно в папке PKI

Любые операции по изменению или удалению сделанные в веб интерфейсе будут актуализироваться тут же в папке PKI

В приложении реализовано логгирование всех действий с сертификатами и их можно посмотреть на странице приложения.

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

Так же в этом приложении добавлена возможность формировать конфиг для клиентов ВПН серверов.

Шаблон для формирования таких конфигов лежит тут:

/pki/templates/ovpn.tpl

При формировании конфига в него будут добавлены сертификат клиента , ключ клиента и корневой сертификат центра.


Адреса ВПН сервером придется добавить в конфиг руками.

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

Но сейчас возникли некоторые особенности с новых версиях Django.
Дело в том, что разные приложения теперь можно располагать в разных базах данных  (для этого в новых версиях Django есть dbRouter). А вот связать модели из разных баз через конструкции
ForeignKey уже не возможно..
Поэтому теперь в приложении в модели хранится только имя пользователя.
Искать такого пользователя придется вручную.


В общем пользуйтесь! и пишите замечания и предложения.

https://pypi.org/project/django3-pki/

https://github.com/yaricp/django3-pki