renemarc/home-assistant-config

View on GitHub
sensors/climate.yaml

Summary

Maintainability
Test Coverage
#
# Bedroom climate
#
# Calibration offsets (set through Zwave configuration panel):
#   Humidity: +6.0% (0+6 = 6)
#   Temperature: -2.4°C (256-24 = 232 = 0xE8 -> +0x01 = 0xE801 = 59393 -> -65536 = -6143)
#
# @link https://www.tabsoverspaces.com/233657-calibrating-aeotec-multisensor-6s-temperature-using-openzwave-in-domoticz/
#
- platform: template
  sensors:
    bedroom_humidity_exact:
      friendly_name: "Bedroom Humidity Exact"
      unit_of_measurement: '%'
      device_class: humidity
      value_template: >-
        {% if state_attr('zwave.bedroom_multisensor', 'lastResponseRTT') > 0 %}
          {{ states('sensor.bedroom_multisensor_relative_humidity') | round(1) }}
        {% else %}
          unknown
        {% endif %}

    bedroom_humidity:
      friendly_name: "Bedroom Humidity"
      unit_of_measurement: '%'
      device_class: humidity
      value_template: >-
        {{ states('sensor.bedroom_humidity_exact') | round }}

    bedroom_luminance:
      friendly_name: "Bedroom Luminance"
      unit_of_measurement: 'lx'
      device_class: illuminance
      value_template: >-
        {% if state_attr('zwave.bedroom_multisensor', 'lastResponseRTT') > 0 %}
          {{ states('sensor.bedroom_multisensor_luminance') | round }}
        {% else %}
          unknown
        {% endif %}

    bedroom_luminance_friendly:
      friendly_name: "Bedroom Luminance"
      icon_template: "mdi:blur"
      value_template: >-
        {% set lx = states('sensor.bedroom_luminance') | int(-1) %}

        {% if lx > 5000 %}
          Outdoors
        {% elif lx > 1000 %}
          Bright
        {% elif lx > 400 %}
          Normal
        {% elif lx > 10 %}
          Dim
        {% elif lx >= 0 %}
          Dark
        {% else %}
          unknown
        {% endif %}

    bedroom_temperature_exact:
      friendly_name: "Bedroom Temperature Exact"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {% if state_attr('zwave.bedroom_multisensor', 'lastResponseRTT') > 0 %}
          {{ states('sensor.bedroom_multisensor_temperature') }}
        {% else %}
          unknown
        {% endif %}

    bedroom_temperature:
      friendly_name: "Bedroom Temperature"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {{ states('sensor.bedroom_temperature_exact') | round }}

- platform: filter
  name: "Bedroom Humidity Filtered"
  entity_id: sensor.bedroom_humidity_exact
  filters:
    - filter: outlier
      window_size: 4
      radius: 4.0
    - filter: lowpass
      time_constant: 10
      precision: 1

- platform: filter
  name: "Bedroom Temperature Filtered"
  entity_id: sensor.bedroom_temperature_exact
  filters:
    - filter: outlier
      window_size: 4
      radius: 2.0
    - filter: lowpass
      time_constant: 10
    - filter: time_simple_moving_average
      window_size: 00:05
      precision: 2


#
# Humidor climate
#
# Calibration offsets:
#   Humidity: -0.5%
#   Temperature: 0.2°C
#
- platform: mqtt
  name: "Humidor Multisensor"
  state_topic: "home/Acurite_tower_sensor/11846"
  unit_of_measurement: '%'
  device_class: humidity
  json_attributes_topic: "home/Acurite_tower_sensor/11846"
  json_attributes_template: "{{ value_json | tojson }}"
  value_template: >-
    {% set calibration = -0.5 %}
    {% set humidity = value_json.humidity %}
    {% set stale_hours = 12 %}
    {% set last_update = as_timestamp(value_json.time) %}

    {% if as_timestamp(now()) - last_update <= stale_hours*60*60 %}
      {{ humidity + calibration }}
    {% else %}
      unknown
    {% endif %}

- platform: mqtt
  name: "Humidor Temperature Exact"
  state_topic: "home/Acurite_tower_sensor/11846"
  unit_of_measurement: '°C'
  device_class: temperature
  json_attributes_topic: "home/Acurite_tower_sensor/11846"
  json_attributes_template: >-
    {
      "temperature_C": "{{ value_json.temperature_C }}"
    }
  value_template: >-
    {% set calibration = 0.2 %}
    {% set temperature = value_json.temperature_C %}
    {% set stale_hours = 12 %}
    {% set last_update = as_timestamp(value_json.time) %}

    {% if as_timestamp(now()) - last_update <= stale_hours*60*60 %}
      {{ (temperature + calibration) | round(1) }}
    {% else %}
      unknown
    {% endif %}

