Съдържание:

Домашен мониторинг „Направи си сам“с RaspberryPi и Cloud4Rpi: 5 стъпки
Домашен мониторинг „Направи си сам“с RaspberryPi и Cloud4Rpi: 5 стъпки

Видео: Домашен мониторинг „Направи си сам“с RaspberryPi и Cloud4Rpi: 5 стъпки

Видео: Домашен мониторинг „Направи си сам“с RaspberryPi и Cloud4Rpi: 5 стъпки
Видео: Mini PC on Intel N100 - AC8-N, powerful fanless platform, Home Assistant OS installation 2024, Ноември
Anonim
Направи си домашен мониторинг с RaspberryPi и Cloud4Rpi
Направи си домашен мониторинг с RaspberryPi и Cloud4Rpi

Един зимен уикенд отидох в селската си къща и разбрах, че там е много студено. Нещо се беше случило с електричеството и RCD прекъсвачът го беше изключил и отоплението също се изключи. Имах късмет, че дойдох там, иначе след няколко дни всичко щеше да бъде замразено, което е много лошо за тръбите и радиаторите.

Имах наоколо няколко Raspberry Pi и термичен сензор, затова си помислих - защо не направя просто устройство за наблюдение? Инструкциите по -долу предполагат, че имате Raspberry Pi с настроена Raspbian и мрежова връзка. В моя случай това е Raspberry Pi B+ с Raspbian (2018–06–27-raspbian-stretch-lite).

Стъпка 1: Мониторинг на температурата

Мониторинг на температурата
Мониторинг на температурата
Мониторинг на температурата
Мониторинг на температурата

Как да свържете температурен сензор DS18B20? Просто потърсете в Google как да направите това и ще видите много снимки като тази:

В моя случай имах черен, жълт и червен проводник. Черното е заземено, отива към заземяващ щифт, червеното е захранващо - преминава към 3.3v щифт, а жълтото е данни - трябва да отиде към пино GPIO4, с резистор 4.7 kOm, свързан между данни и захранване. Забележка, можете да свържете няколко сензора паралелно (те са цифрови и имат различни адреси), имате нужда само от един резистор. След като свържете сензора си, трябва да активирате 1Wire в raspi-config:

sudo raspi-config

Отидете на 5 опции за свързване, активирайте P7 1-Wire и рестартирайте.

След това можете да тествате дали можете да видите сензора:

sudo modprobe w1-gpiosudo modprobe w1-thermls/sys/bus/w1/devices/

Трябва да видите нещо подобно:

pi@vcontrol: ~ $ ls/sys/bus/w1/devices/28–00044eae2dff w1_bus_master1

28–00044eae2dff е нашият температурен сензор.

Хардуерът е готов. Сега трябва да настроя частта за наблюдение. Имам нужда от нещо, което да ми показва данните и да ме уведомява, ако устройството е изключено за известно време или няма захранване, или температурата е ниска. Очевидно това не може да бъде самото малиново пи, трябва да има някакъв сървър или услуга в интернет, която да следи моето устройство.

Мога да създам прост сървър, да получа хостинг и да настроя всичко, но честно казано, не искам. За щастие някой вече е помислил за това и е създал cloud4rpi.io - облачен контролен панел за вашето устройство.

Стъпка 2: Настройка на Cloud4Rpi.io

Настройване на Cloud4Rpi.io
Настройване на Cloud4Rpi.io

Cloud4Rpi предоставя услуга, която позволява на вашето устройство да изпраща и получава данни, използвайки MQTT или HTTP протоколи. Те имат клиентска библиотека за Python, така че ще използвам Python.

Примерите на Python, които се предлагат с услугата Cloud4Rpi, вече съдържа код за сензор за температура DS18B20.

Затова отидох на https://cloud4rpi.io, създадох акаунт и добавих ново устройство там. Страницата на устройството има знак - низ, който идентифицира устройството и който трябва да бъде посочен в програмата, която изпраща данни.

Като начало, винаги е добра идея да актуализирате мениджъра на пакети и да надстроите пакетите (забележка: може да отнеме часове, ако не сте надстройвали известно време):

sudo apt-get update && sudo apt-get upgrade

След това инсталирайте git, Python и неговия мениджър на пакети Pip:

sudo apt-get install git python python-pip

