Отслеживание whenChange у многих устройств

Всем добрый день!
Вопрос к создателям движка wb-rules!

У меня есть массив устройств - датчики движения, например 10 штук.
При изменении хоть у одного устройства его контрола Curren Motion больше определенного значения взводить флаг.
Вот участок кода:

var motion = [
    'wb-msw-v4_1/Current Motion',
    'wb-msw-v4_2/Current Motion',
    ....
    'wb-msw-v4_N/Current Motion'
];

defineRule('motionChange', {
    whenChanged: motion,
    then: function () {
        var move = false;

        motion.forEach(function (item, index, arr) {
            if ( dev[item] > 35 ) move = true;
        });
        dev['name']['motion'] = motion;
    }
});

Если произошло изменение хоть в одном из датчиков движения. то вызывается мой участок кода, где я перебираю весь массив и читаю значение из ВСЕХ датчиков движения. Вот тут у меня и возник вопрос! Сильно ли данный метод нагружает систему? Каждый раз читать значения всех датчиков методом dev? Или лучше создать отдельную переменную-массив и записывать туда значение newValue при изменении, а потом уже в отдельном массиве сравнивать все показания?

Например вот таким способом:

var motion = [
    'wb-msw-v4_1/Current Motion',
    'wb-msw-v4_2/Current Motion',
    ....
    'wb-msw-v4_10/Current Motion'
];

var saveMotion = [0,0,0,0,0,0,0,0,0,0];

defineRule('motionChange', {
    whenChanged: motion,
    then: function (newValue, devName, cellName) {
        var move = false;

        motion.forEach(function (item, index, arr) {
            if ( devName + '/' + cellName == item ) {
                saveMotion[index] = newValue;
                return;
            }
        });

        saveMotion.forEach(function (item, index, arr) {
            if ( item > 35 ) move = true;
        }

        dev['name']['motion'] = move;
    }
});

Какой код более оптимальный?

Добрый день
Второй вариант менее нагружает систему, так как он обновляет массив значений только при изменении одного из датчиков и проверяет только сохраненные значения, а не запрашивает их у dev каждый раз.

По факту вас конечно сказали правильно, сомнений нет. Но есть несколько аспектов:

  1. Нагрузка, создаваемая первым вариантом ничтожна. Если конечно в системе не тысячи датчиков, а помимо правил ещё не работает много сторонних приложений, а контроллер не 6, ну может 7 версии, ибо самый мощный всё же 8.
  2. Во всех случаях вам достаточно проверять newValue. Можно в нагрузку использовать devName, cellName, чтобы точно знать какой из устройств сработал, и даже какая ячейка. Поэтому если вас интересует вопрос под конкретную задачу, то всё можно сделать на порядок проще. Если для общего развития, то уже всё ответили.

У меня около 100 узлов/переменных опрашиваются циклически через dev в бесконечном цикле, около половины ресурсов на это съедается, но удобство/функциональность и простота кода пока перевешивает, да и сбоев пока не замечено.

Насчет удобности полностью с вами согласен, т.к. первый вариант выходит миниатюрнее и не нужно городить сторонних переменных! Поэтому я тут и задал вопрос, вдруг у метода dev есть кучи проверок, а не просто возвращает значение из памяти. И в некоторых случаях забить на оптимизацию и писать просто в лоб как индус)))) :sweat_smile:

1 Like

Добрый день!

В случае небольшого объёма и отсутствия значительного роста метод “индуса” действительно может быть полезным.

Остались ли у вас ещё вопросы?

Конечно всё зависит от задачи. Я так понимаю дев читает из базы mqtt, поэтому это затратное. Если я много раз в одном и том же скрипте и в одном и том же вызове обращаюсь к одному узлу, то я сохраняю его в промежуточную переменную.
А так - между скриптами, между функциями, которые выполняются из разных потоков я обращаюсь к дев. Ведь разработчики не дают гарантий, что срабатывание разных функций, работающих с одной и той же переменной, не может произойти одновременно или с наложением (например, в 8 ВБ процессор многоядерный).
Единственное, я для себя сделал библиотеку “алиасов”, чтобы обращаться к узлам по индексам и функциональным методам, а не вспоминать на каком реле у меня там что записано. Когда сотня входов - это уже сказывается)

Думаю вопрос решён! Спасибо!

Ну это понятно, если в рамках одного правила, то стоит создавать внутренние локальные переменные и работать уже с ними. А можно пример с алиасами, если не трудно?))

Там всё проще. Движок wb-rules подписан на топики в mqtt брокере и всегда при их изменении получает значения оттуда, там сотни, тысячи сообщений в секунду. Полученные значения записывает в массив, откуда вы их и читаете, когда надо через dev[ ].

2 Likes

Ясно, спасибо)

В этой теме в первом сообщении третий спойлер, правда там не полный вариант. Как буду за компьютером с системой, скину файл. Он оформлен в виде модуля, а в админке редактирования правил нет доступа к кодам модулей.

GlobalVars (1).js (37,8 КБ)

Фрагменты использования из разных частей других файлов…

var GLOBAL = require("GlobalVars");
.......
defineRule({

	whenChanged: [GLOBAL.DIN.Index("LightInt1CH1"), GLOBAL.DIN.Index("LightInt2CH1"), GLOBAL.DIN.Index("LightInt3CH1")],
	then: function (newValue, devName, cellName) {

		GLOBAL.LIGHTS.OUT.Set("UpstairRooms1", GLOBAL.DIN.Get("LightInt1CH1"));

		GLOBAL.LIGHTS.OUT.Set("UpstairRooms2", GLOBAL.DIN.Get("LightInt2CH1"));

		GLOBAL.LIGHTS.OUT.Set("UpstairRooms3", GLOBAL.DIN.Get("LightInt3CH1"));

	}

});
var GLOBAL = require("GlobalVars");
............
	var RealInputPowerOn = ( // Определяем есть ли напряжение на вводе
				(GLOBAL.DIN.Get("POWER_INPUT_ON") && GLOBAL.DIN.Get("POWER_RN_ON")) ||		// QF2 (Ввод) + QF22 (Питание РН)
				(GLOBAL.DIN.Get("POWER_RN_ON") && GLOBAL.DIN.Get("POWER_QFD1_ON")) ||		// QF22 (Питание РН) + QFD1 (до инвертора)
				(GLOBAL.DIN.Get("POWER_INPUT_ON") && GLOBAL.DIN.Get("POWER_QFD1_ON")) ||	// QF2 (Ввод) + QFD1 (до инвертора)
				!1
				);

	var RealOutputPowerOn = (
				(GLOBAL.DIN.Get("POWER_QFD2_ON") && GLOBAL.DIN.Get("POWER_QFD3_ON")) ||
				(GLOBAL.DIN.Get("POWER_QFD2_ON") && GLOBAL.DIN.Get("POWER_QFD4_ON")) ||
				(GLOBAL.DIN.Get("POWER_QFD2_ON") && GLOBAL.DIN.Get("POWER_QFD5_ON")) ||
				(GLOBAL.DIN.Get("POWER_QFD3_ON") && GLOBAL.DIN.Get("POWER_QFD4_ON")) ||
				(GLOBAL.DIN.Get("POWER_QFD3_ON") && GLOBAL.DIN.Get("POWER_QFD5_ON")) ||
				(GLOBAL.DIN.Get("POWER_QFD4_ON") && GLOBAL.DIN.Get("POWER_QFD5_ON")) ||
				GLOBAL.AIN.Get("OutputUrms") > 40
				);

	if (dev["PowerControls/EmergencyOffPower"] || dev["PowerControls/AllDisable"])
		GLOBAL.FLAGS.Set("AllPowerOff", true);
	else
		GLOBAL.FLAGS.Set("AllPowerOff", false);
	if (TIMERS.Is10S) {

		// Контроль датчиков температуры

		GLOBAL.DS18B20.List().forEach(function(name){

			ALARMS.WorkOnceEchoAlarm(GLOBAL.DS18B20.Error(name), "DS18B20_" + name, 12);

		});

		// Контроль устройств

		GLOBAL.Devices.List().forEach(function(name){

			ALARMS.WorkOnceEchoAlarm(GLOBAL.Devices.Error(name), "Error " + name, 6);

		});

	}

