Пользователь
0,0
рейтинг
21 января 2013 в 16:36

Отправка данных о температуре с роутера TL-MR3020 и Raspberry Pi на «Народный мониторинг»

Вступление


В следствии возникновения вопросов, позволю себе небольшой комментарий, немного проясняющий смысл статьи. В статье описывается два устройства, не зависящих друг от друга, и выполняющих идентичные задачи по отправке данных на сайт «Народный мониторинг»

Когда я впервые увидел статью на хабре «Народный мониторинг температуры (vs прогноз) в различных городах. Нужен ли?», посвященную мониторингу параметров среды narodmon.ru, я как-то скептически отнесся к такой затее и забыл про нее. Перед новым годом у меня появилась Raspberry Pi и какое-то время ушло на ее освоение и обзор возможностей, в итоге что-бы малинка не простаивала, да и так для общего развития по статье «История взаимодействия «чайника» и DS18B20 посредством Raspberry Pi» сделал тоже самое, но с учетом исходников первоисточника, в который уже внесены изменения по мотивам вышеприведенной статьи с ссылкой на хабр. Температура измерялась, графики строились, но как-то скучно стало за этим наблюдать, да и применение малинки в этих целях это как из пушки по воробьям, и в один прекрасный день я вспомнил про «Народный мониторинг», на котором вся отображаемая на сайте информация выводится только на основании сведений о текущих параметрах среды(температура, влажность, атм.давление и др.) передаваемых с клиентских устройств пользователей данного сервиса. Начал искать и нашел статью «Лучшая реализация реализация UART => 1-wire и I2C/SPI на базе роутеров». Тут я и загорелся идеей сделать такое устройство, правда в надежде на то, что кто-то уже это сделал, а я только повторю, благо роутер TL-MR3020 уже имелся в хозяйстве, и над ним уже ставились бесчеловечные опыты по привинчиванию его к «самокатной телеге» с камерой по мотивам статьи «Простой wifi бот для мониторинга помещений или «кухонное» роботостроение».

Итак, приступим


Начал я с опытов над роутером, на нем на тот момент была прошивка OR-WRT 0.70, основанная на OpenWRT. Подключается датчик температуры к роутеру через преходник USB-UART. Схема подключения предельно проста. Текст и фото с сайта http://cyber-place.ru
Подключить датчик к UART можно по ниже приведенному рисунку

Соеденить RX и TX вместе и подключить к ним data линию 1-Wire датчика DS18B20
VCC к VCC
GND к GND



При попытке подключения и считывания данных через родной UART роутера выяснилось, что сделать с наскока это не получится. На одном буржуйском форуме была найдена информация о том, что ограничение это аппаратное и накладывает его сам роутеровский порт, который заточен под 8 бит данных, а в digitemp (пакет для считывания данных с датчиков 1-wire) используется только 6. Решено – придется ставить переходник USB-COM на FT232 или PL2303, возможен еще вариант на CP2102, но его у меня в наличии нет, а посему буду использовать то что есть. После этого я решил попробовать силы в написании скрипта отправки полученных данных на «Народный мониторинг». На данный сервис отправка данных должна осуществляться двумя методами на выбор, либо telnet TCP/UDP (рекомендуемый), либо HTTP POST. Примеры отправки данных на PHP имеются на сайте. PHP для меня темный лес, но все же это лучше чем ничего. После первой же попытки установить PHP на роутер стало ясно, что имеющихся в нем 4МБ памяти маловато, и фокус не удастся. Тогда я начал думать об увеличении объема флеш-памяти и наткнулся на том-же cyber-place.ru на тему «Замена и восстановление Flash ROM в роутере MR3020 и WR703n». Но после некоторых раздумий пришел к выводу что это не по фэн-шую, для меня и для большинства это довольно трудоемко, плюс требуется программатор, который не у всех есть, и забил на это дело. Решил написать на bash необходимый скрипт, но советы с гуглом не принесли результата, и пара дней прошло зря. В итоге было решено поставить USB-HUB (видел в сети благополучные опыты по вживлению оных во внутренности роутера), и к нему подключить внешний накопитель и USB-UART мост. Сказано – сделано, но в будущем, после удачного завершения опытов с Raspberry Pi и PHP, а в тот момент я как раз перекинулся на эти опыты. Перенесемся в будущее, задуманные опыты над малинкой и ПХП благополучно закончены, о чем я напишу ниже, продолжим опыты с роутером. Для увеличения объема памяти используется ее перенос на внешнюю флешку, а это значит что тот роутер который у меня был настроен на работу с «самокатной телегой» будет окончательно и бесповоротно переведен на использование с дополнительной памятью, чего делать категорически не хотелось. На следующий день был куплен еще 1 роутер и самый маленький USB-HUB, так-как потерять достигнутые результаты было жалко, тем более что это все же должны быть разные устройства.





