
Arduino & Pi
Мониторинг UPS APC и EATON
В предыдущемпосте была показана реализация аппаратной riktak-коробочки на esp8266 со smart протоколом для APC. По реакции мнения разделились: Кто-то сказал "купи сетевую плату за 3 рубля" или добавь еще что-то, или "нафига это, когда есть то". Но в общем есть, то что есть. И да, по работе мне приходится мониторить бесперебойники, и да, в них есть сетевые карты - они разные и не все идеально работают.
Сейчас хотелось бы поделиться скриптом на PHP для мониторинга бесперебойников APC и EATON по snmp.
Предупреждая комментарии, я знаю что такое ZABBIX и также им всё мониторю и я знаю, что такое APC powerChute - это всё громоздко и ресурсоёмко. Свести визуально воедино ни заббиксом и чем-то другим не получилось.
Скрипт написал для собственного удобства - может кому-то сгодится.
Требования: apache/nginx + php + php-snmp и включенный snmp1 на чтение в устройствах.
Возможности:
1- показ состояния бесперебойников, всяких температур, напряжений, оставшегося времени в одной таблице - красоту сами наводите.
2 - с аргументом dailyreport отправляет на почту (нужное исрпавить).
Должно получиться примерно следующее
Требуется отредактировать массивы $urls и $urls2, добавив список свйих УПС, а также почтовые адреса, если нужны рассылки.
Сильно не пинайте, чукча - не чукча и тд..
Источник или немного кода ниже:
<?php
// apt-get install php-snmp
// snmp 1 public readonly
$urls = array( // eatons
"192.168.1.55",
"192.168.1.57",
"192.168.1.16",
"192.168.1.60"
);
$urls2 = array( // APC
"192.168.1.25", "192.168.1.239",
"192.168.1.230",
"192.168.1.231" );
$pr="<html><body><table width= \"100%\" border=\"1\" cellpadding='5' cellspacing=\"0\"> <tr bgcolor=\"#ddd\" style=\"background-color:#ddd\"> <td>IP</td> <td>Расположение</td> <td>Модель</td> <td>Источник питания</td> <td>Нагрузка<br />%</td> <td>Зарядка<br />%</td> <td>Оставшееся<br>время</td> <td>Состояние<br />батареи</td> <td>Температура <br />(вн/нар)/Влажн.</td> </tr>";
for ($i = 0; $i<count($urls); $i++)
{
$pr.="<tr><td><a href=\"http://".$urls[$i]."/\" target=\"_blank\">".$urls[$i]."</a></td>";
$session = new SNMP(SNMP::VERSION_1, $urls[$i], "public");
$session->valueretrieval = SNMP_VALUE_PLAIN; $s = $session->walk("1.3.6.1.2.1.1.5.0", TRUE);
foreach ($s as $val)
{
$pr.= "<td><b>$val</b></td>";
}
$s = $session->walk("1.3.6.1.2.1.33.1.1.2.0", TRUE);
foreach ($s as $val)
{
$pr.= "<td><b><font color=\"#00f\" style=\"color:#00f;\">$val</font></b></td>"; }
$s = $session->walk("1.3.6.1.4.1.534.1.3.4.1.2.1", TRUE);
foreach ($s as $val) { $pr.= "<td>$val Volt</b></td>"; }
$s = $session->walk("1.3.6.1.4.1.534.1.4.1.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'></b>$val %</td>"; }
$s = $session->walk("1.3.6.1.4.1.534.1.2.4.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'>$val %</td>"; } $s = $session->walk("1.3.6.1.4.1.534.1.2.1.0", TRUE); foreach ($s as $val) {
$pr.= "<td>".round($val/60)." min</td>"; }
$s = $session->walk("1.3.6.1.4.1.705.1.5.9.0", TRUE); foreach ($s as $val) if($val=="2") $res1 = 2; else $res1 = 1; $s = $session->walk("1.3.6.1.4.1.705.1.5.15.0", TRUE); foreach ($s as $val) if($val=="2") $res2 = 2; else $res2 = 1; $s = $session->walk("1.3.6.1.4.1.705.1.5.11.0", TRUE); foreach ($s as $val) if($val=="2") $res3 = 2; else $res3 = 1; if($res1==2 && $res2==2 && $res3==2)
$pr.="<td bgcolor=\"#9d9\" style=\"background-color:#9d9\">OK</td>";
else
$pr.="<td bgcolor=\"#d99\" style=\"background-color:#d99\">fault</td>"; $s = $session->walk("1.3.6.1.4.1.534.1.6.1.0", TRUE); foreach ($s as $val) { $pr.= "<td>$val °C / "; } $s = $session->walk("1.3.6.1.4.1.534.1.6.5.0", TRUE); foreach ($s as $val) { $pr.= " $val °C /"; } $s = $session->walk("1.3.6.1.4.1.534.1.6.6.0", TRUE); foreach ($s as $val) { $pr.= " $val %</td>"; }
$session->close();
$pr.="</tr>\r\n";
}
for ($i = 0; $i<count($urls2); $i++)
{
$pr.="<tr><td><a href=\"http://".$urls2[$i]."/\" target=\"_blank\">".$urls2[$i]."</a></td>";
$session = new SNMP(SNMP::VERSION_1, $urls2[$i], "public");
$session->valueretrieval = SNMP_VALUE_PLAIN; $s = $session->walk("1.3.6.1.4.1.318.1.1.1.1.1.2.0", TRUE); foreach ($s as $val)
{
$pr.= "<td><b>$val</font></b></td>"; }
$s = $session->walk("1.3.6.1.4.1.318.1.1.1.1.1.1.0", TRUE); foreach ($s as $val) { $pr.= "<td><b><font color=\"#f00\" style=\"color:#f00;\">$val</font></b></td>"; }
$s = $session->walk("1.3.6.1.4.1.318.1.1.1.3.2.1.0", TRUE); foreach ($s as $val) { $pr.= "<td>$val Volt</b></td>"; }
$s = $session->walk("1.3.6.1.4.1.318.1.1.1.4.2.3.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'></b>$val %</td>"; }
$s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.1.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'>$val %</td>"; } $s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.3.0", TRUE); foreach ($s as $val)
{ $pr.= "<td>".($val/100/60)." min</td>"; }
$s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.4.0", TRUE); foreach ($s as $val) if($val=="1")
{ $pr.= "<td bgcolor=\"#9d9\" style=\"background-color:#9d9\">OK</td>"; }
else
{ $pr.= "<td bgcolor=\"#d99\" style=\"background-color:#d99\">fault</td>"; }
$s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.2.0", TRUE); foreach ($s as $val) { $pr.= "<td>$val °C /"; }
$s = $session->walk("1.3.6.1.4.1.318.1.1.25.1.2.1.6", TRUE); foreach ($s as $val) { $pr.= "$val °C /"; }
$s = $session->walk("1.3.6.1.4.1.318.1.1.25.1.2.1.7", TRUE); foreach ($s as $val) { $pr.= "$val %</td>"; }
$s = $session->walk("1.3.6.1.4.1.318.1.1.1.3.2.5.0", TRUE);
foreach ($s as $val)
{ $pr.= "<td>LTtB:$val</td>"; }
$session->close();
$pr.="</tr>\r\n";
}
$pr.="</table>";
$pr.="<br /><font color=\"#00f\" style=\"color:#00f;\">EATON</font> <font color=\"#f00\" style=\"color:#f00;\">APC</font><br />";
$pr.="APC reason for last transfer (LTtB) to battery power<br /> <p>1 No events<br /> 2 High line voltage<br /> 3 Brownout<br /> 4 Loss of mains power<br /> 5 Small temporary power drop<br /> 6 Large temporary power drop<br /> 7 Small spike<br /> 8 Large spike<br /> 9 UPS self test<br /> 10 Excessive input voltage fluctuation</p><br /> <a href=\"#\">Обновить скрипт УПС</a></body></html>";
if($act=='') echo $pr;
if($act=='dailyreport')
{
$to="admin@domain.ru";
$subject="UPSs daily report";
$body="$pr";
$headers = "Content-type: text/html; charset=utf-8\r\n"; $headers .= "From: ups@domain.ru ";
mail($to, $subject, $body, $headers);
}
?>
Союз Qt и JavaScript - QML
QML - это язык декларативного описания пользовательского интерфейса, основанный на JavaScript и Qt. Особенность QML заключается в том, что он позволяет создавать динамические, анимированные и интерактивные элементы интерфейса с минимальным кодом.
QML также поддерживает интеграцию с C++ и другими языками, что дает возможность использовать готовые библиотеки и фреймворки.
Некоторые преимущества QML:
Быстрая разработка и отладка. QML-код можно изменять во время выполнения, не перезапуская приложение. QML также имеет встроенные средства для отображения ошибок и предупреждений.
Кросс-платформенность. QML-приложения могут работать на разных платформах, таких как Windows, Linux, Mac OS, Android, iOS и других, без изменения кода.
Гибкость и расширяемость. QML позволяет создавать пользовательские элементы интерфейса, комбинируя стандартные элементы и добавляя свою логику. QML также поддерживает использование ресурсов, таких как изображения, звуки, шрифты и т.д..
Высокая производительность. QML использует аппаратное ускорение для отрисовки графики, а также оптимизирует выполнение JavaScript-кода.
Интересные факты и фичи языков программирования у нас в канале, заходи :)
Вы смотрите геймерские шоу и игровых блогеров? А ссылочкой поделитесь?
Мы составляем подборку интересных игровых каналов, шоу и даже просто рубрик про игры, которые можно найти на просторах RUTUBE. Пожалуйста, поделитесь ссылками на то, что смотрите сами, и расскажите, почему вам нравится этот контент.
В конце декабря в этом профиле выйдет подборка. Если ваши предложения окажутся в ней — придет уведомление к «колокольчик»!
Система мониторинга температуры в теплицах (Telegram, 1С, Yandex Алиса, Excel или голосовое оповещение)
На сегодняшний день даже система мониторинга в тепличных комплексах - это не дешёвое удовольствие.
Мы протестировали относительно не дорогой комплект, установили по 3шт промышленных датчика (modbus rtu) температуры +влажность в каждую 100метровую теплицу, которых было 9шт, собрали все данные по проводной шине (Utp5e RS485) около 900метров без каких-либо промежуточных коммутаторов и усложнения проекта. В промежутке поставили компьютер AntexGate.
Итак проект реализовали на разработанном нами контроллере интернет вещей AntexGate + бесплатный софт Node-red, который передает данные либо сразу на экран монитора либо через web-интерфейс:
На главный экран выводится текущая температура и влажность по каждому прибору, в случае обрыва или отсутствия датчика выводится значение ERR, а для выбора страницы реализован всплывающий экран.
За каждый день можно посмотреть данные на графике и проанализировать отношение температуры и влажности (синяя линяя влажность, белая температура), график строится как за отдельный датчик, так и средние значения в теплице.
Для более подробного анализа возможно скачать архив в формате csv и построить аналитику внешними средствами, например, за целый сезон.
Страница настроек для оповещения и привязки Teleram бота. Когда достигнут критический придел из всех устройств (телефоны, ПК) с открытым web интерфейсом либо из подключенного монитора происходит голосовое оповещение о низкой, или высокой температуре определенной теплицы и конкретного датчика.
Планируем расширять проект, т.к. в локальной wifi сети у Всех есть доступ к текущим значениям, но хочется посмотреть значения удаленно, тут мы планируем использовать Умный дом Яндекс, бесплатное приложения для мониторинга отлично подойдём еще и строит график.
Примерно такой дружелюбный интерфейс у Яндекса, в добавок на производстве можно раскидать колонок и спрашивать о состоянии системы.
В заключении хотелось бы сказать, что реализация данной системы подходит для конкретного заказчика и большое преимущество свободно программируемых систем AntexGate + Node-red в том, что ее можно доработать в дальнейшем. Можно добавить стыковку с другими системами, весами, поливом, приводами, климатическими системами и другим.
Ниже наш прибор на котором реализован проект, система отработала год.
Интересно услышать мнение профессионалов о необходимости такой системы на рынке, с разработчиками в РФ и учетом Европейских санкций.
Подробнее об устройстве на котором реализован проект можно почитать в нашем Телеграмм-канале и задать вопросы.
Чем заменить Raspberry PI в промышленности?
Если коротко, то речь пойдет о промышленном ПК на основе Raspberry CM4 – это абсолютный аналог Raspberry Pi4 в промышленном исполнении с надёжной eMMC от Samsung и полной программно-аппаратной совместимостью.
Одну статью мы закончили фразой: «Надеемся, что мы вдохновим читателей на переработку Ваших личных проектов в более масштабное производство с коммерческими перспективами.»
В этой статье мы расскажем о продолжении этой истории и что мы имеем на сегодняшний день.
Глава 1. Небольшие трудности
После пандемии начался великий дефицит на устройства Raspberry CM3+, а потом их и вовсе сняли с производства, что сильно нас не поломало. Мы нашли моментальный выход в виде китайского качественного переходника Raspberry CM3-CM4, тем самым клиенты получили лучшие технические характеристики, а мы время на переход к новому форм-фактору.
Еще одной проблемой была замена корпуса с Китайского Gainta на собственный, в связи с тем же дефицитом и тяжёлой логистикой (дорого возить куски металла) из Китая. Было решено покончить с этой коробкой.
Спустя несколько недель корпус получился, а идею крепления на DIN рейку/панель взяли у Moхи.
Глава 2. Пора переезжать на новую платформу.
Собрав обратную связь от текущих клиентов, специалистов АСУ ТП и остальных диванных критиков, мы выделили следующие недостатки в первой версии:
Необходима гальваническая развязка RS485 портов.
Необходимо два LAN порта для создания киберзащищенных шлюзов между низким и высоким уровнем.
Малый объем оперативной памяти 1Gb в некоторых случаях (установка Касперского, VipNet и другая большая обработка данных)
Отсутствие дополнительного хранилища данных кроме внешней USB флешки.
Нехватка питания для мощных периферийных модемов.
Отсутствие дискретных входов\выходов.
Решено было оставаться на обновленной Raspberry CM4, это устройство сразу решало несколько наших недостатков, а именно ОЗУ до 8GB, WIFI сразу на борту, есть MPCI-E линия для SSD диска, инфраструктура под 1GB Ethernet и самое главное это всемирное сообщество, поддерживающее этот продукт.
В интернете много готовых программах продуктов и исходников для Raspberry.
Самое главное, что клиенту нет необходимости предварительно приобретать такое устройство и можно весь софт писать и тестировать на настольной Raspberry PI и даже целиком перенести слепок на AntexGate c помощью Win32DiskImager.
Инженеру больше не нужно краснеть перед руководством, объясняя, что на этой малинке можно собрать все что угодно, малина — это как-то по-детски, а тут железяка черная – красота!
Накидали функциональную схему и начал тянуться долгий год разработки и отладки.
И вот, наконец, поле нескольких подходов плата получилась и работает безупречно, питание не скачет, все нагрузки выдерживает.
RS485 мы конечно развязали, предусмотрели возможность демонтажа гальваники, когда это критически необходимо, получили два LAN порта 1Gb/s и 100Mb/s и более того добавили возможность питания от любого passive POE-инжектора.
По традиции набор интерфейсов 2xRS485/1xRS232/1x1Wire/1xCAN/2xUSB/1xHDMI/2xSMA, самое главное появились дискретные каналы: 4 входа 9-48В развязанные оптопарами, 3 выхода: 2-реле и 1-оптопара.
Также оставили очень полезные вещи: RTC часы, аппаратный watchdog, MPCI-e разъем для модема, двухцветный программируемый светодиод, которым можно поморгать либо настроить для внешнего визуального осмотра состояния прибора (зеленый/желтый/красный).
С диском m.2 получилось все достаточно хорошо и одна линия MPCI-e выдает свои стабильные 300Mb/s на чтение и 300Mb/s на запись. Теперь уже можно хранить огромные базы данных, использовать как тонкий клиент, загрузить медиа контент, хранить и обрабатывать фото и видеофайлы.
Питание для устройства сделали с запасом и в широком диапазоне от 9 до 48В. У каждого инженера найдется блок питания в таком диапазоне. Отдельно для периферийных устройств реализовали понижающий импульсный источник питания в пределах 5А для дисков NVME + модем одновременно.
Корпус решили оставить в прежнем исполнении за исключением нескольких технических решений, а именно выкинуть крепежные стойки для платы. Вместо стоек мы отогнули 4 уха и нарезали в них резьбу, таким образом в одном цикле мы получаем 2 готовые железяки к сборке.
У нас получился компьютер для встраиваемых систем и действительно безотказный! Всем «дедам» назло.
Шутки в сторону — мы ведь серьезная организация!
Всем кто дочитал до конца мы готовы предоставить устройство на тестирование.
Пол – это лава: я таки открыл свою игровую комнату
Да-да, идея не уникальна, но тег моё, т.к я сам разработал, спаял и запрограммировал эту штуку
Расскажите, что вы мечтаете найти под елкой
Два человека из трех мечтают получить в подарок на Новый год технику — так показывают опросы общественного мнения. Но ведь техника бывает такой разной! Расскажите, о чем мечтаете именно вы. Представьте: разворачиваете подарок, а там…
Запрос скетча
Добрый день. Хотелось бы попросить скетч.
цель: имеем wemos d1 mini + применик для пульта 433мгц. Нужно по сигналу с пульта просиходило выключение пк коммандой: shutdown /s /t 10 /m \\имя_компа.
до этого на веб морде weimos были настройки переменных: компа и логин и пароль от компа. Ну и подключение к wifi чтоб это работало.
ну грубо говоря:
прием сигнала с пульта
посыл комманды для авторизации на пк
типа net use t: \\%computername\c$ %password /user:%username
следом:
shutdown /s /t 10 /m \\%computername
как то так.