Здравствуйте. Никак не получается получить значения топиков в панель wientek. Причем сопряжение работает. После привязки топика, при симуляции на панели нули.
Добрый день.
Если я понял правильно - то хотите подписаться на какой-то топик.
Покажите пожалуйста результат подписки на этот топик, с компьютера, например.
Вот на другой, тот уже изменила. Данный топик тоже не работает
mosquitto_sub -t /devices/hwmon/controls/CPU\ Temperature -v
/devices/hwmon/controls/CPU Temperature 60.342
Так, я вижу что на топик вы подписываетесь успешно, получаете результаты? Что не работает?
Эти данные не приходят на панель wientek. Вмсто данных приходят нули
Где то читала в обсуждениях, что сырые данные wientek у wirenboard не принимает. Как конвертировать данные в json? Читала такую стать Особенности реализации JSON-editor в Wirenboard — Wiren Board , но в GUI отменили такую возможность. Глубоко в код в консоли лезть не хочется
Хм, довольно интересно. А посмотрите, для проверки, что публикует сама “панель” в топик.
То есть создайте топик предполагаемого формата и опубликуйте в него значение - что фактически будет публиковаться? То есть предлагаю проверить гипотезу о том что нужен какой-то специфический формат значения.
Ну и полезно глянуть в лог mosquitto, сама “панель” подключается как клиент?
Тоже задался этим вопрос. Получается на сегодня только через wb-lules можно работать с MQTT weintek.
Weintek не принимает сырые данные, только JSON. Причем с JSON он работает как хочешь, вплоть до сложных вложений. Почему WB не умеет MQTT JSON из коробки?
Почему это не умеет? Вполне, вот так, например:
log.info("Light2HA: запуск");
var HA_BASE = "homeassistant";
/**
* Регистрирует источник света в Home Assistant через MQTT Discovery.
*
* Маршруты синхронизации:
* HA → Контроллер:
* HA публикует "1"/"0" в command_topic (/devices/.../controls/.../on).
* WirenBoard обрабатывает это нативно и обновляет состояние устройства.
* Правило ha2wb_* перехватывает смену состояния и позволяет добавить логику.
*
* Контроллер → HA:
* Правило wb2ha_* следит за топиком WB и публикует состояние в state_topic.
* HA читает state_topic и отображает актуальное состояние.
*
* @param {string} lightName - Отображаемое имя в Home Assistant
* @param {string} wbTopic - Топик WB в формате "устройство/контрол"
* Например: "wb-gpio/EXT1_R3A"
* @param {string} uniqueId - Уникальный ID (только латиница, цифры, _)
* @param {string} [suggestedArea] - Рекомендуемая зона/помещение в HA (опционально)
*/
function registerLight(lightName, wbTopic, uniqueId, suggestedArea) {
var parts = wbTopic.split("/");
var device = parts[0];
var control = parts[1];
// MQTT-пути WirenBoard
var wbStatePath = "/devices/" + device + "/controls/" + control;
var wbCommandPath = wbStatePath + "/on";
var wbErrorCell = wbTopic + "#error";
// Топики Home Assistant
var haAvailTopic = HA_BASE + "/light/" + uniqueId + "/availability";
var haConfigTopic = HA_BASE + "/light/" + uniqueId + "/config";
// --- 1. MQTT Discovery ---
// Используем нативные пути WB: HA читает и пишет напрямую в MQTT-брокер контроллера.
var config = {
name: lightName,
command_topic: wbCommandPath, // HA пишет "1" или "0" сюда
state_topic: wbStatePath, // HA читает актуальное состояние отсюда
payload_on: "1",
payload_off: "0",
state_on: "1",
state_off: "0",
availability_topic: haAvailTopic,
unique_id: uniqueId,
device: {
identifiers: [uniqueId],
name: lightName,
manufacturer: "WirenBoard",
model: "MQTT Light"
}
};
// suggested_area добавляем только если параметр задан и не пустой
if (typeof suggestedArea === "string" && suggestedArea.trim() !== "") {
config.device.suggested_area = suggestedArea.trim();
}
// Публикует availability по содержимому meta/error:
// пусто -> online, непусто -> offline
function publishAvailability(errorValue) {
var hasError = (errorValue !== undefined &&
errorValue !== null &&
String(errorValue).trim() !== "");
publish(haAvailTopic, hasError ? "offline" : "online", 1, true);
}
// retain=true гарантирует, что HA получит конфиг и доступность при переподключении
publish(haConfigTopic, JSON.stringify(config), 1, true);
publishAvailability(dev[wbErrorCell]);
log.info("Light2HA: зарегистрирован [" + lightName + "]" +
" | WB: " + wbTopic +
" | HA id: " + uniqueId);
// --- 2. Контроллер → HA: availability по meta/error ---
defineRule("wb2ha_avail_" + uniqueId, {
whenChanged: wbErrorCell,
then: function (newError) {
publishAvailability(newError);
if (newError !== undefined && newError !== null && String(newError).trim() !== "") {
log.warning("Light2HA: [availability] " + lightName + " -> offline | error: " + newError);
} else {
log.info("Light2HA: [availability] " + lightName + " -> online");
}
}
});
// --- 3. Контроллер → HA: при изменении состояния на WB ---
// Срабатывает при любом изменении: физический выключатель, автоматизация WB,
// а также как результат команды от HA (после обработки WB).
defineRule("wb2ha_light_" + uniqueId, {
whenChanged: wbTopic,
then: function (newValue, devName, cellName) {
var state = newValue ? "1" : "0";
log.debug("Light2HA [wb→ha] " + lightName + " = " + state);
// Публикуем явно — на случай, если HA потерял retain-сообщение
publish(wbStatePath, state, 0, true);
}
});
// --- 4. HA → Контроллер: при получении команды от HA ---
// HA пишет в wbCommandPath (/on), WB обрабатывает нативно.
// Правило добавляем для кастомной логики (логирование, сцены и т.п.).
defineRule("ha2wb_light_" + uniqueId, {
whenChanged: wbTopic,
then: function (newValue, devName, cellName) {
log.debug("Light2HA [ha→wb] " + lightName +
" | устройство: " + devName +
" | канал: " + cellName +
" | значение: " + newValue);
// Место для дополнительной логики: сцены, уведомления, зависимые устройства
}
});
// Публикуем текущее состояние сразу при запуске скрипта
publish(wbStatePath, dev[wbTopic] ? "1" : "0", 0, true);
}
// ============================================================
// Регистрация источников света
// Формат: registerLight("Название в HA", "устройство/канал", "уникальный_id", "помещение")
// "устройство/канал" — как в топике /devices/{устройство}/controls/{канал}
// ============================================================
// registerLight("Свет в коридоре", "wb-gpio/EXT1_R3A", "light_corridor");
// registerLight("Свет на кухне", "wb-gpio/EXT1_R3B", "light_kitchen");
// registerLight("Подсветка", "wb-gpio/EXT2_R1A", "light_backlight");
registerLight("свет", "2fl_light_0/K5", "WorkChamber", "Кабинет");
registerLight("свет", "2fl_light_0/K6", "Bedroom_light", "Спальня");
registerLight("свет", "2fl_light_0/K6", "Storage_light", "Кладовка");
Тут интересно publish(haConfigTopic, JSON.stringify(config), 1, true); - как раз публикация json в указанный топик.
То есть все необходимые инструменты, включая методы объект->json ну и json->объект есть.
Проходили уже. Weintek в сырых данных публикует непонятно что:
~# mosquitto_sub -v -t ‘cMT3072x/test’ -C 5
cMT3072x/test
cMT3072x/test
cMT3072x/test ▒
cMT3072x/test ▒
cMT3072x/test ▒
Для чего производитель сделал работу с сырыми данными я так и не понял.
А, то есть при настройке не стоит использовать “сырые”?
Насколько я понимаю - публикует просто байт в этом случае?
Никогда не щупал такие панели. Как по мне проще и лучше копеечные на OpenHasp.
А если не “сырые” - то json нужен?
Из коробки имелось ввиду через GUI и конфигурационные файлы. По типу того что бы добавить modbus регистр. На сегодняшний день Weintek можно считать одним из лучших в работе IOT по MQTT.
Да JSON. Причем он умеет как и сложный JSON с кучей вложений, скобок ,массивов, метки времени, и т.д. Так и простой JSON:
~# mosquitto_sub -v -t ‘SVR-100/PR200_2/poliv_1’ -C 5
SVR-100/PR200_2/poliv_1 {
“poliv_1”: {
“day”: {
“pn”: false,
“vt”: true,
“sr”: false,
“cht”: false,
“pt”: false,
“sb”: false,
“vs”: false
},
“on_off”: {
“value”: 0
},
“one_run”: {
“value”: false
},
“status”: {
“poliv_run”: false
},
“time”: {
“ones”: {
“minut”: 20
},
“start”: {
“hour”: 7,
“minut”: 0
},
“stop”: {
“hour”: 7,
“minut”: 15
}
}
}
}
Json разных компаний отличается, причем часто кардинально. Если для Modbus - протокол стандартен и не допускает разночтений - то для формирования строки проще набросать конвертор.
Попробуйте, не пожалеете. Weintek HMI одни из лучших панелей как для промышленности, так и для IOT. Некоторые модели Weintek умеют JavaScript версии ECMAScript 2017
Для автора, поверьте мне как матерому вейнтеководу, не умеет он сырые данные, только JSON. Подружить Weintek по MQTT с WB на сегодня получается можно только через движок правил. Передать 150 и более регистров через правила wb-rules мне не понравилось. Поэтому старый добрый modbus.
Что-то дорогие они
Ну, понятно что для промышленного оборудования - цена нормальная. Но для дома несколько перебор, обычная китайская сенсорная панель 7’ на ESP ~$50
Закажу на компанию, наверно.
Так, а что не получилось? Я с таким количесвом довольно регулярно работаю.
Одна функция преобразования и описание вида топикИсточник - топикПриемник.
А если много топиков как мне их массово публиковать в JSONе?
публиковать через Weintek?
Не, чтоб wb публиковал в json

