renemarc/home-assistant-config

View on GitHub
sensors/world.yaml

Summary

Maintainability
Test Coverage
#
# COVID-19
#
# Estimations are based on average survival rate, incubation period, and time
# until death.
#
# @link: https://medium.com/@tomaspueyo/coronavirus-act-today-or-people-will-die-f4d3d9cd99ca
# @link https://community.home-assistant.io/t/help-with-corona-scrape-sensor/174973/
# @link https://github.com/midas-network/COVID-19/tree/master/parameter_estimates/2019_novel_coronavirus
#
- platform: template
  sensors:
    coronavirus_time_until_death:
      friendly_name: "Coronavirus Time Until Death"
      icon_template: "mdi:timer-sand"
      unit_of_measurement: 'day'
      value_template: "17.3"

    coronavirus_time_doubling:
      friendly_name: "Coronavirus Doubling Time"
      icon_template: "mdi:expand-all"
      unit_of_measurement: 'day'
      value_template: "6.2"

- platform: rest
  name: "Coronavirus Country Current"
  resource: "https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov_cases/FeatureServer/1/query?f=json&where=(Country_Region%3D%27Canada%27)&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Confirmed%22%2C%22outStatisticFieldName%22%3A%22Confirmed%22%7D%2C%20%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Deaths%22%2C%22outStatisticFieldName%22%3A%22Deaths%22%7D%2C%20%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Recovered%22%2C%22outStatisticFieldName%22%3A%22Recovered%22%7D%5D"
  value_template: >-
    {% set confirmed = value_json.features[0].attributes.Confirmed | int %}
    {% set deaths = value_json.features[0].attributes.Deaths | int %}
    {% set recovered = value_json.features[0].attributes.Recovered | int %}

    {% if confirmed >= 0 and confirmed >= 0 and confirmed >= 0 %}
      {{ confirmed - deaths - recovered }}
    {% endif %}
  json_attributes_path: "$.features[0].attributes"
  json_attributes:
    - Confirmed
    - Deaths
    - Recovered
  scan_interval: 3600

- platform: rest
  name: "Coronavirus Neighbor Current"
  resource: "https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov_cases/FeatureServer/1/query?f=json&where=(Country_Region%3D%27US%27)&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Confirmed%22%2C%22outStatisticFieldName%22%3A%22Confirmed%22%7D%2C%20%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Deaths%22%2C%22outStatisticFieldName%22%3A%22Deaths%22%7D%2C%20%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Recovered%22%2C%22outStatisticFieldName%22%3A%22Recovered%22%7D%5D"
  value_template: >-
    {% set confirmed = value_json.features[0].attributes.Confirmed | int %}
    {% set deaths = value_json.features[0].attributes.Deaths | int %}
    {% set recovered = value_json.features[0].attributes.Recovered | int %}

    {% if confirmed >= 0 and confirmed >= 0 and confirmed >= 0 %}
      {{ confirmed - deaths - recovered }}
    {% endif %}
  json_attributes_path: "$.features[0].attributes"
  json_attributes:
    - Confirmed
    - Deaths
    - Recovered
  scan_interval: 3600

- platform: rest
  name: "Coronavirus Province Current"
  resource: "https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov_cases/FeatureServer/1/query?f=json&where=(Country_Region%3D%27Canada%27)%20AND%20(Province_State%20LIKE%20%27%25Quebec%27)%20%20&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Confirmed%22%2C%22outStatisticFieldName%22%3A%22Confirmed%22%7D%2C%20%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Deaths%22%2C%22outStatisticFieldName%22%3A%22Deaths%22%7D%2C%20%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Recovered%22%2C%22outStatisticFieldName%22%3A%22Recovered%22%7D%5D"
  value_template: >-
    {% set confirmed = value_json.features[0].attributes.Confirmed | int %}
    {% set deaths = value_json.features[0].attributes.Deaths | int %}
    {% set recovered = value_json.features[0].attributes.Recovered | int %}

    {% if confirmed >= 0 and confirmed >= 0 and confirmed >= 0 %}
      {{ confirmed - deaths - recovered }}
    {% endif %}
  json_attributes_path: "$.features[0].attributes"
  json_attributes:
    - Confirmed
    - Deaths
    - Recovered
  scan_interval: 3600

