{"id":20136917,"url":"https://github.com/ath31st/temp_control_web","last_synced_at":"2026-05-08T06:12:59.181Z","repository":{"id":175813213,"uuid":"589999126","full_name":"ath31st/temp_control_web","owner":"ath31st","description":"A real project for monitoring and controlling the temperature regime in server rooms.","archived":false,"fork":false,"pushed_at":"2023-02-27T12:17:44.000Z","size":3106,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-13T09:45:29.111Z","etag":null,"topics":["scheduler","snmp","spring-boot","sqlite","ssh","thymeleaf","web"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ath31st.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-17T12:42:34.000Z","updated_at":"2023-01-17T16:46:02.000Z","dependencies_parsed_at":null,"dependency_job_id":"aecc1bd3-d360-420c-87f1-9d7b0801cbf6","html_url":"https://github.com/ath31st/temp_control_web","commit_stats":null,"previous_names":["ath31st/temp_control_web"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ath31st%2Ftemp_control_web","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ath31st%2Ftemp_control_web/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ath31st%2Ftemp_control_web/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ath31st%2Ftemp_control_web/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ath31st","download_url":"https://codeload.github.com/ath31st/temp_control_web/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241582522,"owners_count":19985846,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["scheduler","snmp","spring-boot","sqlite","ssh","thymeleaf","web"],"created_at":"2024-11-13T21:23:36.831Z","updated_at":"2026-05-08T06:12:54.159Z","avatar_url":"https://github.com/ath31st.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Temperature control (web)\n\n### Описание\n\nЛегковесный проект для наблюдения и контроля за температурным режимом в серверных помещениях.\nВ данный момент он реально применяется для собственных нужд дежурной смены на моей текущей работе.\n\n### Поставленные задачи\n\n1. Обеспечить круглосуточный контроль за температурой в двух серверных помещениях.\n2. Использовать доступное из имеющегося оборудование. Допускается изготовление из подручных материалов.\n3. Обеспечить своевременное оповещение при возникновении аварий систем охлаждения серверных помещений.\n4. Реализовать наглядный web или gui интерфейс.\n5. Логгировать возникающие события, а так же сохранять текущие показатели температуры в базе данных.\n\n### Оценка имеющихся возможностей, средств\n\nВ одном из серверных помещений достаточно корректную температуру можно получить только с установленного SNMP-модуля в\nИБП. В связи с отсутствием выбора, было принято решение написать парсер страницы веб-интерфейса этого модуля.\n\nВ другом помещении корректных и доступных источников для получения температуры не было.\n\nДля оповещения о возникновении аварий был выбран развернутый сервер ip-телефонии asterisk.\n\nДля логгирования событий - легковесная база данных Sqlite.\n\n### Ход выполнения\n\nИдея парсить страницу веб-интерфейса SNMP-модуля провалилась из-за довольно сложной системы аутентификации, которая\nполностью строилась на скриптах, а применять, например, selenium, показалось чрезмерным.\nДля решения возникшей проблемы пришлось углубиться в SNMP-протокол, найти на сайте производителя модуля информацию об\nOID (конкретный идентификатор, отвечающий за температуру датчика модуля), подобрать библиотеку для работы с snmp. Затем\nосталавалось указать номер порта и\nнайденный OID для формирования запроса, который в ответ присылает актуальное значение температуры.\n\nВ серверном помещении без доступных датчиков был установлен микроконтроллер arduino с подключенным к нему, через\nделитель напряжения, датчиком NTC3950 (NTC термистор).\n\n![image info](images/image05.jpg)\n\nArduino было подключено к usb-порту сервера, на котором работает само приложение. Здесь замысел был в том, что цикл,\nописанный в скетче микроконтроллера:\n\n- каждые 10 секунд оправшивает датчик температуры;\n- преобразует считанное напряжение с помощью библиотеки NTC в градусы, относительно модели датчика;\n- полученное значение передает на COM-порт (на самом деле UART, который так же расположен на плате arduino).\n\n![image info](images/image06.jpg)\n\nЗатем, настроенный планировщик через определенные интервалы считывает данные с виртуального COM-порта. И, как и в случае\nс первым датчиком,\nсравнивает полученное значение с установленное в настройках критической отметкой. В случае превышения критических\nотметок - приложение\nотправляет команду на asterisk сервер через ssh, для оповещения. Затем статус оповещения датчика переводится в режим - \"\nвыключен\" на указанный в настройках\nпериод (сейчас это 30 минут), чтобы избежать \"спама\" звонков. Через указанный интервал температура снова сравнивается и\nесли она, по прежнему, превышает допустимую, происходит повторный отправка команды оповещения.\nТемпература измеряется даже в моменты отключения оповещения, в этом случае, если она быстро снижается и становится ниже\nкритической на 5 градусов, то датчик досрочно переводится в режим оповещения \"включен\".\n\nЗа оповещение в этом проекте отвечает сервер asterisk 16 версии. Для этого был написан кастомный экстеншн для диалплана,\nкоторый отправлет вызов на указанный номер телефона и проигрывает указанный аудиофайл (который тоже, в свою очередь был\nзаранее сгенерирован и помещен в папку для кастомных аудиофайлов на сервере asterisk). Было принято решение использовать\nкоманды через ssh-туннель, чтобы не тратить время на изучение глубин документации asterisk и его api.\n\nРассматриваемый, в начале разработки проекта, вариант с gui был отброшен из-за неудобства использования и вынужденного\nтребования\nразместить приложение на одном из серверов в серверном помещении без доступных датчиков. В итоге был разработан\nпростейший веб-интерфейс с использованием шаблонизатора thymeleaf. Для исключения нежелательного доступа посторонних лиц\nбыл использован модуль spring security и несколько заготовленных, вложенных учетных записей для доступа к сервису.\nВеб-интерфейс обеспечивает доступ к актуальной температуре в серверных\nпомещениях, архиву событий и настройкам приложения. В разделе настроек действует валидация введенных данных, для\nисключения случае ввода некорректных данных.\n\n### Результаты\n\nПоставленные задачи выполнены в полном объеме.\nРазвернутое приложение позволяет получать, по указанному ip-адресу - информацию о датчиках, событиях, изменять\nнастройки.\n\n![image info](images/image01.jpg)\n![image info](images/image02.jpg)\n![image info](images/image03.jpg)\n![image info](images/image04.jpg)\n\nВ автоматическом режиме совершать вызов по указанному телефонному\nномеру и проигрывать аудиофайл, логгировать, хранить и выводить на веб-интерфейс происшедшие события (сюда входят\nежечасные показатели температуры, ошибки, предупреждения).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fath31st%2Ftemp_control_web","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fath31st%2Ftemp_control_web","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fath31st%2Ftemp_control_web/lists"}