Не дает скачать файл))

Т.е. метод дэв просто возвращает значение из массива в момент вызова и не более того? Как обратиться к обычной локальной переменной например?

/*
В данном файле описаны глоьбальные переменные всех скриптов и методы доступа к ним
 */

var DefinedVersion = "1.4"; // При редактировании этих переменных необходимо менять версию, чтобы переопределять глобальные пемеремные

if (module.static.DATA === undefined || module.static.DATA.version != DefinedVersion) {

	module.static.DATA = {

		"version" : DefinedVersion, // Версия файла
		"AllPowerOff" : false, // Полное отключение всех систем и питаний по аварии/пожару
		"NoInputPower" : false, // Нет входного питания потребителей (без детализации причины)
		"MainPowerOn" : false, // Включена сеть в доме (независимо от наличия питания на вводе)
		"BSMainPowerOff" : false, // Флаг перехода на аварийное питание и обратно
		"ONWaterPower" : false, // Включить питание ПЧ водоснабжения
		"OFFWaterPower" : false, // Отключить питание ПЧ водоснабжения
		"MainPowerOnRuleId" : 0, // Объект правила управления мастер-выключателем
		"MainWaterRuleId" : 0, // Объект правила управления водоснабжения
		"DINLastStates" : {}, // Состояния входов предыдущие (для логирования)

	};

}

exports.CONFIG = readConfig("/etc/ControlPanelSystemConfig.conf");

// Описываем дискретные входы
var DINChannelsNames = {

	// WB-DIO модуль 1 - 14 входов
	"ButtonOff" 				: "wb-gpio/EXT5_IN1", // Кнопка "Отключение" //--
	"ButtonReset" 				: "wb-gpio/EXT5_IN2", // Кнопка "Сброс" //--
	"Rezerv1_3" 				: "wb-gpio/EXT5_IN3", // 
	"Rezerv1_4" 				: "wb-gpio/EXT5_IN4", // 
	"Power12VOK" 				: "wb-gpio/EXT5_IN5", // Питание 12 В в норме
	"QFAKB48VOFF" 				: "wb-gpio/EXT5_IN6", // Автомат АКБ 48 В отключен
	"QFPV120VOFF" 				: "wb-gpio/EXT5_IN7", // Автомат СБ 120 В отключен
	"PowerGenOK" 				: "wb-gpio/EXT5_IN8", // Напряжение генератора в норме
	"HeatingLight3" 			: "wb-gpio/EXT5_IN9", // Свет погреба 3
	"Heating3" 					: "wb-gpio/EXT5_IN10", // Обогрев погреба 3
	"Heating2" 					: "wb-gpio/EXT5_IN11", // Обогрев комнаты 2
	"Heating1" 					: "wb-gpio/EXT5_IN12", // Обогрев кухни 1
	"Rezerv1_13" 				: "wb-gpio/EXT5_IN13", // 
	"ButtonMain" 				: "wb-gpio/EXT5_IN14", // Мастер-выключатель

	// WB-DIO модуль 2 - 14 входов
	"ManualModeOn" 				: "wb-gpio/EXT6_IN1", // Ручное управление включено
	"InvertorSignalOk"			: "wb-gpio/EXT6_IN2", // Батарея инвертора не разряжена
	"Rezerv2_3" 				: "wb-gpio/EXT6_IN3", // 
	"Rezerv2_4" 				: "wb-gpio/EXT6_IN4", // 
	"LightInt3CH1" 				: "wb-gpio/EXT6_IN5", // Свет 3 чердак Ч1
	"LightInt2CH1" 				: "wb-gpio/EXT6_IN6", // Свет 2 чердак Ч1
	"LightInt1CH1" 				: "wb-gpio/EXT6_IN7", // Свет 1 чердак Ч1
	"SlivVody"	 				: "wb-gpio/EXT6_IN8", // Слив воды
	"MainWater" 				: "wb-gpio/EXT6_IN9", // Вода в доме
	"Rezerv2_10" 				: "wb-gpio/EXT6_IN10", // 
	"MoveSensor1" 				: "wb-gpio/EXT6_IN11", // Датчик движения 1
	"MoveSensor2" 				: "wb-gpio/EXT6_IN12", // Датчик движения 2
	"MoveSensor3" 				: "wb-gpio/EXT6_IN13", // Датчик движения 3 //--
	"QFVVInputPowerOn" 			: "wb-gpio/EXT6_IN14", // Вводной выключатель ЩВ включен

	// WB-DIO модуль 3 - 14 входов
	"POWER_INPUT_ON"			: "wb-gpio/EXT7_IN1", // QF2 (Ввод)
	"POWER_RN_ON" 				: "wb-gpio/EXT7_IN2", // QF22 (Питание РН)
	"POWER_INPUT_RN_OK"			: "wb-gpio/EXT7_IN3", // U в норме (сигнал с РН)
	"POWER_QFD1_ON" 			: "wb-gpio/EXT7_IN4", // QFD1 (до инвертора)
	"POWER_QFD2_ON" 			: "wb-gpio/EXT7_IN5", // QFD2 (после инвертора)
	"POWER_QFD3_ON" 			: "wb-gpio/EXT7_IN6", // QFD3 (после инвертора)
	"POWER_QFD4_ON" 			: "wb-gpio/EXT7_IN7", // QFD4 (после инвертора)
	"POWER_QFD5_ON" 			: "wb-gpio/EXT7_IN8", // QFD5 (Питание автоматики)
	"Power12VVideoSystemOK"		: "wb-gpio/EXT7_IN9", // Питание ВН 12 В в норме
	"Power24VOK" 				: "wb-gpio/EXT7_IN10", // Питание 24 В в норме
	"AKB24VError" 				: "wb-gpio/EXT7_IN11", // Авария АКБ 24 В
	"AKB24VDischarged" 			: "wb-gpio/EXT7_IN12", // Разряжена АКБ 24 В
	"UZIP_OK" 					: "wb-gpio/EXT7_IN13", // УЗИП ввода исправен
	"QFSCHVUInputPowerOn"		: "wb-gpio/EXT7_IN14", // Автомат ввода ЩВУ QF2 включен

	// WB-DIO модуль 4 - 14 входов
	"Light13" 					: "wb-gpio/EXT8_IN1", // Освещение 3
	"Light12" 					: "wb-gpio/EXT8_IN2", // Освещение 2
	"Light46" 					: "wb-gpio/EXT8_IN3", // Освещение 4
	"Light56" 					: "wb-gpio/EXT8_IN4", // Освещение 5
	"Light11" 					: "wb-gpio/EXT8_IN5", // Освещение 11
	"Light79" 					: "wb-gpio/EXT8_IN6", // Освещение 7
	"Light810" 					: "wb-gpio/EXT8_IN7", // Освещение 8
	"Rezerv4_8" 				: "wb-gpio/EXT8_IN8", // 
	"Rezerv4_9" 				: "wb-gpio/EXT8_IN9", // 
	"Rezerv4_10" 				: "wb-gpio/EXT8_IN10", // 
	"Rezerv4_11" 				: "wb-gpio/EXT8_IN11", // 
	"Rezerv4_12" 				: "wb-gpio/EXT8_IN12", // 
	"Rezerv4_13" 				: "wb-gpio/EXT8_IN13", // 
	"EmergencyFanON" 			: "wb-gpio/EXT8_IN14", // Аварийный вентилятор включен

	// Модуль WB-MAO4 221
	"MAO4_SCHVUUpDoorOpen" 		: "wb-mao4_221/Input 1", // Дверь верхняя ЩВУ открыта
	"MAO4_SCHVUDownDoorOpen" 	: "wb-mao4_221/Input 2", // Дверь нижняя ЩВУ открыта
	"MAO4_Input3" 				: "wb-mao4_221/Input 3", // 

	/*	Модуль внешних входов - выходов */

	// WB-DIO модуль 1 - 14 входов - B1.4 ЩВС
	"WaterWorkButton"			: "wb-mio-gpio_183:3/IN1", // Работа насоса (пульт в П1)
	"WaterEmergencyNo"			: "wb-mio-gpio_183:3/IN2", // Экстр. откл. (пульт в П1) - НЗ контакт
	"WaterLeakageNo"			: "wb-mio-gpio_183:3/IN3", // Протечка в П1 - НЗ контакт
	"WaterOnKran"	 			: "wb-mio-gpio_183:3/IN4", // Вода 'Кран'
	"LightP1" 					: "wb-mio-gpio_183:3/IN5", // Освещение П1
	"WaterOnSocket"				: "wb-mio-gpio_183:3/IN6", // Нагрузка рез. П1
	"WaterOnBak" 				: "wb-mio-gpio_183:3/IN7", // Заполнить бак
	"WaterOnRuchBak" 			: "wb-mio-gpio_183:3/IN8", // Вода к баку
	"Light810_1" 				: "wb-mio-gpio_183:3/IN9", // Освещение 8 (вторая кнопка)
	"WaterOnPoliv" 				: "wb-mio-gpio_183:3/IN10", // Полив ручной
	"WaterFlowControl"			: "wb-mio-gpio_183:3/IN11", // Датчик протока
	"WaterAutoPolivEnable"		: "wb-mio-gpio_183:3/IN12", // Полив автомат
	"WaterAutoPolivCmd" 		: "wb-mio-gpio_183:3/IN13", // Выполнить полив
	"WaterCoverOpen" 			: "wb-mio-gpio_183:3/IN14", // Открыта крышка погреба

	// WB-DIO модуль 2 - 14 входов - B1.5 ЩВС
	"WaterOnRuchPoliv1"			: "wb-mio-gpio_183:4/IN1", // Клапан п. 1
	"WaterOnRuchPoliv2" 		: "wb-mio-gpio_183:4/IN2", // Клапан п. 2
	"WaterOnRuchPoliv3" 		: "wb-mio-gpio_183:4/IN3", // Клапан п. 3
	"WaterBakNePolon"			: "wb-mio-gpio_183:4/IN4", // Бак ВУ
	"WaterOnBanya"				: "wb-mio-gpio_183:4/IN5", // Вода 'Баня'
	"BanyaLight"				: "wb-mio-gpio_183:4/IN6", // Свет в бане
	"Ring" 						: "wb-mio-gpio_183:4/IN7", // Звонок
	"RezervB1_5_I8" 			: "wb-mio-gpio_183:4/IN8", // Резерв B1_5_I8
	"RezervB1_5_I9"				: "wb-mio-gpio_183:4/IN9", // Резерв B1_5_I9
	"RezervB1_5_I10"			: "wb-mio-gpio_183:4/IN10", // Резерв B1_5_I10
	"RezervB1_5_I11" 			: "wb-mio-gpio_183:4/IN11", // Резерв B1_5_I11
	"WaterSCHVSPowerK1" 		: "wb-mio-gpio_183:4/IN12", // Наличие питания после K1
	"WaterModeSwitch"			: "wb-mio-gpio_183:4/IN13", // Режим работы в/с
	"WaterButtonReset" 			: "wb-mio-gpio_183:4/IN14", // Кнопка "Сброс" неисправностей водоснабжения

};