- platform: rest
  name: "Coronavirus World Current"
  resource: "https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov_cases/FeatureServer/1/query?f=json&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Confirmed%22%2C%22outStatisticFieldName%22%3A%22Confirmed%22%7D%2C%20%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Deaths%22%2C%22outStatisticFieldName%22%3A%22Deaths%22%7D%2C%20%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Recovered%22%2C%22outStatisticFieldName%22%3A%22Recovered%22%7D%5D"
  value_template: >-
    {% set confirmed = value_json.features[0].attributes.Confirmed | int %}
    {% set deaths = value_json.features[0].attributes.Deaths | int %}
    {% set recovered = value_json.features[0].attributes.Recovered | int %}

    {% if confirmed >= 0 and confirmed >= 0 and confirmed >= 0 %}
      {{ confirmed - deaths - recovered }}
    {% endif %}
  json_attributes_path: "$.features[0].attributes"
  json_attributes:
    - Confirmed
    - Deaths
    - Recovered
  scan_interval: 3600

- platform: template
  sensors:
    coronavirus_neighbor_confirmed:
      friendly_name: "Coronavirus Neighbor Confirmed"
      icon_template: "mdi:hospital-box"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_neighbor_current', 'Confirmed') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_neighbor_deaths:
      friendly_name: "Coronavirus Neighbor Deaths"
      icon_template: "mdi:emoticon-cry-outline"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_neighbor_current', 'Deaths') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_neighbor_recovered:
      friendly_name: "Coronavirus Neighbor Recovered"
      icon_template: "mdi:emoticon-happy-outline"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_neighbor_current', 'Recovered') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_neighbor_mortality_rate:
      friendly_name: "Coronavirus Neighbor Mortality Rate"
      icon_template: "mdi:ticket-percent"
      unit_of_measurement: '%'
      value_template: >-
        {% set confirmed = states('sensor.coronavirus_neighbor_confirmed') | int %}
        {% set deaths = states('sensor.coronavirus_neighbor_deaths') | int %}
        {{ (deaths / confirmed * 100) | round(2) }}

    coronavirus_neighbor_estimated:
      friendly_name: "Coronavirus Neighbor Estimated"
      icon_template: "mdi:emoticon-neutral-outline"
      value_template: >-
        {% set deaths = states('sensor.coronavirus_neighbor_deaths') | int %}
        {% set mortality = states('sensor.coronavirus_neighbor_mortality_rate') | float %}
        {% set doubling = states('sensor.coronavirus_time_doubling') | float %}
        {% set ttl = states('sensor.coronavirus_time_until_death') | float %}

        {% set ratio = 2**(ttl/doubling) / mortality * 100 %}
        {% set estimate = (ratio * deaths) | round %}
        {% set length = estimate | string | length %}
        {% set divider = ('1' + '0' * (length - 2)) | int %}

        {{ ((ratio * deaths / divider) | round) * divider }}

    coronavirus_neighbor_estimated_deaths:
      friendly_name: "Coronavirus Neighbor Estimated Deaths"
      icon_template: "mdi:emoticon-frown-outline"
      value_template: >-
        {% set confirmed = states('sensor.coronavirus_neighbor_estimated') | int %}
        {% set mortality = states('sensor.coronavirus_neighbor_mortality_rate') | float %}

        {% if confirmed > 0 or mortality > 0 %}
          {{ (confirmed * mortality / 100) | int }}
        {% endif %}
      attribute_templates:
        could_die_within: >-
          {{ states('sensor.coronavirus_time_until_death') | float }} days
        formula: >-
          2^({{ states('sensor.coronavirus_time_until_death') | float }} / {{ states('sensor.coronavirus_time_doubling') | float }}) / {{ states('sensor.coronavirus_neighbor_mortality_rate') }} [2^(days_until_death / case_doubling_time) / world_mortality_rate]

