Добавление датчика Aquara из SprutHub в Wirenboard

Здравствуйте! Хочу добавить датчик температуры и влажности Aquara из SprutHub в WirenBoard. Написал правило, устройство добавилось на дашборд, но не получает данные. Вот код, где я ошибся?
var SensorTemperatura = “03_virtual_sensor/Temperatura”;
var MQTT_SensorTemperatura = “Sprut.hub-6535EB0F093C07B5_1/accessories/44/13”;

var SensorVlag = “03_virtual_sensor/Vlag”;
var MQTT_SensorVlag = “Sprut.hub-6535EB0F093C07B5_1/accessories/44/16”;

var SensorDavlenie = “03_virtual_sensor/Davlenie”;
var MQTT_SensorDavlenie = “Sprut.hub-6535EB0F093C07B5_1/accessories/44/19”;

var SensorData = {
Temperatura: {
title: “Температура”,
type: “value”,
order: 0,
value: 25,
unit: “°C”
},
Vlag: {
title: “Влажность”,
type: “value”,
order: 1,
value: 45,
unit: “%”
},
Davlenie: {
title: “Давление”,
type: “value”,
order: 2,
value: 750,
unit: “мм рт.ст.”
}
};

// Создаем виртуальное устройство
defineVirtualDevice(‘03_VirtualSensor’, {
title: ‘Датчик микроклимата кухня’,
cells: SensorData
});

// Функция для обновления значения в виртуальном устройстве
function updateValue(sensor, value) {
setCellValue(sensor, value.toFixed(1)); // округляем до 1 знака после запятой
}

// Функция для получения новых данных с датчика
function getNewData() {
// Получаем новые значения с датчиков
var newTemperatura = getValue(MQTT_SensorTemperatura);
var newVlag = getValue(MQTT_SensorVlag);
var newDavlenie = getValue(MQTT_SensorDavlenie);

// Обновляем значения в виртуальном устройстве
updateValue(SensorTemperatura, newTemperatura);
updateValue(SensorVlag, newVlag);
updateValue(SensorDavlenie, newDavlenie);
}

// Запускаем обновление каждые 60 секунд
setInterval(getNewData, 60000); // 60000 миллисекунд = 60 секунд

// Отслеживаем MQTT сообщения и обновляем значения
trackMqtt(MQTT_SensorTemperatura, function(message) {
var value = parseFloat(message.value);
updateValue(SensorTemperatura, value);
});

trackMqtt(MQTT_SensorVlag, function(message) {
var value = parseFloat(message.value);
updateValue(SensorVlag, value);
});

trackMqtt(MQTT_SensorDavlenie, function(message) {
var value = parseFloat(message.value);
updateValue(SensorDavlenie, value);
});

Я бы в целом пошел по другому пути - сделать единую фукцию для 1 вирт. устройства, в которой будет сколько угодно датчиков.

Накидал вариант без тестирования - попробуйте:

/*
	Скрипт для забора данных датчиков от спрутхаба для
	доступа внутри wb-rules через виртуальное устройство
*/

(function() {

	// Опеределяем локальные переменные
	var virt = 'spruthub', order = 1;

	// Инициализируем виртуальное устройство без контроллов
	defineVirtualDevice(virt, {title: 'Датчики Sprut.Hub', cells: {}});

	function addSprutMonitoring(name, control, topic, units) {

		// Добавляем контрол в виртуальное устройство
		getDevice(virt).addControl(control, {title: {en: control, ru: name}, type: 'value', value: 0, units: units  || '', order: order});

		// Добавляем отслеживание данных от спрута на брокере
		trackMqtt(topic, function(message) {
			dev[virt][control] = parseFloat(message.value);
		});

		// Увеличиваем счетчик порядка
		order++;
	}

	// Вызов функции для добавления контроллов в вирт. устройство, отслеживающих изменения на брокере
	// Формат: наименование датчика, имя контрола, топик от спрута, единицы измерения

	addSprutMonitoring('Температура', 'temperatura', 'Sprut.hub-6535EB0F093C07B5_1/accessories/44/13', '°C');
	addSprutMonitoring('Влажность', 'vlag', 'Sprut.hub-6535EB0F093C07B5_1/accessories/44/16', '%');
	addSprutMonitoring('Давление', 'davlenie', 'Sprut.hub-6535EB0F093C07B5_1/accessories/44/16', 'мм рт.ст.');

})();
4 лайка

Супер. Спасибо. Все заработало и кода меньше и последующие добавлять легче. :handshake:

1 лайк