- platform: template
  sensors:
    humidor_humidity:
      friendly_name: "Humidor Humidity"
      unit_of_measurement: '%'
      device_class: humidity
      value_template: >-
        {{ states('sensor.humidor_multisensor') | round }}

    humidor_temperature:
      friendly_name: "Humidor Temperature"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {{ states('sensor.humidor_temperature_exact') | round }}

- platform: filter
  name: "Humidor Humidity Filtered"
  entity_id: sensor.humidor_multisensor
  filters:
    - filter: outlier
      window_size: 4
      radius: 4.0
    - filter: lowpass
      time_constant: 10
      precision: 1

- platform: filter
  name: "Humidor Temperature Filtered"
  entity_id: sensor.humidor_temperature_exact
  filters:
    - filter: outlier
      window_size: 4
      radius: 2.0
    - filter: lowpass
      time_constant: 10
    - filter: time_simple_moving_average
      window_size: 00:05
      precision: 2


#
# Kitchen climate
#
# Calibration offsets:
#   Temperature: -0.5°C
#
# The Ecolink FireFighter smoke alarm monitor is in the kitchen, but even if
# it is a Z Wave device, is offers no configuration options trough the Z Wave
# management interface. We'll override the values here instead.
#
- platform: template
  sensors:
    kitchen_temperature_exact:
      friendly_name: "Kitchen Temperature Exact"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {% set calibration = -0.5 %}
        {% set temperature = 'unknown' %}
        {% if state_attr('zwave.siren_monitor', 'lastResponseRTT') > 0 %}
          {% set temperature = states('sensor.siren_monitor_temperature') | round(1) %}
        {% endif %}

        {% if temperature != 'unknown' %}
          {{ temperature + calibration }}
        {% else %}
          unknown
        {% endif %}

    kitchen_temperature:
      friendly_name: "Kitchen Temperature"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {{ states('sensor.kitchen_temperature_exact') | round }}

- platform: filter
  name: "Kitchen Temperature Filtered"
  entity_id: sensor.kitchen_temperature_exact
  filters:
    - filter: outlier
      window_size: 4
      radius: 2.0
    - filter: lowpass
      time_constant: 10
    - filter: time_simple_moving_average
      window_size: 00:05
      precision: 2


#
# Lounge climate
#
# Calibration offsets (set through Zwave configuration panel):
#   Humidity: +3.7% (0+4 = 4)
#   Temperature: -0.8°C (256-8 = 248 = 0xF8 -> +0x01 = 0xF801 = 63489 -> -65536 = -2047)
#
# @link https://www.tabsoverspaces.com/233657-calibrating-aeotec-multisensor-6s-temperature-using-openzwave-in-domoticz/
# @link https://docs.microsoft.com/en-us/windows/desktop/sensorsapi/understanding-and-interpreting-lux-values
#
- platform: template
  sensors:
    lounge_humidity_exact:
      friendly_name: "Lounge Humidity Exact"
      unit_of_measurement: '%'
      device_class: humidity
      value_template: >-
        {% if state_attr('zwave.lounge_multisensor', 'lastResponseRTT') > 0 %}
          {{ states('sensor.lounge_multisensor_relative_humidity') }}
        {% else %}
          unknown
        {% endif %}

    lounge_humidity:
      friendly_name: "Lounge Humidity"
      unit_of_measurement: '%'
      device_class: humidity
      value_template: >-
        {{ states('sensor.lounge_humidity_exact') | round }}

    lounge_luminance:
      friendly_name: "Lounge Luminance"
      unit_of_measurement: 'lx'
      device_class: illuminance
      value_template: >-
        {% if state_attr('zwave.lounge_multisensor', 'lastResponseRTT') > 0 %}
          {{ states('sensor.lounge_multisensor_luminance') | round }}
        {% else %}
          unknown
        {% endif %}

    lounge_luminance_friendly:
      friendly_name: "Lounge Luminance"
      icon_template: "mdi:blur"
      value_template: >-
        {% set lx = states('sensor.lounge_luminance') | int(-1) %}

        {% if lx > 5000 %}
          Outdoors
        {% elif lx > 1000 %}
          Bright
        {% elif lx > 400 %}
          Normal
        {% elif lx > 10 %}
          Dim
        {% elif lx >= 0 %}
          Dark
        {% else %}
          unknown
        {% endif %}

    lounge_temperature_exact:
      friendly_name: "Lounge Temperature Exact"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {% if state_attr('zwave.lounge_multisensor', 'lastResponseRTT') > 0 %}
          {{ states('sensor.lounge_multisensor_temperature') }}
        {% else %}
          unknown
        {% endif %}

    lounge_temperature:
      friendly_name: "Lounge Temperature"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {{ states('sensor.lounge_temperature_exact') | round }}

