Fui confrontado com a tarefa de controlar um piso quente a partir da interface do Fibaro Home Center 2. Parece ser uma tarefa simples, mas não. A pedido do cliente, os termostatos devem ser baseados na temperatura do piso. Foi decidido usar termostatos HeatIt.

Eles eram mais adequados às necessidades do cliente:
- design minimalista
- a capacidade de extinguir, tanto quanto possível, o que está aceso no painel
- a capacidade de trabalhar com base na temperatura do piso
- a possibilidade de associação direta com relés externos (porque o piso radiante é água, é necessário controlar os relés localizados na sala da caldeira, que abrem e fecham as válvulas dos circuitos correspondentes)
Depois de estudar um pouco os materiais na rede, descobri que o Fibaro Home Center 2 “legal” não sabe como definir termostatos para temperaturas> 30 graus na interface da web e> 28 graus no aplicativo móvel. O que para a temperatura máxima do piso, é claro que não é suficiente.

Ao mesmo tempo, os termostatos HeatIt possibilitam configurar até 40 graus. A questão é por que o Fibaro não permite que o instalador defina a faixa de temperaturas possíveis. Bem, tudo bem, pensei, vamos pensar em algo. Havia até uma idéia de mudar as leituras do sensor NTC com um resistor adicional, mas o cliente teria que se acostumar com as leituras de temperatura nos "papagaios" condicionais, o que não é bom.
Havia uma ideia, mas e se pegarmos e enviarmos de alguma forma um valor maior?
A troca entre o cliente da web e o Home Center 2 é descrita na
API REST FibaroMas achei mais fácil interceptar todos os comandos no Wireshark.
Especificamente para HeatIt:
POST / api / devices / 9 / action / setMode {"args": [1]}
POST / api / devices / 9 / action / setSetpointMode {"args": [1]}
POST / api / devices / 9 / action / setThermostatSetpoint {"args": [1,27]}
Descrição do produtosetMode - seleção de modo (argumentos: 1 - no aquecimento, 11 - aquecimento econômico, 0 - desligado)
setSetpointMode - selecione em qual modo a temperatura de instalação é exibida (os argumentos são os mesmos)
setThermostatSetpoint - define a temperatura alvo para o modo (consequentemente, o primeiro argumento é mode, o segundo é temperatura)
Você também pode enviar solicitações como:
GET / api / callAction? DeviceID = ID & nome = setThermostatSetpoint & arg1 = MODO & arg2 = TEMP VALUE
etc.
Você também pode aprender todos os comandos e valores para todos os dispositivos instalados por uma solicitação REST:
GET / api / devices
Então, enviamos ao termostato uma temperatura de 35 graus e, e eis que o termostato o aceitou.
Agora, a tarefa é fornecer um substituto para o controle em tempo integral do termostato.
A primeira opção é um dispositivo virtual Fibaro.
Esbocei o formulário:

Começando a escrever scripts:
Primeiro, descobriremos o ID de todos os dispositivos nos quais estamos interessados. Para fazer isso, vá para as configurações de cada "dispositivo" relacionado ao nosso termostato e consulte o ID na página ou na barra de endereços do navegador.
No meu caso, o dispositivo para definir a temperatura alvo (setPoint) - ID:
7Sensor de temperatura do piso - ID:
8Seleção do modo de operação do termostato - ID:
9

Além disso, nosso dispositivo virtual também possui seu próprio ID, ele só pode ser visto na barra de endereços do navegador, eu tenho esse ID
12 . Além disso, cada elemento do dispositivo virtual também possui seu próprio ID, no meu caso:
"Ritmo atual." Eu tenho o ID "
Label1 ", "Temperatura alvo" - ID "
Label2 "
Botões “+” e “-” - ID “
Button1 ” e ID “
Button2 ”, respectivamente. “Mode” - ID “
Label1 ”.
Bem, os botões "OFF", "ECO" e "ON" - ID "
Button3 ", ID "
Button4 " e ID "
Button5 ", respectivamente.
O loop principal:
Em seguida, escrevemos scripts para os botões:
Com os botões de seleção de modo, tudo é simples:
"OFF":
fibaro:call(9, 'setMode',0)
"ECO":
fibaro:call(9, 'setMode',11) fibaro:call(7, 'setSetpointMode',11)
"ON":
fibaro:call(9, 'setMode',1) fibaro:call(7, 'setSetpointMode',1)
Para o botão "+":
Para o botão "-":
currentSetPoint = tonumber(fibaro:getValue(7, 'value')) if (currentSetPoint > 5) then setPoint = currentSetPoint - 1 else setPoint = 5 end fibaro:call(7, 'setThermostatSetpoint',11, setPoint)
Em geral, tudo.
Funciona bem, o único problema é o atraso após pressionar o botão. Se você gerenciar de uma rede local, isso será de 1 a 2 segundos, mas se você gerenciar remotamente, o atraso poderá chegar a 10 segundos. I.e. se necessário, adicione ou diminua a temperatura em uma dúzia de graus remotamente, podendo levar alguns minutos.
Em geral, é claro que é uma muleta, mas não há outra saída. Em outros assuntos, olhando para o futuro, direi que todo o sistema ficará sob o controle do Iridium Mobile, portanto, essa é uma solução temporária.