След това инсталирайте библиотеката на cloud4rpi Python:

sudo pip инсталирайте cloud4rpi

И накрая, готов съм да напиша моята програма за управление. Започвам от пример, достъпен на

git clone https://github.com/cloud4rpi/cloud4rpi-raspberrypi… cloud4rpicd cloud4rpi

Основният програмен файл е control.py - трябва да го променя според нуждите си. Първо, редактирайте програмата и поставете знак:

sudo nano control.py

Намерете ред DEVICE_TOKEN = '…'] и посочете там жетон на устройство. След това мога просто да стартирам програмата: Тя работи и отчита температура в променливата RoomTemp:

sudo python control.py

Той работи и отчита температура в променливата RoomTemp.

Имайте предвид, че той открива всички едножични сензори ds18b20

ds_sensors = ds18b20. DS18B20.find_all ()

и използва първия намерен сензор:

RoomTemp ': {' type ':' numeric ',' bind ': ds_sensors [0] if ds_sensors else None}

Добре, това беше лесно, защото примерната програма има всичко необходимо за работа със сензор ds18b20 на Raspberry Pi. Сега трябва да намеря начин да докладвам за състоянието на захранването.

Стъпка 3: Мониторинг на UPS

UPS Мониторинг
UPS Мониторинг

Следващото нещо, което искам да наблюдавам, е състоянието на UPS, така че ако има прекъсване на захранването, ще знам за това, преди всичко да се прекъсне.

Имам APC UPS с USB управление, затова бързо потърсих в google и установих, че имам нужда от apcupsd. https://www.anites.com/2013/09/monitoring-ups.html… Опитах няколко пъти да го инсталирам чрез apt-get и той не работи за мен по различни причини. Ще покажа как да го инсталирам от източниците.

wget https://sourceforge.net/projects/apcupsd/files/ap…tar xvf apcupsd-3.14.14.tar.gz cd apcupsd-3.14.14./configure --enable-usb sudo make sudo make install

След това редактирам apcupsd.conf, за да се свържа с моя UPS чрез usb.

sudo nano /etc/apcupsd/apcupsd.conf# #UPSCABLE smart UPSCABLE usb ##UPSTYPE apcsmart #DEVICE/dev/ttyS0 UPSTYPE usb DEVICE

Сега мога да включа USB кабел от UPS към RaspberryPi и да тествам дали ще бъде намерен UPS.

sudo apctest

Той не трябва да ви дава съобщения за грешка.

Сега трябва да стартира sevice apcupsd:

sudo systemctl стартира apcupsd

За да получа заявен статус на UPS, мога да използвам команда за състояние:

sudo /etc/init.d/apcupsd статус

И ще изведе нещо подобно:

APC: 001, 035, 0855ДАТА: 2018-10-14 16:55:30 +0300 HOSTNAME: vcontrol ВЕРСИЯ: 3.14.14 (31 май 2016 г.) debian UPSNAME: vcontrol КАБЕЛ: USB кабелен драйвер: USB UPS драйвер UPSMODE: Самостоятелен STARTTIME: 2018-10-14 16:54:28 +0300 МОДЕЛ: Back-UPS XS 650CI СТАТУТ: ОНЛАЙН ЛИНЕВ: 238.0 Волта LOADPCT: 0.0 Процент BCHARGE: 100.0 Процент TIMEELEFT: 293.3 минути MBATTCHG: 5 процента MINTIMEL: 3 минути MAXTIME 0 секунди SENSE: среден LOTRANS: 140.0 волта HITRANS: 300.0 волта ALARMDEL: 30 секунди BATTV: 14.2 волта LASTXFER: Няма прехвърляния от момента на завъртане NUMXFERS: 0 TONBATT: 0 секунди CUMONBATT: 0 секунди XOFFBATT: N/A STATX0BT4: 2014-06-10 NOMINV: 230 волта NOMBATTV: 12,0 волта NOMPOWER: 390 вата ФИРМУАР: 892. R3. I USB FW: R3 END APC: 2018-10-14 16:55:38 +0300

Имам нужда от състояние - което е редът „STATUS:“.