// Описываем функции дискретных входов
exports.DIN = {

	"Index" : function(name) {
		return DINChannelsNames[name];
	},
	"Get" : function(name, nolog) {

		var State = dev[exports.DIN.Index(name)] ? true : false;

		if (!nolog) {

			if (module.static.DATA.DINLastStates[name]) {

				if (module.static.DATA.DINLastStates[name]["State"] != State)
					log("Изменён вход DIN \"" + name + "\": " + State);

				module.static.DATA.DINLastStates[name]["State"] = State;

			} else module.static.DATA.DINLastStates[name] = {"State" : State};

		}

		return State;
	},

};

// Описываем дискретные выходы
var DOUTChannelsNames = {

	// WB-DIO модуль 1 - 8 выходов высоковольтных раздельных мех. реле
	"InputPower" 				: "wb-gpio/EXT1_R3A1", // Контактор ввода (РН)
	"SCHVULight" 				: "wb-gpio/EXT1_R3A2", // Освещение ЩВУ
	"Battery48VOFF" 			: "wb-gpio/EXT1_R3A3", // Аварийное отключение АКБ 48 В
	"PV120VOFF" 				: "wb-gpio/EXT1_R3A4", // Аварийное отключение СБ 120 В
	"HeatingFan" 				: "wb-gpio/EXT1_R3A5", // Циркуляционный вентилятор обогрева
	"WaterPower" 				: "wb-gpio/EXT1_R3A6", // Контактор ПЧ
	"EmergencyFan"				: "wb-gpio/EXT1_R3A7", // Аварийный вентилятор
	"MainFan" 					: "wb-gpio/EXT1_R3A8", // Основной вентилятор

	// WB-DIO модуль 2 - 16 выходов слаботочных мех. реле
	"GenPower" 					: "wb-gpio/EXT2_K1", // Контактор генератора
	"MainPower" 				: "wb-gpio/EXT2_K2", // Контактор сети дома
	"BanyaPower" 				: "wb-gpio/EXT2_K3", // Контактор сети бани
	"SystemPower" 				: "wb-gpio/EXT2_K4", // Переключатель питания автоматики
	"Battery24VOff"				: "wb-gpio/EXT2_K5", // Отключение АКБ 24 В
	"Heating4" 					: "wb-gpio/EXT2_K6", // Уличный душ //--
	"VentilControl1" 			: "wb-gpio/EXT2_K7", // Вентиляция 2 //--
	"VentilControl2" 			: "wb-gpio/EXT2_K8", // Вентиляция 1 //--
	"Rezerv2_9" 				: "wb-gpio/EXT2_K9", // 
	"Rezerv2_10" 				: "wb-gpio/EXT2_K10", // 
	"BatteryGen" 				: "wb-gpio/EXT2_K11", // Заряд АКБ ген. //--
	"NeOtklDest" 				: "wb-gpio/EXT2_K12", // Не отключаемые потребители
	"Heating1" 					: "wb-gpio/EXT2_K13", // Обогреватель 1
	"Heating2" 					: "wb-gpio/EXT2_K14", // Обогреватель 2
	"VideoSystem" 				: "wb-gpio/EXT2_K15", // Система видеонаблюдения
	"EmergencyGas" 				: "wb-gpio/EXT2_K16", // Газовый клапан //--

	// WB-DIO модуль 3 - 16 выходов слаботочных мех. реле
	"HeatingInd1" 				: "wb-gpio/EXT3_K1", // Индикатор "Обогрев 1"
	"HeatingInd2" 				: "wb-gpio/EXT3_K2", // Индикатор "Обогрев 2"
	"Rezerv3_3" 				: "wb-gpio/EXT3_K3", // 
	"Rezerv3_4" 				: "wb-gpio/EXT3_K4", // 
	"Rezerv3_5" 				: "wb-gpio/EXT3_K5", // 
	"Rezerv3_6" 				: "wb-gpio/EXT3_K6", // 
	"Rezerv3_7" 				: "wb-gpio/EXT3_K7", // 
	"Rezerv3_8" 				: "wb-gpio/EXT3_K8", // 

	// WB-DIO модуль 4 - 8 выходов слаботочных оптронов
	"SCHVUHeater1" 				: "wb-gpio/EXT4_K1", // Обогреватель 1 ЩВУ
	"SCHVUHeater2" 				: "wb-gpio/EXT4_K2", // Обогреватель 2 ЩВУ
	"Ring" 						: "wb-gpio/EXT4_K3", // Звонок
	"ModeInd" 					: "wb-gpio/EXT4_K4", // Индикатор "Режим"
	"LightInd" 					: "wb-gpio/EXT4_K5", // Индикатор "Подсветка пультов"
	"Rezerv4_6" 				: "wb-gpio/EXT4_K6", // 
	"WorkInd" 					: "wb-gpio/EXT4_K7", // Индикатор "Работа"
	"AlarmInd" 					: "wb-gpio/EXT4_K8", // Индикатор "Неисправность"

	// Системные выходы
	"5V_OUT"					: "wb-gpio/5V_OUT", // Питание 5 В для датчиков

	/*	Модуль внешних входов - выходов */

	// WB-DIO модуль 1 - 16 выходов слаботочных мех. реле - B1.2 ЩВС
	"WaterClapanPoliva1"		: "wb-mio-gpio_183:1/K1", // Клапан пол. 1
	"WaterClapanPoliva2"		: "wb-mio-gpio_183:1/K2", // Клапан пол. 2
	"WaterClapanPoliva3"		: "wb-mio-gpio_183:1/K3", // Клапан пол. 3
	"WaterClapanNS1Kran"		: "wb-mio-gpio_183:1/K4", // Клапан в/с 1 - Кран
	"WaterClapanNS2Banya" 		: "wb-mio-gpio_183:1/K5", // Клапан в/с 2 - Баня
	"WaterClapanNS3Bak"			: "wb-mio-gpio_183:1/K6", // Клапан в/с 3 - Бак
	"WaterClapanSliva" 			: "wb-mio-gpio_183:1/K7", // Клапан слива
	"Rezerv_B1_2_K8" 			: "wb-mio-gpio_183:1/K8", // Резерв B1_2_K8
	"WaterVentil1" 				: "wb-mio-gpio_183:1/K9", // Вентилятор с. 1
	"WaterVentil2"	 			: "wb-mio-gpio_183:1/K10", // Вентилятор с. 2
	"Rezerv_B1_2_K11" 			: "wb-mio-gpio_183:1/K11", // Резерв B1_2_K11
	"Rezerv_B1_2_K12" 			: "wb-mio-gpio_183:1/K12", // Резерв B1_2_K12
	"Rezerv_B1_2_K13" 			: "wb-mio-gpio_183:1/K13", // Резерв B1_2_K13
	"Rezerv_B1_2_K14" 			: "wb-mio-gpio_183:1/K14", // Резерв B1_2_K14
	"WaterWorkNasos1" 			: "wb-mio-gpio_183:1/K15", // Индикатор насоса 1
	"WaterWorkNasos2" 			: "wb-mio-gpio_183:1/K16", // Индикатор насоса 2

	// WB-DIO модуль 2 - 8 выходов слаботочных оптронов - B1.3 ЩВС

	"WaterSCHVSPowerK1"			: "wb-mio-gpio_183:2/K1", // Сеть клапанов
	"Rezerv_B1_3_K2"			: "wb-mio-gpio_183:2/K2", // Резерв
	"Heating5"					: "wb-mio-gpio_183:2/K3", // Освещение П1
	"WaterSocket"	 			: "wb-mio-gpio_183:2/K4", // Нагрузка рез.
	"WaterPDatPoliv" 			: "wb-mio-gpio_183:2/K5", // Пит. дат. полива
	"WaterPDatMain"				: "wb-mio-gpio_183:2/K6", // Пит. дат. в/с
	"WaterWorkInd" 				: "wb-mio-gpio_183:2/K7", // Индикатор "Работа В/С"
	"WaterAlarmInd" 			: "wb-mio-gpio_183:2/K8", // Индикатор "Неисправность В/С"

};

