Для вывода в браузер текущей температуры используется web сервер Bottle, а для просмотра графиков установлен web сервер Lighttpd.
В проекте используются два цифровых датчика температуры DS18B20. Как подключить и проверить датчик, читайте в статье Как подключить DS18B20 и вывести показания на веб-страницу. Второй датчик подключается параллельно первому, т.е. вывод питания к выводу питания, Data к Data, GND к GND. Каждый датчик имеет идентификатор, поэтому скрипт может обращаться к датчику по его идентификатору.
В проекте использовался Raspberry Pi с 512 Mb памяти с системой Raspbian Stretch (образ от 2017-11-29-raspbian-stretch.img). Обновите систему командами
sudo apt update
sudo apt upgrade
Установите веб сервер Lighttpd командой
sudo apt install lighttpd
На другом компьютере локальной сети откройте браузер и в адресной строке введите IP адрес Raspberry Pi. Вы должны увидеть тестовую страницу веб сервера Lighttpd.
Веб сервер Lighttpd на выбор выводит один из двух графиков температур с помощью простейшего сайта из трех веб-страниц. Все файлы, в том числе текстовые файлы данных для построения графиков, находятся в каталоге веб сервера /var/www/html. Скрипт на Python'e temp_2.py регулярно с интервалом две минуты (120 c) пишет показания датчиков в файлы data_a.txt (наружный воздух) и data_k.txt (квартира). Для построения графиков использована библиотека dygraph-combined-dev.js [1]. Скрипт temp_2.py находится в папке examples/python домашнего каталога /home/pi. Запуск скрипта прописан в /etc/rc.local. Он запускается автоматически при загрузке системы и работает постоянно.
Второй скрипт bottle-test2.py похож на первый, он запускает веб сервер Bottle. Bottle по запросу выводит текущие показания датчиков в браузер. Я указал порт 8000, чтобы он не конфликтовал с сервером Lighttpd, который использует по умолчанию порт 80. Для удобства оба скрипта расположены в одной папке /home/pi/examples/python.
Скачать файлы проекта
Чтобы можно было записать данные в каталог веб сервера, измените владельца и права доступа на каталог:
sudo chown -R pi:pi /var/www/html
sudo chmod -R 777 /var/www/
Распакуйте командой unzip архив с файлами проекта. Содержимое папки html проекта (не саму папку!) скопируйте в каталог /vat/www/html. Удобно это делать в файловом менеджере Midnight Commander (аналог Total Commander в Windows). Установите его командой
sudo apt-get install mc
В домашнем каталоге /home/pi создайте папку examples, а внутри нее каталог python. Из скачанного архива скопируйте в папку python два скрипта temp_2.py и bottle-test2.py. Дайте им права на выполнение командами
sudo chmod +x /home/pi/examples/python/temp_2.py
sudo chmod +x /home/pi/examples/python/bottle-test2.py
Скрипт temp_2.py
#!/usr/bin/python
import glob
import time
from bottle import route, run, template
from datetime import datetime
from time import strftime
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28-041654f0dcff')[0]
device_folder1 = glob.glob(base_dir + '28-031651a2b9ff')[0]
device_file = device_folder + '/w1_slave'
device_file1 = device_folder1 + '/w1_slave'
def read_temp_raw():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines
def read_temp_raw1():
f = open(device_file1, 'r')
lines = f.readlines()
f.close()
return lines
def read_temp():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
return temp_c
def read_temp1():
lines = read_temp_raw1()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c1 = float(temp_string) / 1000.0
return temp_c1
while True:
# print("temp C=%f\t" % read_temp())
t1=read_temp()
f = open('/var/www/html/data_a.txt', 'a')
data_entry = "{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),"%.3f" % t1)
f.write(data_entry)
f.close()
t2=read_temp1()
f = open('/var/www/html/data_k.txt', 'a')
data_entry = "{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),"%.3f" % t2)
f.write(data_entry)
f.close()
time.sleep(120)
Отредактируйте скрипты, заменив IP адрес и идентификаторы датчиков DS18B20 на свои значения. Почти всё готово для запуска проекта. Осталось только добавить строку в файл /etc/rc.local
/home/pi/examples/python/temp_2.py &
перед строкой exit 0.
Настройте правильное время. Запустите sudo raspi-config и пройдите Localisation Options ► Change Timezone. Выберите свою временнУю зону (часовой пояс). Я выбираю Asia ► Yakutsk. Перезагрузите Raspberry Pi. Теперь на другом компьютере локальной сети откройте браузер и в адресной строке введите IP адрес Raspberry Pi.
Если ваш браузер вместо открытия страницы начинает поиск по этому адресу и выводит кучу сообщений о невозможности найти такой текст, значит вам надо изменить настройки браузера. В настройках браузера отмените поиск по адресной строке. В Mozilla Firefox в разделе Поиск снимите галку "Использовать адресную строку для поиска и навигации". Теперь браузер должен открывать адрес, а не начинать поиск.
Вы увидите следующее:
Щелкните по одной из нижних картинок. Через пару секунд построится график температуры.
Участок графика можно "растянуть" мышкой и он отобразится в подробном виде. Подведя курсор мыши к линии графика, можно увидеть время и показание датчика для этой точки в правом верхнем углу картинки.
Пока что на графики выводятся мои данные, но постепенно файлы данных будут заполняться вашими показаниями и вы сможете удалить мои данные. Как просматривать и удалять ненужные данные, читайте в конце статьи WebIOPi-0.7.1 и Raspberry Pi 3 - подключение датчика давления BMP180. Проверьте запись данных в файлы data_a.txt, data_k.txt. В mc перейдите в каталог /var/www/html, пометьте файл data_a.txt и нажмите F3 (просмотр файла). Перейдите в конец файла (Ctrl+End), должна быть добавлена запись показания датчика на данный момент времени. Через три минуты снова откройте файл, должна быть добавлена еще одна запись. Если это так, значит скрипт temp_2.py работает. Вы можете изменить интервал записи показаний в последней строчке скрипта, у меня указано 120 секунд.
Осталось запустить web сервер Bottle для вывода текущих значений температур датчиков. Bottle запускается из командной строки в фоновом режиме. Для того, чтобы после запуска веб сервера можно было продолжить работу в терминале, применена команда nohup:
nohup /home/pi/examples/python/bottle-test2.py &
Команда nohup выводит сообщение. Нажмите Ctrl+C, чтобы появилось приглашение командной строки. Теперь можно дать любую команду или просто закрыть терминал.
Как можно видеть, я подключаюсь к Raspberry Pi по SSH из Linux Mint.
Для просмотра текущей температуры датчиков на другом компьютере локальной сети откройте браузер и в адресной строке введите IP адрес Raspberry Pi и через двоеточие порт 8000. Вы увидите примерно следующее:
Показания не обновляются автоматически. Для обновления перезагрузите (обновите) веб-страницу.
На данный момент вы можете смотреть показания по локальной сети. Чтобы смотреть показания датчика по интернету, нужно сделать дополнительные настройки. Об этом читайте в статье Как получить доступ по интернету к датчикам в квартире. Если у вас роутер Xiaomi, то в статье описана его настройка именно для данного проекта. В настройках port forwarding укажите порт 80 и порт 8000. Если планируете подключаться по SSH, то пробросьте еще порт 22.
Использованные ресурсы
1. http://lock.3dn.ru/news/raspberry_pi_dlja_domashnej_avtomatizacii_grafiki_parametrov/2015-09-18-136
2. Simon Monk Raspberry Pi Cookbook O’Reilly Media 2014 p. 319
3. Simon Monk Raspberry Pi Cookbook O’Reilly Media 2nd Edition 2016
русский перевод Саймон Монк: Raspberry Pi. Сборник рецептов. Решение программных и аппаратных задач Диалектика, 2017
4. Монитор атмосферного давления и температуры на Raspberry Pi 3
|