Библиотеката Cloud4rpi съдържа модул „rpy.py“, който връща системните параметри на Raspberry Pi, като име на хост или температура на процесора. Тъй като всички тези параметри са резултат от изпълнение на някои команди и анализиране на изхода, той съдържа и удобна функция „parse_output“, която прави точно това, от което се нуждая. Ето как да получа статуса си на UPS:

def ups_status (): result = rpi.parse_output (r'STATUS / s+: / s+(S+) ', [' /etc/init.d/apcupsd ',' status ']) ако резултат: връщане на резултат else: връщане „НЕИЗВЕСТНО“

За да изпратя това състояние на cloud4rpi, трябва да декларирам променлива UPSStatus и да я свържа с моята функция ups_status: Сега мога да стартирам програмата си:

променливи = {'RoomTemp': {'type': 'numeric', 'bind': ds_sensors [0]}, 'UPSStatus': {'type': 'string', 'bind': ups_status}}

И веднага мога да видя променливата си на страницата на cloud4rpi устройството.

Стъпка 4: Подготовка за „производство“

Подготовка за „производство“
Подготовка за „производство“

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

За начало ще коригирам времевите интервали. Интервалът на анкетата определя колко често програмата проверява за температура и състояние на UPS - задайте го на една секунда.

Резултатите се изпращат в облака на всеки 5 минути, а диагностичната информация - на всеки час.

# КонстантиDATA_SENDING_INTERVAL = 300 # сек DIAG_SENDING_INTERVAL = 3600 # сек POLL_INTERVAL = 1 # сек

Когато състоянието на UPS се промени - не искам устройството ми да чака 5 минути и веднага изпращам данни. Така че леко промених основния цикъл и той изглежда така:

data_timer = 0diag_timer = 0 prevUPS = 'ONLINE' докато True: newUPS = ups_status () if (data_timer <= 0) или (newUPS! = prevUPS): device.publish_data () data_timer = DATA_SENDING_INTERVAL prevUPS = newUPS ако diag_timer < device.publish_diag () diag_timer = DIAG_SENDING_INTERVAL сън (POLL_INTERVAL) diag_timer -= POLL_INTERVAL data_timer -= POLL_INTERVAL

Тестване: стартиране на скрипт:

sudo python control.py

И мога да гледам състоянието на UPS на страницата на устройството си.

Ако изключа захранването на UPS, състоянието се променя след няколко секунди, така че всичко работи. Сега трябва да стартирам apcupsd и моя control.py при стартиране на системата. Услугата Apcupsd е стара и за да я стартирам на съвременния raspbian, трябва да променя /etc/init.d/apcupsd файла, като добавя тези редове някъде в горната част:

### BEGIN INIT INFO # Предоставя: apcupsd # Изисква се-Старт: $ all # Изисква се-Стоп: # По подразбиране-Старт: 2 3 4 5 # Default-Stop: # Кратко описание: APC UPS демон … ### END INIT ИНФОРМАЦИЯ#

След това активирайте услугата:

sudo systemctl активира apcupsd

След това стартирайте услугата:

sudo systemctl стартира apcupsd

Сега apcupsd ще бъде стартиран при стартиране на системата.

За да инсталирам control.py като услуга, използвах предоставения скрипт service_install.sh:

sudo bash service_install.sh ~/cloud4rpi/control.py

Сега услугата е стартирана и тя трябва да оцелее при рестартиране.

Стъпка 5: Настройване на контролен панел

Настройване на контролен панел
Настройване на контролен панел

Cloud4rpi ми позволява да настроя контролен панел за моето устройство. Можете да добавите „джаджи“и да ги свържете с променливите на устройството.

Устройството ми предлага две променливи само за четене - RoomTemp и UPSStatus:

променливи = {'RoomTemp': {'type': 'numeric', 'bind': ds_sensors [0]}, 'UPSStatus': {'type': 'string', 'bind': ups_status}}

Добавих 3 приспособления - номер за RoomTemp, Текст за UPSStatus и диаграма за RoomTemp.

Мога да настроя сигнали, така че получавам имейл, когато температурата е извън зададения диапазон, UPS е изключен или самото устройство не изпраща данни, когато трябва. Сега мога да съм сигурен, че моята селска къща е добре и мога да бъда уведомен когато нещо не е наред, мога да се обадя на съседите и да ги помоля да проверят какво става. Ето действителния код на control.py.

Препоръчано: