Este projeto torna possível ler informações da bomba de calor Panasonic Aquarea e reportar os dados para um servidor MQTT ou em formato JSON sobre HTTP.
Um README_DE.md alemão que você encontra aqui.
Uma tradução holandesa do README_NL.md está aqui.
Suomen kielellä README_FI.md luettavissa täällä.
Ajuda na tradução para outros idiomas é bem-vinda.
O último lançamento está disponível aqui. O binário compilado ESP8266 pode ser instalado em um Wemos D1 mini, no HeishaMon PCB e geralmente em qualquer placa baseada em ESP8266 compatível com as configurações de construção do Wemos (pelo menos 4 MB de flash). Você também pode baixar o código e compilá-lo (veja as bibliotecas necessárias abaixo). O binário ESP32-S3 é para a versão grande e mais recente do heishamon.
HeishaMon é capaz de se comunicar com as séries Panasonic Aquarea H, J, K e L&. Tipos de usuários confirmados da HP você encontra aqui
Se você quiser compilar esta imagem sozinho, certifique-se de usar as bibliotecas mencionadas e o suporte para um sistema de arquivos no esp8266, então selecione a opção de flash correta no arduino ide para isso.
Ao iniciar, sem um wifi configurado, um hotspot wifi aberto ficará visível permitindo que você configure sua rede wifi e seu servidor MQTT. A página de configuração estará localizada em http://192.168.4.1.
Após configurar e inicializar a imagem poderá ler e conversar com sua bomba de calor. A conexão GPIO13/GPIO15 será usada para comunicações para que você possa manter seu computador/uploader conectado à placa, se desejar.
Serial 1 (GPIO2) pode ser usado para conectar outra linha serial (GND e TX somente da placa) para ler alguns dados de depuração.
Todos os dados recebidos serão enviados para diferentes tópicos MQTT (veja abaixo as descrições dos tópicos). Há também um tópico MQTT 'panasonic_heat_pump/log' que fornece registro de depuração e um hexdump dos pacotes recebidos (se habilitado no portal da web).
Você pode conectar uma rede 1wire no GPIO4 que reportará em tópicos MQTT separados (panasonic_heat_pump/1wire/sensorid).
O software também é capaz de medir Watts em uma porta S0 de dois medidores de kWh. Você só precisa conectar GPIO12 e GND ao S0 de um medidor de kWh e se precisar de um segundo medidor de kWh use GPIO14 e GND. Ele reportará sobre o tópico MQTT panasonic_heat_pump/s0/Watt/1 e panasonic_heat_pump/s0/Watt/2 e também na saída JSON. Você pode substituir 'Watt' no tópico anterior por 'Watthour' para obter o contador de consumo em WattHour (por mensagem mqtt) ou por 'WatthourTotal' para obter o consumo total medido em WattHour. Para sincronizar o WatthourTotal com seu medidor de kWh, publique o valor correto no MQTT no tópico panasonic_heat_pump/s0/WatthourTotal/1 ou panasonic_heat_pump/s0/WatthourTotal/2 com a opção 'retain' enquanto o heishamon está reiniciando. Após a reinicialização, heishamon lê esse valor como o último valor conhecido que você pode sincronizar usando este método.
Atualizar o firmware é tão fácil quanto acessar o menu do firmware e, após autenticação com nome de usuário 'admin' e senha 'heisha' (ou outra fornecida durante a configuração), fazer o upload do binário lá.
Uma saída json de todos os dados recebidos (heatpump e 1wire) está disponível no url http://heishamon.local/json (substitua heishamon.local pelo endereço IP do seu dispositivo heishamon se o MDNS não estiver funcionando para você).
Dentro da pasta 'integrações' você encontra exemplos de como conectar sua plataforma de automação ao HeishaMon.
A funcionalidade de regras permite controlar a bomba de calor de dentro do próprio HeishaMon. O que o torna muito mais confiável do que ter que lidar com domótica externa via WiFi. Ao postar um novo conjunto de regras, ele é validado imediatamente e quando válido é usado. Quando um novo conjunto de regras for inválido, ele será ignorado e o antigo conjunto de regras será carregado novamente. Você pode verificar o console para obter feedback sobre isso. Se de alguma forma um novo conjunto de regras válido travar o HeishaMon, ele será automaticamente desabilitado na próxima reinicialização, permitindo que você faça alterações. Isso evita que o HeishaMon entre em um loop de inicialização.
As técnicas usadas na biblioteca de regras permitem trabalhar com conjuntos de regras muito grandes, mas a melhor prática é mantê-los abaixo de 10.000 bytes.
Observe que o envio de comandos para a bomba de calor é feito de forma assíncrona. Portanto, os comandos enviados para a bomba de calor no início da sua sintaxe não serão refletidos imediatamente nos valores da bomba de calor posteriormente. Portanto, os valores da bomba de calor devem ser lidos a partir da própria bomba de calor, em vez daqueles baseados nos valores que você mantém.
Duas regras gerais são que os espaços são obrigatórios e o ponto e vírgula é usado como caractere de fim de linha.
O conjunto de regras usa a seguinte estrutura de variáveis:
#
: Globais Estas variáveis podem ser acessadas em todo o conjunto de regras, mas devem ser definidas dentro de um bloco de regras. Não use globais para todas as suas variáveis, pois isso usará memória persistentemente.
$
: Locais Essas variáveis residem dentro de um bloco de regras. Quando um bloco de regras termina, essas variáveis serão limpas, liberando qualquer memória utilizada.
@
: Parâmetros da bomba de calor Estes são os mesmos listados na página de documentação Gerenciar Tópicos e encontrados na página inicial do HeishaMon. O conjunto de regras também segue a lógica R/W usada por meio do MQTT e da API REST. Isso significa que os tópicos lidos diferem dos tópicos escritos. Portanto, a leitura do estado da bomba de calor é feita através de @Heatpump_State
, alterando o estado da bomba de calor através de @SetHeatpump
.
%
: Variáveis de data e hora Podem ser usadas para regras baseadas em data e hora. Atualmente há suporte %hour
(0 - 23), %minute
(0 - 59), %month
(1 - 12) e day
(1 - 7). Todos são números inteiros simples. Uma configuração NTP adequada é necessária para definir a data e hora corretas do sistema no HeishaMon.
?
: Parâmetros do termostato Essas variáveis refletem os parâmetros lidos do termostato conectado ao usar a funcionalidade OpenTherm. Quando o OpenTherm for suportado, esta documentação será ampliada com informações mais precisas. Você pode verificar na guia opentherm as variáveis que podem ser usadas. Os nomes são iguais para leitura e escrita, mas nem todos os valores suportam leitura e/ou escrita. A guia opentherm também lista isso.
ds18b20#2800000000000000
: Valores de temperatura de 1 fio Dallas Use essas variáveis para ler a temperatura dos sensores conectados. Obviamente, esses valores são somente leitura. O id do sensor deve ser colocado após a hashtag.
Quando uma variável é chamada, mas ainda não tem um valor definido, o valor será NULL
.
As variáveis podem ser do tipo booleano ( 1
ou 0
), float ( 3.14
), inteiro ( 10
) e string. A definição de strings é feita com aspas simples ou duplas.
As regras são escritas em blocos event
ou function
. São bloqueios que são acionados quando algo acontece; um novo valor da bomba de calor ou do termostato foi recebido ou um temporizador foi acionado. Ou pode ser usado como funções simples
on [event] then [...] end on [name] then [...] end
Os eventos podem ser parâmetros ou temporizadores da bomba de calor ou do termostato:
on @Heatpump_State then [...] end on ?setpoint then [...] end on timer=1 then [...] end
Ao definir funções, basta nomear seu bloco e então chamá-lo de qualquer outro lugar:
on foobar then [...] end on @Heatpump_State then foobar(); end
As funções podem ter parâmetros que você pode chamar:
on foobar($a, $b, $c) then [...] on @Heatpump_State then foobar(1, 2, 3); end
Se você chamar uma função com menos valores do que a função assume, todos os outros parâmetros terão um valor NULL.
Atualmente existe uma função especial que é chamada quando o sistema é inicializado quando um novo conjunto de regras é salvo:
on System#Boot then [...] end
Esta função especial pode ser usada para definir inicialmente seus globais ou determinados temporizadores.
Os operadores regulares são suportados com a sua associatividade e precedência padrão. Isso permite que você também use matemática regular.
&&
: E
||
: Ou
==
: Igual a`
>=
: Maior ou igual então
>
: Maior então
<
: Menor então
<=
: Menor ou igual então
-
: Menos
%
: Módulo
*
: Multiplicar
/
: Dividir
+
: Mais
^
: Poder
Parênteses podem ser usados para priorizar operadores, pois funcionariam na matemática normal.
coalesce
Retorna o primeiro valor, não NULL
. Por exemplo, $b = NULL; $a = coalesce($b, 1);
retornará 1. Esta função aceita um número ilimitado de argumentos.
max
Retorna o valor máximo dos parâmetros de entrada.
min
Retorna o valor mínimo dos parâmetros de entrada.
isset
Retorna booleano verdadeiro quando a variável de entrada ainda é NULL
em qualquer outro caso, retornará falso.
round
Arredonda o float de entrada para o número inteiro mais próximo.
floor
O maior valor inteiro menor ou igual ao float de entrada.
ceil
O menor valor inteiro maior ou igual ao float de entrada.
setTimer
Define um cronômetro para disparar em X segundos. O primeiro parâmetro é o número do temporizador e o segundo parâmetro é o número de segundos antes de disparar. Um cronômetro é acionado apenas uma vez, portanto deve ser redefinido para eventos recorrentes. Quando um cronômetro é acionado, ele pode executar o evento do cronômetro conforme descrito acima. Por exemplo
print
Imprime um valor no console.
concat
Concatena vários valores em uma string combinada. Ex: @SetCurves = concat('{zone1:{heat:{target:{high:', @Z1_Heat_Curve_Target_High_Temp, ',low:32}}}}');
on System#Boot then setTimer(3, 60); end on timer=3 then [...] setTimer(3, 60); end
As únicas condições suportadas são if
, else
e elseif
:
if [condition] then [...] else if [condition] then [...] end end
if [condition] then [...] elseif [condition] then if [condition] then [...] else [...] end elseif [condition] then [...] else [...] end
Assim que o sistema de regras for usado por mais e mais usuários, exemplos adicionais serão adicionados à documentação.
Calculando a GUERRA
on calcWar($Ta1, $Tb1, $Ta2, $Tb2) then #maxTa = $Ta1; if @Outside_Temp >= $Tb1 then #maxTa = $Ta1; elseif @Outside_Temp <= $Tb2 then #maxTa = $Ta2; else #maxTa = $Ta1 + (($Tb1 - @Outside_Temp) * ($Ta2 - $Ta1) / ($Tb1 - $Tb2)); end end
Ponto de ajuste do termostato
on ?roomTemp then calcWar(32, 14, 41, -4); $margin = 0.25; if ?roomTemp > (?roomTempSet + $margin) then if @Heatpump_State == 1 then @SetHeatpump = 0; end elseif ?roomTemp < (?roomTempSet - $margin) then if @Heatpump_State == 0 then @SetHeatpump = 1; end else @SetZ1HeatRequestTemperature = round(#maxTa); end end
Uma redefinição de fábrica pode ser realizada na interface da web, mas se a interface da web não estiver disponível, você poderá realizar uma redefinição dupla. A reinicialização dupla não deve ser executada muito rapidamente, mas também não muito lenta. Normalmente, meio segundo entre as duas redefinições deve resolver. Para indicar que a redefinição dupla executou uma redefinição de fábrica, o LED azul piscará rapidamente (você precisa pressionar reset novamente agora para reiniciar o HeishaMon de volta ao normal, onde um ponto de acesso WiFi deve estar visível novamente).
Abaixo você encontra alguns detalhes técnicos do projeto. Como construir seus próprios cabos. Como construir seu próprio PCB etc.
A comunicação pode ser estabelecida através de um dos dois soquetes: CN-CNT ou CN-NMODE. Se você possui uma interface WiFi Panasonic CZ-TAW1 existente que deseja substituir pelo HeishaMon, basta desconectar o cabo do CZ-TAW1 e reconectar ao seu dispositivo HeishaMon. No entanto, não é possível usar o HeishaMon e o módulo CZ-TAW1 original juntos como um dispositivo ativo. No entanto, é possível colocar o HeishaMon no modo "Somente escuta", o que permitirá que o HeishaMon e o módulo CZ-TAW1 original coexistam. A única desvantagem disso é que o HeishaMon não consegue enviar comandos e usar a opção PCB opcional.
Parâmetros de comunicação: TTL 5V UART 9600,8,E,1
Pinagem CN-CNT (de cima para baixo)
1 - +5V (250mA)
2 - 0-5V TX (da bomba de calor)
3 - 0-5V RX (para bomba de calor)
4 - +12V (250mA)
5 - GND
Pinagem CN-NMODE (da esquerda para a direita)
"Aviso! Conforme impresso no PCB, o pino esquerdo é o pino 4 e o pino direito é o pino 1. Não conte de 1 a 4 da esquerda!
4 - +5V (250mA)
3 - 0-5V TX (da bomba de calor)
2 - 0-5V RX (para bomba de calor)
1 - GND
HeishaMon receberá energia da Panasonic através do cabo (alimentação de 5 V).
É possível conectar o HeishaMon a longa distância. Até 5 metros estão funcionando com cabeamento normal. Para distâncias maiores é possível uma configuração TTL para RS485 conforme mostrado na imagem abaixo. No entanto, é necessário que o HeishaMon seja alimentado externamente usando energia de 5 V (por exemplo, de um cabo USB).
Pedidos RS-Online
Ordens de Conrado
Use um cabo de 4 condutores blindado 24 AWG.
Os PCB necessários para conectar à bomba de calor são projetados pelos membros do projeto e estão listados abaixo. A parte mais importante do hardware é uma mudança de nível entre 5v da Panasonic para 3,3v do HeishaMon e uma linha de habilitação GPIO13/GPIO15 após a inicialização.
Projetos PCD dos membros do projeto
Imagem Wemos D1 beta
Imagem ESP12-F
Para facilitar as coisas, você pode solicitar um PCB completo de alguns membros do projeto:
Loja de tindie de Igor Ybema (também conhecido como TheHogNL) com sede na Holanda
placas:
esp8266 pela comunidade esp8266 versão 3.0.2 Arduino
Todas as bibliotecas que usamos são necessárias para compilar.
A lista atual de tópicos MQTT documentados pode ser encontrada aqui
O software também suporta leitura de sensores de temperatura de 1 fio ds18b20. Uma configuração adequada de 1 fio (com resistor pull-up de 4,7kohm) conectada ao GPIO4 será lida a cada segundo configurado (mínimo 5) e enviada no tópico panasonic_heat_pump/1wire/"sensor-hex-address". Nas placas pré-fabricadas este resistor de 4,7kohm já vem instalado.
O heishamon mais novo e grande contém dois relés integrados que podem ser ligados e desligados usando comandos MQTT. Os relés podem ser usados para qualquer comutação de contato, até mesmo rede de 230V (máx. 5A). Por exemplo, para ligar os contactos de 230V na bomba de calor para controlar o 'termostato externo', ligar ou desligar uma bomba ou outros dispositivos de menor potência. Não recomendo usar o relé como interruptor de aquecedor elétrico, pois eles consomem muita energia. Para controlar o relé basta enviar um valor de 1 ou 0 para o tópico MQTT "panasonic_heat_pump/gpio/relay/one" para o relé um ou "panasonic_heat_pump/gpio/relay/two" para o relé dois.
Se sua placa heishamon suportar opentherm, o software também pode ser usado para conectar informações opentherm de um termostato compatível para sua automação residencial por meio de MQTT ou JSON e, como mencionado acima, também pode ser conectado diretamente nas regras para conectar informações opentherm à bomba de calor e vice-versa , por exemplo, para exibir a temperatura externa da bomba de calor em seu termostato opentherm. Se você ativar o suporte opentherm nas configurações, haverá uma nova guia visível na página da web. Nessa guia você verá os valores opentherm. Alguns são do tipo R(ead) e alguns são W(rite), e alguns são ambos. Ler significa que o termostato pode ler essas informações do heishamon. Você fornece essas informações por meio do MQTT (ou usando as regras) atualizando esse valor no tópico mqtt 'opentherm/read', por exemplo 'panasonic_heat_pump/opentherm/read/outsideTemp'. Os valores de gravação são informações do termostato, como 'roomTemp'. Eles estão disponíveis no tópico mqtt 'opentherm/write'. Você pode usar esses valores para alterar o comportamento da bomba de calor da maneira que desejar, usando sua automação residencial e comandos mqtt set para heishamon ao usar as regras internas.
As variáveis opentherm disponíveis são:
chEnable que é um booleano que mostra se o aquecimento central deve ser habilitado. Isso é frequentemente usado quando o termostato deseja aquecer sua casa.
dhwEnable que é um booleano que mostra se o aquecimento de água quente deve ser habilitado. Frequentemente usado como uma opção do usuário no termostato para desativar o aquecimento de água quente sanitária durante as férias
CoolingEnable que é um booleano que mostra se o resfriamento deve ser habilitado. A quantidade de resfriamento é solicitada em 'coolingControl', veja abaixo.
roomTemp é o valor do ponto flutuante da temperatura ambiente medida pelo termostato
roomTempSet é o valor do ponto flutuante do ponto de ajuste da temperatura ambiente solicitado no termostato
chSetpoint é o valor do ponto flutuante do setpoint da água calculado pelo termostato. Os termostatos Opentherm tentam definir este chSetpoint para não ultrapassar o ponto de ajuste da sala. Pode ser usado para definir o ponto de ajuste da água na bomba de calor, mas a maioria dos termostatos responde muito rápido em comparação com o funcionamento das bombas de calor
maxRelativeModulation é a quantidade de modulação (0-100%) que a bomba de calor (escravo opentherm) pode usar (consulte a modulação relativa nos valores READ, que devem ser sempre iguais ou inferiores a este máximo)
CoolingControl é a quantidade de resfriamento (0-100%) que o termostato solicita da bomba de calor. Requer um termostato opentherm com suporte de resfriamento.
dhwSetpoint é o valor do ponto flutuante que é o ponto de ajuste atual de AQS pelo termostato, mas também pode ser definido pelo heishamon para substituí-lo. Nem todos os termostatos suportam isso. Não deve ser definido acima de dhwSetUppBound, veja abaixo.
maxTSet é o valor do ponto flutuante que define o setpoint máximo da água. O usuário pode definir isso no termostato ou também no heishamon. Não deve ser definido acima de chSetUppBound, veja abaixo.
chPressure é o valor do ponto flutuante que define a pressão medida da água do aquecimento central fornecida pelo heishamon
outsideTemp é o valor do ponto flutuante que define a temperatura externa medida do aquecimento central fornecido pelo heishamon
inletTemp é o valor do ponto flutuante que define a temperatura medida de entrada de água do aquecimento central fornecida pelo heishamon
outletTemp é o valor do ponto flutuante que define a temperatura medida de saída da água do aquecimento central fornecida pelo heishamon
dhwTemp é o valor do ponto flutuante que define a temperatura medida da água quente sanitária do aquecimento central fornecida pela heishamon
relativoModulação é a quantidade (0-100%) de modulação em que a bomba de calor (escravo opentherm) está funcionando atualmente, deve ser sempre menor ou igual ao maxRelativeModulation definido pelo termostato
flameState é um valor booleano (envie 'true', 'on' ou '1' para habilitar) que define se o aquecimento central está fornecendo calor central
chState é um valor booleano (envia 'true', 'on' ou '1' para habilitar) que define se a bomba de calor está no modo de aquecimento ambiente/central (por exemplo válvula de 3 vias no ambiente, em modo de aquecimento)
dhwState é um valor booleano (enviar 'true', 'on' ou '1' para ativar) que define se a bomba de calor está no modo AQS (por exemplo válvula de 3 vias em AQS)
CoolingState é um valor booleano (envie 'true', 'on' ou '1' para ativar) que define se a bomba de calor está no modo de refrigeração ambiente/central (por exemplo, válvula de 3 vias na sala, em modo de refrigeração)
dhwSetUppBound é um valor inteiro de 0 a 127 que define a temperatura máxima de AQS suportada para que o termostato não possa solicitar um dhwSetpoint superior a este. O padrão é definido como 75. Para substituir, envie uma mensagem MQTT para este tópico e mantenha-a retida para que heishamon a receba novamente após a reinicialização.
dhwSetLowBound é um valor inteiro de 0 a 127 que define a temperatura mínima de AQS suportada para que o termostato não possa solicitar um dhwSetpoint inferior a este. O padrão é definido como 40. Para substituir, envie uma mensagem MQTT para este tópico e mantenha-a retida para que heishamon a receba novamente após a reinicialização.
chSetUppBound é um valor inteiro de 0 a 127 que define a temperatura máxima de CH (água de aquecimento) suportada para que o termostato não possa solicitar um chSetpoint superior a este. O padrão é definido como 65. Para substituir, envie uma mensagem MQTT para este tópico e mantenha-a retida para que heishamon a receba novamente após a reinicialização.
chSetLowBound é um valor inteiro de 0 a 127 que define a temperatura mínima de CH (água de aquecimento) suportada para que o termostato não possa solicitar um chSetpoint inferior a este. O padrão é definido como 20. Para substituir, envie uma mensagem MQTT para este tópico e retenha-a para que heishamon a receba novamente após a reinicialização.
A lista atual de bytes documentados descriptografados pode ser encontrada aqui
Openhab2
Assistente Doméstico
Manual IOBroker
Domótica