SIA 180 Adaptive Comfort

SIA 180 Adaptive Comfort#

Goal

Evaluate indoor thermal comfort according to the SIA 180:2014 adaptive comfort model. The plot shows indoor room temperature against outdoor temperature, overlaid with the SIA 180 comfort boundaries.

Data Basis

Two datasets are used:

  • centralOutsideTemp.csv — outdoor temperature (columns: time, centralOutsideTemp; separator ;)

  • flatTempHum.csv — indoor temperature (column FlatA_Temp; separator ;)

Each is prepared as a 2-column DataFrame [timestamp, value]. Time ranges are aligned before plotting.

Data Preparation#

import pandas as pd

base_url = "https://raw.githubusercontent.com/retomarek/edap/main/edap/sampleData/"

# --- Outdoor temperature ---
raw_out = pd.read_csv(base_url + "centralOutsideTemp.csv", sep=";")
raw_out["time"] = pd.to_datetime(raw_out["time"])
df_outdoor = raw_out.copy()
df_outdoor.columns = ["timestamp", "value"]
df_outdoor = df_outdoor.dropna()

# --- Indoor temperature ---
raw_in = pd.read_csv(base_url + "flatTempHum.csv", sep=";")
raw_in["time"] = pd.to_datetime(raw_in["time"])
df_room = raw_in[["time", "FlatA_Temp"]].copy()
df_room.columns = ["timestamp", "value"]
df_room = df_room.dropna()

# Align time ranges
t_start = max(df_outdoor["timestamp"].min(), df_room["timestamp"].min())
t_end = min(df_outdoor["timestamp"].max(), df_room["timestamp"].max())
df_outdoor = df_outdoor[(df_outdoor["timestamp"] >= t_start) & (df_outdoor["timestamp"] <= t_end)]
df_room = df_room[(df_room["timestamp"] >= t_start) & (df_room["timestamp"] <= t_end)]

print(f"Outdoor: {len(df_outdoor)} rows, Indoor: {len(df_room)} rows")
print(f"Time range: {t_start} to {t_end}")
Outdoor: 17123 rows, Indoor: 16484 rows
Time range: 2018-10-03 00:00:00 to 2020-09-15 21:00:00

Visualization#

from pyedautils.plots import plot_comfort_sia180

fig = plot_comfort_sia180(df_outdoor, df_room, title="SIA 180 — Adaptive Comfort")
fig.show()
Customization

You can use different indoor sensors by selecting another column from flatTempHum.csv, for example FlatB_Temp.

df_room = raw_in[["time", "FlatB_Temp"]].copy()
df_room.columns = ["timestamp", "value"]