Последние статьи
- Твердотельный датчик направления и скорости ветра. Эксперимент
- iPhone на стене в качестве панели управления домом
- MegaD-16M-XT - подсветка выключателей и не только
- Переделка выключателей в кнопки и мини-обзор текущего рынка
- RadSens - модульный счетчик Гейгера с интерфейсом I2C
- "U" - значит универсальный. Обзор модуля MegaD-16U-XT
- SCD4x - современная альтернатива для измерения концентрации CO2
- HTU31D - новый датчик температуры и влажности с нагревательным элементом
- Измерение коэффициента пульсации ламп с помощью MegaD-2561
- Использование солнечных панелей в качестве датчика освещенности
- Согласование датчиков с выходом типа TTL со стандартными входами контроллера
- DPS368 - датчик атмосферного давления индустриального класса повышенной точности
- DS18B20 Waterpoof - импортзамещение
- TMP117 - высокоточный датчик температуры с интерфейсом I2C
- MegaD-16R-XT - расширитель на 16 релейных выходов
- MegaD-2561-RTC V3 - больше портов, зуммер и ИОН
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
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.
Добавить комментарий:
Сортировка комментариев: Последние сверху | Первые сверху
2010-11-17 15:02:36 | Павел
Искал скрипт вывода ближайших праздников, нашел эту страничку. В целом скрипт правильный, но один вопрос - что будет с условием " DATE_FORMAT(event_date, '%m.%d') >= DATE_FORMAT(NOW(), '%m.%d')" при смене года, месяц ведь с 12-го перейдет в 1-ый и скрипт не покажет ближайшие праздники (январские) в конце декабря.
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')
Понятна ли вам моя идея?
2012-04-17 10:57:07 | n1205
реализовал у себя учет рабочих и выходных дней - это когда переносят праздники и т.д. очень удобно. вот только нужно каждый год забивать в систему данные из производственного календаря. :)
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-06-08 10:58:22 | SNike
с использованием S E L E C T ... U N I O N
2012-06-08 16:56:20 | Andrey_B
SNike, спасибо, наверное, можно попробовать.