Всем привет!

Сейчас я покажу, как перенести на смартфон проект погодной станции, изначально сделанный под Raspberry Pi. Для этого мы установим программу Termux — эмулятор терминала Linux —, затем поставим на него среду визуального программирования Node-RED и за 5 минут реализуем готовый проект — погодную станцию, то есть экран, выводящий текущую погоду и прогноз. Использовать будем только Free/Open Source- инструменты.

Этот текст основан на моем видео:

И мы продолжаем погружаться в тему повторного использования техники в курсе “Galaxy Upcycling - новая жизнь старого смартфона”. Чего мы с вами уже только не делали: и физические эксперименты, и полезные гаджеты, и забавные спецэффекты. Но в сегодняшнем уроке будет важно не то, ЧТО мы сделаем, а КАК мы это сделаем.

Что такое Termux: консоль Linux на смартфоне

Termux имитирует консоль операционной системы Linux на смартфоне с Android, и даже Root-доступ ей не требуется.

Открываются новые возможности:

  • перепробовать много вариантов программного обеспечения, уже существующего под Linux

  • поднять свой сервер для резервного копирования или для игры в Minecraft с друзьями

  • проверять системы на уязвимость

  • хостить свою домашнюю страничку

  • и даже превратить смартфон в устройство Интернета вещей! Чем мы и займемся сегодня

Источник: https://github.com/AKXX/termux
Источник: https://github.com/AKXX/termux

Установка Termux

Termux распространяется открыто и бесплатно. Достаточно просто скачать установочный APK-файл с сайта F-Droid: https://f-droid.org/en/packages/com.termux/

Требуется ОС Android не ниже 7-й версии. На моем Galaxy S7 (2016) всё запустилось без проблем. Нужно дать приложению различные разрешения при установке. И вот, запустив Termux, вы видите знакомое окно консоли Linux! Здесь можно использовать все привычные команды, такие как перейти в директорию (cd), вывести листинг директории (ls), установить новые пакеты (apt), автодополнение (tab), история команд (↑, ↓). Пользовательский опыт при работе в консоли оказался вполне сносным, а уж если подключить Bluetooth-клавиатуру, то вообще не отличить от десктопа.

Так выглядит домашняя директория.
Так выглядит домашняя директория.
А так - файловая система
А так - файловая система

Что полезного можно здесь сделать? Раз мы взялись делать погодную станцию, нужна какая-то среда разработки, простая и удобная для работы с физическими устройствами. Я предлагаю установить среду Node-RED.

Что такое Node-RED

Node-RED - это открытая и бесплатная платформа для интеграции систем между собой, своего рода универсальный клей для быстрого соединения программных и аппаратных компонентов. Ее часто используют при изучении Интернета вещей. Платформа поощряет сотрудничество: на официальном сайте выложено свыше 4000 готовых узлов и более 2000 готовых пользовательских программ.

Программы в Node-RED создаются на визуальном языке, и готовая программа похожа на блок-схему. Среда приучает вас мыслить в парадигме событийно-ориентированного программирования, в ней широко используется многопоточность. Но такая организация кода имеет и свои особенности: в визуальной схеме легко запутаться, как только она хоть немного разрастается.

Node-RED называется так потому что в основе своей он написан на языке серверного программирования NodeJS. Пользовательские узлы пишутся на языке JavaScript. В этом уроке мы будем использовать полностью готовый код, то есть программировать не придется.

Устанавливаем Node-RED

На сайте Node-RED есть руководство по установке под Termux, но вкратце все сводится к нескольким строчкам:

apt update
apt upgrade
apt install coreutils nano nodejs
npm i -g --unsafe-perm node-red
node-red

Сервер стартовал:

Сервер Node-RED будет доступен на смартфоне по адресу http://127.0.0.1:1880. Все достаточно понятно: адрес localhost и порт 1880. Можно открыть среду прямо в браузере в смартфоне, но там редактировать неудобно.

Среда явно не предназначена для программирования через экран смартфона
Среда явно не предназначена для программирования через экран смартфона

Я предпочитаю работать над кодом с ноутбука. Для этого ноутбук должен быть в той же WiFi-сети. Выйдем из Node-RED через стандартную для Linux команду прерывания процесса Ctrl+C. Узнаем IP адрес смартфона через стандартную команду ifconfig. И опять запускаем сервер node-red. У меня у смартфона оказался адрес 192.168.0.14, соответственно в браузере я перешла на адрес http://192.168.0.14:1880/ и увидела удобное большое окно среды Node-RED.

Совсем другое дело!
Совсем другое дело!

Обзор готового проекта - погодной станции

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

Автор делал его изначально под Raspberry Pi, но оказывается, что ту же самую программу можно запустить и на смартфоне, ведь платформа разработки одна и та же - Node-RED.