- platform: template
  sensors:
    coronavirus_country_confirmed:
      friendly_name: "Coronavirus Country Confirmed"
      icon_template: "mdi:hospital-box"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_country_current', 'Confirmed') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_country_deaths:
      friendly_name: "Coronavirus Country Deaths"
      icon_template: "mdi:emoticon-cry-outline"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_country_current', 'Deaths') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_country_recovered:
      friendly_name: "Coronavirus Country Recovered"
      icon_template: "mdi:emoticon-happy-outline"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_country_current', 'Recovered') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_country_mortality_rate:
      friendly_name: "Coronavirus Country Mortality Rate"
      icon_template: "mdi:ticket-percent"
      unit_of_measurement: '%'
      value_template: >-
        {% set confirmed = states('sensor.coronavirus_country_confirmed') | int %}
        {% set deaths = states('sensor.coronavirus_country_deaths') | int %}
        {{ (deaths / confirmed * 100) | round(2) }}

    coronavirus_country_estimated:
      friendly_name: "Coronavirus Country Estimated"
      icon_template: "mdi:emoticon-neutral-outline"
      value_template: >-
        {% set deaths = states('sensor.coronavirus_country_deaths') | int %}
        {% set mortality = states('sensor.coronavirus_country_mortality_rate') | float %}
        {% set doubling = states('sensor.coronavirus_time_doubling') | float %}
        {% set ttl = states('sensor.coronavirus_time_until_death') | float %}

        {% set ratio = 2**(ttl/doubling) / mortality * 100 %}
        {% set estimate = (ratio * deaths) | round %}
        {% set length = estimate | string | length %}
        {% set divider = ('1' + '0' * (length - 2)) | int %}

        {{ ((ratio * deaths / divider) | round) * divider }}

    coronavirus_country_estimated_deaths:
      friendly_name: "Coronavirus Country Estimated Deaths"
      icon_template: "mdi:emoticon-frown-outline"
      value_template: >-
        {% set confirmed = states('sensor.coronavirus_country_estimated') | int %}
        {% set mortality = states('sensor.coronavirus_country_mortality_rate') | float %}

        {% if confirmed > 0 or mortality > 0 %}
          {{ (confirmed * mortality / 100) | int }}
        {% endif %}
      attribute_templates:
        could_die_within: >-
          {{ states('sensor.coronavirus_time_until_death') | float }} days
        formula: >-
          2^({{ states('sensor.coronavirus_time_until_death') | float }} / {{ states('sensor.coronavirus_time_doubling') | float }}) / {{ states('sensor.coronavirus_country_mortality_rate') }} [2^(days_until_death / case_doubling_time) / world_mortality_rate]

- platform: template
  sensors:
    coronavirus_province_confirmed:
      friendly_name: "Coronavirus Province Confirmed"
      icon_template: "mdi:hospital-box"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_province_current', 'Confirmed') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_province_deaths:
      friendly_name: "Coronavirus Province Deaths"
      icon_template: "mdi:emoticon-cry-outline"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_province_current', 'Deaths') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_province_recovered:
      friendly_name: "Coronavirus Province Recovered"
      icon_template: "mdi:emoticon-happy-outline"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_province_current', 'Recovered') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_province_mortality_rate:
      friendly_name: "Coronavirus Province Mortality Rate"
      icon_template: "mdi:ticket-percent"
      unit_of_measurement: '%'
      value_template: >-
        {% set confirmed = states('sensor.coronavirus_province_confirmed') | int %}
        {% set deaths = states('sensor.coronavirus_province_deaths') | int %}
        {{ (deaths / confirmed * 100) | round(2) }}

    coronavirus_province_estimated:
      friendly_name: "Coronavirus Province Estimated"
      icon_template: "mdi:emoticon-neutral-outline"
      value_template: >-
        {% set deaths = states('sensor.coronavirus_province_deaths') | int %}
        {% set mortality = states('sensor.coronavirus_province_mortality_rate') | float %}
        {% set doubling = states('sensor.coronavirus_time_doubling') | float %}
        {% set ttl = states('sensor.coronavirus_time_until_death') | float %}

        {% set ratio = 2**(ttl/doubling) / mortality * 100 %}
        {% set estimate = (ratio * deaths) | round %}
        {% set length = estimate | string | length %}
        {% set divider = ('1' + '0' * (length - 2)) | int %}

        {{ ((ratio * deaths / divider) | int) * divider }}
    coronavirus_province_estimated_deaths:
      friendly_name: "Coronavirus Province Estimated Deaths"
      icon_template: "mdi:emoticon-frown-outline"
      value_template: >-
        {% set estimated = states('sensor.coronavirus_province_estimated') | int %}
        {% set mortality = states('sensor.coronavirus_province_mortality_rate') | float %}

        {% if estimated > 0 or mortality > 0 %}
          {{ (estimated * mortality / 100) | int }}
        {% endif %}
      attribute_templates:
        could_die_within: >-
          {{ states('sensor.coronavirus_time_until_death') | float }} days
        formula: >-
          2^({{ states('sensor.coronavirus_time_until_death') | float }} / {{ states('sensor.coronavirus_time_doubling') | float }}) / {{ states('sensor.coronavirus_province_mortality_rate') }} [2^(days_until_death / case_doubling_time) / world_mortality_rate]