- platform: filter
  name: "Lounge Humidity Filtered"
  entity_id: sensor.lounge_humidity_exact
  filters:
    - filter: outlier
      window_size: 4
      radius: 4.0
    - filter: lowpass
      time_constant: 10
      precision: 1

- platform: filter
  name: "Lounge Temperature Filtered"
  entity_id: sensor.lounge_temperature_exact
  filters:
    - filter: outlier
      window_size: 4
      radius: 2.0
    - filter: lowpass
      time_constant: 10
    - filter: time_simple_moving_average
      window_size: 00:05
      precision: 2


#
# Washroom climate
#
# Calibration offsets (set through Zwave configuration panel):
#   Humidity: +2.0% (0+2 = 2)
#   Temperature: -1.3°C (256-13 = 243 = 0xF3 -> +0x01 = 0xF301 = 62209 -> -65536 = -3327)
#
# @link https://www.tabsoverspaces.com/233657-calibrating-aeotec-multisensor-6s-temperature-using-openzwave-in-domoticz/
#
- platform: template
  sensors:
    washroom_humidity_exact:
      friendly_name: "Washroom Humidity Exact"
      unit_of_measurement: '%'
      device_class: humidity
      value_template: >-
        {% if state_attr('zwave.washroom_multisensor', 'lastResponseRTT') > 0 %}
          {{ states('sensor.washroom_multisensor_relative_humidity') }}
        {% else %}
          unknown
        {% endif %}

    washroom_humidity:
      friendly_name: "Washroom Humidity"
      unit_of_measurement: '%'
      device_class: humidity
      value_template: >-
        {{ states('sensor.washroom_humidity_exact') | round }}

    washroom_luminance:
      friendly_name: "Washroom Luminance"
      unit_of_measurement: 'lx'
      device_class: illuminance
      value_template: >-
        {% if state_attr('zwave.washroom_multisensor', 'lastResponseRTT') > 0 %}
          {{ states('sensor.washroom_multisensor_luminance') | round }}
        {% else %}
          unknown
        {% endif %}

    washroom_luminance_friendly:
      friendly_name: "Washroom Luminance"
      icon_template: "mdi:blur"
      value_template: >-
        {% set lx = states('sensor.washroom_luminance') | int(-1) %}

        {% if lx > 5000 %}
          Outdoors
        {% elif lx > 1000 %}
          Bright
        {% elif lx > 400 %}
          Normal
        {% elif lx > 10 %}
          Dim
        {% elif lx >= 0 %}
          Dark
        {% else %}
          unknown
        {% endif %}

    washroom_temperature_exact:
      friendly_name: "Washroom Temperature Exact"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {% if state_attr('zwave.washroom_multisensor', 'lastResponseRTT') > 0 %}
          {{ states('sensor.washroom_multisensor_temperature') }}
        {% else %}
          unknown
        {% endif %}

    washroom_temperature:
      friendly_name: "Washroom Temperature"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {{ states('sensor.washroom_temperature_exact') | round }}

- platform: filter
  name: "Washroom Humidity Filtered"
  entity_id: sensor.washroom_humidity_exact
  filters:
    - filter: outlier
      window_size: 4
      radius: 4.0
    - filter: lowpass
      time_constant: 10
      precision: 1

- platform: filter
  name: "Washroom Temperature Filtered"
  entity_id: sensor.washroom_temperature_exact
  filters:
    - filter: outlier
      window_size: 4
      radius: 2.0
    - filter: lowpass
      time_constant: 10
    - filter: time_simple_moving_average
      window_size: 00:05
      precision: 2


#
# Airthings Wave radon detector
#
# The Airthings Wave radon detector is a Bluetooth Low Energy (BLE) device.
# Instead of using its mobile app, a Raspberry Pi Zero W is setup as a Bluetooth
# to MQTT bridge allowing the device's sensors to be integrated easily.
#
# Thanks Herb Peyerl! :-)
#
# @link https://github.com/hpeyerl/airthingswave-mqtt
# @link https://airthings.com/raspberry-pi/
# @link https://airthings.com/wave/
#
- platform: mqtt
  name: "Radon Daily"
  state_topic: "airthings-wave/Radon-Day"
  unit_of_measurement: 'Bq/m3'
  icon: "mdi:radioactive"
  value_template: >-
    {{ value | round }}

- platform: mqtt
  name: "Radon Long Term"
  state_topic: "airthings-wave/Radon-Long-Term"
  unit_of_measurement: 'Bq/m3'
  icon: "mdi:radioactive"
  value_template: >-
    {{ value | round }}

- platform: mqtt
  name: "Radon Detector Humidity Exact"
  state_topic: "airthings-wave/Humidity"
  unit_of_measurement: '%'
  device_class: humidity
  value_template: >-
    {% set calibration = 0 %}
    {% set humidity = value | float %}

    {{ (humidity + calibration) | round(1) }}

- platform: mqtt
  name: "Radon Detector Temperature Exact"
  state_topic: "airthings-wave/Temperature"
  unit_of_measurement: '°C'
  device_class: temperature
  value_template: >-
    {% set calibration = 0 %}
    {% set temperature = value | float %}

    {{ (temperature + calibration) | round(1) }}

- platform: template
  sensors:
    radon_friendly:
      friendly_name: "Radon"
      icon_template: >-
        {{ state_attr('sensor.radon_daily', 'icon') }}
      value_template: >-
        {% set radon = states('sensor.radon_daily') | int(-1) %}

        {% if radon >= 200 %}
          Danger
        {% elif radon >= 150 %}
          High
        {% elif radon >= 100 %}
          OK-High
        {% elif radon >= 0 %}
          OK
        {% else %}
          unknown
        {% endif %}

    radon_detector_humidity:
      friendly_name: "Radon Detector Humidity"
      unit_of_measurement: '%'
      device_class: humidity
      value_template: >-
        {{ states('sensor.radon_detector_humidity_exact') | round }}

    radon_detector_temperature:
      friendly_name: "Radon Detector Temperature"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {{ states('sensor.radon_detector_temperature_exact') | round }}

- platform: filter
  name: "Radon Detector Humidity Filtered"
  entity_id: sensor.radon_detector_humidity_exact
  filters:
    - filter: lowpass
      time_constant: 10
      precision: 1

- platform: filter
  name: "Radon Detector Temperature Filtered"
  entity_id: sensor.radon_detector_temperature_exact
  filters:
    - filter: lowpass
      time_constant: 10
      precision: 1


#
# Average temperature
#
# The appartment being mostly open plan, one can calculate an average
# temperature value between calibrated sensors set in different rooms.
#
# Uses the current reading because temperature changes are readily felt.
#
- platform: min_max
  name: "Average Temperature Exact"
  type: mean
  round_digits: 0
  entity_ids:
    - sensor.bedroom_temperature_exact
    - sensor.lounge_temperature_exact

- platform: template
  sensors:
    average_temperature:
      friendly_name: "Temperature"
      unit_of_measurement: '°C'
      device_class: temperature
      value_template: >-
        {{ states('sensor.average_temperature_exact') | round }}


#
# Average humidity
#
# The appartment being mostly open plan, one can calculate an average humidity
# value between calibrated sensors set in different rooms.
#
# Uses the filtered reading because humidity hikes and drops can happen rapidly
# but their real effect is smoothed over time due to humidity absorption and
# release of furniture, fabrics and building materials.
#
- platform: min_max
  name: "Average Humidity Exact"
  type: mean
  round_digits: 1
  entity_ids:
    - sensor.bedroom_humidity_filtered
    - sensor.lounge_humidity_filtered

- platform: template
  sensors:
    average_humidity:
      friendly_name: "Humidity"
      unit_of_measurement: '%'
      device_class: humidity
      icon_template: "mdi:water-percent"
      value_template: >-
        {{ states('sensor.average_humidity_exact') | round }}

- platform: template
  sensors:
    average_humidity_friendly:
      friendly_name: "Humidity"
      icon_template: >-
        {{ state_attr('sensor.average_humidity', 'icon') }}
      value_template: >-
        {% set humidity = states('sensor.average_humidity') | int(-1) %}

        {% if humidity > 90 %}
          Mold imminent
        {% elif humidity > 70 %}
          Mold alert
        {% elif humidity > 55 %}
          Mold warning
        {% elif humidity > 50 %}
          OK-High
        {% elif humidity > 35 %}
          OK
        {% elif humidity >= 30 %}
          OK-Low
        {% elif humidity >= 0 %}
          Too dry
        {% else %}
          unknown
        {% endif %}

    average_humidity_emoji:
      friendly_name: "Humidity"
      icon_template: >-
        {{ state_attr('sensor.average_humidity', 'icon') }}
      value_template: >-
        {% set humidity = states('sensor.average_humidity') | int(-1) %}

        {% if humidity > 90 %}
          ☣️
        {% elif humidity > 70 %}
          🍄
        {% elif humidity > 55 %}
          🧫
        {% elif humidity > 50 %}
          💦
        {% elif humidity > 35 %}
          ✅
        {% elif humidity >= 30 %}
          🌵
        {% elif humidity >= 0 %}
          🏜️
        {% else %}
          ❓
        {% endif %}