Automating a Water Recirculation Pump System (Home Assistant + Smart Plugs)

To improve the hot water consumption in a daily routine, water recirculation pumps are very well used across the country. Water recirculation pumps are responsible for circulating cold water from plumbing lines back to the central heating boiler, opening space for new fresh and hot water.

This process is very sensitive if not handled smartly, and it can cause higher energy consumption, water waster or even not attend the family expectations.

Previously, I had a 15 Amp 7-Day indoor plug-in digital timer connected to my water recirculation pump. I can’t say it was a perfect solution. My biggest concerns with this solution were:

  • It only supports 7 ON/OFF programmable events: with my investigations I noticed that only 7 programmable events are not enough for this task.
  • It’s an offline solution: I can’t control this solution from my phone, tablet or voice assistant. Every configuration change requires me to access the digital timer physically.
  • Poor on-demand experience: the digital timer is very good with scheduled events, but I can’t turn on the water recirculation pump on demand if I need it

My current solution is using a Raspberry Pi 4 with Home Assistant Operating System and a Philips Smart Plug connected to a Philips Hue Bridge.

First things first: YOU DON’T NEED TO HAVE ALL THESE SPECIFIC DEVICES TO MAKE YOUR SOLUTION WORK. A simple smart plug connected to an app with good a scheduling tool is enough.

My solution is using all these specific devices because I did set up my house around Phillips Hue and Home Assistant. Here are some of my reasons to use these specific devices:

  • Philips Hue is a very strong platform. I like their solution, robustness and user experience. The Philips Hue Bridge controls my set of lights and as I don’t want to have another app/platform, I decided using a Philips smart plug.
  • Home Assistant is an open source home automation system. It allows me to control from Apple Home Kit devices that originally were not supported on it.  Home Assistant also is a platform that allows me to center all my automations in a single place, as I don’t want to use multiple apps to control my automations.

After registering my Philips Smart Plug in the Philips Hue Bridge, the smart plug became available in Home Assistant due their integration. I gave it the name “Water Recirculation Pump” (as shown in the following picture).

In Home Assistant I created my initial automations using the existing wizard. It’s very straightforward to be done.

Home Assistant – “How do you want to create your new automation?” Start a new one from the scratch. 😎

In total I created four automations: three automations to control the water flow during morning, afternoon and evening/night, and a fourth automation to shutdown the water recirculation pump if running for more than 15 minutes (this is a secure shutdown system to turn off the water flow if something goes wrong, or if my family leaves the recirculation pump on after an on-demand request).

List of four automations created in Home Assistant.

In every automation, I created a time pattern trigger which is executed every 30 minutes, during a specific time window (morning, afternoon, evening/night), which leaves the recirculation pump running for 4 minutes and 30 seconds, and then turns it off. The next 30 minutes window starts in 25 minutes and 30 seconds, where the warm/cold water will be replaced by hot water.

The following image demonstrate the logic

Sequence of cycles of 30 minutes.

Why 4 minutes and 30 seconds every 30 minutes?

I noticed that 4 minutes and 30 seconds is time enough to circulate the water from the boiler to the shower in the highest floor. I live in a three level house plan with three bathrooms. If you live in a higher or bigger house, probably it can take longer to recirculate the water.

I also noticed that, water can stay hot/warm for the next 25 minutes and 30 seconds between every 30 minutes window. This is a period of time which works fine for my family, but maybe giving your wall insulations, weather conditions and  family expectations, these 30 minutes windows can be too much, probably a 20 or 25 minutes window work better. Try to understand what it’s the ideal scenario for your house/family.

Giving my learnings and impressions, another important recommendation is: avoid leaving the recirculation pump running for very long. If the water recirculation runs for a very long period of time, it’ll mix too much cold water with the hot water in the boiler, and the boiler will not have enough time to warm up the water (because the recirculation pump is still running). In this situation, your boiler will fall in a condition where water is flowing all the time through the pipes and not getting hot enough as you expect. Think about it.

My current configuration is:

 StartEndCycles of 30 minutes
Morning Automation06:00 AM08:50AM6
Afternoon Automation12:00 PM01:50PM4
Evening/Night Automation04:30 PM11:50PM15

The Automation in Home Assistant

As mentioned, there are three automations controlling the water recirculation pump during beginning of morning, beginning of afternoon and evening/night. I don’t keep the automation running all they day, just during the periods when our family really needs hot water for showers and cooking.

The following pictures shows the existing automation for the period of evening/night.

The secure shutdown is important to avoid leaving the water pump running for very long and wasting heat, water and energy. My current automation handling it is the following:

This is still a work in progress.

Suggestions are always welcome.

// by Fernando Henrique Inocêncio Borba Ferreira

Desenvolvimento Efetivo na Plataforma Microsoft: o livro.

Desenvolver software é complexo. E fazer isso de forma ágil, manutenível, gerando soluções escaláveis, performáticas, seguras e com alta disponibilidade é mais complexo ainda.

Diante desses desafios, o time de engenheiros de suporte a campo Modern Apps Brazil decidiu por reunir um conjunto de práticas e lições aprendidas em campo com a plataforma Microsoft em um livro. Esses engenheiros são focados na resolução de problemas críticos relacionados a ALM, IIS e .NET Framework na plataforma Microsoft.

clip_image001

Leia mais »

MSB8020: The build tools for v140 (Platform Toolset = ‘v140’) cannot be found.

Durante a compilação de um projeto C++ CLR/CLI podemos encontrar essa mensagem de erro:

Error 1 error MSB8020: The build tools for v140 (Platform Toolset = ‘v140’) cannot be found. To build using the v140 build tools, please install v140 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Upgrade Solution…". C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets 64 5 WorkingWiithStrings.

Geralmente, existe um cenário associado a essa mensagem de erro: quando criamos uma aplicação em uma versão mais recente do Visual Studio e depois abrimos essa mesma aplicação em uma versão anterior da IDE. 

Leia mais »

Complexidade Algorítmica

Outro dia participei de uma discussão sobre "O que é a complexidade algorítmica?". Por conta disso, resolvi escrever esse post. Já havia falado sobre complexidade algorítmica entre outros posts deste blog, como neste link, onde falamos sobre o algoritmo de busca binária.

A Teoria da Complexidade Computacional é uma área de conhecimento destinada a avaliação da complexidade de algoritmos.

Esta avaliação trata de analisar o custo computacional de um algoritmo, o qual pode estar relacionado a diferentes fatores, como: tempo de execução, utilização de memória principal, utilização de disco e consumo de energia.

Um algoritmo pode ser tido como solução aceitável quando para qualquer entrada produz uma resposta correta. Entretanto, mesmo resolvendo um problema, um algoritmo pode ser tido como inaceitável, por possuir um custo computacional elevado.

Leia mais »

Arduino e Microsoft .NET Framework – Integrando os dois mundos

Arduino é uma plataforma eletrônica de hardware livre. Baseada em um microcontrolador Atmel AVR com suporte de entrada/saída embutido. O principal objetivo da plataforma é criar ferramentas acessíveis, de baixo custo e fáceis de serem utilizadas.

Neste post, será apresentado um modo de comunicação entre uma aplicação Microsoft .NET e um hardware Arduino.

clip_image002

Leia mais »

Busca binária

O objetivo deste post é apresentar um meio eficiente de busca de objetos em memória.

O surgimento da sintaxe LINQ, assim como a utilização de query methods, facilitou a busca em memória. Com estes recursos podemos facilmente executar queries em arrays, coleções e listas de tipos genéricos. O uso deste modelo de sintaxe agiliza o processo de desenvolvimento por tornar a busca em memória trivial e de simples codificação.

Mas, ao adotarmos esse modelo de sintaxe, estamos realmente escrevendo código performático? Será que essas consultas em memória são o modelo mais rápido de pesquisa? Não estaríamos perdemos poder computacional ou tempo de processamento ao adotar estes recursos em determinados cenários de pesquisa em memória?

Dada a necessidade de executar consultas eficientes e com baixo custo computacional, passamos a evitar consultas que consumam muitos recursos computacionais e que sejam lentas.

A busca binária é um algoritmo de busca que segue o paradigma da divisão e conquista. Partindo do pressuposto de que o conjunto de elementos está ordenado, são executadas diversas divisões do espaço de busca restringindo o possível local no qual o elemento buscado está posicionado. A imagem a seguir ilustra o processo de divisão do conjunto de elementos realizado pela busca de elementos.

clip_image002

Leia mais »

Erro 404 ao acessar rota do ASP.NET MVC no IIS 7 / KB980368

Ao acessar uma URL do ASP.NET MVC, exposto no IIS 7, é lançado o erro 404 Page/Directory not found.

Existem duas maneiras de resolver este erro:

1) Adicionando o atributo runAllManagedModulesForAllRequests na seção Modules do Web.Config.

2) Instalação do KB980368 (http://support.microsoft.com/kb/980368).

A utilização do runAllManagedModulesForAllRequests é necessária para o roteamento de requisições quando não temos o KB instalado, mas a utilização da tag runAllManagedModulesForAllRequests acarreta em overheads de execução desnecessários.

Leia mais »

Padrão Generation Gap

O padrão Generation Gap surgiu da dificuldade de se manter código gerado automaticamente e código escrito manualmente em um mesmo arquivo.

Em primeiro lugar, precisamos contextualizar quando as duas abordagens tornam-se conflitantes.

A partir do momento que temos uma classe gerada automaticamente por alguma ferramenta (por exemplo: Entity Framework Database First) e precisamos adicionar a ela algum comportamento escrito manualmente (algum método, ou propriedade que não será persistida no banco de dados), corremos o risco de perder tais modificações manuais após qualquer atualização da classe gerada automaticamente. Isto é, qualquer modificação gerada a partir de uma atualização do modelo acarretará na perda de qualquer código escrito manualmente.

Criando um componente SQL CLR para o registro de mensagens no event log do Windows

O Common Language Runtime é o coração do .NET Framework. O SQL Server fornece recursos que permitem a incorporação de componentes CLR ao seu ambiente de execução, desta forma podemos construir stored procedures, triggers, user-defined functions, user-defined types e user-defined aggregates utilizando código gerenciado.

Este post descreve os passos necessários para criação de um componente SQL CLR para o registro de mensagens no event log do Windows a partir da execução de stored procedures.

Leia mais »