- platform: template
  sensors:
    coronavirus_roc_current:
      friendly_name: "Coronavirus RoC Current"
      icon_template: "mdi:emoticon-neutral-outline"
      value_template: >-
        {% set country = states('sensor.coronavirus_country_current') | int%}
        {% set province = states('sensor.coronavirus_province_current') | int%}
        {% if country != None and province != None %}
          {{ country - province }}
        {% endif %}

    coronavirus_roc_confirmed:
      friendly_name: "Coronavirus RoC Confirmed"
      icon_template: "mdi:hospital-box"
      value_template: >-
        {% set country = state_attr('sensor.coronavirus_country_current', 'Confirmed') %}
        {% set province = state_attr('sensor.coronavirus_province_current', 'Confirmed') %}
        {% if country != None and province != None %}
          {{ country - province }}
        {% endif %}

    coronavirus_roc_deaths:
      friendly_name: "Coronavirus RoC Deaths"
      icon_template: "mdi:emoticon-cry-outline"
      value_template: >-
        {% set country = state_attr('sensor.coronavirus_country_current', 'Deaths') %}
        {% set province = state_attr('sensor.coronavirus_province_current', 'Deaths') %}
        {% if country != None and province != None %}
          {{ country - province }}
        {% endif %}

    coronavirus_roc_recovered:
      friendly_name: "Coronavirus RoC Recovered"
      icon_template: "mdi:emoticon-happy-outline"
      value_template: >-
        {% set country = state_attr('sensor.coronavirus_country_current', 'Recovered') %}
        {% set province = state_attr('sensor.coronavirus_province_current', 'Recovered') %}
        {% if country != None and province != None %}
          {{ country - province }}
        {% endif %}

    coronavirus_roc_mortality_rate:
      friendly_name: "Coronavirus RoC Mortality Rate"
      icon_template: "mdi:ticket-percent"
      unit_of_measurement: '%'
      value_template: >-
        {% set confirmed = states('sensor.coronavirus_roc_confirmed') | int %}
        {% set deaths = states('sensor.coronavirus_roc_deaths') | int %}
        {{ (deaths / confirmed * 100) | round(2) }}

    coronavirus_roc_estimated:
      friendly_name: "Coronavirus RoC Estimated"
      icon_template: "mdi:emoticon-neutral-outline"
      value_template: >-
        {% set deaths = states('sensor.coronavirus_roc_deaths') | int %}
        {% set mortality = states('sensor.coronavirus_roc_mortality_rate') | float %}
        {% set doubling = states('sensor.coronavirus_time_doubling') | float %}
        {% set ttl = states('sensor.coronavirus_time_until_death') | float %}

        {% set ratio = 2**(ttl/doubling) / mortality * 100 %}
        {% set estimate = (ratio * deaths) | round %}
        {% set length = estimate | string | length %}
        {% set divider = ('1' + '0' * (length - 2)) | int %}

        {{ ((ratio * deaths / divider) | round) * divider }}

    coronavirus_roc_estimated_deaths:
      friendly_name: "Coronavirus RoC Estimated Deaths"
      icon_template: "mdi:emoticon-frown-outline"
      value_template: >-
        {% set confirmed = states('sensor.coronavirus_roc_estimated') | int %}
        {% set mortality = states('sensor.coronavirus_roc_mortality_rate') | float %}

        {% if confirmed > 0 or mortality > 0 %}
          {{ (confirmed * mortality / 100) | int }}
        {% endif %}
      attribute_templates:
        could_die_within: >-
          {{ states('sensor.coronavirus_time_until_death') | float }} days
        formula: >-
          2^({{ states('sensor.coronavirus_time_until_death') | float }} / {{ states('sensor.coronavirus_time_doubling') | float }}) / {{ states('sensor.coronavirus_roc_mortality_rate') }} [2^(days_until_death / case_doubling_time) / world_mortality_rate]

