intro:
i had my water-based wall heating’s temperatures regulated by node red over mqtt/tasmota the last couple of years, but as this setup started acting up and HA got more established in my home lately i figured i should reconsider doing this in esphome/HA directly.
the chicken coop incident
in europe most motorized 3-way mixing valves like this or this seem to work similar. they have 2 AC lines in - one driving the motor to one direction, the other to the opposite, an internal endstop seems to turn off the motor and it doesn’t explode or anything if you happen to have both lines live at a time (at least for a short period of time). most common seem to be a running time of 120s for the full 90° angle.
there are several threads in here asking about how to use these 3 way mixing valves with esphome, mostly concentrating on the aspect of using it with the thermostat/climate component - which is meant to be a simple on or off of a heating or cooling device to achieve a certain temperature. but actually the challenge most (like myself) face is how to best implement these timings and switches and ideally get a position … then i remembered my chicken coop door …
and so it struck me: the valve is a cover!
specifically a time based cover as we know the time it takes for fully opening and closing and have no endstops. it might also be possible with a template cover, but so far i found no need for it.
so i went on flashing my sonoff 4ch with esphome.
in my installation the first relay switches the circulating pump, the second turns the mixer left (‘closing’ / letting less hot water in), the third one to the right (/‘opening’), the fourth unused till now.
switch:
- platform: gpio
name: "heating 4chR1"
pin: GPIO12
id: relay_1
- platform: gpio
name: "heating 4chR2"
pin: GPIO5
id: relay_2
- platform: gpio
name: "heating 4chR3"
pin: GPIO4
id: relay_3
- platform: gpio
name: "heating 4chR4"
pin: GPIO15
id: relay_4
so the magic for getting this controlled follows:
cover:
- platform: time_based
name: "Mixer"
open_action:
- switch.turn_on: relay_3
open_duration: 120sec
close_action:
- switch.turn_on: relay_2
close_duration: 120sec
stop_action:
- switch.turn_off: relay_3
- switch.turn_off: relay_2
and that’s actually it for esphome
(unless you want to also make the physical buttons on the 4ch useable)
binary_sensor:
- platform: gpio
pin:
number: GPIO0
mode:
input: true
pullup: true
inverted: true
name: "heating 4chB1"
on_press:
- switch.toggle: relay_1
- platform: gpio
pin:
number: GPIO9
mode:
input: true
pullup: true
inverted: true
name: "heating 4chB2"
on_press:
- switch.toggle: relay_2
- platform: gpio
pin:
number: GPIO10
mode:
input: true
pullup: true
inverted: true
name: "heating 4chB3"
on_press:
- switch.toggle: relay_3
- platform: gpio
pin:
number: GPIO14
mode:
input: true
pullup: true
inverted: true
name: "heating 4chB4"
on_press:
- switch.toggle: relay_4
- platform: status
name: "heating 4CH Status"
on to home assistant, to get the basics going for testing i set up a dashboard with an entity card of the four relays and one for the mixer:
whereas the position isn’t usually part of a mixer’s entity card. for that i installed the great lovelace-slider-entity-row which gives a controllable visual feedback of the cover’s state. very cool.
with that, the card’s code looks like that:
type: entities
entities:
- entity: cover.heating_sonoff4ch_mixer
name: Mixer
icon: mdi:valve
- type: custom:slider-entity-row
entity: cover.heating_sonoff4ch_mixer
name: Position
icon: none
… and it just works.
now on we go, trying to get the cover’s actions implemented in a climate component - not sure yet if in HA or esphome directly, as the sensor data comes from another device…
hope this helps someone at some point.