Управление радиаторами с изменяемой температурой

Здравствуйте!

Есть идея сделать возможность установки температуры в комнате через несколько кнопок включения радиатора: то есть будут кнопки “выключить”, “20 градусов”, “23 градуса”, “24 градуса”. Когда одна включается, другие выключаются и выполняется один из циклов. Делаю через два whenChanged, но выдает ошибку. Подскажите, что делаю не так или может как правильнее это реализовать?

defineRule(“heater_control sleeping room”, {
whenChanged: [“Radiators/Спальня_24”],
then: function (newValue, devName, cellName) {
if (newValue) {
whenChanged: “wb-msw-v3_11/Temperature”,
then: function (newValue, devName, cellName) {
if ( newValue1 > 24) { //температура
dev[“wb-gpio”][“EXT2_R3A2”] = true;
} else {
dev[“wb-gpio”][“EXT2_R3A2”] = false;
}
}
}
})

Добрый день.
whenChanged не может быть вложенным. Точнее может, но выполнится один раз. Посмотрите для примера Как сделать, чтобы в WB-MRWL3 единовременно включалось только 1 реле? - #5 от пользователя BrainRoot

А ответ на вопрос где?)

Как сделать возможность регулировать температуру батареи?

Я использую для регулировки контрол range виртуального устройства. Но и кнопками - тоже можно, как один из вариантов.
Возможно я не совсем правильно понял вопрос, переформулируйте пожалуйста.

Вопрос в том, как сделать возможность регулировки температуры батареи? Я привел пример кода, там используется два whenChanged, что, получается, невозможно. Как лучше сделать? Меня устроит и вариант с кнопками, чтобы при нажатии на кнопку включалось определенное правило, либо с range. Желательно пример кода (хотя бы структуру понять, как включать правило с кнопки и как использовать range в данном контексте).

range:

//10_26_test_01.js

defineRule({
whenChanged: "10_26_test_01/setnVal",
then: function (newValue, devName, cellName) {
  log ("{}: Вход 10_26_test_01", devName, newValue);
  
},
});

defineVirtualDevice("10_26_test_01", {
  title: "10_26_test_01",
  cells: {
    setnVal: {
        title: "Name for range",
	    type: "range",
	    value: 25,
        max: 50,
	}
  }
});

С кнопками:

//10_26_test_01.js

defineRule({
whenChanged: "10_26_test_01/setnVal",
then: function (newValue, devName, cellName) {
  log ("{}: Вход 10_26_test_01", devName, newValue);
  
},
});

defineRule({
whenChanged: "10_26_test_01/b1",
then: function (newValue, devName, cellName) {
  log ("{}: Вход 10_26_test_01", cellName, newValue);
  
},
});

defineRule({
whenChanged: "10_26_test_01/b2",
then: function (newValue, devName, cellName) {
  log ("{}: Вход 10_26_test_01", cellName, newValue);
  
},
});

defineVirtualDevice("10_26_test_01", {
  title: "10_26_test_01",
  cells: {
    setnVal: {
        title: "Name for range",
	    type: "range",
	    value: 25,
        max: 50,
        forceDefault: true,
        order: 1
	},
    b1: {
      type: "pushbutton",
      value: false,
      order: 2
      
    },
    b2: {
      type: "pushbutton",
      order: 3
      
    },
  }
});

Прописал кнопку так:
defineVirtualDevice(“Rad temp”, {
title: “Rad temp”,
cells: {
Tempsleep: {
title: “Name for range”,
type: “range”,
value: 25,
max: 50,
forceDefault: true,
order: 1
},

}
});

Правило - так:
defineRule(“heater_control sleeping room”, {
whenChanged: “wb-msw-v3_11/Temperature”,
then: function (newValue, devName, cellName) {
if ( newValue1 > “Rad temp/Tempsleep”) {
dev[“wb-gpio”][“EXT2_R3A2”] = true;
} else {
dev[“wb-gpio”][“EXT2_R3A2”] = false;
}
}
})

Не работает че-то) Есть подозрение, что в этой строке ошибка:
if ( newValue1 > “Rad temp/Tempsleep”) {

Не подскажете, как прописать правильно?

И сразу подскажите, как скриптом задать температуру на данном Range? Тоже семантика интересует…

Не совсем понятно, вы сравниваете значение со строкой? А какое значение в переменной newValue1, кстати?

Вообще, я сравниваю с числом 24, это здесь пытаюсь понять, как сравнивать со значением.

С NewValue1 - ошибся, вообще просто NewValue

Если значение контрола - то оно получается как dev["Rad temp/Tempsleep"]
А сравнивать строку и число - результаты будут недетерминированы.

Спасибо! Заработало!

Создал в Homekit термостат, он при включении на нагрев выдает топик “HEAT”, я хочу, чтобы батарея включалась только при включении термостата на нагрев.

defineRule(“heater_control sleeping room”, {
whenChanged: “wb-msw-v3_11/Temperature”,
then: function (newValue, devName, cellName) {
if ( newValue > dev[“Rad temp/Tempsleep”], dev[“Thermo/Thermosleep”]==“HEAT”) {
dev[“wb-gpio”][“EXT2_R3A2”] = true;
} else {
dev[“wb-gpio”][“EXT2_R3A2”] = false;
}
}
})

То есть должно выполняться два условия: температура и топик HEAT. Я так понимаю, что я прописал “или”? Как мне сделать условие “И”?

Не совсем понял. Где условие?

Пишет, что ошибка в строке
if ( newValue > dev[“Rad temp/Tempsleep”]&&dev[“Thermo/Thermosleep”]==“HEAT”)

А что за ошибка? При выполнении?

if ((newValue > dev["Rad temp/Tempsleep"]) && (dev["Thermo/Thermosleep"]=="HEAT")) {

Работает вполне нормально.

Мистика какая-то… Сейчас не дает ошибку при сохранении…

Только что выяснилась очень странная вещь. Когда подключаюсь к веб интерфейсу через компьютер и через телефон показываются разные данные. То есть я изменяю показания термостата в applehome, они передаются на range в wb, в веб-интерфейсе пк значение изменяется, в веб телефона - нет. Более того mqtt тоже разные значения. Обновлял страницу по несколько раз. Когда через веб пк меняю значение, то в веб мобильного тоже меняются. Получается значения разные и не понятно, где правильные.

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

“Правильные” - те сто в mqtt.

Что такое "в веб телефона? браузер, его версия?

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

В итоге ситуация следующая:

То есть изменяю температуру в apple homekit, она меняется в mqtt, но обновив страницу она возвращается назад. Причем, в apple homekit она назад не меняется. Если через браузер ползунком поменять температуру, то все работает. В чем может быть проблема?