Сеть температурных датчиков по квартире v.2

Мои поделки
Ответить
TechMike
Site Admin
Сообщения: 226
Зарегистрирован: Вт окт 06, 2009 3:37 pm
Контактная информация:

Сеть температурных датчиков по квартире v.2

Сообщение TechMike »

Цель все та же: получать и обрабатывать температуру во всех комнатах квартиры и на улице
Реализация:
Так как ранее описанная система Сеть температурных датчиков по квартире (умнеющий дом)viewtopic.php?f=3&t=5 прекратила долго жить из-за залитого водой сервера, но сейчас в моем распоряжении был неплохой роутер ASUS WL-500gP в котором был линукс и на нем планировалось собирать температуру с датчиков.
Железячная часть:
Без распайки роутера у него было два USB разъема, один был занять флешкой под FTP сервер, второй был свободен. Для свободного разъема USB был собран переходник для 1-Wire. Сам переходник представлял собой USB2COM адаптер для телефона Siemens C65/S65 с функцией зарядки, собран переходник на всем известной PL2303.
Упаковка от него выглядит так:
Изображение
Изображение
Для согласования уровней и превращения двух проводной rs232 в 1-Wire после USB2COM переходника, была собрана простейшая схема:
Изображение
Резисторы можно в схеме заменить на 5.6к, питание подавалось от +питания переходника, с включенной зарядкой. RX и TX нужно перевернуть, т.е. RX по этой схеме подключается к TX на USB2COM переходнике.
Если функцию зарядка на USB2COM переходнике выключить, то устройство не работает, это я использовал для выключения всей системы сбора температуры.
Схема согласования была распаяно навесным монтажом прямо в коробке с переходником:
Изображение
Получилось в результате вот такой девайс:
Изображение
Датчики температуры были взяты, как и ранее DS18B20, только для работы по двум проводам (паразитное питание) было грамотно соединен VDD датчика с GND, после этого ошибки в работе датчика в виде +85 градусов или +127 градусов перестали появляться вообще или крайне редко.
Датчики для улицы и холодильника были замурованы в колпачках от шариковых ручек, сначала датчик распаивался, потом выводы обжимались термоусадкой, далее сам датчик обильно обмазывался термопастой КПТ-8 и все это помещалось в колпачек и заливалось, либо герметиком для ремонта прокладок автомобиля (сохнет 1 сутки), либо эпоксидкой.
Получилось вот это с герметиком:
Изображение
Или вот это с эпоксидкой:
Изображение
Соединялось датчики и переходник через небольшие разъемы:
Изображение
Всего сейчас работает 3 датчика, до каждого 7 метров витой пары, но четырехжильной и все работает без ошибок.
На это железячная часть конструкции закончено.
Программная часть:
На роутере была сразу установлена прошивка от Олега, взять ее можно вот здесьhttp://wl500g.info/

Код: Выделить всё

[admin@WL-002215534079 root]$ tail /.version
1.9.2.7-10
[admin@WL-002215534079 root]$
Поднят SSH на порту 2002:

Код: Выделить всё

mkdir -p /usr/local/etc/dropbear
dropbearkey -t dss -f /usr/local/etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -f /usr/local/etc/dropbear/dropbear_rsa_host_key
mkdir -p /usr/local/sbin/
echo "#!/bin/sh" >> /usr/local/sbin/post-boot
echo "dropbear -p 2002 > /dev/null 2>&1" >> /usr/local/sbin/post-boot
chmod +x /usr/local/sbin/post-boot
echo "#!/bin/sh" >> /usr/local/sbin/post-firewall
echo "iptables -I INPUT 1 -p tcp --dport 2002 -j ACCEPT" >> /usr/local/sbin/post-firewall
chmod +x /usr/local/sbin/post-firewall
flashfs save && flashfs commit && flashfs enable
reboot
Подключаем драйвера для переходника PL2303:

Код: Выделить всё

echo " insmod usbserial.o" >> /usr/local/sbin/post-boot
echo " insmod pl2303.o" >> /usr/local/sbin/post-boot
flashfs save && flashfs commit && flashfs enable
reboot
После всех этих теледвижений, при включении USB2COM переходника в роутер, в логах должно быть примерно вот такое сообщение:

Код: Выделить всё

Apr 13 22:32:05 kernel: usbserial.c: PL-2303 converter detected
Apr 13 22:32:05 kernel: usbserial.c: PL-2303 converter now attached to ttyUSB0 (or usb/tts/0 for devfs)
Это значит, что переходник опознан, для него найдены драйвера и поток ввода/вывода для него находится на устройстве «usb/tts/0»
Заливаем на роутер бинарник files/digitemp_DS9097.rar для программы Digitemp, она собственно и будет опрашивать датчики и сохранять полученные результаты в файл.
Настраиваем crontab:

Код: Выделить всё

mkdir -p /var/spool/cron/crontabs
crontab -e
#Edit crontab file. See tutorials on crontab and vi (text editor)
#Ex. Press "a" for append-mode. Enter cron-command ex "00 1 * * *
reboot" 
#to reboot everyday at 1 am. Press "Esc", ":wq" and "Enter" to save and
quit.
mkdir -p /usr/local/sbin
echo "/var/spool/cron/crontabs/admin" >> /usr/local/.files
if [ ! -f /usr/local/sbin/post-boot ] ; then
echo "#!/bin/sh" > /usr/local/sbin/post-boot
fi
echo "/usr/sbin/crond" >> /usr/local/sbin/post-boot
chmod +x /usr/local/sbin/post-boot
flashfs save
flashfs commit
#If not already enabled:
flashfs enable
reboot
Создаем нижеследующие файлы в домашней папке root (куда попадаем сразу после коннекта к роутеру), которые будут непосредственно собирать температуру в файл:
В файл scan.cmd помещаем в него команды

Код: Выделить всё

./digitemp_DS9097 -s /dev/usb/tts/0 –i
В файл temp.cmd помещаем команды:

Код: Выделить всё

./digitemp_DS9097 -q -a -o"%d-%m-%Y %H:%M:%S %R %.2C" -c ~/.digitemprc >>temperature.log
Теперь всегда, когда подключен новый датчик или отключен старый, необходимо выполнить scan.cmd, этот файл ищет все датчики в 1-Wire сети и собирает их параметры в файл .digitemprc. После этого можно запускать сбор температуры указываю в настройках этот файл конфигурации, это делает temp.cmd.
В результате в файле temperature.log сохраняются все измерения температуры, например у меня это примерно вот так:

Код: Выделить всё

13-04-2010 22:05:13 28B04B6D01000026 8.50
13-04-2010 22:05:15 28F04A2402000009 24.94
13-04-2010 22:05:16 28F2602402000022 -19.50
13-04-2010 22:10:14 28B04B6D01000026 8.50
13-04-2010 22:10:15 28F04A2402000009 24.88
13-04-2010 22:10:16 28F2602402000022 -19.81
Теперь температура собирается, но нужно ее отображать в удобном виде, для этого была попытка настроить dtgraph v0.4mhttp://freshmeat.net/projects/dtgraph/?topic_id=135 но он работать отказался, разбираться в нем я устал и начал на его основе писать свое творения на движке jpgraph, эта работа еще не закончена, статья будет дополнена по окончанию программирования.

Ссылки на используемый в работе материал:
http://www.lecad.si/~leon/other/wlan/wrt54ow/
http://siemensdca.ucoz.ru/photo/2-0-7-3
TechMike
Site Admin
Сообщения: 226
Зарегистрирован: Вт окт 06, 2009 3:37 pm
Контактная информация:

Re: Сеть температурных датчиков по квартире v.2

Сообщение TechMike »

Сейчас используется следующая версия digitemp:
DigiTemp v3.3.2 Copyright 1996-2004 by Brian C. Lane
GNU Public License v2.0 - http://www.brianlane.com
Compiled for DS9097

Но уже можно скачать v3.5.0 вот отсюда: http://wl500g.info/showthread.php?18254 ... wfs)/page8
Вот сам пакет из которого надо вытащить бинарник: http://downloads.openwrt.org/backfire/1 ... cm47xx.ipk
TechMike
Site Admin
Сообщения: 226
Зарегистрирован: Вт окт 06, 2009 3:37 pm
Контактная информация:

Re: Сеть температурных датчиков по квартире v.2

Сообщение TechMike »

Настраиваем обновление для no=ip.org:
1. создаем два файла в /usr/local/root
IPupdate.sh

Код: Выделить всё

#!/bin/sh
    ###################################
    #Content of /opt/bin/IPupdate.sh #
    ###################################

    # Logfile parameter
    # LOG=1/0 (On/Off)
    # LOG=pathname to the logfile
    LOG=1
    LOGFILE=/usr/local/root/ipupdate.log

    # provider url's
    # DynDNS
    #URL="http://$1:$2@members.dyndns.org/nic/update?hostname=$3"
    # NoIP
    #URL="http://dynupdate.no-ip.com/dns?username=$1&password=$2&hostname=$3"
    # dyn.ee
    #URL="http://dynserv.ca/dyn/dynengine.cgi?name=$1&pass=$2&func=set&domain=$3"
    # ipactive
    #URL="http://logon.ipactive.de/cgi-bin/logon_off.pl?V=2.1&B=$1&P=$2&IP=$3&F=1"
    URL="http://$1:$2@dynupdate.no-ip.com/nic/update?hostname=$3&myip=$IP"


    echo ""
    if [ $# != 3 ] ; then
      echo "IPUpdate script"
        echo "usage: $0 <LOGIN-NAME> <PASSWORD> <HOSTNAME/DOMAIN/IPADR>"
          exit
          fi

          if [ $LOG == 1 ] ; then echo "$(date) Starting DNS entry update for $3 ..." >> $LOGFILE; fi
          echo "Starting DNS entry update for $3 ..."

          #Get ip
          IP="$(ifconfig | grep 'inet ' | sed -e 's/inet //' -e 's/addr://' -e 's/ Bcast.*//' -e 's/127.*//' -e 's/\<192\.168\..*//')"

          # Update Host entry
          RESULT=`wget -O - $URL | cat`
          if [ "$RESULT" == "" ] ; then RESULT=Error; fi
          if [ $LOG == 1 ] ; then echo "$(date) DNS entry update result for $3: $RESULT" >> $LOGFILE; fi
          echo "DNS entry update result for $3: $RESULT"
noip.cmd

Код: Выделить всё

./IPupdate.sh [логив в no-ip.com, обычно почтовый адрес] [пароль к no-ip.com] [домен].no-ip.org
В крон добавляем следующее:
* */1 * * * /tmp/local/root/noip.cmd

доступ на файлы:

Код: Выделить всё

[admin@WL-002215534079 root]$ ls -l
-rwxr--r--    1 admin    root         1490 Sep 15 15:00 IPupdate.sh
-rwxrwxr--    1 admin    root        83012 Mar 18  2010 digitemp_DS9097
-rwxr--r--    1 admin    root        57707 Sep 15 00:09 digitemp_DS9097_3_5_0
-rw-r--r--    1 admin    root          176 Sep 15 14:52 ipupdate.log
-rwxrwxr--    1 admin    root           20 Mar 24  2010 log.cmd
-rwxr--r--    1 admin    root           55 Sep 15 14:54 noip.cmd
-rwxrwxr--    1 admin    root           38 Mar 18  2010 scan.cmd
-rwxr--r--    1 admin    root          406 Sep 15 00:37 temp.cmd
-rwxrwxr--    1 admin    root           81 Oct 15  2009 wake.cmd
[admin@WL-002215534079 root]$
TechMike
Site Admin
Сообщения: 226
Зарегистрирован: Вт окт 06, 2009 3:37 pm
Контактная информация:

Re: Сеть температурных датчиков по квартире v.2

Сообщение TechMike »

Настраиваем доступ по ssh без ключа:
На большом сервере выполняем команду

Код: Выделить всё

ssh-keygen -t dsa -b 1024 -f /home/techmike24/data/.ssh/id_dsa
Получаем ответа вида:

Код: Выделить всё

Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/techmike24/data/.ssh/id_dsa.
Your public key has been saved in /home/techmike24/data/.ssh/id_dsa.pub.
The key fingerprint is:
e5:28:35:bc:5f:d7:32:3f:74:90:e7:f6:9a:62:3a:58 techmike24@gigahoster.ru
Получаем два файла id_dsa и id_dsa.pub. PUB ключ - это публичный, а id_dsa секретный.
Переносим файл или все строки из id_dsa.pub на роутер в файл /tmp/local/root/.ssh/authorized_keys
Лучше скопировать id_rsa.pub в каталог /tmp/local/root/.ssh/ роутера и потом сделать

Код: Выделить всё

cat ./id_rsa.pub >> ./authorized_keys
Чтобы не потерять символы или кодировку при переносе публичного ключа.
Даем правильные права на созданные файлы:

Код: Выделить всё

chmod 0700 /tmp/local/root/.ssh
chmod 0600 /tmp/local/root/.ssh/authorized_keys
После этого обязательно делаем

Код: Выделить всё

flashfs save && flashfs commit && flashfs enable && reboot
и получаем доступ без пароля.
В логах роутера будут записи вида:

Код: Выделить всё

Sep 15 15:48:56 dropbear[475]: Child connection from ::ffff:193.106.92.169:44955
Sep 15 15:48:57 dropbear[475]: pubkey auth succeeded for 'admin' with key md5 33:2f:5a:bf:d2:5b:1d:ec:4b:59:9e:13:4d:45:c8:c2 from ::ffff:193.106.92.169:44955
Sep 15 15:48:57 dropbear[475]: exit after auth (admin): Exited normally
Использовалась литература:
http://bruteforcer.ru/dropbear-avtoriza ... -500gp-v1/
http://mihairu.net/blog/show/4
http://wiki.openwrt.org/inbox/howto/dro ... c-key.auth
Ответить