- platform: template
  sensors:
    coronavirus_world_confirmed:
      friendly_name: "Coronavirus World Confirmed"
      icon_template: "mdi:hospital-box"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_world_current', 'Confirmed') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_world_deaths:
      friendly_name: "Coronavirus World Deaths"
      icon_template: "mdi:emoticon-cry-outline"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_world_current', 'Deaths') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_world_recovered:
      friendly_name: "Coronavirus World Recovered"
      icon_template: "mdi:emoticon-happy-outline"
      value_template: >-
        {% set val = state_attr('sensor.coronavirus_world_current', 'Recovered') %}
        {% if val != None %}
          {{ val }}
        {% endif %}

    coronavirus_world_mortality_rate:
      friendly_name: "Coronavirus World Mortality Rate"
      icon_template: "mdi:ticket-percent"
      unit_of_measurement: '%'
      value_template: >-
        {% set confirmed = states('sensor.coronavirus_world_confirmed') | int %}
        {% set deaths = states('sensor.coronavirus_world_deaths') | int %}
        {{ (deaths / confirmed * 100) | round(2) }}

    coronavirus_world_estimated:
      friendly_name: "Coronavirus World Estimated"
      icon_template: "mdi:emoticon-neutral-outline"
      value_template: >-
        {% set deaths = states('sensor.coronavirus_world_deaths') | int %}
        {% set mortality = states('sensor.coronavirus_world_mortality_rate') | float %}
        {% set doubling = states('sensor.coronavirus_time_doubling') | float %}
        {% set ttl = states('sensor.coronavirus_time_until_death') | float %}

        {% set ratio = 2**(ttl/doubling) / mortality * 100 %}
        {% set estimate = (ratio * deaths) | round %}
        {% set length = estimate | string | length %}
        {% set divider = ('1' + '0' * (length - 2)) | int %}

        {{ ((ratio * deaths / divider) | round) * divider }}

    coronavirus_world_estimated_deaths:
      friendly_name: "Coronavirus World Estimated Deaths"
      icon_template: "mdi:emoticon-frown-outline"
      value_template: >-
        {% set estimated = states('sensor.coronavirus_world_estimated') | int %}
        {% set mortality = states('sensor.coronavirus_world_mortality_rate') | float %}

        {% if estimated > 0 or mortality > 0 %}
          {{ (estimated * mortality / 100) | int }}
        {% endif %}
      attribute_templates:
        could_die_within: >-
          {{ states('sensor.coronavirus_time_until_death') | float }} days
        formula: >-
          2^({{ states('sensor.coronavirus_time_until_death') | float }} / {{ states('sensor.coronavirus_time_doubling') | float }}) / {{ states('sensor.coronavirus_world_mortality_rate') }} [2^(days_until_death / case_doubling_time) / world_mortality_rate]


#
# Doomsday Clock
#
# @link https://github.com/renemarc/home-assistant-doomsday-clock
# @link https://thebulletin.org/doomsday-dashboard
#
- platform: doomsday_clock
  scan_interval: 86400