// Описываем функции дискретных выходов
exports.DOUT = {

	"Index" : function(name) {
		return DOUTChannelsNames[name];
	},
	"Get" : function(name) {
		return dev[exports.DOUT.Index(name)] ? true : false;
	},
	"Set" : function(name, State, nolog) {
		State = State ? true : false;
		if (dev[exports.DOUT.Index(name)] == State) return;
		dev[exports.DOUT.Index(name)] = State ? true : false;
		if (!nolog) log("Установлен в " + (State ? "1" : "0") + " \"" + name + "\": " + exports.DOUT.Index(name));
		return State;
	},
	"On" : function(name, nolog) {
		if (dev[exports.DOUT.Index(name)] == true) return;
		dev[exports.DOUT.Index(name)] = true;
		if (!nolog) log("Включен \"" + name + "\": " + exports.DOUT.Index(name));
	},
	"Off" : function(name, nolog) {
		if (dev[exports.DOUT.Index(name)] == false) return;
		dev[exports.DOUT.Index(name)] = false;
		if (!nolog) log("Отключен \"" + name + "\": " + exports.DOUT.Index(name));
	},
	"Toggle" : function(name, nolog) {
		var State = dev[exports.DOUT.Index(name)]  ? false : true;
		dev[exports.DOUT.Index(name)] = State;
		if (!nolog) log("Переключен \"" + name + "\" в " + (State ? "1" : "0") + ": " + exports.DOUT.Index(name));
		return State;
	}

};

// Описываем дискретные входы освещения
var LightINChannelsNames = {

	// Модуль WB-MR6C 16
	"ModLight1_Input0"			: "wb-mr6c_16/Input 0",
	"Room1_1"					: "wb-mr6c_16/Input 1",
	"Room1_2"					: "wb-mr6c_16/Input 2",
	"Room1_3"					: "wb-mr6c_16/Input 3",
	"Room1_4"					: "wb-mr6c_16/Input 4",
	"Room1_5"					: "wb-mr6c_16/Input 5",
	"Room1_6"					: "wb-mr6c_16/Input 6",

	// Модуль WB-MR6C 63
	"ModLight2_Input0"			: "wb-mr6c_63/Input 0",
	"Kitchen1_1" 				: "wb-mr6c_63/Input 1",
	"Kitchen1_2" 				: "wb-mr6c_63/Input 2",
	"Kitchen1_3" 				: "wb-mr6c_63/Input 3",
	"Kitchen1_4" 				: "wb-mr6c_63/Input 4",
	"Room2_1" 					: "wb-mr6c_63/Input 5",
	"Room2_2" 					: "wb-mr6c_63/Input 6",

	// Модуль WB-MR6C 83
	"ModLight3_Input0"			: "wb-mr6c_83/Input 0",
	"Room2_3" 					: "wb-mr6c_83/Input 1",
	"Hall1_1" 					: "wb-mr6c_83/Input 2",
	"Hall1_2" 					: "wb-mr6c_83/Input 3",
	"Kladovka" 					: "wb-mr6c_83/Input 4",
	"WC" 						: "wb-mr6c_83/Input 5",
	"Room2_4" 					: "wb-mr6c_83/Input 6",

	// Модуль WB-MR6C 84
	"ModLight4_Input0"			: "wb-mr6c_84/Input 0",
	"Hall2_1" 					: "wb-mr6c_84/Input 1",
	"Hall2_2" 					: "wb-mr6c_84/Input 2",
	"Hall2_3" 					: "wb-mr6c_84/Input 3",
	"Krilco_1" 					: "wb-mr6c_84/Input 4",
	"Krilco_2" 					: "wb-mr6c_84/Input 5",
	"Saray1" 					: "wb-mr6c_84/Input 6",

	// Модуль WB-MR6C 117
	"ModLight5_Input0"			: "wb-mr6c_117/Input 0",
	"Saray2" 					: "wb-mr6c_117/Input 1",
	"UpstairSaray1" 			: "wb-mr6c_117/Input 2",
	"Saray3" 					: "wb-mr6c_117/Input 3",
	"Pogreb2" 					: "wb-mr6c_117/Input 4",
	"Pogreb21" 					: "wb-mr6c_117/Input 5",
	"Out_5_6" 					: "wb-mr6c_117/Input 6",

	// WB-LED 130
	"ModLed1Input1" 			: "wb-led_130/Input 1", // Вход 1
	"ModLed1Input2" 			: "wb-led_130/Input 2", // Вход 2
	"ModLed1Input3" 			: "wb-led_130/Input 3", // Вход 3
	"ModLed1Input4" 			: "wb-led_130/Input 4", // Вход 4
	"ModLed1Overcurrent" 		: "wb-led_130/Overcurrent", // Перегрузка по току

	// WB-LED 144
	"ModLed2Input1" 			: "wb-led_144/Input 1", // Вход 1
	"ModLed2Input2" 			: "wb-led_144/Input 2", // Вход 2
	"ModLed2Input3" 			: "wb-led_144/Input 3", // Вход 3
	"ModLed2Input4" 			: "wb-led_144/Input 4", // Вход 4
	"ModLed2Overcurrent" 		: "wb-led_144/Overcurrent", // Перегрузка по току

};

