по идее надо было бы вести записи по ходу дел, но как-то не было нужды. а тут друг обзавелся той же проблемой (только в его случае был куплен дом, а не квартира) и чтобы сократить ему время на гугления решил восстановить шаги по памяти:
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
И получим что-то типа такого:
Готово!






поставил и настроил owfs для USB9097
ОтветитьУдалитьВ /etc/owfs.conf после закомментаривания "server: FAKE ..." нужно расскоментарить server: device=/dev/ttyUSB0. Каким девайсом прописывается USB9097 можно посмотерть: dmesg|grep ch341