Отправка смс о температуре воздуха + прогноз

Отправка смс о температуре воздуха + прогноз

Тут опишу небольшой скрипт, написанный на Shell для отправки температуры воздуха с сенсора DS18B20 при изменении на определённое кол-во градусов, а так же способ получения прогноза температуры на ближайший промежуток времени. Так же скрипт ограничен по времени отправки, смс отправляются только в период с 07 до 23 часов.

Для начала нам нужно пройтись по статье «1-wire термо станция на FreeBSD» — собрать схему, проверить датчики, для отправки смс используется модем Huawei, настроенные по статье: «Отправка смс с модема Huawei e171 FreeBSD». Источником данных о прогнозе погоды служит сайт rp5.ru по Вашему городу. Для отправки смс нам необходимо модифицировать скрипт добавления данных в БД следующим образом:

#!/bin/sh

outopen=`date '+%H'`
minh=07
maxh=23

db_host=localhost
db_pass=пароль_бд
db_user=пользователь_бд
db_name=имя_бд

digitemp_dir=/mnt/soft/digitemp
digitemp_bin=$digitemp_dir/dt
digitemp_conf=$digitemp_dir/.digitemprc
digitemp_format=%.1C
digitemp_sensor=13

smssendbin=/usr/local/bin/sendsms
grad=4

idrp5=4475

#######################################################
# Сам скрипт
#######################################################
# Выполняем получение данных с сенсоров
`$digitemp_bin -a -q -o $digitemp_format -c $digitemp_conf -l temperature.log`

# Процедура проверки временных файлов
TmpFiles ()
{
if ! [ -f $digitemp_dir/sensor${1}.dat ];
then
        touch $digitemp_dir/sensor${1}.dat;
        echo '100' >> $digitemp_dir/sensor${1}.dat;
fi
}
# Сверяем временной интервал
IsTime()
{
if [ "$1" -ge "$2" ]
        then
        if [ "$1" -lt "$3" ]
                then
                Gradaciya $ost $digitemp_sensor;
        fi
fi
}
Gradaciya()
{
if [ $1 -eq 0 ];
        then
        t_file=`cat $digitemp_dir/sensor${2}.dat`;
        MakeTmpl $2 $t_file;
fi
}
MakeTmpl()
{
if [ $t_cel -ne $2 ];
        then
        rm -f $digitemp_dir/sensor${1}.dat;
        echo $t_cel >> $digitemp_dir/sensor${1}.dat
        Ssms $1
fi
}
Ssms()
{
#####
# Отправка смс - настройка шаблонов в зависимости от сенсора
#####
# Шаблон для сенсора 13
if [ $1 -eq 13 ];
        then
        tpl="Temperatura Doma: ";
        $smssendbin 79230000000 "${tpl}${line}C";
fi
# Шаблон для сенсора 14
if [ $1 -eq 14 ];
        then
        tpl="Tempetarura v Krasnoyarske: ";
        #Подтягиваем прогноз
        prgn=`/usr/local/bin/curl -s http://rp5.ru/xml/${idrp5}/00000/ru | grep -E -i -m2 -w 'HHii|temperature' | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | tr -d '\n' | awk '{ print "V "$1" prognoz "$2"C"; }'`;
        $smssendbin 79230000000 "${tpl}${line}C; ${prgn}";
fi
}

cat temperature.log | while read line;
do
        TmpFiles $digitemp_sensor;
        t_cel=`echo $line | awk -F "." '{print $1}' `;
        ost=`let "$t_cel % $grad"`;
        IsTime $outopen $minh $maxh;
        sql="call update_temp($line,$digitemp_sensor);";
        digitemp_sensor=`expr $digitemp_sensor + 1`;
        `/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user $db_name -p$db_pass`;
done
rm -f temperature.log;

Вкратце расскажу о настройках:

minh=07
maxh=23

Временной промежуток, со скольки и до скольки отправлять смс-ки

db_host=localhost
db_pass=пароль_бд
db_user=пользователь_бд
db_name=имя_бд

Настройки бд (формат бд и таблиц смотрим тут)

digitemp_dir=/mnt/soft/digitemp
digitemp_bin=$digitemp_dir/dt
digitemp_conf=$digitemp_dir/.digitemprc
digitemp_format=%.1C
digitemp_sensor=13

Настройки корневого каталога, исполняемого файла digitemp, конфигурационного файла digitemp, формата выдачи температуры, номер для начала отсчёта количества сенсоров.

smssendbin=/usr/local/bin/sendsms
grad=4

Тут настраивается путь до исполняемого файла отправки смс из пакета SMSTools, переменная град указывает количество градусов, работает как радиус для последней полученной информации с датчика, т.е. разрешает отправку смс, если температура от последнего значения изменилась на (допустим) +-4 градуса.

idrp5=4475

ИД города с сайта rp5.ru, для Красноярска это 4475.

Пример полученной смс показан на фото ниже: