Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Когда Рамадан стучится в дверь, города по всему миру загораются и готовятся к месяцу поста. Огни висят на площадях и городских улицах, а также на внешних стенах домов, освещенных по ночам до восхода солнца.
В этом проекте я хотел бы поделиться своим вкладом, в котором я автоматизирую зажигание этих украшений на основе времени азана и добавляю это в свою систему умного дома.
Шаг 1: теория
По сути, проще и удобнее автоматизировать освещение, например, в зависимости от интенсивности солнечного света. Однако я бы хотел, чтобы в этом был дух священного месяца, то есть свет будет включаться до тех пор, пока людям разрешается есть в течение месяца поста. В частности, огни горят от Магриб Азана до Фаджр Азана каждый день без какого-либо вмешательства человека.
Шаг 2: Дизайн
Ниже я перечислю требования / возможности этого проекта:
- Система должна иметь возможность автоматически обрабатывать данные при загрузке.
- Система должна иметь возможность периодически выполнять алгоритм принятия решения (ВКЛ / ВЫКЛ).
- Система должна иметь возможность ежедневно вызывать API.
- Система должна иметь возможность восстановиться после незапланированного перезапуска.
- Система должна выполнить алгоритм принятия решения (ВКЛ / ВЫКЛ) при получении данных немедленно.
- В системе должен быть переключатель для включения режима автопилота (автоматический режим).
- В системе должен быть предусмотрен переключатель для ручного включения / выключения света.
- При срабатывании ручного переключателя ручной режим должен быть выключен.
- Когда автоматический режим включен, результат алгоритма принятия решения должен отражаться на ручном переключателе ВКЛ / ВЫКЛ.
Шаг 3. Технические детали: API
Чтобы теория была применима, необходимо знать время азана на ежедневной основе, начиная с его переменной, и действовать в соответствии с ним, чтобы включать / выключать свет / украшения.
Для этого я решил использовать API на основе местоположения для обслуживания данных (время для Adhan).
muslimsalat.com/api/#location
- Этот API предоставляет множество опций и параметров конфигурации, описанных в ссылке на документацию выше.
- Рекомендуется использовать собственный API_key, который предоставляется бесплатно при регистрации.
- В моем дизайне меня интересует ежедневный график.
- Возвращаемое время отображается в 12-часовом формате (AM / PM).
- Что касается местоположения, мне хотелось бы, чтобы этот API мог предоставлять более точные параметры для местоположений, таких как координаты географической системы координат (широта и долгота). Таким образом, этот API может быть снабжен, например, названием города, и этого в большинстве случаев вполне достаточно. К сожалению, результаты для моего конкретного города были довольно предвзятыми в нескольких тестах, и разница в пару минут при сравнении времени Адхана между результатами API и фактическим временем Адхана в моем городе. С другой стороны, результаты были идеально согласованы, когда я указал близлежащий город на севере и придерживался его!
- Я использую URL-адрес API: https://muslimsalat.com/.json? Key =
Шаг 4: Технические детали: оборудование
Для простоты я оставляю оборудование вне процесса синхронизации с API и расчета времени, делегируя эти операции моей системе домашней автоматизации. Это даст мне больше контроля, если я захочу настроить источник API и алгоритм расчета.
При этом я использовал ESP8266 (NodeMCU) для подключения к локальной сети через WIFI и релейный модуль в качестве исполнительного механизма. NodeMCU будет использовать протокол MQTT и прослушивать определенную тему, чтобы получить команды для включения / выключения реле. Так просто!
Шаг 5: Технические детали: Соединение точек | Домашняя автоматизация
Мой RaspberryPi содержит нодированный экземпляр, способный обрабатывать все, что мне нужно для этого проекта. На нем также установлен сервер MQTT для публикации наших сообщений.
Сначала я подумал, что могу получать данные API ежедневно в 9 утра и извлекать время как Фаджр, так и Махгриб Адхан, и продолжать сравнивать текущее время с этими переменными, а именно:
каждые 30 секунд:
если: Махгриб <СЕЙЧАС <Фаджр правда | включи свет | опубликовать сообщение ON в указанной теме MQTT иначе: выключить
Для сравнения времени я конвертирую часы, предоставляемые API, из чч: мм (AM / PM) в формат полной даты, устанавливая часть даты на незначительную дату в истории, например (01.01.1970), поскольку мы сравниваем время только на текущее время (также преобразуется часть даты).
К сожалению, это сработает только в простых случаях. Предположим, случай, когда пропало электричество или система перезапустилась по незапланированной причине. Если этот случай произойдет до 12 часов утра, тогда мы все еще в безопасности, но после 12 часов утра наш простой алгоритм не сработает.
В качестве примера давайте устроим Магриб Азан в 19:30 и Фаджр в 4:10 утра. Когда система загружается, она отправляет новый запрос на выборку данных, упомянутых ранее. Если время сейчас 1:45, мы ожидаем, что наш алгоритм вернет истину, но на самом деле это не так, потому что 1:45 утра меньше, чем Фаджр (4:10 утра), но не больше, чем Магриб (7:30 вечера). Это потому, что мы объединяем дату между всеми переменными. Ниже представлена окончательная версия алгоритма (пока что):
каждые 30 секунд:
если ((magrib.getHours ()> = 12 && fajr.getHours () <= 12) || fajr <maghrib) {fajr.setDate (fajr.getDate () + 1); // обрабатываем охват дней endTime if (now.getHours () <= 12) {now.setDate (now.getDate () + 1); // обрабатываем охват дней currentTime}} // ниже приведен предыдущий блок кода, если: Mahgrib <NOW <Fajr true | включи свет | опубликовать сообщение ON в указанной теме MQTT else: false | выключать
Полный поток процесса аннотирован на изображении выше.
Что касается UI, я добавил 2 переключателя в UI / interface:
- Переключатель, позволяющий включить автоматический или ручной режим.
- Переключатель для включения / выключения света вручную.
Шаг 6. Заключение
Время летит, чтобы его не вспомнить. Выполнение таких простых однодневных проектов позволяет вам перевести дух на этом быстром пути и помочь вам со временем возродить свои навыки межличностного общения.
Я старался изо всех сил в этом проекте, чтобы он был простым и пригодным для повторного использования по всему миру.
Пожалуйста, проголосуйте за эту инструкцию, если считаете, что этот проект заслуживает.
Счастливого Рамадана!