Есть график аналогового входа, как мне получить значение этого графика в определенное время в прошлом. Задача стоит подсчитать количество пиков на графике за определенный период.
или как взять значение из этой таблицы? Как мне узнать какое было значение 27.08.25 в 8:08:07? Какой функцией читать из базы данных? Или это надо делать с помощью запросов SQL? Тогда где хранятся эти данные и как подключиться к БД?
Добрый день!
Для реализации вашей задачи вам потребуется wb-mqtt-db.
Либо можно установить любую другую БД с интеграцией с MQTT, например InfluxDB, и работать уже с ней.
Возможно, будет еще полезна данная тема.
а зачем устанавливать какую-нибудь БД, разве сам WB не пишет в свою БД? Мне нужно в моем правиле просто прочитать данные из БД в которую пишет WB и отобразить на экране?
Может есть пример правила?
Добрый день!
Прошу подробнее ознакомиться с ранее предоставленными ссылками.
Пример правила можно взять, например, здесь.
Стороннюю БД я использовал для себя, так как привык работать именно с ней и знаю её лучше остальных.
Сделал такое правило
// Запуск shell-команды с запросом в историю
runShellCommand("wb-mqtt-db-cli -h 127.0.0.1 --from '2025-08-26 08:00:00' --to '2025-08-27 08:00:00' --limit 1 -d';' wb-adc/A1 |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);
}
})
и получил такой ответ
2025-08-27 11:50:32cmd output:
2025-08-27 11:50:32channel:
2025-08-27 11:50:32time: undefined
2025-08-27 11:50:32average: undefined
2025-08-27 11:50:32min: undefined
2025-08-27 11:50:32max: undefined
2025-08-27 11:50:32cmd Erroroutput: usage: wb-mqtt-db-cli [–help] [-b BROKER_URL] [–from DATE_FROM]
[–to DATE_TO] [–time-format TIME_FORMAT]
[–limit LIMIT] [–interval MIN_INTERVAL | -a]
[–max-records MAX_RECORDS]
[–decimal-places DECIMAL_PLACES] [-d DELIMITER]
[-o OUTPUT_FNAME] [–timeout TIMEOUT]
DEVICE/CONTROL [DEVICE/CONTROL …]
wb-mqtt-db-cli: error: unrecognized arguments: -h wb-adc/A1
хотя аргумент такой есть
что не так?
когда вы писали Для реализации вашей задачи вам потребуется wb-mqtt-db
, что вы имели в виду? Я должен что то установить или запустить?
Добрый день,
Данный сервис логирует все данные. Для работы нужен wb-mqtt-db-cli, который выше уже использовался в скрипте.
Рекомендую выполнить команду в консоли и проверить, какие данные отображаются.
А сервис wb-mqtt-db-cli надо запускать или он уже запущен?
Добрый день,
сервис работает в фоне. Вывод команды должен быть примерно такой.
root@WB65-A4B6F4W4:~# wb-mqtt-db-cli
usage: wb-mqtt-db-cli [--help] [-b BROKER_URL] [--from DATE_FROM] [--to DATE_TO] [--time-format TIME_FORMAT]
[--limit LIMIT] [--interval MIN_INTERVAL | -a] [--max-records MAX_RECORDS]
[--decimal-places DECIMAL_PLACES] [-d DELIMITER] [-o OUTPUT_FNAME] [--timeout TIMEOUT]
DEVICE/CONTROL [DEVICE/CONTROL ...]
wb-mqtt-db-cli: error: the following argu
ments are required: DEVICE/CONTROL
для примера используйте например данную команду, у вас не верный синтаксис.
wb-mqtt-db-cli -b tcp://127.0.0.1:1883 --from "2025-08-26 08:00:00" --to "2025-08-27 08:00:00" --interval 144 -d ';' wb-adc/Vin
А в каком документе я мог бы прочитать про эту команду? и другие команды.
Только тут и --help использоватьпри работе с командой
а как узнать какие вообще есть команды?
Данная команда отобразит все команды
wb-mqtt-db-cli --help
у меня вот такие настройки
стоит заносить в базу данных каждые 2 секунды, а на графике я вижу, что значения попадают каждые 120 секунд,
что я не так настроил?
как сделать что бы в базу писалось чаще?
Добрый день!
При такой конфигурации (как на скриншоте) запись будет выполняться примерно раз в 2 секунды, но это справедливо только для данной конкретной конфигурации. Частота зависит от множества параметров: скорости на шине, количества устройств, числа ошибок и общей нагрузки на контроллер.
Прошу описать задачу более глобально, которую вы пытаетесь решить — возможно, смогу предложить более подходящее решение.
Оператор на большом экскаваторе поднимает ковш, в ковше ценный грунт, при подъёме ковша ток возрастает. Надо считать ковши. Я решил отслеживать ток и считать пики. Оператор поднимает полный ковш - ток большой, потом опускает ковш на землю и ток 0, потом зачерпнув грунт он опять поднимает ковш и ток опять вырос. Вот эти пики тока я и хочу считать?
чт, 28 авг. 2025 г., 12:03 Aleksandr Khlebnikov через Wiren Board Support <info@wirenboard.com>:
Рекомендую сделать так: правило не будет брать данные из базы, а будет работать напрямую с топика. При каждом новом значении проверяется условие, и если оно выполнено — увеличивается отдельный счётчик в своём топике.
// Пороговое значение
var LIMIT = 1;
// Флаг: текущее состояние "выше порога"
var wasAbove = false;
// Создаём виртуальное устройство-счётчик
defineVirtualDevice("counter_dev", {
title: "Счётчик превышений",
cells: {
count: {
type: "value",
value: 0
}
}
});
// Подписываемся на исходный топик
defineRule("count_if_limit", {
whenChanged: "wb-adc/V3_3", // замените на свой топик
then: function (newValue) {
var val = parseFloat(newValue);
if (val > LIMIT && !wasAbove) {
// Сработал переход снизу вверх через порог
dev["counter_dev/count"] = dev["counter_dev/count"] + 1;
wasAbove = true;
}
if (val <= LIMIT && wasAbove) {
// Вернулись обратно — сброс флага
wasAbove = false;
}
}
});