feat(measurements): accept indoor CO2, temperature and humidity

Room climate from a home automation system gets three types of its own:
INDOOR_CO2 (ppm), INDOOR_TEMPERATURE (celsius, shown in Fahrenheit for
imperial readers) and INDOOR_HUMIDITY (percent). They arrive through the
existing ingest token (measurements:write, source EXTERNAL), sit in the
environment cluster beside daylight, and the daily rollup carries their
mean, low and high like any spot reading. They never mix with the body
temperatures or with the outdoor environment channels.

The Home Assistant page documents the three types, a rest_command that
sends a room as one request, a single-room automation, and an
importable blueprint (docs/integrations/blueprints) that skips sensors
reporting unknown or non-numeric states, converts Fahrenheit, and
stamps readings to the minute so a retried push is refused rather than
written twice.
This commit is contained in:
Marc-André Bombeck committed 2026-10-21 20:26:15 +02:00
1 parent b76826a5f8
commit cc8ea3dfbb
32 files changed
+463 -9

No files matched your search

+3
View File
@@ -917,6 +917,9 @@
"typeMindfulMinutes": "Achtsamkeitsminuten",
"typeStateOfMindValence": "Gemütszustand",
"typeAfibBurden": "VHF-Last",
"typeIndoorCo2": "CO₂ (innen)",
"typeIndoorTemperature": "Raumtemperatur",
"typeIndoorHumidity": "Luftfeuchtigkeit (innen)",
"durationReadAs": "Gelesen als {duration}",
"durationHoursMinutes": "{hours} Std. {minutes} Min.",
"durationHoursOnly": "{hours} Std.",
+3
View File
@@ -917,6 +917,9 @@
"typeMindfulMinutes": "Mindful minutes",
"typeStateOfMindValence": "State of mind",
"typeAfibBurden": "AFib burden",
"typeIndoorCo2": "Indoor CO₂",
"typeIndoorTemperature": "Indoor temperature",
"typeIndoorHumidity": "Indoor humidity",
"durationReadAs": "Read as {duration}",
"durationHoursMinutes": "{hours} h {minutes} min",
"durationHoursOnly": "{hours} h",
+3
View File
@@ -917,6 +917,9 @@
"typeMindfulMinutes": "Minutos de atención plena",
"typeStateOfMindValence": "Estado de ánimo",
"typeAfibBurden": "Carga de FA",
"typeIndoorCo2": "CO₂ interior",
"typeIndoorTemperature": "Temperatura interior",
"typeIndoorHumidity": "Humedad interior",
"durationReadAs": "Se lee como {duration}",
"durationHoursMinutes": "{hours} h {minutes} min",
"durationHoursOnly": "{hours} h",
+3
View File
@@ -917,6 +917,9 @@
"typeMindfulMinutes": "Minutes de pleine conscience",
"typeStateOfMindValence": "État d’esprit",
"typeAfibBurden": "Charge de FA",
"typeIndoorCo2": "CO₂ intérieur",
"typeIndoorTemperature": "Température intérieure",
"typeIndoorHumidity": "Humidité intérieure",
"durationReadAs": "Compris comme {duration}",
"durationHoursMinutes": "{hours} h {minutes} min",
"durationHoursOnly": "{hours} h",
+3
View File
@@ -917,6 +917,9 @@
"typeMindfulMinutes": "Minuti di consapevolezza",
"typeStateOfMindValence": "Stato d’animo",
"typeAfibBurden": "Carico di FA",
"typeIndoorCo2": "CO₂ interna",
"typeIndoorTemperature": "Temperatura interna",
"typeIndoorHumidity": "Umidità interna",
"durationReadAs": "Letto come {duration}",
"durationHoursMinutes": "{hours} h {minutes} min",
"durationHoursOnly": "{hours} h",
+3
View File
@@ -917,6 +917,9 @@
"typeMindfulMinutes": "마음 챙기기 시간(분)",
"typeStateOfMindValence": "마음 상태",
"typeAfibBurden": "심방세동 부담",
"typeIndoorCo2": "실내 CO₂",
"typeIndoorTemperature": "실내 온도",
"typeIndoorHumidity": "실내 습도",
"durationReadAs": "{duration}(으)로 읽었어요",
"durationHoursMinutes": "{hours}시간 {minutes}분",
"durationHoursOnly": "{hours}시간",
+3
View File
@@ -917,6 +917,9 @@
"typeMindfulMinutes": "Mindfulnessminuten",
"typeStateOfMindValence": "Gemoedstoestand",
"typeAfibBurden": "AF-belasting",
"typeIndoorCo2": "CO₂ binnen",
"typeIndoorTemperature": "Binnentemperatuur",
"typeIndoorHumidity": "Luchtvochtigheid binnen",
"durationReadAs": "Gelezen als {duration}",
"durationHoursMinutes": "{hours} u {minutes} min",
"durationHoursOnly": "{hours} u",
+3
View File
@@ -917,6 +917,9 @@
"typeMindfulMinutes": "Minuty uważności",
"typeStateOfMindValence": "Stan umysłu",
"typeAfibBurden": "Obciążenie AF",
"typeIndoorCo2": "CO₂ w pomieszczeniu",
"typeIndoorTemperature": "Temperatura w pomieszczeniu",
"typeIndoorHumidity": "Wilgotność w pomieszczeniu",
"durationReadAs": "Odczytano jako {duration}",
"durationHoursMinutes": "{hours} godz. {minutes} min",
"durationHoursOnly": "{hours} godz.",