Страница 1 из 1

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

Добавлено: Вт мар 31, 2020 11:55 am
alx69
Скрипт берет данные с 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 МБ) 148 скачиваний
Запускать так:
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 КБ) 3713 просмотров
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 - старый устарел.

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

Добавлено: Вт мар 31, 2020 11:13 pm
adzam
А как выводить данные из под винды?

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

Добавлено: Вт мар 31, 2020 11:37 pm
alx69
Есть интерпретатор php под винду. Но как это запускать там я не в курсе.

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


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

Добавлено: Ср апр 01, 2020 4:37 pm
alx69
adzam писал(а):
Вт мар 31, 2020 11:13 pm
А как выводить данные из под винды?
Переписал код на Go и скомпилил на Windows. Все в первом сообщении.

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

Добавлено: Ср апр 01, 2020 8:49 pm
alx69
Дописал кусок для метода MJD. Будет работать в Windows без костылей через MQTT.