Так выглядел проект под Raspberry Pi.
Так выглядел проект под Raspberry Pi.
А так выглядит у меня на смартфоне
А так выглядит у меня на смартфоне

Я немного упростила этот проект: убрала сторонние иконки, чтобы их не пришлось устанавливать отдельно, и добавила свои параметры, которых мне здесь не хватало.

Какие шаги нужно проделать, чтобы сделать точно такую же станцию у себя на смартфоне? Очень просто! Нужно импортировать мой код в Node-RED. Скачайте по вышеприведенной ссылке файл flow.json и нажмите Import.

Удобно, что весь проект в Node-RED представляет собой JSON-текст, и его можно импортировать даже простым copy-paste
Удобно, что весь проект в Node-RED представляет собой JSON-текст, и его можно импортировать даже простым copy-paste

После импорта программа сама напишет, каких еще пакетов ей не хватает. Все эти дополнительные пакеты легко установить через менеджер палитры. К примеру, это пакет dashboard, который отвечает за визуальный интерфейс вашего приложения.

После того, как всё установлено и настроено, запускаю проект кнопкой Deploy и открываю визуальный интерфейс по адресу http://192.168.0.14:1880/ui. Чтобы всё отображалось красиво, включите темную тему в настройках Dashboard.

Пока никаких показаний погоды не видно. Почему? Это легко понять, используя узел debug. Ставлю его и сразу по сообщению об ошибке понимаю, что необходим API-ключ.

Погодная станция берет данные с сайта прогнозов погоды Openweathermap. У этого сайта существует API для внешних запросов, то есть формат для общения с другими программами. Зная этот формат, можно получить показания погоды для конкретной географической точки.

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

С ключом возвращаемся в Node-RED. В настройках узла Current Weather я прописываю свои параметры: географическое положение (широту и долготу) и свой API-ключ. То же самое проделываю в настройках узла 5 Day Forecast.

После чего всё будет работать!

Разбор кода погодной станции

Теперь, когда у меня всё запустилось и работает, посмотрим, как же это всё устроено.

Код достаточно простой. В узле Current Weather отправляется запрос на сервер погоды. От этого сервера приходит ответ в виде длинной строки в формате JSON.

В JavaScript текст в формате JSON преобразуется в программный объект, содержащий поля с данными. Увидеть объект и его содержимое можно, если поставить сразу после узла Current Weather узел Debug. Посмотрим на данные. Они достаточно понятны: здесь есть и скорость ветра, и его направление, и текущая температура с текстовым описанием, и облачность, и многое другое.

Дальше в узле Prepare Dashboard Data происходит следующее: мы берем эти данные и обрабатываем, как нам нужно. К примеру, если нам не принципиально знать точное направление ветра в градусах, мы можем преобразовать это в буквенное обозначение по сторонам света - Ю, З, ЮЗ и так далее. Многие из этих данных слишком подробные для повседневного использования. А еще здесь выбираем иконки для отображения на экране. Иконки берутся из готового базового набора для погоды, который уже встроен в NodeRed. Часть показателей здесь я добавила (изначально они не отображались): облачность, влажность, давление. Вы можете добавить что-то на свое усмотрение, все делается полностью по аналогии.

А в узле 5 Day Forecast происходит ровно всё то же самое, только запрос делается уже не текущей погоды, а прогноза - на ближайшие часы, либо дни.

Что получилось:

На первом экране указано время рассвета/заката, и можно обновить данные (вручную послать запрос к серверу погоды)
На первом экране указано время рассвета/заката, и можно обновить данные (вручную послать запрос к серверу погоды)
На втором экране текущая погода и прогноз в ближайшие часы, обновляется по таймеру
На втором экране текущая погода и прогноз в ближайшие часы, обновляется по таймеру

Заключение

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

Если показанного примера вам не достаточно и вы хотите научиться делать полноценные приложения под Android, то вам помогут практические навыки программирования на Java, которые можно получить в «IT Школе Samsung».

Ну, а вам домашнее задание — добавьте свои собственные виджеты на панель инструментов так, чтобы отображать важные для вас показатели. Это может быть счетчик просмотров вашего канала на YouTube, или даты ближайших событий в календаре, или расписание электричек. А еще можно дальше развивать погодную станцию. Теперь, когда вы поняли принцип, вы можете подключить свои собственные самодельные или покупные датчики, чтобы отображать показания не только из Интернета, но и прямо из окружающей среды, например, измерять температуру и влажность внутри помещения.

Всем пока! Продолжим эту тему в следующем уроке с совершенно другим проектом.

Другие статьи этого цикла:

Татьяна Волкова

Ведущий специалист управления развития технологических проектов и образовательных программ Исследовательского Центра Samsung в России

Комментарии (22)


  1. sirri
    29.12.2022 20:29

    О, спасибо! Интересный материальчик. Пишите еще!


  1. ushanov90
    29.12.2022 22:40

    Хм... А есть другие источники погодной информации, кроме Опенвэзермап? А то зашел на сайт, а оно для моего населенного пункта показывает -19, а на самом деле всего -6, все желание отбило повторять проект... Аккувэзер какой-нибудь может так?


    1. sden77
      30.12.2022 00:19
      +1

      есть от Яндекса - https://yandex.ru/dev/weather/


      1. ushanov90
        30.12.2022 00:39

        Спасибо. Завтра сравню его точность с реальным градусником, и, может быть, будет интересно...


        1. OptimumOption
          30.12.2022 14:54

          Яндекс тоже часто врёт, а вот прогнозы погоды от гугла частенько пугают точностью


      1. sav13
        30.12.2022 05:35

        Там же вроде все платно сделали с АПИ?


        1. sden77
          30.12.2022 11:11

          50 запросов в день вроде бесплатно


  1. sav13
    30.12.2022 05:40

    А существует лаунчер для андройда, который позволит запустить браузер с моим дашбордом но при этом не будет запускать кучу разной лишней фигни?
    Желательно для старого и дремучего андройда, так как телефоны и планшеты, годные для такого использования, не блещут новизной андройда и обновлениями


    1. 13werwolf13
      30.12.2022 06:40

      а при чём тут лаунчер? ведроид запускает кучу шлака независимо от лончера. возьмите AOSP и сделайте прошивку под свои задачи.


      1. sav13
        30.12.2022 08:56

        При том что моя задача - запустить WiFi, подцепиться к сети и запустить браузер с моим дашбордом.
        Сколько времени и сил уйдет на сборку, заливку и отладку кастомной прошивки на древнее устройство? А ланчер в принципе решит мою задачу. Минут так за 10-15 )))


        1. DaemonGloom
          30.12.2022 09:31

          Вам пытаются сказать, что куча софта запускается вне зависимости от выбранного лаунчера. Поэтому в любом случае придётся сначала вычищать всё это дело. И после этого уже использовать лаунчеры типа https://wallpanel.xyz или https://www.fully-kiosk.com. Но нужно учитывать, что в зависимости от древности системы, там могут не поддерживаться современные версии браузера — и, соответственно, не все сайты будут работать.


    1. vviz
      30.12.2022 11:34

      MacroDroid ?


  1. 13werwolf13
    30.12.2022 09:17

    You:

    sav13

    30.12.2022 в 07:40

    А существует лаунчер для андройда, который позволит запустить браузер с моим дашбордом но при этом не будет запускать кучу разной лишней фигни?

    Me:

    ведроид запускает кучу шлака независимо от лончера

    You:

    ланчер в принципе решит мою задачу. Минут так за 10-15

    Простите но яннп


    1. Arovi4
      30.12.2022 13:40

      @sav13 хочет, чтобы за место лаунчера при загрузке ОС открывался только браузер на весь экран (заранее настроенный на некий адрес, который покажет его дашборд)


      1. 13werwolf13
        30.12.2022 14:13

        спасибо за пояснение, это действительно другая задача


  1. OptimumOption
    30.12.2022 11:37

    Какие шаги нужно проделать, чтобы сделать точно такую же станцию у себя на смартфоне?

    На старый планшет тупо поставил WhatWeather, без всяких лишних телодвижений с root и termux...


    1. gsaw
      30.12.2022 13:11
      +2

      На старый планшет тупо поставил WhatWeather

      Ну тут же общий принцип описан, помимо погоды можно метрики чего угодно из любого источника тянуть. Это может и своя станция погоды быть, и датчики температуры или co2 в помещении или актуальные выигрышные номера в лотерею. И телодвижений минимум. Ясно, что есть софт на многие случаи жизни, но не на все комбинации. А тут и экономия на raspberry pi, которые в последнее время стоят как комп и гибкость.


  1. Mike_Mihalych
    30.12.2022 15:34
    +1

    У Вас указано, что нужен Андроид не ниже 5-й версии, а по приведенной Вами ссылке сам автор Termux-а утверждает, что нужен не ниже 7-й. У Вас опечатка или автор ПО перестраховывается?


    1. gsaw
      30.12.2022 16:28
      +1

      В Вики приложения ещё стоит 5 версия андроида, видимо раньше было так, теперь и в плеймаркете пишет 7 минимум.


      1. robofreak Автор
        30.12.2022 18:32

        Точно, исправила! Спасибо за ремарку


    1. robofreak Автор
      30.12.2022 18:32

      Спасибо за внимательность! Действительно, у авторов встречаются разночтения на разных сайтах, но самая новая версия по-видимому действительно требует 7.0. Исправила.


    1. Otard
      31.12.2022 07:17

      Установил через F-Droid Termux на смарт с Андроид 5 версии. Работает.