Данные по короновирусу в MQTT

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Ответить
Аватара пользователя
alx69
Сообщения: 122
Зарегистрирован: Чт фев 09, 2017 12:42 pm
Откуда: Киев, Украина
Благодарил (а): 10 раз
Поблагодарили: 22 раза

Данные по короновирусу в MQTT

Сообщение alx69 » Вт мар 31, 2020 11:55 am

Скрипт берет данные с https://corona.lmao.ninja/countries в json формате, выбирает из них страну, которую задаем в начале скрипта и шлет по ней данные в MQTT.
Используется библиотека, которая есть в каталоге с Majordomo - лежит по пути "корень MJD"/3rdparty/phpmqtt/phpMQTT.php
Если вдруг от туда файл phpMQTT.php пропадет, то вот исходник: http://github.com/bluerhinos/phpMQTT
За основу был взят файл publish.php, который лежит в этих исходниках.

Перед использованием подправить (при необходимости) переменные $server, $port, $username, $password, $client_id, $country.
СпойлерПоказать

Код: Выделить всё

<?php
require "../3rdparty/phpmqtt/phpMQTT.php";

$server = "localhost";            // change if necessary
$port = 1883;                       // change if necessary
$username = "username";     // set your username
$password = "pass";              // set your password
$client_id = "phpMQTT-publisher"; // make sure this is unique for connecting to sever - you could use uniqid()
$country = "Ukraine";

$date_format = "Y-m-d H:i:s";

$fc = file_get_contents('https://corona.lmao.ninja/v2/countries');

$date = new DateTime();
$mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id);

$cv = json_decode($fc, true);

if ($mqtt->connect(true, NULL, $username, $password)) {
  foreach ($cv as $name => $value) {
    if ($value['country'] == $country) {
      $date->setTimestamp(substr($value['updated'], 0, 10));

      $mqtt->publish("/coronavirus/cases", $value['cases'], 0);
      $mqtt->publish("/coronavirus/todayCases", $value['todayCases'], 0);
      $mqtt->publish("/coronavirus/deaths", $value['deaths'], 0);
      $mqtt->publish("/coronavirus/todayDeaths", $value['todayDeaths'], 0);
      $mqtt->publish("/coronavirus/recovered", $value['recovered'], 0);
      $mqtt->publish("/coronavirus/updated", $date->format($date_format), 0);
    }
  }
  $mqtt->close();
}
?>
У меня скрипт лежит в папке "корень MJD"/scripts и называется c-virus-mqtt.php. Отсюда и в директиве require (в начале скрипта) такой путь к phpMQTT.php библиотеке.

Сам скрипт поставить в крон (заходим через ssh на сервер majordomo. Далее crontab -e). Например так:
*/30 * * * * cd /var/www/md/scripts/; /usr/bin/php /var/www/md/scripts/c-virus-mqtt.php > /dev/null 2>&1
Запускать раз в 30 минут.

UPD1 (01.04.2020):
Переписал полностью на Go. Скомпилировал бинарник для Windows. Компилил на своем компе, он Windows x64, так что не знаю, запуститься ли на x32 винде.
c-virus.zip
для Windows
(3.85 МБ) 83 скачивания
Запускать так:
c-virus.exe -user <имя пользователя на mqtt брокере> -password <пароль для этого пользователя> -broker tcp://10.1.3.35:1883
Где: tcp://10.1.3.35:1883 - адрес где у меня стоит mqtt брокер.
-user, -password можно не указывать если на брокере не настроена аутентификация
Есть справка. Вызывать c-virus.exe -h
Фактически, он вот:
СпойлерПоказать

Код: Выделить всё

Usage of D:\aaaaa\c-virus.exe:                                                                                                                                                                                         -broker string
        The broker URI. ex: tcp://localhost:1883 (default "tcp://localhost:1883")
  -country string
        For witch country (optional) (default "Ukraine")
  -id string
        The ClientID (optional) (default "CV-Stats")
  -password string
        The password (optional)
  -timezone string
        Timezone for updated date (optional) (default "Europe/Kiev")
  -topic string
        Topics start at (optional) (default "/coronavirus")
  -user string
        The User (optional)
Да-да-да, статистику можно получать для разных стран и указывать разные timezone для получаемого поля updated :)

Выглядит в MQTT все вот так:
СпойлерПоказать
mqtt-go.jpg
mqtt-go.jpg (29.67 КБ) 2075 просмотров
UPD2 (01.04.2020 18:15):
Вот тут все исходники и скомпилированный бинарник под win64:
https://github.com/alxpanther/coronavirus-mqtt

UPD3 (01.04.2020 20:45):
Спасибо skySilver переписал первый вариант в код для метода в Majorodomo. Точнее, он переписал, а я доправил.
СпойлерПоказать

Код: Выделить всё

$country = "Ukraine";
$date_format = "Y-m-d H:i:s";

$fc = file_get_contents('https://corona.lmao.ninja/v2/countries');

$date = new DateTime();

$cv = json_decode($fc, true);

foreach ($cv as $name => $value) {
 if ($value['country'] == $country) {
  $date->setTimestamp(substr($value['updated'], 0, 10));
  $this->setProperty("cases", $value['cases']);
  $this->setProperty("todayCases", $value['todayCases']);
  $this->setProperty("deaths", $value['deaths']);
  $this->setProperty("todayDeaths", $value['todayDeaths']);
  $this->setProperty("recovered", $value['recovered']);
  $this->setProperty("updated", $date->format($date_format));
 }
}
Создаем новый объект. Создаем в нем новый метод. Добавляем поля (перечислены в коде SetProperty).
Далее идем, например, в метод: ClockChime.onNewMinute и внутри него делаем запуск, что-то типа callMethod('CoronaVirus.CoronaStats'); где CoronaVirus это новый объект, а CoronaStats это сам метод.
Все, раз в минуту данные обновляются в полях. Будет работать и на Windows.

UPD4 (21.04.2020 14:13):
В кодах двух скриптов выше, обновил URL - старый устарел.
Последний раз редактировалось alx69 Вт апр 21, 2020 2:14 pm, всего редактировалось 5 раз.
За это сообщение автора alx69 поблагодарили (всего 2):
Samir77 (Ср апр 01, 2020 6:27 pm) • adzam (Ср апр 01, 2020 10:31 pm)
Рейтинг: 2.35%
Raspberry PI 3, 4 (MicroSD+HDD/SSD) + Netatmo + Xiaomi + Sonoff + Broadlink + Livolo/Funry/Sesoo + Ghome + Irbis (Алиса)
CONNECT
Аватара пользователя
adzam
Сообщения: 583
Зарегистрирован: Сб дек 08, 2012 10:28 pm
Откуда: Кишинев
Благодарил (а): 16 раз
Поблагодарили: 131 раз

Re: Данные по короновирусу в MQTT

Сообщение adzam » Вт мар 31, 2020 11:13 pm

А как выводить данные из под винды?
Мои проекты здесь...https://connect.smartliving.ru/profile/41/blog213.htm
Если вам помогло какое-либо мое сообщение - не ленитесь пользоваться кнопкой СПАСИБО.
Аватара пользователя
alx69
Сообщения: 122
Зарегистрирован: Чт фев 09, 2017 12:42 pm
Откуда: Киев, Украина
Благодарил (а): 10 раз
Поблагодарили: 22 раза

Re: Данные по короновирусу в MQTT

Сообщение alx69 » Вт мар 31, 2020 11:37 pm

Есть интерпретатор php под винду. Но как это запускать там я не в курсе.

Отправлено с моего Mi MIX 2S через Tapatalk

Raspberry PI 3, 4 (MicroSD+HDD/SSD) + Netatmo + Xiaomi + Sonoff + Broadlink + Livolo/Funry/Sesoo + Ghome + Irbis (Алиса)
CONNECT
Аватара пользователя
alx69
Сообщения: 122
Зарегистрирован: Чт фев 09, 2017 12:42 pm
Откуда: Киев, Украина
Благодарил (а): 10 раз
Поблагодарили: 22 раза

Re: Данные по короновирусу в MQTT

Сообщение alx69 » Ср апр 01, 2020 4:37 pm

adzam писал(а):
Вт мар 31, 2020 11:13 pm
А как выводить данные из под винды?
Переписал код на Go и скомпилил на Windows. Все в первом сообщении.
Raspberry PI 3, 4 (MicroSD+HDD/SSD) + Netatmo + Xiaomi + Sonoff + Broadlink + Livolo/Funry/Sesoo + Ghome + Irbis (Алиса)
CONNECT
Аватара пользователя
alx69
Сообщения: 122
Зарегистрирован: Чт фев 09, 2017 12:42 pm
Откуда: Киев, Украина
Благодарил (а): 10 раз
Поблагодарили: 22 раза

Re: Данные по короновирусу в MQTT

Сообщение alx69 » Ср апр 01, 2020 8:49 pm

Дописал кусок для метода MJD. Будет работать в Windows без костылей через MQTT.
Raspberry PI 3, 4 (MicroSD+HDD/SSD) + Netatmo + Xiaomi + Sonoff + Broadlink + Livolo/Funry/Sesoo + Ghome + Irbis (Алиса)
CONNECT
Ответить