Optimising My Office Climate with Home Assistant

Working from my converted garage office has been a mixed blessing. It’s a dedicated space with plenty of potential, but being a single-skin brick construction it’s prone to damp, humidity swings, and uncomfortable temperatures in both winter and summer. After months of experimenting, I finally put together a climate system that actually works: a heater, a circulation fan, an extractor fan, a dehumidifier, and smart automation via Home Assistant.

The Problems I Faced

  • Cold in winter: The space drops quickly without heating. My fan heater pulls 2.6 kWh when running, so I had to balance warmth with energy cost.
  • Humidity and damp: With two external brick walls and a wooden garage door, moisture crept in, especially in the corners.
  • Stale air: With no windows, airflow was almost non-existent, making the room stuffy and encouraging condensation.
  • Inefficient drying: Ventilation alone wasn’t always enough, especially when the outside air was as humid as inside.

Hardware Setup

Here’s the full kit I’m now running:

  • Heater: A plug-in fan heater with thermostat control.
  • Circulation Fan: A small oscillating desk fan to keep air moving evenly across the space.
  • Extractor Fan: Door-mounted, with a vent grill at the bottom to allow fresh air to enter.
  • Dehumidifier: Compact compressor unit, integrated into Home Assistant using the generic hygrostat platform.
  • Sensors: Zigbee temperature and humidity sensors placed inside and outside for comparison.

The Home Assistant Logic

The guiding principle: Only heat, ventilate, or dehumidify when it actually improves the indoor climate, without wasting energy.

Heater Control

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
climate:
  - platform: generic_thermostat
    name: Office Heater
    heater: switch.office_heater
    target_sensor: sensor.office_temperature
    min_temp: 14
    max_temp: 22
    ac_mode: false
    target_temp: 20
    cold_tolerance: 0.5
    hot_tolerance: 0.5
    min_cycle_duration:
      minutes: 5
  • Occupied: 20–21°C
  • Unoccupied: 14–16°C

Extractor Fan + Circulation Fan

The extractor only runs if the outside air is drier, and humidity inside is above 55%.
When the extractor is active, the circulation fan runs at the same time to help move the air effectively.

1
2
3
4
5
6
7
8
template:
  - binary_sensor:
      - name: "Office Ventilation Needed"
        state: >
          {% set inside_rh = states('sensor.office_humidity') | float %}
          {% set outside_rh = states('sensor.outside_humidity') | float %}
          {% set drier_outside = is_state('binary_sensor.drier_outside', 'on') %}
          {{ inside_rh > 55 and drier_outside }}          
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
automation:
  - alias: "Ventilate Office"
    trigger:
      - platform: state
        entity_id: binary_sensor.office_ventilation_needed
        to: "on"
    action:
      - service: switch.turn_on
        entity_id:
          - switch.office_extractor_fan
          - switch.office_desk_fan

  - alias: "Stop Ventilation"
    trigger:
      - platform: state
        entity_id: binary_sensor.office_ventilation_needed
        to: "off"
    action:
      - service: switch.turn_off
        entity_id:
          - switch.office_extractor_fan
          - switch.office_desk_fan

In addition, the desk fan runs for 5 minutes out of every 15 when the office is occupied, with a quiet period enforced between 23:00 and 07:00:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
automation:
  - alias: "Circulate Air on Cycle"
    trigger:
      - platform: time_pattern
        minutes: "/15"
    condition:
      - condition: time
        after: "07:00:00"
        before: "23:00:00"
      - condition: state
        entity_id: input_boolean.office_occupied
        state: "on"
    action:
      - service: switch.turn_on
        entity_id: switch.office_desk_fan
      - delay: "00:05:00"
      - service: switch.turn_off
        entity_id: switch.office_desk_fan

Dehumidifier Control

When ventilation isn’t possible (because the outside air is too damp), the dehumidifier steps in.
It’s set up in Home Assistant using the generic hygrostat integration:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
climate:
  - platform: generic_hygrostat
    name: Office Dehumidifier
    humidifier: switch.office_dehumidifier
    target_sensor: sensor.office_humidity
    min_humidity: 45
    max_humidity: 60
    target_humidity: 50
    dry_tolerance: 2
    wet_tolerance: 2

This keeps humidity between 45–55%, switching the dehumidifier on only when needed.

Results So Far

  • Comfortable workspace: Temperature stays steady at 20–21°C when I’m in the office.
  • Reduced damp: Humidity stays around 50–55% consistently.
  • Smart airflow: The extractor runs only when outside air helps, otherwise the dehumidifier takes over.
  • Even climate: The circulation fan keeps air moving—either alongside the extractor or in short cycles during the day.

Next Steps

  • Add seasonal profiles (different thresholds for summer/winter).
  • Experiment with energy-saving schedules (e.g. night vs day targets).
  • Long-term: insulate walls and door to reduce heating and dehumidifier workload.

This project is part of my ongoing effort to make the garage-office both comfortable and efficient. With the heater, fan, extractor, and dehumidifier, the climate finally feels under control.


↤ Previous Post