Оглавление:

Мониторинг дома своими руками с помощью RaspberryPi и Cloud4Rpi: 5 шагов
Мониторинг дома своими руками с помощью RaspberryPi и Cloud4Rpi: 5 шагов

Видео: Мониторинг дома своими руками с помощью RaspberryPi и Cloud4Rpi: 5 шагов

Видео: Мониторинг дома своими руками с помощью RaspberryPi и Cloud4Rpi: 5 шагов
Видео: Собираем сетевое хранилище из Raspberry Pi 4! 2024, Ноябрь
Anonim
Мониторинг дома своими руками с помощью RaspberryPi и Cloud4Rpi
Мониторинг дома своими руками с помощью RaspberryPi и Cloud4Rpi

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

У меня было несколько Raspberry Pi и термодатчик, поэтому я подумал: а почему бы мне не сделать простое устройство для мониторинга? В приведенных ниже инструкциях предполагается, что у вас есть Raspberry Pi с Raspbian и настроено сетевое соединение. В моем случае это Raspberry Pi B + с Raspbian (2018-06-27-raspbian-stretch-lite).

Шаг 1: Мониторинг температуры

Контроль температуры
Контроль температуры
Контроль температуры
Контроль температуры

Как подключить датчик температуры DS18B20? Просто погуглите, как это сделать, и вы увидите много картинок вроде этой:

В моем случае у меня были черный, желтый и красный провода. Черный - земля, идет к контакту заземления, красный - питание - идет к контакту 3,3 В, а желтый - данные - должен идти к контакту GPIO4, с резистором 4,7 кОм, подключенным между данными и питанием. Обратите внимание, что вы можете подключить несколько датчиков. параллельно (они цифровые, имеют разные адреса) нужен только один резистор. После подключения датчика вы должны включить 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 - это наш датчик температуры.

Железо готово. Теперь мне нужно настроить мониторинговую часть. Мне нужно что-то, что показывало бы мне данные и уведомляло меня, если устройство отключено на некоторое время, или нет питания, или температура низкая. Очевидно, что это не может быть сама Raspberry Pi, в Интернете должен быть какой-то сервер или служба, которая отслеживает мое устройство.

Я могу создать простой сервер, получить хостинг и все настроить, но, честно говоря, я не хочу. К счастью, кто-то уже подумал об этом и создал 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

Затем установите библиотеку Python cloud4rpi:

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: Мониторинг ИБП

Мониторинг ИБП
Мониторинг ИБП

Следующее, что я хочу контролировать, - это состояние ИБП, поэтому, если произойдет отключение электроэнергии, я узнаю об этом до того, как все отключится.

У меня есть ИБП APC с управлением через USB, поэтому я быстро погуглил и обнаружил, что мне нужен 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, чтобы подключиться к своему ИБП через usb.

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

Теперь я могу подключить USB-кабель от ИБП к RaspberryPi и проверить, будет ли найден ИБП.

sudo apctest

Он не должен выдавать сообщений об ошибках.

Теперь нужно запустить sevice apcupsd:

sudo systemctl start apcupsd

Чтобы запросить статус ИБП, я могу использовать команду статуса:

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-драйвер ИБП UPSMODE: Stand Alone ВРЕМЯ НАЧАЛА: 2018-10-14 16:54:28 +0300 МОДЕЛЬ: Back-UPS XS 650CI СОСТОЯНИЕ: ONLINE LINEV: 238,0 В НАГРУЗКА PCT: 0,0% BCHARGE: 100,0% TIMELEFT: 293,3 минуты MBATTCHG: 5% MINTIMEL: 3 минуты MAXTIME: 0 секунд SENSE: Medium LOTRANS: 140,0 вольт HITRANS: 300,0 вольт ALARMDEL: 30 секунд BATTV: 14,2 вольт LASTXFER: без передачи с момента включения NUMXFERS: 0 TONBATT: 0 секунд CUMONBATT: 0 секунд XOFFBATTATE: N / A 0x08BATT: N / A 0x02: 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

Мне нужен статус - это строка «СТАТУС:».

Библиотека Cloud4rpi содержит модуль «rpy.py», который возвращает системные параметры Raspberry Pi, такие как имя хоста или температура процессора. Поскольку все эти параметры являются результатом выполнения некоторых команд и анализа вывода, он также содержит удобную функцию parse_output, которая делает именно то, что мне нужно. Вот как получить статус моего ИБП:

def ups_status (): result = rpi.parse_output (r'STATUS / s +: / s + (S +) ', [' /etc/init.d/apcupsd ',' status ']) if result: return result else: return 'НЕИЗВЕСТНЫЙ'

Чтобы отправить этот статус в cloud4rpi, мне нужно объявить переменную UPSStatus и привязать ее к моей функции ups_status: Теперь я могу запустить свою программу:

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

И я сразу вижу свою переменную на странице устройства cloud4rpi.

Шаг 4: Подготовка к «производству»

Подготовка к «производству»
Подготовка к «производству»

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

Для начала я настрою временные интервалы. Интервал опроса определяет, как часто программа проверяет температуру и состояние ИБП - установите значение в одну секунду.

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

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

При изменении статуса ИБП - я не хочу, чтобы мое устройство ждало 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 <0 diag: device.publish_diag () diag_timer = DIAG_SENDING_INTERVAL сна (POLL_INTERVAL) diag_timer - = POLL_INTERVAL data_timer - = POLL_INTERVAL

Тестирование: запустить скрипт:

sudo python control.py

И я могу наблюдать за состоянием ИБП на странице своего устройства.

Если я выключу ИБП, статус изменится через пару секунд, так что все работает. Теперь мне нужно запустить apcupsd и мой control.py при запуске системы. Сервис Apcupsd старый, и чтобы запустить его на современном raspbian, мне нужно изменить файл /etc/init.d/apcupsd, добавив эти строки где-нибудь вверху:

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

Затем включите сервис:

sudo systemctl включить apcupsd

Затем запустите службу:

sudo systemctl start 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.

Я могу настроить оповещения, поэтому я получаю электронное письмо, когда температура выходит за пределы указанного диапазона, ИБП отключился или само устройство не отправляет данные, когда должно. Теперь я могу быть уверен, что с моим загородным домом все в порядке, и я могу получать уведомления когда что-то не так, я могу позвонить соседям и попросить их проверить, что происходит. Вот фактический код control.py.

Рекомендуемые: