пятница, 16 ноября 2012 г.

ставим ubuntu на benq s6

описанный в пердыдущем посте мониторинг температуры на скорую руку проработал примерно неделю и после этого тот старый десктоп из первого шага начал активно умирать. раздумья на тему искать очередное старье или что-то более свежее навели меня вот на такую штуку:
которую на ebay в легкую можно купить за $59 с бесплатной доставкой в пределах США. два клика и две недели ожидания, когда с оказией оный довезут до минска и эта радость у меня в руках. вставил симку и пару минут потыкавшись, чтобы убедится что 3g работает (да-да adsl в квартире пока нет и инет мобильный) пошел искать howto на нее поставить что-нибудь типа юбунты... упс - нашел только ролик на ютюбе, что некто в древние времена поставил на нее ubuntu 8.04 без подробностей и посты на форумах о том что как включить wifi и 3g они не знают.. эх, пришлось думать самому:
  1. взял 32битную сборку ubuntu server 12.04.1 lts
  2. при помощи Unetbootin сделал загрузочную флэшку. на ней из-за бага в unetbootin нужно ручками переименовать четыре файла с расширением .ude на расширение .udeb в директории /pool/main/l/linux. Детали вот тут
  3. перегрузил девайс со вставленной флэшкой и ... получил ubuntu installer!
  4. далее отвечая на вопросы доходим до момента когда он все скопирует, настроит и предложит перегрузиться. вынимаем флэшку и соглашаемся.
  5. после перегрузки первая засада - экран пару раз моргает и отказывается что-либо показывать.. догадываюсь что, по-видимому, он переключает монитор в какой-то графический режим, который на этом железе не поддерживается ;-( но если installer может работать в текстовом, то почему сама убунта этого не делает? гуглю и нахожу как сказать grub'u работать в текстовом режиме. Перегружаюсь опять с флэшкой, открываю консоль, монтирую /dev/sda и редактирую /etc/default/grub как описанно. главное после этого не забыть запустить 'update-grub'. помогло!
    UPDATE: этот глюк у меня был только при первой попытке установить юбунту, где я, по-видимому, вначале выбрал какой-то экзотический режим консоли. позже, установка той же версии юбунты на другом benq s6 прошла гладко и без дополнительной возни с grub'ом
    итак имею установелнную юбунту 12.04 lts на benq s6, но с выключенным (обесточенными power mamager'ом) wifi и 3g ..
  6. опять гуглю и нахожу пост какого-то итальянца с описанием протокола для их включения
  7. модифицирую скрипт для управления Benq S6 ACPI EC (Embedded Controller) который даже соответствующие светодиоды зажигает: benqs6_ec.pl
    делаю скрипт для включения 3g
    #!/bin/bash
    benqs6_ec.pl 3g on
    modprobe -r usbserial
    modprobe usbserial vendor=0x1da5 product=0x4511
    

    и скрипт для включения и подключения к wifi которому на вход надо давать имя точки доступа
    #!/bin/bash
    rmmod libertas_sdio
    rmmod sdhci_pci
    beqs6_ec.pl wifi on
    modprobe sdhci_pci
    modprobe libertas_sdio
    sleep 2
    iwconfig wlan0 essid $1
    dhclient wlan0
    
  8. wifi у меня еще нет, это на будущее. а в настоящем настраиваю pppd over 3g (через vwdial)
Все. Дальше повторяю уже описанные ранее действа для мониторинга температуры и получаю удовлетворение от проделанной работы! ;-)

суббота, 10 ноября 2012 г.

мониторинг температуры на скорую руку

недавно купил квартиру без отделки и чтобы как-то скрасить ожидание долго-муторного цикла планирование-согласование-ремонт-въезд решил на скорую руку поставить там что-нибудь для отслеживания температуры (дом новый, квартира на мансардном этаже, высота потолков в максимум 5,25 метра и есть подозрение, что существующего отопления не хватает для поддержания комфортной температуры)

по идее надо было бы вести записи по ходу дел, но как-то не было нужды. а тут друг обзавелся той же проблемой (только в его случае был куплен дом, а не квартира) и чтобы сократить ему время на гугления решил восстановить шаги по памяти:

1. взял старый десктоп с установленной ubuntu
2. воткнул в нее 1-wire usb adapter ds2490 с несколькими подсоедененными температурным датчиками ds1820
3. поставил нужный софт

apt-get install owfs
apt-get install rrdtool

В файле конфигурации owfs'а /etc/owfs.conf закоментировал строку
server: FAKE = DS18S20,DS2405
и раскоментировал строку
server: usb = all
запустил owfs
service owserver start
и убеждился что все работает:
owdir
в ответ должны получить нечто типа:
/10.A3AA9D000800
/10.B3BA4B010800
/81.769127000000
/bus.0
/uncached
/settings
/system
/statistics
/structure
/simultaneous
/alarm

теперь дело за малым - 1) настроить периодический опрос датчиков, 2) хранение и визуализация температурных логов.

для 1-ого используем cron job, для 2-ого rrdtool:
apt-get install rrdtool
создаем базу для сохранения каждые 5-ть минут температуры с 3-х датчиков, которые я назвал indoor, outdoor, battery. По ним мы будет также смотреть на средние величины за последние 3 часа, 24 часа, 2 дня, а также за последнюю неделю, месяца и 1 год.
#!/bin/bash
rrdtool create $1 --start N --step 300 \
DS:indoor:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:12 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:168 \
RRA:AVERAGE:0.5:12:720 \
RRA:AVERAGE:0.5:288:365 \
DS:outdoor:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:12 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:168 \
RRA:AVERAGE:0.5:12:720 \
RRA:AVERAGE:0.5:288:365 \
DS:battery:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:12 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:168 \
RRA:AVERAGE:0.5:12:720 \
RRA:AVERAGE:0.5:288:365
вот так выглядит скрипт, который запускается кроном каждые 5-ть минут:
#!/bin/bash
cd /home/ssr/rrdtool

# Read temperature from sensor
tempread=`owread /10.B3BA4B010800/temperature`
tempread_heater=`owread /10.A3AA9D000800/temperature`

if [[ -z $tempread ]]
then
  indoor=`cat .last_indoor_t`
else
  indoor=`echo $tempread | cut -c -4`
  `echo $indoor > .last_indoor_t`
fi

if [[ -z $tempread_heater ]]
then
  heater=`cat .last_indoor_heater_t`
else
  heater=`echo $tempread_heater | cut -c -4`
  `echo $heater> .last_indoor_heater_t`
fi

outdoor=`./wunderground_t.pl`
if [[ -z $outdoor ]]
then
  outdoor=`cat .last_outdoor_t`
else
  `echo $outdoor > .last_outdoor_t`
fi


echo "heater/indoor/outdoor ${heater}/${indoor}/${outdoor}"

# Update database
rrdtool update database.rrd  -t \ 
indoor:outdoor:battery N:$indoor:$outdoor:$heater
две ремарки:
  • чтобы не было дырок в логах в случае если я вдруг датчики по какой-то причине не прочитались, я кэширую последнее прочитанное сообщение, но это можно было бы не далать и скрипт упростить.
  • я решил не сверлить дырку наружу, чтобы снимать температуру снаружи, а беру это информацию с интернета (конкретно с wunderground.com, но об этом возможно будет отдельный пост)
ну и теперь сгенерируем картинки:
#!/bin/bash
HOMEDIR=/home/ssr/rrdtool
cd $HOMEDIR
DB="$HOMEDIR/database.rrd"
COMMENT="Generated on `date "+%d %m %y %H\:%M %Z"`"
IMAGE="tz.png"
watermark="ssrhome inc."
width=600
height=100
periods=("Last 3 Hours" "Last 24 Hours" "Last 2 Days" "Last Week" "Last Month" "Last Year")
period_index=0
for time in 3h 24h 48h 8days 1month 1year
do
 PERIOD="${periods[$period_index]}"
 TITLE="temperature log for $PERIOD"
 2>/dev/null rrdtool graph `echo png/$PERIOD | tr ' ' '_'`_$IMAGE -A -s -$time -e now -a PNG \
     -t "$TITLE" \
     -v "°C" \
  -w $width \
  -h $height \
  -W "$watermark" \
  -z \
  -Y \
     DEF:Main=$DB:indoor:AVERAGE \
     COMMENT:"\t\t\tnow       avg.      max.      min."\\n \
     LINE1:Main#0000FF:"Indoor\t" \
     GPRINT:Main:LAST:"%5.1lf °C" \
     GPRINT:Main:AVERAGE:"%5.1lf °C" \
     GPRINT:Main:MAX:"%5.1lf °C" \
     GPRINT:Main:MIN:"%5.1lf °C"\\n \
     DEF:Out=$DB:outdoor:AVERAGE \
     LINE1:Out#00FF00:"Outdoor\t" \
     GPRINT:Out:LAST:"%5.1lf °C" \
     GPRINT:Out:AVERAGE:"%5.1lf °C" \
     GPRINT:Out:MAX:"%5.1lf °C" \
     GPRINT:Out:MIN:"%5.1lf °C"\\n \
     DEF:Heating=$DB:battery:AVERAGE \
     LINE1:Heating#00F0FF:"Heating\t" \
     GPRINT:Heating:LAST:"%5.1lf °C" \
     GPRINT:Heating:AVERAGE:"%5.1lf °C" \
     GPRINT:Heating:MAX:"%5.1lf °C" \
     GPRINT:Heating:MIN:"%5.1lf °C"\\n \
     COMMENT:"$COMMENT"


     period_index=$[ $period_index + 1 ]
done
И получим что-то типа такого:
Готово!