Решил поделиться своим вариантом релизации правила для тёплого пола с двумя датчиками 1wire и интеграцией в home assistant (mqtt HVAC)
Буду рад если укажете что можно оптимизировать
var wc_floor_sensor_1= new Array();
var wc_floor_sensor_2= new Array();
var wc_floor_average_temp_1 = 0;
var wc_floor_average_temp_2 = 0;
var wc_floor_diff = 2;
defineVirtualDevice("wc_floor", {
title: "Cанузел. Теплый пол",
cells: {
"Уставка": {
type: "range",
value: 25,
max: 35,
order: 6
},
"Поддержание температуры": {
type: "switch",
value: false,
order: 5
},
"Нагреватель": {
type: "switch",
value: false,
order: 4
},
"Датчик_1": {
type: "temperature",
value: 0,
order: 3
},
"Датчик_2": {
type: "temperature",
value: 0,
order: 2
},
"Датчик": {
type: "temperature",
value: 0,
order: 1
}
}
});
defineRule("wc_sensor_changed", {
whenChanged: ["wb-w1/28-3c01d0757a5f","wb-w1/28-3c01d0759ed2"],
then: function (newValue, devName, cellName) {
if(newValue>10&&newValue<100&&dev["wc_floor"]["Датчик"]>10&&dev["wc_floor"]["Датчик"]<100)
{
if (cellName == "28-3c01d0757a5f")
{
dev["wc_floor"]["Датчик_1"] = newValue;
wc_floor_average_temp_1 = 0;
wc_floor_sensor_1.unshift(newValue);
for(var i = 0; i<wc_floor_sensor_1.length; ++i)
{
if(wc_floor_average_temp_1>10)
{
wc_floor_average_temp_1 = wc_floor_average_temp_1 + wc_floor_sensor_1[i];
}
else
{
wc_floor_average_temp_1 = wc_floor_sensor_1[i];
}
}
wc_floor_average_temp_1 = wc_floor_average_temp_1/wc_floor_sensor_1.length;
if(wc_floor_sensor_1.length>5)
{
wc_floor_sensor_1.pop();
}
}
else if (cellName == "28-3c01d0759ed2")
{
dev["wc_floor"]["Датчик_2"] = newValue;
wc_floor_average_temp_2 = 0;
wc_floor_sensor_2.unshift(newValue);
for(var i = 0; i<wc_floor_sensor_2.length; ++i)
{
if(wc_floor_average_temp_2>10)
{
wc_floor_average_temp_2 = wc_floor_average_temp_2 + wc_floor_sensor_2[i];
}
else
{
wc_floor_average_temp_2 = wc_floor_sensor_2[i];
}
}
wc_floor_average_temp_2 = wc_floor_average_temp_2/wc_floor_sensor_2.length;
if(wc_floor_sensor_2.length>5)
{
wc_floor_sensor_2.pop();
}
}
if(wc_floor_average_temp_1>10&&wc_floor_average_temp_2>10&&wc_floor_average_temp_1<100&&wc_floor_average_temp_2<100)
{
dev["wc_floor"]["Датчик"]= parseFloat(((wc_floor_average_temp_1+wc_floor_average_temp_2)/2).toFixed(2));
}
else if(wc_floor_average_temp_1<10||wc_floor_average_temp_1>100)
{
dev["wc_floor"]["Датчик"]= parseFloat(wc_floor_average_temp_2.toFixed(2));
}
else if(wc_floor_average_temp_2<10||wc_floor_average_temp_2>100)
{
dev["wc_floor"]["Датчик"]= parseFloat(wc_floor_average_temp_1.toFixed(2));
}
}
else if(newValue>10&&newValue<100)
{
dev["wc_floor"]["Датчик"] = newValue;
}
}
});
trackMqtt("/wc_floor/mode", function(message){
if(message.value=="heat")
{
dev["wc_floor"]["Поддержание температуры"]=true;
}
else if(message.value=="off")
{
dev["wc_floor"]["Поддержание температуры"]=false;
}
});
defineRule("wc_floor_heater", {
whenChanged: ["wc_floor/Датчик","wc_floor/Поддержание температуры","wc_floor/Уставка"],
then: function (newValue, devName, cellName) {
log(dev["wc_floor"]["Поддержание температуры"]);
log(dev["wc_floor"]["Уставка"]);
log(dev["wc_floor"]["Датчик"]);
if(dev["wc_floor"]["Поддержание температуры"])
{
publish("/wc_floor/state", "heat");
if(dev["wc_floor"]["Уставка"]>dev["wc_floor"]["Датчик"])
{
dev["wc_floor"]["Нагреватель"]=true;
}
else if(dev["wc_floor"]["Уставка"]<dev["wc_floor"]["Датчик"]-wc_floor_diff)
{
dev["wc_floor"]["Нагреватель"]=false;
}
else
{
dev["wc_floor"]["Нагреватель"]=false;
}
}
else
{
publish("/wc_floor/state", "off");
dev["wc_floor"]["Нагреватель"]=false;
}
dev["wb-mr3_48"]["K1"]=dev["wc_floor"]["Нагреватель"];
}
});
На стороне Home Assistant
climate:
- platform: mqtt
name: "Санузел"
modes:
- "off"
- "heat"
mode_command_topic: "/wc_floor/mode"
mode_state_topic: "/wc_floor/state"
temperature_command_topic: "/devices/wc_floor/controls/Уставка"
temperature_state_topic: "/devices/wc_floor/controls/Уставка"
current_temperature_topic: "/devices/wc_floor/controls/Датчик"
precision: 0.1