// Описываем релейныу дискретные выходы освещения
var LightOUTChannelsNames = {

	// WB-MR6C 16
	"Room1_1" 					: "wb-mr6c_16/K1", // Выход 1.1
	"Room1_2" 					: "wb-mr6c_16/K2", // Выход 1.2
	"Room1_3" 					: "wb-mr6c_16/K3", // Выход 1.3
	"Room1_4" 					: "wb-mr6c_16/K4", // Выход 1.4
	"Room1_5" 					: "wb-mr6c_16/K5", // Выход 1.5
	"Room1_6" 					: "wb-mr6c_16/K6", // Выход 1.6

	// WB-MR6C 63
	"Kitchen1_1" 				: "wb-mr6c_63/K1", // Выход 2.1
	"Kitchen1_2" 				: "wb-mr6c_63/K2", // Выход 2.2
	"Kitchen1_3" 				: "wb-mr6c_63/K3", // Выход 2.3
	"Kitchen1_4" 				: "wb-mr6c_63/K4", // Выход 2.4
	"Room2_1" 					: "wb-mr6c_63/K5", // Выход 2.5
	"Room2_2" 					: "wb-mr6c_63/K6", // Выход 2.6

	// WB-MR6C 83
	"Room2_3" 					: "wb-mr6c_83/K1", // Выход 3.1
	"Hall1_1" 					: "wb-mr6c_83/K2", // Выход 3.2
	"Hall1_2" 					: "wb-mr6c_83/K3", // Выход 3.3
	"Kladovka" 					: "wb-mr6c_83/K4", // Выход 3.4
	"WC" 						: "wb-mr6c_83/K5", // Выход 3.5
	"Room2_4" 					: "wb-mr6c_83/K6", // Выход 3.6

	// WB-MR6C 84
	"Hall2_1" 					: "wb-mr6c_84/K1", // Выход 4.1
	"Hall2_2" 					: "wb-mr6c_84/K2", // Выход 4.2
	"Hall2_3" 					: "wb-mr6c_84/K3", // Выход 4.3
	"Krilco_1" 					: "wb-mr6c_84/K4", // Выход 4.4
	"Krilco_2" 					: "wb-mr6c_84/K5", // Выход 4.5
	"Saray1" 					: "wb-mr6c_84/K6", // Выход 4.6

	// WB-MR6C 117
	"Saray2" 					: "wb-mr6c_117/K1", // Выход 5.1
	"UpstairSaray1" 			: "wb-mr6c_117/K2", // Выход 5.2
	"Saray3" 					: "wb-mr6c_117/K3", // Выход 5.3
	"Pogreb2" 					: "wb-mr6c_117/K4", // Выход 5.4
	"Pogreb21" 					: "wb-mr6c_117/K5", // Выход 5.5 - резерв
	"Out_5_6" 					: "wb-mr6c_117/K6", // Выход 5.6

	// WB-MR6CU 131
	"Outdoor1" 					: "wb-mr6cu_131/K1", // Выход 6.1 - Крыльцо у входа, малый свет (1.1)
	"Outdoor2" 					: "wb-mr6cu_131/K2", // Выход 6.2 - Ворота и проезд, большой свет (2)
	"Outdoor3" 					: "wb-mr6cu_131/K3", // Выход 6.3 - Крыльцо у входа, большой свет (3)
	"Outdoor4" 					: "wb-mr6cu_131/K4", // Выход 6.4 - Калитка и проход у дома (4)
	"Outdoor5" 					: "wb-mr6cu_131/K5", // Выход 6.5 - Дальний проход и торец дома (5)
	"Outdoor6" 					: "wb-mr6cu_131/K6", // Выход 6.6 - Освещение дороги с фасада (6)

	// WB-MR6CU 239
	"Outdoor7" 					: "wb-mr6cu_239/K1", // Выход 7.1 - Сад за домом, малый свет (7)
	"Outdoor8" 					: "wb-mr6cu_239/K2", // Выход 7.2 - Проход к огороду слева (8)
	"Outdoor9" 					: "wb-mr6cu_239/K3", // Выход 7.3 - Сад за домом, большой свет (9)
	"Outdoor10"					: "wb-mr6cu_239/K4", // Выход 7.4 - Освещение огорода и теплиц (10)
	"UpstairRooms1"				: "wb-mr6cu_239/K5", // Выход 7.5
	"UpstairRooms2"				: "wb-mr6cu_239/K6", // Выход 7.6

	// WB-MR6CU 108
	"Outdoor1_1"				: "wb-mr6cu_108/K1", // Выход 8.1
	"UpstairRooms3"				: "wb-mr6cu_108/K2", // Выход 8.2
	"Heating3" 					: "wb-mr6cu_108/K3", // Выход 8.3 - Погреб в коридоре КР2
	"Out_8_4" 					: "wb-mr6cu_108/K4", // Выход 8.4
	"Out_8_5" 					: "wb-mr6cu_108/K5", // Выход 8.5
	"Out_8_6" 					: "wb-mr6cu_108/K6", // Выход 8.6

	// WB-LED 130
	"Out13_ON" 					: "wb-led_130/RGB Strip", // Выход 1-3
	"Kitchen1_12_ON" 			: "wb-led_130/Channel 4", // Выход 4

	// WB-LED 144
	"Hall2_11_ON" 				: "wb-led_144/RGB Strip", // Выход 1-3
	"Kitchen1_11_ON" 			: "wb-led_144/Channel 4", // Выход 4

};

// Описываем релейныу дискретные выходы освещения
var LightOUTOptionsChannelsNames = {

	// WB-LED 130
	"Out13_StripHue" 			: "wb-led_130/RGB Strip Hue", // Выход 1-3 Оттенок RGB ленты (H)
	"Out13_StripSaturation" 	: "wb-led_130/RGB Strip Saturation", // Выход 1-3 Насыщенность цвета RGB ленты (S)
	"Out13_StripBrightness"		: "wb-led_130/RGB Strip Brightness", // Выход 1-3 Яркость RGB ленты (V)
	"Kitchen1_12_ON" 			: "wb-led_130/Channel 4", // Выход 4
	"Kitchen1_12_Brightness" 	: "wb-led_130/Channel 4 Brightness", // Выход 4 яркость
	"ModLed1OvercurrentOff"		: "wb-led_130/Overcurrent", // Перегрузка по току

	// WB-LED 144
	"Hall2_11_StripHue" 		: "wb-led_144/RGB Strip Hue", // Выход 1-3 Оттенок RGB ленты (H)
	"Hall2_11_StripSaturation" 	: "wb-led_144/RGB Strip Saturation", // Выход 1-3 Насыщенность цвета RGB ленты (S)
	"Hall2_11_StripBrightness"	: "wb-led_144/RGB Strip Brightness", // Выход 1-3 Яркость RGB ленты (V)
	"Kitchen1_11_ON" 			: "wb-led_144/Channel 4", // Выход 4
	"Kitchen1_11_Brightness" 	: "wb-led_144/Channel 4 Brightness", // Выход 4 яркость
	"ModLed2OvercurrentOff"		: "wb-led_144/Overcurrent", // Перегрузка по току

};

