Как работать с базой данных HIstory. wb-mqtt-db

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

Введение времени обновления позволяет строить и производные сигналы (используя виртуальное устройство, например): если значение с датчика не поступает в течение определенного времени, то выдавать определенное значение, которое является индикатором отсутствия связи.

Вариант, но не такой изящный как отправлять данные в мониторинг сразу после их поступления с устройства. Изобретать программную прослойку с виртуальными устройствами не очень удобно. Особенно если речь идет о радио устройствах типа Lora - могут прислать данные, могут и нет.

Изобретать программные прослойки не то, что “не очень удобно”, это необходимо для построения надежной и легко поддерживаемой системы.

Каждая такая прослойка убирает “шороховатости” на нижнем уровне и адаптирует/нормализует/преобразует данные до вида и свойств, которые требуются следующему уровню системы.

Существует и терминология, и шаблоны по построению таких прослоек, см., например: https://www.enterpriseintegrationpatterns.com/patterns/messaging/toc.html

Книга "Шаблоны корпоративных приложений"

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

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

Книга предназначена для программистов, проектировщиков и архитекторов, которые занимаются созданием корпоративных приложений и стремятся повысить качество принимаемых стратегических решений…

https://www.ozon.ru/context/detail/id/4884925/

Книга: Шаблоны интеграции корпоративных приложений

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

Книга ориентирована на разработчиков программного обеспечения и системных интеграторов, использующих различные технологии и продукты для обмена сообщениями, такие как Java Message Service (JMS), Microsoft Message Queuing (MSMQ), IBM WebSphere MQ, Microsoft BizTalk, TIBCO, WebMethods, SeeBeyond, Vitria и др.

https://rsdn.org/res/book/prog/IntegrationPatterns.xml

ИМХО

история хранится в sqlite, не проще ли делать из него выборки и или их по почте в формате csv ( sqlite умеет это сам делать) отсылать или в базу забикса (или чего там еще) импортировать? Зачем такая куча промежуточных механизмов?

dead_Ivanich, правильно ли я понимаю, что через zabbix можно вытаскивать только текущие значения, а архивные вытащить таким образом не получится?

Кхм… база данных имеет информацию по тем данным, которые у нее есть. Вы можете в zabbix завести показатель, а потом по нему вставить историю из другой базы. Из Sqlite например…
Zabbix Mysql база имеет открытую и очень понятную структуру. (но временные запросы лучше строить в PostgreSQL). Я завел показатели в Zabbix - счетчики воды, электричества, тепла и формирую из них посредством SQL запросов выборку за нужные периоды с учетом нескольких тарифов. Потом настроил связку Openhab2 и отдельно nginx+uwsgi+flask(python) и нарисовал приличный интерфейс с графиками, которые мне нужно. Сделал как я хотел, могу крутить как хочу и тп…

Это в разработке еще… идей много… времени мало

dead_Ivanich, Если у меня нет отдельного компьютера с Linux, то Zabbix Server я не смогу использовать?
А если поставить Zabbix Server на WB6, а на комп с Windows Zabbix Agent?

В чем проблема?

wb-mqtt-db-cli -h 127.0.0.1 --from “2019-02-11” --to “2019-02-12” --limit 10 -d’;’ devices/wb-adc/controls/5Vout

Traceback (most recent call last):

File “/usr/bin/wb-mqtt-db-cli”, line 182, in

main()

File “/usr/bin/wb-mqtt-db-cli”, line 157, in main

raise err

mqttrpc.client.MQTTRPCError: Server error [-32000]: ‘channels’ items must be an arrays of size two

Добрый день!
У вас не те кавычки и апострофы (не знаю, как вы этого добились; возможно, в каком-то текстовом редакторе сохраняли команду); девайс назван не так, как требуется.

root@wirenboard-AH2M5RIF:~# wb-mqtt-db-cli -h 127.0.0.1 --from "2019-02-11" --to "2019-02-12" --limit 10 -d';' wb-adc/5Vout
channel;time;average;min;max
wb-adc/5Vout;2019-02-11 00:01:21.000000;5.01998637602178;5.01;5.02
wb-adc/5Vout;2019-02-11 00:03:21.000000;5.02;;
wb-adc/5Vout;2019-02-11 00:15:21.000000;5.01998441153561;5.01;5.02
wb-adc/5Vout;2019-02-11 00:23:21.000000;5.01998635743518;5.01;5.02
wb-adc/5Vout;2019-02-11 00:25:21.000000;5.01994535519125;5.01;5.02
wb-adc/5Vout;2019-02-11 00:35:21.000000;5.01998910675385;5.01;5.02
wb-adc/5Vout;2019-02-11 00:43:21.000000;5.02;;
wb-adc/5Vout;2019-02-11 00:47:21.000000;5.01999090909101;5.01;5.02
wb-adc/5Vout;2019-02-11 00:55:21.000000;5.01998637602178;5.01;5.02
wb-adc/5Vout;2019-02-11 01:03:21.000000;5.01998637602178;5.01;5.02

