ФОРУМ КУПИТЬ

Последние статьи

ВСЕ СТАТЬИ

Web-сайт Умного Дома. События и праздники

26/10/2010 17:43:00

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

Я решил построить систему на базе Интернет-технологий. Так появился Web-интерфейс умного дома, с помощью которого можно контролировать и управлять различными системами дома. Это решение оказалось очень удачным. Все современные компьютерные устройства, мобильные телефоны, коммуникаторы, нетбуки имеют полноценный доступ к системе. Это означает, что можно удаленно через Интернет или локально смотреть камеры видеонаблюдения, слышать звук в доме, вносить коррективы в работу инженерных систем, включать или выключать нужные устройства, скачивать или загружать файлы.

Воздушные шарикиПолучился полноценный Web-сайт с большим набором функций. Мне захотелось расширить этот набор еще одной полезной функцией. Теперь мой Web-сайт на своих страницах сообщает о праздниках, днях, именинах, событиях, которые записаны в базу данных. Кроме того, Умный Дом заранее сообщает о грядущих днях рождения родственников и друзей, дабы мы не забыли и успели купить подарки.

Я разделил задачу на две части. Первое - общероссийские праздники и дни.
С помощью программы wget я рекурсивно скачал набор HTML-страниц с какого-то сайта и прогнал их через Perl-скрипт, чтобы на выходе получить SQL-команды для создания базы данных в MySQL-сервере. Для простоты опубликую дамп уже готовой таблицы.

Праздники, события, дни, именины (MySQL-дамп)

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

Далее я написал простенький скрипт на PHP

<?
echo "Сегодня праздники: ";
 $sql = "SELECT event_title FROM tmp_6 WHERE DATE_FORMAT(event_date, "%m%d")=".date("md");
$if(!($result=mysql_query($sql,$conn)))
echo "Ошибка";
else
{
    while(($data=mysql_fetch_row($result)))
    echo $data[0]."<br>";
}
?> 

После этого я создал еще одну такую же по структуре таблицу и записал в нее даты рождения всех своих родственников, знакомых и друзей.
В отличие от предыдущего примера, здесь функционал сложнее. Во-первых, необходимо сообщить сколько лет исполнится человеку, а во-вторых, необходимо рассчитать сколько дней осталось до дня рождения. Несмотря на кажущуюся простоту, эта задача оказалась не из легких. Пришлось составить далеко не тривиальный SQL запрос (зато всего один!).

<?
echo "Ближайший семейные праздники:<br>";
$sql="SELECT DATE_FORMAT(event_date, '%d.%m'), event_title,
    DATEDIFF(CONCAT(DATE_FORMAT(NOW(), '%Y'), '-', DATE_FORMAT(event_date, '%m-%d')), NOW()),
    DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(event_date, '%Y'), DATE_FORMAT(event_date, '%m')
    FROM tmp_7 WHERE DATE_FORMAT(event_date, '%m.%d') >= DATE_FORMAT(NOW(), '%m.%d')
    ORDER BY DATE_FORMAT(event_date, '%m%d')
    LIMIT 3";
if(!($result=mysql_query($sql,$conn)))
echo "Ошибка";
else
{
    while(($data=mysql_fetch_row($result)))
    {
        if ( $data[0] == date('d.m') )
        echo "<font color="red">Ура! Ура! $data[1]! Исполняется лет: $data[3]. Поздравляем!</font><br>";
        else
        echo "$data[0] - $data[1] ($data[2] дн., исполняется лет: $data[3])<br>";
    }
}
?>

Данный скрипт выводит три ближайших дня рождения. Нетрудно настроить также голосовое оповещение, а также уведомление по почте или SMS для тех членов семьи, кто не пользуется Web-интерфейсом системы.

Вывод на сайт праздников и дней рождений

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:

(необязательно, не отображается на сайте)


Сортировка комментариев: Последние сверху | Первые сверху

2012-06-08 16:56:20 | Andrey_B
SNike, спасибо, наверное, можно попробовать.


2012-06-08 10:58:22 | SNike
с использованием S E L E C T ... U N I O N


2012-06-08 10:55:54 | SNike
Andrey_B, добрый день, а почему бы вам не использовать запрос с использованием , например:
DATE_FORMAT(`datetime`, '%d.%m') `D.M`, `koment` `описание`,
DATEDIFF(CONCAT(DATE_FORMAT(NOW(), '%Y'), '-', DATE_FORMAT(`datetime`, '%m-%d')), NOW()) `осталось (дней)`,
DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`datetime`, '%Y') `исполнится`
`holidays` (DATE_FORMAT(`datetime`, '%m.%d') >= DATE_FORMAT(NOW(), '%m.%d'))

DATE_FORMAT(`datetime`, '%d.%m'), `koment`,
DATEDIFF(CONCAT(DATE_FORMAT(NOW(), '%Y'), '-', DATE_FORMAT(`datetime`, '%m-%d')), NOW()) +365,
DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`datetime`, '%Y') +1
`holidays`
ORDER BY abs(`осталось (дней)`)
limit 3

не нужно будет вызывать запрос дважды при переходе года


2012-04-17 10:57:07 | n1205
реализовал у себя учет рабочих и выходных дней - это когда переносят праздники и т.д. очень удобно. вот только нужно каждый год забивать в систему данные из производственного календаря. :)


2010-11-17 23:17:04 | Andrey_B
Павел, совершенно верно!
В статье я об этом не сказал, но скрипт разбит на два запроса. Второй запрос точно такой же как и первый, но без этого WHERE
Это сделано для того, чтобы правильно отсортировать выборку, так как
ORDER BY DATE_FORMAT(event_date, '%m%d')
выдаст прежде всего те дни рождения, которые идут в следующем году, а это неправильно. Поэтому мне и пришлось сначала сделать выборку за этот год, а если она выдала менее 3 результатов, добрать следующим годом, но уже без
DATE_FORMAT(event_date, '%m.%d') >= DATE_FORMAT(NOW(), '%m.%d')
Понятна ли вам моя идея?


2010-11-17 15:02:36 | Павел
Искал скрипт вывода ближайших праздников, нашел эту страничку. В целом скрипт правильный, но один вопрос - что будет с условием " DATE_FORMAT(event_date, '%m.%d') >= DATE_FORMAT(NOW(), '%m.%d')" при смене года, месяц ведь с 12-го перейдет в 1-ый и скрипт не покажет ближайшие праздники (январские) в конце декабря.