// Описываем функции дискретных выходов
exports.LIGHTS = {

	"IN" : {

		"Index" : function(name) {
			return LightINChannelsNames[name];
		},
		"Get" : function(name) {
			return dev[exports.LIGHTS.IN.Index(name)] ? true : false;
		},

	},

	"OUT" : {

		"Index" : function(name) {
			return LightOUTChannelsNames[name];
		},
		"Get" : function(name) {
			return dev[exports.LIGHTS.OUT.Index(name)] ? true : false;
		},
		"Set" : function(name, State, nolog) {
			State = State ? true : false;
			if (dev[exports.LIGHTS.OUT.Index(name)] == State) return;
			dev[exports.LIGHTS.OUT.Index(name)] = State ? true : false;
			if (!nolog) log("Установлен в " + (State ? "1" : "0") + " \"" + name + "\": " + exports.LIGHTS.OUT.Index(name));
			return State;
		},
		"On" : function(name, nolog) {
			if (dev[exports.LIGHTS.OUT.Index(name)] == true) return;
			dev[exports.LIGHTS.OUT.Index(name)] = true;
			if (!nolog) log("Включен \"" + name + "\": " + exports.LIGHTS.OUT.Index(name));
		},
		"Off" : function(name, nolog) {
			if (dev[exports.LIGHTS.OUT.Index(name)] == false) return;
			dev[exports.LIGHTS.OUT.Index(name)] = false;
			if (!nolog) log("Отключен \"" + name + "\": " + exports.LIGHTS.OUT.Index(name));
		},
		"Toggle" : function(name, nolog) {
			var State = dev[exports.LIGHTS.OUT.Index(name)]  ? false : true;
			dev[exports.LIGHTS.OUT.Index(name)] = State;
			if (!nolog) log("Переключен \"" + name + "\" в " + (State ? "1" : "0") + ": " + exports.LIGHTS.OUT.Index(name));
			return State;
		},
		"List" : function() {
			return Object.keys(LightOUTChannelsNames);
		},
		"GetValue" : function(name) {
			return dev[LightOUTOptionsChannelsNames[name]];
		},
		"SetValue" : function(name, Value, nolog) {
			if (dev[LightOUTOptionsChannelsNames[name]] == Value) return;
			dev[LightOUTOptionsChannelsNames[name]] = Value;
			if (!nolog) log("Установлен в " + Value + " \"" + name + "\": " + LightOUTOptionsChannelsNames[name]);
			return Value;
		},

	},

};

// Инвертор/ИБП
var InvertorChannelsNames = {

	"upsMode"					: "snmp_192.168.184.20_public/upsMode", // Режим
	"upsBatEstChargeRemaining"	: "snmp_192.168.184.20_public/upsBatEstChargeRemaining", // Заряд АКБ
	"upsBatPBatVoltage" 		: "snmp_192.168.184.20_public/upsBatPBatVoltage", // Напряжение АКБ
	"upsBatPBatChargCurrent" 	: "snmp_192.168.184.20_public/upsBatPBatChargCurrent", // Ток заряда
	"upsBatPBatDischargCurrent" : "snmp_192.168.184.20_public/upsBatPBatDischargCurrent", // Ток разряда
	"ACinputvoltage" 			: "snmp_192.168.184.20_public/AC input voltage", // Напряжение на входе
	"Outputloadpercent" 		: "snmp_192.168.184.20_public/Output load percent", // Нагрузка на выходе
	"ACoutputactivepower" 		: "snmp_192.168.184.20_public/AC output active power", // Активная мощность
	"ACouputapparentpower"	 	: "snmp_192.168.184.20_public/AC ouput apparent power", // Полная мощность
	"ACoutputvoltage" 			: "snmp_192.168.184.20_public/AC output voltage", // Напряжение на выходе
	"MaxMesTemperature" 		: "snmp_192.168.184.20_public/MaxMesTemperature", // Температура
	"OutputSourceStatus" 		: "snmp_192.168.184.20_public/OutputSourceStatus", // Статус источника выхода

};

// Описываем функции инвертора
exports.INVERTOR = {

	"Index" : function(name) {
		return InvertorChannelsNames[name];
	},
	"Get" : function(name) {
		return dev[exports.INVERTOR.Index(name)];
	},
	"Error" : function(name) {
		if (dev[exports.INVERTOR.Index(name)] === null) return 1;
		return dev[exports.INVERTOR.Index(name) + "#error"] == "r";
	},

};

// Описываем датчики температуры
var DS18B20ChannelsNames = {

	"Kitchen1" 					: "wb-w1/28-000006777942", // Кухня 1 (у входа)
	"Kitchen1_1" 				: "wb-w1/28-00000ff78dea", // Кухня 1 (у гарнитура)
	"Room1" 					: "wb-w1/28-00000ff77a1f", // Комната 1
	"Kitchen2" 					: "wb-w1/28-000006777942", // Кухня 2 //--
	"Room2" 					: "wb-w1/28-00000ff77a1f", // Комната 2 //--
	"HallKR1" 					: "wb-w1/28-021466c1acff", // Коридор между комнатами
	"SCHVUUpSection" 			: "wb-w1/28-0314665343ff", // Верхняя секция ЩВУ
	"SCHVUInvertorSection" 		: "wb-w1/28-021466c071ff", // Секция инвертора
	"SCHVUAKBSection" 			: "wb-w1/28-021466c008ff", // Секция АКБ
	"Pogreb3Up" 				: "wb-w1/28-00000ff68d1d", // Погреб с овощами (верх)
//	"Pogreb3Down" 				: "wb-w1/28-000006775ed9", // Погреб с овощами (низ)
	"Pogreb1"	 				: "wb-w1/28-00042e0683ff", // Погреб водоснабжения
	"SCHVS"	 					: "wb-w1/28-00042e0664ff", // Щит водоснабжения
//	"Gallery1"					: "wb-w1/28-00000ff68d1d", // Теплица 1 //--
//	"Gallery2"					: "wb-w1/28-000006775ed9", // Теплица 2 //--
	"Street1"					: "wb-w1/28-00000ff6d968", // Улица 1

};

// Описываем функции датчиков температур
exports.DS18B20 = {

	"Index" : function(name) {
		return DS18B20ChannelsNames[name];
	},
	"Get" : function(name) {
		return dev[exports.DS18B20.Index(name)];
	},
	"Error" : function(name) {
		if (dev[exports.DS18B20.Index(name)] === null) return 1;
		return dev[exports.DS18B20.Index(name) + "#error"] == "r";
	},
	"List" : function() {
		return Object.keys(DS18B20ChannelsNames);
	},

};