Для «термометра» я решил использовать чистую OpenWRT. Скачав ее при попытке установки в поле выбора имени файла поиском по первым буквам обнаружил что у меня там целых 3 прошивки с одинаковым размером и именем файла, отличался только порядковый номер закачки файла. Я решил что когда-то уже качал эту прошивку и выбрал на угад одну из трех. После прошивки мне не удавались ни какие первичные действия из мануала на OpenWRT. Думал уже что что-то пошло не так во время прошивки и начал изучать методы извлечения роутера из кирпича через TFTP. Весь вечер на это положил, благо до практики руки не дошли, в теории было много не понятного. И под конец вечера что-то меня дернуло попробовать выполнить первоначальные настройки как для OR-WRT 0.70. Мне повезло, оказалось что я залил именно ее. Потом при сравнивании имен скачиваемых файлов оказалось что и OpenWRT и OR-WRT имеют одинаковые названия. Далее я потратил энное количество времени на попытку расширить память на внешнюю флешку, после чего было принято решение о заливке другой прошивки OR-WRT 0.75 alpha с уже имеющейся поддержкой флешек. Без проблем прошил и настроил по инструкции свой роутер и приступил к дальнейшим действиям.
По накатанной в /etc/opkg.conf изменил адрес репозитория на downloads.openwrt.org/snapshots/trunk/ar71xx/packages, обновил список пакетов

opkg update

установил пакеты digitemp-a

opkg install digitemp-usb
opkg install digitemp

После этого командой dmesg выяснил куда подключен адаптер FTDI, у меня оказался ttyUSB0. Выполняем поиск устройств 1-wire

digitemp_DS9097 -i -s /dev/ttyUSB0

если нашлись, то считываем показания температуры и пишем в файл

digitemp_DS9097 -a -A -l /tmp/1wire_log

что бы посмотреть результат вводим

cat /tmp/1wire_log

Все работает. Далее устанавливаем пакеты для работы PHP

opkg install php5
opkg install php5-cgi

И начинаем заниматься написанием скриптов. В этом деле я не мастак, поэтому прошу сильно не пинать за кривость кода и огромные костыли, подставленные, чтобы это все заработало. Написано было два скрипта, один на bash, другой на php. Вернее тот, что на php был сделан на основе исходников с сайта «Народный мониторинг». Первый скрипт выуживает данные полученные от пакета digitemp и записанные в файл 1wire_log, и подгоняет их в удобоваримый вид. После чего передает управление второму скрипту на php для отправки данных на сервер.

Первый скрипт get_send.sh
#!/bin/bash
rm /temperatura/1wire_log
rm /temperatura/temp
rm /temperatura/temper
cd /
digitemp_DS9097 -i -s /dev/ttyUSB0
sleep 1s
digitemp_DS9097 -a -A -l /temperatura/1wire_log
sleep 2s
cd /temperatura
cut -c29-33 1wire_log | sed 's/$//' > temp
cat temp | tr -d '\n' > temper
php-cgi /temperatura/send.php
echo «OK\n»

Второй скрипт берет данные из файла, подготовленного первым скриптом, и отправляет их на сервер.

Второй скрипт send.php
<?php
$file_name="/temperatura/temper";
$file=fopen("$file_name", «r»);
$gradus_out=fread($file, filesize($file_name));
echo "$gradus_out\n";
fclose($file);