Как это не те?! Это шутка! Я их в командной строке вбивал.

Что значит не так назван. Если задать wb-adc/5Vout, то выводится всегда:

channel;time;average;min;max

С другими параметрами тоже пустые значения выводятся.

Не понял, что вы имели в виду. Вот кавычки из вашего сообщения:

вот из моего:

Легко заметить, что они разные.

Почему нет истории, сходу сказать не могу. Если зайти в History, то там данные есть? Пришлите скриншот, пожалуйста.

As you wish… вариантов масса. можете виртуальный линукс запустить в hyper-v!
zabbix agent это агент , а не удаленный терминал. Zabbix server на wb6 наверное можно запустить, но я использую его только как mqtt брокера и интерфейсы…

да тупиковая эта ветка, поверьте… я про использование sqlite

dead_Ivanich, Проблема в том, что я пока не нашел ни одного нормального способа извлекать данные с WB6, кроме кривоватого UI. (Впрочем, это тоже не выход, т. к. мне нужно вытягивать архивные данные из базы.)
Заводить ради этого еще один компьютер с Linux или мучаться с виртуальной машиной я не буду.
Нужен способ, который будет гарантированно работать в Windows без плясок с бубном!

ставьте заббикс на винду и алга.
ставьте mqtt на винду и тащите туда топики какие надо
монтируйте на винду раздел с wb6 и “щупайте” непосредственно файлуху
пишите программу на запускайте на WB6 и пишите по сетке на винду в базу данных топики или что надо

Вариантов - миллион. Правда все они требуют
определенных усилий

Сорри за некропостинг. Вопрос по теме.

Есть ли возможность работать с историческими данными в скриптах wb-rules?

Хочу иметь среднюю температуру с датчика.

если в консоли: используем команду вида
wb-mqtt-db-cli -h 127.0.0.1 --from '2020-06-16 09:06:30' --to '2020-06-18' --limit 1 -d';' wb-adc/5Vout |tail -1 | cut -f 3 -d';'
для нужного устройства, периода времени (период - можно указывать переменными ессно).
tail -1 | cut -f 3 -d’;’ - вернет третье (среднее значение параметра за период) поле второй (последней) строки

В скрипте пользоваться так:

    runShellCommand("wb-mqtt-db-cli -h 127.0.0.1 --from '2020-06-16 09:06:30' --to '2020-06-18' --limit 1 -d';' wb-adc/5Vout |tail -1 | cut -f 3 -d';'",
        {
      captureOutput: true, //Захватывать stdout
      captureErrorOutput: true, //Захватывать stderr (если нужно)
      exitCallback: function (exitCode, capturedOutput, capturedErrorOutput) //Функция, в которую попадает вывод
            {
                log("cmd output: " + capturedOutput); //Делаем с данными что угодно(в переменную, например)
                log("cmd Erroroutput: " + capturedErrorOutput);
            }
         })

Еще один вариант, предложенный настоящим гуру:

  // Запуск shell-команды с запросом в историю
    runShellCommand("wb-mqtt-db-cli -h 127.0.0.1 --from '2020-06-11 09:06:30' --to '2020-06-18' --limit 1 -d';' wb-adc/5Vout |tail -1",
        {
      captureOutput: true, //Захватывать stdout
      captureErrorOutput: true, //Захватывать stderr (если нужно)
      exitCallback: function (exitCode, capturedOutput, capturedErrorOutput) //Функция, в которую попадает вывод
            {
                log("cmd output: " + capturedOutput); //строка полностью
              	log("channel: " +capturedOutput.split(";")[0]) // channel
				log("time: " +capturedOutput.split(";")[1]) // time
				log("average: " +capturedOutput.split(";")[2]) // average
				log("min: " +capturedOutput.split(";")[3]) // min
				log("max: " +capturedOutput.split(";")[4]) // max
                log("cmd Erroroutput: " + capturedErrorOutput);
            }
         })
1 Like

Спасибо большое.

Я в итоге решил через таймеры и сохранение значений в PersistentStorage и расчет среднего значения при каждом обновлении.