// Аналоговые входы
var AINChannelsNames = {

	// Измеритель на вводе
	"InputUrms"					: "wb-map6s_55/Urms", // Напряжение ввода
	"InputAP"					: "wb-map6s_55/P 1", // Активная мощность ввода
	"InputEnergyAP"				: "wb-map6s_55/AP energy 1", // Израсходованная энергия ввода
	"InputSP"					: "wb-map6s_55/S 1", // Полная мощность ввода
	"InputAP_QFD1"				: "wb-map6s_55/P 2", // Активная мощность QFD1 (обогрев, баня)
	"InputEnergyAP_QFD1"		: "wb-map6s_55/AP energy 2", // Израсходованная энергия ввода
	"InputSP_QFD1"				: "wb-map6s_55/S 2", // Полная мощность QFD1 (обогрев, баня)
	"WaterHeater1AP"			: "wb-map6s_55/P 3", // Активная мощность нагревателя воды 1
	"WaterHeater1AP"			: "wb-map6s_55/AP energy 3", // Израсходованная энергия нагревателя воды 1
	"WaterHeater1SP"			: "wb-map6s_55/S 3", // Полная мощность нагревателя воды 1
	"WaterHeater1Current"		: "wb-map6s_55/Irms 3", // Ток нагревателя воды 1

	// Измеритель на шинах нагрузки
	"OutputUrms"				: "wb-map6s_116/Urms", // Напряжение шин нагрузки
	"OutputAP_QFD2"				: "wb-map6s_116/P 1", // Активная мощность QFD2 (освещ., роз. кухн.)
	"OutputAP_QFD3"				: "wb-map6s_116/P 2", // Активная мощность QFD3 (розетки)
	"OutputAP_QFD4"				: "wb-map6s_116/P 3", // Активная мощность QFD4 (кондиц., ул. душ)
	"OutputAP_QFD5"				: "wb-map6s_116/P 4", // Активная мощность QFD5 (система управления)
	"OutputAP_QFD6"				: "wb-map6s_116/P 5", // Активная мощность QFD6 (водоснабжение)
	"OutputAP_CLimatControl"	: "wb-map6s_116/P 6", // Активная мощность системы климат-контроля ЩВУ

	"OutputSP_QFD2"				: "wb-map6s_116/S 1", // Полная мощность QFD2 (освещ., роз. кухн.)
	"OutputSP_QFD3"				: "wb-map6s_116/S 2", // Полная мощность QFD3 (розетки)
	"OutputSP_QFD4"				: "wb-map6s_116/S 3", // Полная мощность QFD4 (кондиц., ул. душ)
	"OutputSP_QFD5"				: "wb-map6s_116/S 4", // Полная мощность QFD5 (система управления)
	"OutputSP_QFD6"				: "wb-map6s_116/S 5", // Полная мощность QFD6 (водоснабжение)
	"OutputSP_CLimatControl"	: "wb-map6s_116/S 6", // Полная мощность системы климат-контроля ЩВУ

	"OutputEnergyAP_QFD2"		: "wb-map6s_116/AP energy 1", // Израсходованная энергия QFD2 (освещ., роз. кухн.)
	"OutputEnergyAP_QFD3"		: "wb-map6s_116/AP energy 2", // Израсходованная энергия QFD3 (розетки)
	"OutputEnergyAP_QFD4"		: "wb-map6s_116/AP energy 3", // Израсходованная энергия QFD4 (кондиц., ул. душ)
	"OutputEnergyAP_QFD5"		: "wb-map6s_116/AP energy 4", // Израсходованная энергия QFD5 (система управления)
	"OutputEnergyAP_QFD6"		: "wb-map6s_116/AP energy 5", // Израсходованная энергия QFD6 (водоснабжение)
	"OutputEnergyAP_CLimatControl": "wb-map6s_116/AP energy 6", // Ток системы климат-контроля ЩВУ

	"OutputCurrent_CLimatControl": "wb-map6s_116/Irms 6", // Израсходованная энергия системы климат-контроля ЩВУ

	// Низковольтные системы

	"MainPower27V"				: "wb-adc/Vin", // Напряжение питания 27 В
	"DatPower5V"				: "wb-adc/V5_0", // Напряжение питания датчиков 5 В

	// Датчики давления водоснабжения и полива

	"PDatPoliv_Ma"				: "wb-mai6_119/IN 1 P Current", // Датчик полива, миллиамперы
	"PDatMainIn_Ma"				: "wb-mai6_119/IN 2 P Current", // Датчик насоса, миллиамперы
	"PDatMainOut_Ma"			: "wb-mai6_119/IN 3 P Current", // Датчик гидроаккумулятора, миллиамперы

};

// Описываем функции аналоговых входов
exports.AIN = {

	"Index" : function(name) {
		return AINChannelsNames[name];
	},
	"Get" : function(name) {
		return dev[exports.AIN.Index(name)];
	},
	"Error" : function(name) {
		if (dev[exports.AIN.Index(name)] === null) return 1;
		return dev[exports.AIN.Index(name) + "#error"] == "r";
	},

};

// Аналоговые выходы
var AOUTChannelsNames = {

	"MainFanOn"					: "wb-mao4_221/Channel 1 Switch", // Канал 1 включить/отключить
	"MainFanLevel"				: "wb-mao4_221/Channel 1 Dimming Level", // Канал 1

	"HeatingFanOn"				: "wb-mao4_221/Channel 2 Switch", // Канал 1 включить/отключить
	"HeatingFanLevel"			: "wb-mao4_221/Channel 2 Dimming Level", // Канал 1

};

// Описываем функции аналоговых выходов
exports.AOUT = {

	"Index" : function(name) {
		return AOUTChannelsNames[name];
	},
	"Get" : function(name) {
		return dev[exports.AOUT.Index(name)];
	},
	"Set" : function(name, State, nolog) {
		if (dev[exports.AOUT.Index(name)] == State) return;
		dev[exports.AOUT.Index(name)] = State;
		if (!nolog) log("Задан " + State + " \"" + name + "\": " + exports.AOUT.Index(name));
	},

};

// Описываем функции флагов системы
exports.FLAGS = {

	"Get" : function(name) {
		return module.static.DATA[name];
	},
	"Set" : function(name, State) {
		module.static.DATA[name] = State;
	},

};

// Описываем устройства
var DevicesNames = {

	// Реальные устройства и их значимые регистры

	"wb-mao4_221"			: "wb-mao4_221/Serial",
	"wb-mr6c_16" 			: "wb-mr6c_16/Serial",
	"wb-mr6c_63"			: "wb-mr6c_63/Serial",
	"wb-mr6c_83"			: "wb-mr6c_83/Serial",
	"wb-mr6c_84"			: "wb-mr6c_84/Serial",
	"wb-mr6c_117"			: "wb-mr6c_117/Serial",
	"wb-mr6cu_108"			: "wb-mr6cu_108/Serial",
	"wb-mr6cu_131"			: "wb-mr6cu_131/Serial",
	"wb-mr6cu_239"			: "wb-mr6cu_239/Serial",
	"wb-led_130"			: "wb-led_130/Serial",
	"wb-led_144"			: "wb-led_144/Serial",
	"wb-map6s_55"			: "wb-map6s_55/Serial",
	"wb-map6s_116"			: "wb-map6s_116/Serial",
	"wb-mio-e_183"			: "wb-mio-gpio_183:1/K1",
	"wb-mai6_119"			: "wb-mai6_119/Serial",

	// Алиасы имён устройств для использования в ПО

	"MAI1_SHVS"			: "wb-mai6_119/Serial", // Модуль с датчиками давления в ЩВС
	"MIO1_SHVS"			: "wb-mio-gpio_183:1/K1", // Модуль с входами-выходами в ЩВС

};

// Описываем функции устройств
exports.Devices = {

	"Index" : function(name) {
		return DevicesNames[name];
	},
	"Error" : function(name) {
		var Error = dev[exports.Devices.Index(name) + "#error"];
		return !!(Error === null || Error);
	},
	"List" : function() {
		return Object.keys(DevicesNames);
	},

};

// Регистры управления ПЧ
var PCHRegistersNames = {

	"SetFrequency"				: "Заданная частота",
	"OutFrequency"				: "Выходная частота",
	"OutCurrent"				: "Выходной ток",
	"DCVoltage"					: "Напряжение на шине DC",
	"Motohours"					: "Счетчик часов эксплуатации",
	"OutVoltage"				: "Выходное напряжение",
	"ErrorCode"					: "Текущий код ошибки",
	"CMDPuskStop"				: "Команда управления",
	"CMDFrequency"				: "Задание частоты",

};