$fp = @fsockopen(«tcp://narodmon.ru», NNNN, $errno, $errstr);
# где NNNN — номер порта доступный после регистрации
if(!$fp) exit(«ERROR(».$errno."): ".$errstr);
fwrite($fp, "#01-23-45-67-89-AF\n# 0123456789ABCDEF#$gradus_out\n##");
fclose($fp);
echo «OK\n»;
?>

где 01-23-45-67-89-AF – mac-адрес сетевой карты wlan (Wi-Fi), а 0123456789ABCDEF – серийный номер датчика температуры DS16(x)20
Для обоих реализаций устройства я использовал mac-адрес wlan для привязки устройства на сайте «Народный мониторинг». Что-бы найти этот адрес можно ввести команду ifconfig.
Далее нам необходимо автоматизировать получение и отправку данных на сервер с помощью cron. На момент отладки скриптов я отправлял данные на сервер с периодичностью 5 минут, но как только они были отлажены, период увеличился до 10 минут. Для этого создаем простенький crontab для пользователя root с содержимым

Crontab для root
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0,10,20,30,40,50 * * * * sh /temperatura/get_send.sh

По данному заданию опрос датчика и отправка данных осуществляется каждые 10 минут. Последняя строка скрипта вполне может быть вида

*/10 * * * * sh /temperatura/get_send.sh

Так как на данный момент у меня включены два устройства для отправки данных о температуре, а на сайте игнорируются данные приходящие чаще чем раз в пять минут, данные от одного из моих устройств игнорируются. По этому, для каждого из устройств было четко задано в кроне время отправки данных с интервалом между устройствами в 5 минут. Скачать скрипты и crontab можно здесь. Далее копируем crontab пользователя root в /etc/crontabs и папку temperatura в / (корень файловой системы).
Для запуска и включения cron надо выполнить в терминале

/etc/init.d/cron start

/etc/init.d/cron enable

Переходим на сборочный участок


После того как все было проверено в работе пора приступать к сборке всего хозяйства в единое устройство. После вскрытия USB-хаба и роутера начал прикидывать компоновку устройств внутри корпуса советуясь с гуглом и подглядывая на страничку по моддингу роутера. Оказалось что USB-HUB я купил такой же как и у автора первого варианта доработок. Уже хорошо, раз ему удалось это сделать значит и у меня получится. После первичной компоновки внутренностей устройства стало ясно, что можно попробовать уместить туда же и USB-UART переходник. В качестве USB-UART переходника был опробован и принесен в жертву датакабель от какого-то старого телефона на микросхеме PL2303, появившийся у меня из ниоткуда с целью использования как мост USB-UART. До этого он кем-то дорабатывался, были напаяны не самые маленькие детали, которые задавали толщину самой плате. После изучения схем на телефонные шнурки эти габаритные детали были удалены. Так же был удален переключатель питания и откусаны торчащие ноги выводных элементов. Платка сразу похудела. Можно было бы воспользоваться и платкой на FTDI, габариты которой минимум в 2 раза меньше примененной платы, но ее было жалко т.к. в ней есть полезный сигнал DTR, применяемый для сброса Arduino, а в PL2303 он инверсный и для его использования пришлось бы городить инвертор. А для наших целей этот сигнал совершенно не важен.
После доработки USB-UART переходника пришла очередь и USB-хаба, торчащие выводы которого так же были срезаны. Для него это похудение оказалось почти не заметным, но в целом для конструкции думаю стало полезным. Опираясь на опыт людей которые уже делали это начал повторную примерку. Те варианты что были предложены меня не устраивали т.к. пришлось бы удалять световод. Перекинул на противоположную от световода сторону, уже лучше. Но все равно имеющейся флешкой будет закрываться часть светодиодов и придется так же удалять часть световода.Но по прикидкам можно обойтись без крайних мер купив флешку покороче. Начал искать по компьютерным магазинам и нашел достойный вариант по адекватной цене, которую купил на следующий день. Как оказалось такую же модель флешки уже использовал автор еще одного варианта моддинга. Получается что ввыбор применяемых деталей не так велик, раз я 2 раза случайно попал на такие же, совершенно не зависимо от опередивших меня авторов.
Далее я начал думать как наиболее элегантно расположить порт UART на корпусе роутера для подключения внешнего датчика. Оказалось что не используемый отныне USB порт, выводы питания которого так и продолжают исполнять возложенные на них функции, а отрезанные от схемы выводы +D и -D вполне можно приспособить под Rx и Tx. Отлично. Спаял все воедино, проверил.





Для фиксации плат между собой использовал обычный 2х сторонний скотч. При сборке надо быть предельно осторожным, что-бы ничто нигде не коротнуло и не продавить скотч острыми паяными выводами. При приклейке хаба я использовал два слоя скотча для увеличения расстояния между платами, по 2 полоски на слой сложенные «паленицей». Для тестов использовал оставшийся хвост от того же хаба. Вот что получилось в итоге





Результат порадовал, даже места еще немного осталось, и остался неиспользуемый встроенный UART. В закромах был найден Bluetooth модуль HC-04 и примерен на возможное место установки. Встал как родной. Сразу же был припаян и приклеен на тот же скотч на USB порт роутера.





Зачем мне это? Как уже сказал выше, жалко что пропадает место и UART. Плюс роутер ничего не будет делать целых 10 минут, не порядок. Можно навешать еще каких функций. Например, первое из-за чего я это сделал – в интернете на градусник смотреть хорошо, но не всегда удобно. Вот и думаю поставить простейшую ардуину с 7-сегментным индикатором. А может и знакосинтезирующий, чтоб еще и время/дату показывать. Вообще вариантов масса.
Закрыть крышку мешал только один штырь на ней, который должен упираться в плату, а упирается в USB разъем хаба. Примерил на глаз да и срезал половину.





После чего крышка нормально встала на место. Правда так же плотно поставить ее не удалось и она немного выдается вверх. Но это нормальное явление и ей не мешают все мои доработки. Тоже самое у меня на первом не доработанном роутере. В итоге получил внешне почти девственно новый роутер, не считая следов не аккуратного вскрытия.





Для выноса датчика на улицу я использовал разборный USB разъем на кабель и шнур от комовской мышки, он мягче остальных шнуров которые у меня были, с напаянным небольшим отрезком плоского кабеля что-бы пропустить его между оконными уплотнителями при закрывании окна.
.
Цена вопроса при использовании роутера

Роутер TL-MR3020 910р.
USB-HUB Ginzzu 210р.
Флешка Sandisk Cruzer Fit 8 ГБ 248р.
Переходник USB-UART на PL2303 из китая ~50р.
Bluetooth модуль HC-04 из китая ~7$ = 210р.
Датчик температуры DS16(x)20 ~60р.
Итого ~1688р.

Естественно Bluetooth модуль можно выкинуть, и тогда цена приблизится к планке ~1500р.

Варианты усовершенствования

Первое – оптимизация скриптов приведенных в статье
Второе – если удастся избавиться от скрипта на PHP и перейти на bash полностью, то получится избавиться от флешки и USB-хаба, что существенно сократит трудоемкость и стоимость конечного устройства.
Третье (просто предположение) – возможно, если почистить прошивку удалив не используемые модули, получится освободить место для PHP, достигнем тех же результатов что и во втором варианте.
Четвертое – заставить работать аппаратный UART, еще сократит стоимость, но немного повысит трудоемкость. Все что я смог найти на эту тему это непонятный мне скрипт на pastebin-е без комментариев, и ссылку на лежачий сайт, откуда идет ссылка на pastebin. Пробовал запустить этот скрипт безрезультатно.
Пятое – задействовать вывод GPIO написав соответствующий драйвер.

Отправка с Raspberry Pi


Как я уже упоминал, у меня уже была малинка настроенная должным образом на измерение температуры на двух датчиках и составление графиков. Таким образом, дело осталось за малым, выдернуть данные о температуре и отправить их на сервер.
Дальнейшее описание процесса будет с учетом того, что Вы уже настроили малинку на получение данных с датчиков и построение графиков. Однако коротко расскажу принцип действия тех скриптов, а желающие смогут скачать полностью мои скрипты для быстрой настройки. В варианте, который я повторил и предлагаю Вам повторить, имеется 3 скрипта на bash, один на perl и один файл базы данных для RRDTool. Первый скрипт на bash запускается однократно и создает файл базы данных. Второй скрипт на bash добавляется в cron и все что он делает, это запускает выполнение остальных скриптов. Первым делом он запускает скрипт get_temp.pl, который отвечает за считывание показаний с датчиков температуры и укладывание этих показаний в базу данных. Второй строкой он запускает скрипт create_graphs.sh, который берет значения температуры из базы данных и по ним строит графики. Отталкиваясь от того что моя малинка все это уже умеет делать приступаю к реализации оставшейся части задуманного. Здесь уже используется один скрипт на PHP для отправки данных на сервер. Плюс к этому добавляется несколько строк обработки полученных от датчиков данных в уже имеющийся скрипт get_temp.pl и одна строчка в скрипт get.sh.
Мой скрипт получения данных с датчиков с добавлением обработки показаний температуры выглядит так

get_temp.pl
#######################################################################
Здесь прошу меня простить, то ли в скрипте что-то мешает, то ли глюк какой, но нормально вставить его под спойлер у меня не получилось, по этому привожу кусок оригинального кода с вставленными моими доработками.
#######################################################################
foreach $device (@deviceIDs)
{
$reading = &read_device($device);
if ($reading == 9999) {
$reading = «U»;
}

push(@temp_readings,$reading);

}

if ($temp_readings[0] ne 'U') {$temp_readings[0] -= $in_correction;}
if ($temp_readings[1] ne 'U') {$temp_readings[1] -= $out_correction;}

#update the database
`/usr/bin/rrdtool update /home/pi/temperature/multirPItemp.rrd N:$temp_readings[0]:$temp_readings[1]`;
print «Temp 1 = $temp_readings[0] Temp 2 = $temp_readings[1]\n»;
#######################################################################
#Мои дополнения
open(FILE, ">/home/pi/temperature/temp_out");
print FILE "$temp_readings[0]";
close (FILE);
open(FILE, ">/home/pi/temperature/temp_in");
print FILE "$temp_readings[1]";
close (FILE);
#######################################################################


Суть моих дополнений заключается в вылавливании данных о температуре, которые заносятся в базу данных, и записи их в отдельные файлы для каждого датчика.
После того как все это заработало можно заняться скриптом отправки данных на сервер. Для этого нам понадобится установить PHP.

sudo apt-get install php5-cgi

Скрипт отправки данных сделан из примера, представленного на сайте «Народный мониторинг». Он обращается к файлам созданным предыдущим скриптом, берет из них данные о температуре и отправляет их.
Мой скрипт send.php выглядит так

send.php
#!/usr/bin/php-cgi -q
<?
$file_name="/home/pi/temperature/temp_out";
$file=fopen("$file_name", «r»);
$gradus_out=fread($file, filesize($file_name));
echo "$gradus_out\n";
fclose($file);

$file_name="/home/pi/temperature/temp_in";
$file=fopen("$file_name", «r»);
$gradus_in=fread($file, filesize($file_name));
echo "$gradus_in\n";
fclose($file);

$fp = @fsockopen(«tcp://narodmon.ru», NNNN, $errno, $errstr);
# где NNNN — номер порта доступный после регистрации
if(!$fp) exit(«ERROR(».$errno."): ".$errstr);
fwrite($fp, "#01-23-45-67-89-AF\n#0123456789ABCDEF#$gradus_out\n#0123456789ABCDEF#$gradus_in\n##");
fclose($fp);
?>

где так же как и в варианте с роутером 01-23-45-67-89-AF – mac-адрес сетевой карты wlan (Wi-Fi) или lan, если малинка подключена через него, а 0123456789ABCDEF – серийный номер датчика температуры DS16(x)20.
Затем добавляем строчку в скрипт get.sh, указывающую на исполнение скрипта send.php.

Скрипт get.sh
#!/bin/bash
/home/pi/temperature/get_temp.pl
/home/pi/temperature/create_graphs.sh
#######################################################################
#Мое дополнение
/home/pi/temperature/send.php
echo «OK\n»
#######################################################################

В кроне я изменил расписание на отправку данных каждые 10 минут с четкой привязкой ко времени, не пересекающимся с временем отправки данных роутером.
Задание в кроне выглядит так

5,15,25,35,45,55 * * * * /home/pi/temperature/get.sh

После этого должно все заработать. Скачать данные скрипты можно здесь

Цена вопроса при использовании Raspberry Pi

Здесь уже посчитать так однозначно не получится. Дело в том, что стоимость самой малинки и дополнительных комплектующих к ней может сильно отличаться от человека к человеку.

Заключение


На мой взгляд при не имении ни того ни другого наиболее рациональным является использование роутера. Использование малинки имеет смысл только в том случае, если у Вас уже она есть, постоянно включена и выполняет какие либо задачи.
А в целом в полку устройств отправляющих данные на сервис «Народный мониторинг» прибыло, и это хорошо.

UPD


Совместными усилиями нам удалось избавиться от PHP скрипта и написать все на BASH, за что спасибо всем откликнувшимся. Особую благодарность хочу выразить пользователю Ssar, его подсказка оказалась решающей в написании скрипта для роутера. На данный момент остался всего один скрипт get_send.sh, и два вспомогательных файла.

get_send.sh
#!/bin/bash
rm /temperatura/1wire_log
rm /temperatura/temp
rm /temperatura/out
cd /
digitemp_DS9097 -i -s /dev/ttyUSB0
sleep 1s
digitemp_DS9097 -a -A -l /temperatura/1wire_log
sleep 2s
cd /temperatura
cut -c29-33 1wire_log | sed 's/$//' > temp
cat /temperatura/mac_id > /temperatura/out
cat /temperatura/temp >> /temperatura/out
cat /temperatura/end >> /temperatura/out
cat /temperatura/out | /usr/bin/nc narodmon.ru NNNN
# где NNNN — номер порта доступный после регистрации
echo «OK»

Скачать архив можно здесь. Распаковать вложенную папку необходимо в корень файловой системы не забывая про crontab.
Данным скриптом выполнен второй пункт оптимизации устройства, а это ведет к удешевлению и упрощению конструкции.

UPD 2


Пользователем Ssar был написан улучшенный скрипт на BASH для автоматического определения mac-адреса устройства и подключения нескольких датчиков с автоматическим определением ID датчиков. Таким образом теперь нет необходимости в ручную в скрипте прописывать эти данные, он сам сделает это для Вас.
@Serenya
карма
21,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (50)

  • +1
    Нечто похожее сделано и на моем роутере для народного мониторинга. Только вот вебсервер стал часто отваливаться. Какой ваш датчик?
    • 0
      На хостинге порой «колбасит» одного из 2х провайдеров, F5 помогает ибо нагрузка балансируется меж ними.
      Если Вы передаете данные на IP, а не на DNS имя, то выберете другой IP из тех что вам nslookup вернет.
      • 0
        Однако по своему опыту скажу, что чаще это локальные проблемы РТК.
        Мне помогла замена/добавление DNS провайдера на гугловские.
        • +1
          Я имел ввиду отваливается на роутере :)
          • +1
            Полезное уточнение, ато я уж начал «копать»…
  • +1
    В данный момент подключен DS18B20.
  • +1
    Спасибо!
    Сегодня попробую свой WR703N подключить к народному мониторингу
  • 0
    Я вам так скажу — в свете роста интереса общества к бескорыстной помощи, имеет смысл готовить почву к стандартным USB-датчикам, который каждый желающий сможет (если захочет) воткнуть к себе в комп. Ну и софт, само собой.

    Температура, влажность, скорость ветра — да метеорологи будут счастливы.

    Плюс туда же — радиоактивный фон, загазованность, шум и т.п.

    Мегасеть с мегавозможностями, которые принесут реальную пользу.

    • +2
      Смысл моего шаманства — обойтись без включенного компа.
      • 0
        Да, Ваше «шаманство» безусловно нужно и полезно.

        Но если проэкстраполировать ситуацию на несколько лет вперед, то, думаю, что наличие в условном городе Эн 1000 компов со стандартными датчиками, которые то включаются, то выключаются, но в любой момент времени какие-то работают — более вероятно, чем наличие 100 постоянно работающих роутеров с Вашими или схожими устройствами.

        Тем не менее: «Пусть расцветают все цветы» (с) Мао Цзе-дун
        • 0
          Не могу не согласиться, таким образом мы стимулируем трудолюбивых китайцев на создание подобных датчиков.
    • 0
      Согласно информации «О проекте» сервис не предназначен для прогнозирования. Нашей целью не является конкурирование с гисметео и прочими службами с оборудованием за 30-50килоруб и более(хотя и его можно подключить к проекту).
      Ориентир на частное использование и мониторинг множества объектов или множества точек одного объекта на карте/схеме для наглядности, а публичная карта — демонстрация возможностей. Приватных датчиков(скрытых от публичного просмотра) в разы больше.
  • +2
    вот вам замена send.php на bash

    #!/bin/bash
    exec 3<>/dev/tcp/narodmon.ru/8283
    printf "#01-23-45-67-89-AF\n#0123456789ABCDEF#" >&3
    cat "/home/pi/temperature/temp_out" >&3
    printf "\n#0123456789ABCDEF#" >&3
    cat "/home/pi/temperature/temp_in" >&3
    printf "\n##" >&3
    
    • 0
      Спасибо, вечером обязательно попробую
      • 0
        На малинке отлично работает, а вот на роутере не хочет
        «line 2: can't create /dev/tcp/narodmon.ru/8283: nonexistent directory»
    • 0
      еще вариант?
      #!/bin/bash
      digitemp_DS9097 -i -s /dev/ttyATH0
      sleep 1s
      RES=`./digitemp_DS9097 -a`
      rqstr="ID=xxxxx&yyyyy="
      echo $rqstr$RES
      wget --post-data "$rqstr$RES" http://narodmon.ru/post.php
      
      • 0
        POST порой проще в реализации и универсальнее, но за это приходится расплачиваться скоростью обработки и нарушением балансировки нагрузки на прием/отображение/вывод данных ибо еще и с Сosm HTTP POST поток данных идет постоянно.
      • 0
        /dev/ttyATH0 это опечатка? работает только на ttyUSB0. Переменной RES ничего не присваивается — line 4: ./digitemp_DS9097: not found и в ECHO соответственно отсутствует. И я не понял что делает последняя строка — wget: can't open 'post.php': File exists
        • 0
          digitemp_DS9097 -i -s /dev/ttyATH0
          sleep 1s
          RES=`digitemp_DS9097 -a`
          rqstr="ID=xxxxx&yyyyy="
          echo $rqstr$RES
          wget --post-data "$rqstr$RES" http://narodmon.ru/post.php -O /dev/null
          

          /dev/ttyATH0 — досадная опечатка;
          RES=`digitemp_DS9097 -a` убрать "./" слеш для случая когда digitemp_DS9097 и скрипт в одной папке
          wget --post-data "$rqstr$RES" narodmon.ru/post.php -O /dev/null — тут опция -O /dev/null не создавать файл post.php — скорее всего нет прав его перезаписать
          • 0
            Что-то куда-то отправляется, но не принимается сервером. Возможно из-за не правильного формата данных, т.к. вывод команды digitemp_DS9097 -a -A -l /temperatura/1wire_log такой Jan 22 19:25:45 Sensor 0 C: -8.63 F: 16.48. Здесь необходимо вырезать числовое значение температуры по типу как у меня сделано и запихивать в RES. А дальше смотреть что получилось.
            • 0
              RES=`digitemp_DS9097 -a | cut -c29-33 | sed 's/$//' `
    • 0
      В этот скрипт явно надо добавить построение списка датчиков и их опрос.
      Переписывать скрипт при добавлении/выходе из строя очередного датчика не есть хорошо.
    • 0
      /dev/tcp/narodmon.ru/8283

      На plan9 работает?
      • 0
        Я совсем не понимаю о чем речь.
        • 0
          Вроде бы в стандартном линуксе нет устройства /dev/tcp.
          • 0
            Если Вы про этот пост, то я не знаю как, но оно работает на Raspberry Pi
  • 0
    Автору статьи огромное спасибо за обзор и проделанную работу, к тому же у самого на полочке лежит MR3020 и ожидает своей участи по еще более бюджетному(без малинки, ардуино, внешних контроллеров) варианту подключения к проекту используя лишь простейший мост UART->1-wire выведенный наружу используя audio jack и герметизированный вариант термодатчика.

    Быть может кто сможет придумать как аккуратно вывести и подключить I2C сенсоры DHT22(влажность) и BMP085(атм.давление) былоб просто замечательно, а также трансформатор тока SCT-013 для замера потребления энергии. А также с возможностью передачи данных через USB 3G модем, подключаемый к роутеру.

    Для читателей и будущих пользователей сервиса — оставляю тут ссылку на сам проект narodmon.ru, на сообщество vk.com/narodmon и на десктопную утилиту (описание, загрузка) под win/wine(nix ожидается), Android-клиент на подходе, будем рады и разработчикам для других платформ.

    • 0
      Спасибо Вам за сервис, по поводу I2C здесь есть немного про подключение без ардуины.
    • 0
      DHT22/AM2302 не по I2C передаёт данные, там какой-то самопальный 1-wire протокол.
      • 0
        Да, есть такое, похожа на 1-wire но асинхронная для dht22.
        Это в общем относилось, что нужна поддержка i2c датчиков.
  • 0
    Так и не нашел спецификации на протокол, можно прямую ссылку?
    • 0
      DHT11 брат близнец DHT22, у роутера есть GPIO. На него и посадить датчик. В статье Исследование Wi-Fi-роутера TP-LINK TL-MR3020 написано как его использовать и как написать программу. Протокол — есть, коза процедуры — есть, как скомпилировать — есть осталось соединить.
      • 0
        У DHT11 просто ужасные техданные, особенно в плане точности измерений. Не рекомендую тратить на него время зазря.
        • 0
          это комнатный термометр, график в сравнении с LM и DS тут
          • 0
            сравнивать лучше при отрицательных температурах, где погрешность выше, а не в условиях близких к идеальным
            • 0
              DHT11 не меряет отрицательные температуры (datashit) еще раз повторюсь это дешевый комнатный термометр, с округлением до целых градусов (влажность до целых процента). График показывает что в диапазоне комнатных температур он округляет довольно неплохо…
              Зато DHT22 имея тот же протокол меряет отрицательные и точность до десятых
  • 0
    Протокол доступен после регистрации.
    • 0
      ох… Честно говоря, как-то не охота регистрироваться, только для того чтобы посмотреть нужно ли оно мне.
      • 0
        после регистрации лишь протокол, а вот просто смотреть — ничего не нужно кроме как по ссылке перейти.
        • 0
          Ну я думал, прикручивать ли протокол к своим железкам или нет.
          • 0
            бОльшую часть уже тут расписали, а так неахти какая сложность указать 1 раз адрес любой своей электронки.
  • +2
    хороший проект! готов поучаствовать, но хотелось бы увидеть еще и расширенный вариант например для удаленного контроля котельными, температура, давление в системе отопления, давление холодной воды и т.п возможно ли это? готов внести свой вклад!
    • 0
      Спасибо за отзыв!
      Расширенный вариант как водится врядли будет бесплатным ибо трудозатраты возрастают, а вот простые триггеры-уведомления по email по превышении/понижении установленных пределов — ожидаются в ближайшее время.
      PS SMS-шлюзов бесплатных в Инете не нашлось, но для желающих по тарифам раза в 2 ниже розничных операторских можно сорганизовать. Пока SMS-уведомлений/регистраций нет ибо желающих маловато… но все может измениться КТТС.
      • 0
        Трудозатраты на такие серьезные вещи, всегда есть, поэтому и предложил посильную помощь
        • 0
          Спасибо. Буду иметь ввиду. Мои контакты есть в профиле.
          Хотя сами понимаете, тут больше вопрос в востребованности реализации и окупаемости.
  • 0
    В процессе поиска оптимального варианта передачи данных на narodmon.ru c минимумом используемых пакетов в OpenWRT родился такой вот скриптец: /usr/narodmon.sh

    #!/bin/sh
    # run every 10 min
    ifconfig | grep HWaddr | awk '{FS=" "; if(NR==1) {print "#"$5}};' > /var/log/narodmon
    digitemp_DS9097 -q -i -a -s /dev/ttyUSB0 | awk '{FS=" "; if($2==":") { mac[NR-1]=$1;}; if($4=="Sensor") { print "#"mac[$5]"#"$7;}}' >> /var/log/narodmon
    echo "##" >> /var/log/narodmon
    cat /var/log/narodmon | nc narodmon.ru NNNN > /var/log/narodmon.log
    

    NNNN — TCP порт листенера, последний пакет отправленных данных и результат его отправки пишутся в /var/log и перекрываются в целях экономии места на роутере.
    • 0
      также не забывает создать файлик /etc/crontabs/root с содержимым:
      SHELL=/bin/sh
      PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
      */10 * * * * /bin/sh /usr/narodmon.sh > /var/log/cron.log
      
      • 0
        А еще для того, чтобы не ждат 10-15 мин пока сработает cron желательно прописать в /etc/rc.local запуск скрипта отправки показаний сразу же после включения и инициализации роутера:
        # Put your custom commands here that should be executed once
        # the system init finished. By default this file does nothing.
        SHELL=/bin/sh
        PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
        /bin/sh /usr/narodmon.sh > /var/log/autorun.log
        exit 0
        
    • 0
      Дабы не скидывать на сервер неполные данные(например когда digitemp дал сбой), то желательно встроить проверку, заменив последнюю строку скрипта с отправкой данных на сервер на проверку кол-ва строк в сформированном пакете данных(должно быть >2 строк в случае одного датчика):

      LC=`cat /var/log/narodmon | wc -l`
      if [ $LC -gt 2 ]
       then cat /var/log/narodmon | nc narodmon.ru 8283 > /var/log/narodmon.log
      fi
      
  • 0
    На надо писать свой драйвер, он есть в стандартных репозиториях OpenWRT.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.