This Homatica research initiative by Claudio Cabete explores real-time HVAC performance monitoring and adaptive control strategies to improve comfort and efficiency while maintaining full local data ownership.



Traditional thermostats react slowly and waste energy, while many smart thermostats rely on cloud services, risking your privacy. My goal was a privacy-first, locally hosted HVAC controller that anticipates thermal behavior, adapts system output dynamically, and adapts dynamically—all without third-party data sharing. This project embodies Homatica’s mission: modular, resilient, and customizable home automation built with open-source tools like Home Assistant.

All components communicate via MQTT, with the Pi 4 orchestrating logic and logging telemetry to MariaDB.
import machine
import time
from umqtt.simple import MQTTClient
# Servo control example
servo = machine.PWM(machine.Pin(16))
servo.freq(50)
def set_servo_duty(duty):
servo.duty_u16(int(duty * 65535 / 100))
# MQTT setup
client = MQTTClient("pico_w", "mqtt_broker_ip")
client.connect()
def on_message(topic, msg):
if topic == b"hvac/ctrl/outputs":
duty = float(msg.decode().split("adaptive_output:")[1])
set_servo_duty(duty)
client.set_callback(on_message)
client.subscribe("hvac/ctrl/outputs")
Active schedule selected:
eid=0
mode=hold
sch_type=AC
sch_hvac_mode=AC
setpoint=24.7
fan_on=0
fan_off=1800
HEAT_TEMP_TRIGGER: 18
AC_TEMP_TRIGGER: 26
heat_max_setpoint: 20
ac_max_setpoint: 25
dead_band: 0.7
ac_min_run_secs: 900
ac_min_off_secs: 300
ac_fan_delay_secs: 60
furnace_fan_delay_secs: 90
hvac_mode: AC
sch_mode: AC
settemp: 24.7
setadjtemp: 24.7
fan_cycle_on_secs: 0
fan_cycle_off_secs: 1800
udv_hvac_mode: AC
🌦️ Weather:
temperature: 72°F
humidity: 97%
condition: rainy
forecast:
temperature: 77°F
templow: 72°F
humidity: 95%
wind_speed: 13.17 km/h
uv_index: 5.3
precipitation: 0.47
datetime: 2025-09-25T16:00:00+00:00
🌡️ Sensors:
HVAC Central Unit CTLR:
In Air Temp: 22.81°C
Internal Temp: 29.86°C
Out Air Temp: 11.63°C
Portable Thermostat:
Ambient Temp: 22.94°C
Internal Temp: 29.86°C
BedRoom Thermostat:
Ambient Temp: 25.69°C
Internal Temp: 33.60°C
Mode: AC
Setpoint: 24.7
AvgTemp: 24.8
TempDiff: 0.10
ac_state_change_lap: 575.31
ac_state: 1
Time since last fan state change: 514.78s
Air Temp Delta:
temp_diff_air: 11.19
fan_diff_on: 6.0
fan_diff_off: 3.0
Thermostat Temp Delta:
temp_diff_thermostats: 2.75
thermostat_diff_on: 4.5
thermostat_diff_off: 3.7
During AC Active:
temp_diff_air: 11.19
registers:
air_in_out_delta: True
thermostats_delta: False
fan_cycle: False
ac_fan_delay: True
furnace_fan_delay: False
post_ac_fan: False
post_furnace_fan: False
circfan_state: 1
fan_reason: air_in_out_delta, ac_fan_delay
Topic: hvac/ctrl/outputs
Payload:
device_id: 7
settemp: 24.7
setadjtemp: 24.7
udv_hvac_mode: AC
fan_cycle_on_secs: 0
fan_cycle_off_secs: 1800
sch_mode: hold
adaptive_output: 11.4
hvac_mode: AC
avg_temp: 24.8
data:
- ioid: 0, io_v: on
- ioid: 1, io_v: off
- ioid: 2, io_v: on
- ioid: 16, io_v: on, io_freq: 50, io_duty: 11.4
This HVAC controller was crafted with AI assistance, from optimizing MicroPython code to refining control logic and documenting the build. AI helped me explore edge cases and streamline the system, but the core design—every wire, code line, and debug session—came from my passion for DIY automation, sparked by building an FM transmitter at age 12.
This project is an experimental research platform and not a commercial product. It is not intended as installation guidance or modification instructions for HVAC equipment.