var PCHNames = {

	"MAIN"						: "INNOVERT-ISD-mini-PLUS_1/",
	"IR"						: "INNOVERT-ISD-mini-PLUS_2/",

};

// Описываем функции работы с ПЧ
exports.PCH = {

	"Index" : function(name) {
		return PCHNames[name];
	},
	"Reg" : function(name) {
		return PCHRegistersNames[name];
	},
	"Get" : function(name, reg) {
		return dev[exports.PCH.Index(name)+exports.PCH.Reg(reg)];
	},
	"Set" : function(name, reg, State, nolog) {
		dev[exports.PCH.Index(name)+exports.PCH.Reg(reg)] = State;
		if (!nolog) log("Задан " + State + " \"" + name + " " + reg + "\": " + exports.PCH.Index(name)+exports.PCH.Reg(reg));
	},
	"Error" : function(name) {
		var Error = dev[exports.PCH.Index(name) + exports.PCH.Reg("DCVoltage") + "#error"];
		return !!(Error === null || Error);
	},
	"List" : function() {
		return Object.keys(PCHNames);
	},

};

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

Добрый день!
Я вот как раз разбираюсь с wb-msw-v4 (fw 4.31.11) и заметил такую фичу: несмотря на то что в параметрах датчика указан период опроса параметра Current Motion = 500мс, при движении это все равно игнорируется и высыпается куча сообщений в топик:

mosquitto_sub -h localhost -p 1883 -v -t "/devices/wb-msw-v4_29/controls/Current Motion" | ts | ts -i %.s
0.500799 фев 03 14:59:52 /devices/wb-msw-v4_29/controls/Current Motion 8
0.501328 фев 03 14:59:52 /devices/wb-msw-v4_29/controls/Current Motion 11
0.298612 фев 03 14:59:52 /devices/wb-msw-v4_29/controls/Current Motion 31
0.050330 фев 03 14:59:52 /devices/wb-msw-v4_29/controls/Current Motion 68
0.049540 фев 03 14:59:52 /devices/wb-msw-v4_29/controls/Current Motion 94
0.049735 фев 03 14:59:52 /devices/wb-msw-v4_29/controls/Current Motion 118
0.052128 фев 03 14:59:53 /devices/wb-msw-v4_29/controls/Current Motion 120
0.501925 фев 03 14:59:53 /devices/wb-msw-v4_29/controls/Current Motion 103
0.098889 фев 03 14:59:53 /devices/wb-msw-v4_29/controls/Current Motion 146
0.011531 фев 03 14:59:53 /devices/wb-msw-v4_29/controls/Current Motion 161
0.038776 фев 03 14:59:53 /devices/wb-msw-v4_29/controls/Current Motion 175
0.352095 фев 03 14:59:54 /devices/wb-msw-v4_29/controls/Current Motion 166
0.098777 фев 03 14:59:54 /devices/wb-msw-v4_29/controls/Current Motion 227
0.009646 фев 03 14:59:54 /devices/wb-msw-v4_29/controls/Current Motion 258
0.040698 фев 03 14:59:54 /devices/wb-msw-v4_29/controls/Current Motion 317
0.050000 фев 03 14:59:54 /devices/wb-msw-v4_29/controls/Current Motion 369
0.050289 фев 03 14:59:54 /devices/wb-msw-v4_29/controls/Current Motion 399
0.250505 фев 03 14:59:54 /devices/wb-msw-v4_29/controls/Current Motion 382
0.098719 фев 03 14:59:54 /devices/wb-msw-v4_29/controls/Current Motion 365
0.101285 фев 03 14:59:54 /devices/wb-msw-v4_29/controls/Current Motion 356
0.300844 фев 03 14:59:55 /devices/wb-msw-v4_29/controls/Current Motion 342
0.200331 фев 03 14:59:55 /devices/wb-msw-v4_29/controls/Current Motion 327
0.149125 фев 03 14:59:55 /devices/wb-msw-v4_29/controls/Current Motion 312
0.100777 фев 03 14:59:55 /devices/wb-msw-v4_29/controls/Current Motion 298
0.056873 фев 03 14:59:55 /devices/wb-msw-v4_29/controls/Current Motion 290
0.043069 фев 03 14:59:55 /devices/wb-msw-v4_29/controls/Current Motion 286
0.100969 фев 03 14:59:55 /devices/wb-msw-v4_29/controls/Current Motion 277
0.199143 фев 03 14:59:55 /devices/wb-msw-v4_29/controls/Current Motion 263
0.156310 фев 03 14:59:56 /devices/wb-msw-v4_29/controls/Current Motion 250
0.045313 фев 03 14:59:56 /devices/wb-msw-v4_29/controls/Current Motion 246
0.100321 фев 03 14:59:56 /devices/wb-msw-v4_29/controls/Current Motion 235
0.150108 фев 03 14:59:56 /devices/wb-msw-v4_29/controls/Current Motion 223
0.205594 фев 03 14:59:56 /devices/wb-msw-v4_29/controls/Current Motion 217
0.145691 фев 03 14:59:56 /devices/wb-msw-v4_29/controls/Current Motion 210
0.250555 фев 03 14:59:56 /devices/wb-msw-v4_29/controls/Current Motion 225
0.102643 фев 03 14:59:57 /devices/wb-msw-v4_29/controls/Current Motion 223
0.197752 фев 03 14:59:57 /devices/wb-msw-v4_29/controls/Current Motion 212
0.250207 фев 03 14:59:57 /devices/wb-msw-v4_29/controls/Current Motion 199
0.053745 фев 03 14:59:57 /devices/wb-msw-v4_29/controls/Current Motion 196
0.396734 фев 03 14:59:57 /devices/wb-msw-v4_29/controls/Current Motion 185
0.102697 фев 03 14:59:58 /devices/wb-msw-v4_29/controls/Current Motion 177
0.098702 фев 03 14:59:58 /devices/wb-msw-v4_29/controls/Current Motion 171
0.201732 фев 03 14:59:58 /devices/wb-msw-v4_29/controls/Current Motion 159
0.201668 фев 03 14:59:58 /devices/wb-msw-v4_29/controls/Current Motion 150
0.098014 фев 03 14:59:58 /devices/wb-msw-v4_29/controls/Current Motion 147
0.300294 фев 03 14:59:58 /devices/wb-msw-v4_29/controls/Current Motion 132
0.101404 фев 03 14:59:59 /devices/wb-msw-v4_29/controls/Current Motion 127
0.150163 фев 03 14:59:59 /devices/wb-msw-v4_29/controls/Current Motion 120
0.299557 фев 03 14:59:59 /devices/wb-msw-v4_29/controls/Current Motion 107
0.051552 фев 03 14:59:59 /devices/wb-msw-v4_29/controls/Current Motion 105
0.250069 фев 03 14:59:59 /devices/wb-msw-v4_29/controls/Current Motion 95
0.250896 фев 03 15:00:00 /devices/wb-msw-v4_29/controls/Current Motion 86
0.099823 фев 03 15:00:00 /devices/wb-msw-v4_29/controls/Current Motion 82
0.399490 фев 03 15:00:00 /devices/wb-msw-v4_29/controls/Current Motion 68
0.452602 фев 03 15:00:00 /devices/wb-msw-v4_29/controls/Current Motion 55
0.056360 фев 03 15:00:01 /devices/wb-msw-v4_29/controls/Current Motion 54
0.500422 фев 03 15:00:01 /devices/wb-msw-v4_29/controls/Current Motion 43
....

У Вас такое же поведение у датчика?

Действительно)) Выставил у себя 5000мс, все равно сыпит, но пореже вроде немного. Но точно не раз в 5000мс

Это ожидаемо, оно прилетает по Быстрому Modbus и не зависит от того сколько вы там в опросе выставили. Настройка опроса влияет только на то, как часто драйвер будет опрашивать устройство по обычному Modbus.

1 Like