266 lines
9.7 KiB
YAML
266 lines
9.7 KiB
YAML
# Capped Cloudflare throughput tests: 2 MB download and 500 kB upload per run.
|
|
command_line:
|
|
- sensor:
|
|
name: "Internet Speed Test"
|
|
unique_id: internet_speed_test
|
|
command: "/config/scripts/internet_speed_test.sh"
|
|
command_timeout: 120
|
|
scan_interval: 31536000
|
|
unit_of_measurement: "Mbit/s"
|
|
device_class: data_rate
|
|
state_class: measurement
|
|
value_template: "{{ value_json.download_mbps }}"
|
|
json_attributes:
|
|
- upload_mbps
|
|
|
|
- binary_sensor:
|
|
name: "Internet Connected"
|
|
unique_id: internet_connected
|
|
command: >-
|
|
curl --fail --silent --show-error --max-time 10 --output /dev/null
|
|
https://one.one.one.one/cdn-cgi/trace && printf "ON" || printf "OFF"
|
|
command_timeout: 15
|
|
scan_interval: 60
|
|
payload_on: "ON"
|
|
payload_off: "OFF"
|
|
device_class: connectivity
|
|
|
|
input_number:
|
|
internet_speed_tests_today:
|
|
name: "Internet Speed Tests Today"
|
|
min: 0
|
|
max: 100
|
|
step: 1
|
|
mode: box
|
|
internet_speed_tests_this_month:
|
|
name: "Internet Speed Tests This Month"
|
|
min: 0
|
|
max: 2000
|
|
step: 1
|
|
mode: box
|
|
internet_download_today_average:
|
|
name: "Internet Download Today Average"
|
|
min: 0
|
|
max: 10000
|
|
step: 0.01
|
|
mode: box
|
|
internet_upload_today_average:
|
|
name: "Internet Upload Today Average"
|
|
min: 0
|
|
max: 10000
|
|
step: 0.01
|
|
mode: box
|
|
internet_download_month_average:
|
|
name: "Internet Download Month Average"
|
|
min: 0
|
|
max: 10000
|
|
step: 0.01
|
|
mode: box
|
|
internet_upload_month_average:
|
|
name: "Internet Upload Month Average"
|
|
min: 0
|
|
max: 10000
|
|
step: 0.01
|
|
mode: box
|
|
|
|
input_boolean:
|
|
internet_speed_test_running:
|
|
name: "Internet Speed Test Running"
|
|
|
|
script:
|
|
internet_run_speed_test:
|
|
alias: "Internet: Run speed test"
|
|
sequence:
|
|
- action: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.internet_speed_test_running
|
|
- variables:
|
|
test_started: "{{ as_timestamp(now()) }}"
|
|
- action: homeassistant.update_entity
|
|
target:
|
|
entity_id: sensor.internet_speed_test
|
|
# Ignore the command-line sensor's interim unavailable state.
|
|
- wait_template: >-
|
|
{{
|
|
has_value('sensor.internet_speed_test')
|
|
and as_timestamp(states.sensor.internet_speed_test.last_updated, 0) > test_started
|
|
}}
|
|
timeout:
|
|
minutes: 2
|
|
continue_on_timeout: true
|
|
- delay:
|
|
seconds: 3
|
|
- action: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.internet_speed_test_running
|
|
mode: single
|
|
|
|
template:
|
|
- sensor:
|
|
- name: "Internet Upload Speed Test"
|
|
unique_id: internet_upload_speed_test
|
|
unit_of_measurement: "Mbit/s"
|
|
device_class: data_rate
|
|
state_class: measurement
|
|
availability: "{{ state_attr('sensor.internet_speed_test', 'upload_mbps') is number }}"
|
|
state: "{{ state_attr('sensor.internet_speed_test', 'upload_mbps') | float }}"
|
|
- name: "Internet Last Speed Display"
|
|
unique_id: internet_last_speed_display
|
|
state: >-
|
|
{% if is_state('input_boolean.internet_speed_test_running', 'on') %}
|
|
Testing
|
|
{% elif has_value('sensor.internet_speed_test') and has_value('sensor.internet_upload_speed_test') %}
|
|
{{ states('sensor.internet_speed_test') | float(0) | round(0) | int }}/{{ states('sensor.internet_upload_speed_test') | float(0) | round(0) | int }}
|
|
{% else %}
|
|
--
|
|
{% endif %}
|
|
- name: "Internet Download Average Today"
|
|
unique_id: internet_download_average_today
|
|
unit_of_measurement: "Mbit/s"
|
|
device_class: data_rate
|
|
state_class: measurement
|
|
availability: "{{ states('input_number.internet_speed_tests_today') | int(0) > 0 }}"
|
|
state: "{{ states('input_number.internet_download_today_average') | float(0) }}"
|
|
- name: "Internet Upload Average Today"
|
|
unique_id: internet_upload_average_today
|
|
unit_of_measurement: "Mbit/s"
|
|
device_class: data_rate
|
|
state_class: measurement
|
|
availability: "{{ states('input_number.internet_speed_tests_today') | int(0) > 0 }}"
|
|
state: "{{ states('input_number.internet_upload_today_average') | float(0) }}"
|
|
- name: "Internet Download Average This Month"
|
|
unique_id: internet_download_average_this_month
|
|
unit_of_measurement: "Mbit/s"
|
|
device_class: data_rate
|
|
state_class: measurement
|
|
availability: "{{ states('input_number.internet_speed_tests_this_month') | int(0) > 0 }}"
|
|
state: "{{ states('input_number.internet_download_month_average') | float(0) }}"
|
|
- name: "Internet Upload Average This Month"
|
|
unique_id: internet_upload_average_this_month
|
|
unit_of_measurement: "Mbit/s"
|
|
device_class: data_rate
|
|
state_class: measurement
|
|
availability: "{{ states('input_number.internet_speed_tests_this_month') | int(0) > 0 }}"
|
|
state: "{{ states('input_number.internet_upload_month_average') | float(0) }}"
|
|
|
|
sensor:
|
|
- platform: statistics
|
|
name: "Internet Download Average Last 7 Days"
|
|
unique_id: internet_download_average_last_7_days
|
|
entity_id: sensor.internet_speed_test
|
|
state_characteristic: mean
|
|
sampling_size: 400
|
|
max_age:
|
|
days: 7
|
|
- platform: statistics
|
|
name: "Internet Upload Average Last 7 Days"
|
|
unique_id: internet_upload_average_last_7_days
|
|
entity_id: sensor.internet_upload_speed_test
|
|
state_characteristic: mean
|
|
sampling_size: 400
|
|
max_age:
|
|
days: 7
|
|
|
|
automation:
|
|
- id: internet_run_speed_test
|
|
alias: "Internet: Run capped speed test"
|
|
description: "Runs at a random time between five minutes before and after each half-hour."
|
|
triggers:
|
|
- trigger: time_pattern
|
|
minutes: 25
|
|
- trigger: time_pattern
|
|
minutes: 55
|
|
conditions: []
|
|
actions:
|
|
- delay:
|
|
seconds: "{{ range(0, 601) | random }}"
|
|
- action: script.internet_run_speed_test
|
|
target:
|
|
entity_id: sensor.internet_speed_test
|
|
mode: single
|
|
|
|
- id: internet_record_speed_test
|
|
alias: "Internet: Record speed test averages"
|
|
description: "Records every successful speed test, including the startup test."
|
|
triggers:
|
|
- trigger: state
|
|
entity_id: sensor.internet_speed_test
|
|
conditions: []
|
|
actions:
|
|
# Allow the upload template sensor to update from the command-line result.
|
|
- delay:
|
|
seconds: 1
|
|
- condition: template
|
|
value_template: "{{ has_value('sensor.internet_speed_test') and has_value('sensor.internet_upload_speed_test') }}"
|
|
- action: input_number.set_value
|
|
target:
|
|
entity_id: input_number.internet_download_today_average
|
|
data:
|
|
value: >-
|
|
{{ ((states('input_number.internet_download_today_average') | float(0) * states('input_number.internet_speed_tests_today') | int(0)) + states('sensor.internet_speed_test') | float(0)) / (states('input_number.internet_speed_tests_today') | int(0) + 1) }}
|
|
- action: input_number.set_value
|
|
target:
|
|
entity_id: input_number.internet_upload_today_average
|
|
data:
|
|
value: >-
|
|
{{ ((states('input_number.internet_upload_today_average') | float(0) * states('input_number.internet_speed_tests_today') | int(0)) + states('sensor.internet_upload_speed_test') | float(0)) / (states('input_number.internet_speed_tests_today') | int(0) + 1) }}
|
|
- action: input_number.set_value
|
|
target:
|
|
entity_id: input_number.internet_download_month_average
|
|
data:
|
|
value: >-
|
|
{{ ((states('input_number.internet_download_month_average') | float(0) * states('input_number.internet_speed_tests_this_month') | int(0)) + states('sensor.internet_speed_test') | float(0)) / (states('input_number.internet_speed_tests_this_month') | int(0) + 1) }}
|
|
- action: input_number.set_value
|
|
target:
|
|
entity_id: input_number.internet_upload_month_average
|
|
data:
|
|
value: >-
|
|
{{ ((states('input_number.internet_upload_month_average') | float(0) * states('input_number.internet_speed_tests_this_month') | int(0)) + states('sensor.internet_upload_speed_test') | float(0)) / (states('input_number.internet_speed_tests_this_month') | int(0) + 1) }}
|
|
- action: input_number.set_value
|
|
target:
|
|
entity_id: input_number.internet_speed_tests_today
|
|
data:
|
|
value: "{{ states('input_number.internet_speed_tests_today') | int(0) + 1 }}"
|
|
- action: input_number.set_value
|
|
target:
|
|
entity_id: input_number.internet_speed_tests_this_month
|
|
data:
|
|
value: "{{ states('input_number.internet_speed_tests_this_month') | int(0) + 1 }}"
|
|
mode: queued
|
|
|
|
- id: internet_reset_daily_speed_averages
|
|
alias: "Internet: Reset daily speed averages"
|
|
triggers:
|
|
- trigger: time
|
|
at: "00:00:00"
|
|
conditions: []
|
|
actions:
|
|
- action: input_number.set_value
|
|
target:
|
|
entity_id:
|
|
- input_number.internet_speed_tests_today
|
|
- input_number.internet_download_today_average
|
|
- input_number.internet_upload_today_average
|
|
data:
|
|
value: 0
|
|
mode: single
|
|
|
|
- id: internet_reset_monthly_speed_averages
|
|
alias: "Internet: Reset monthly speed averages"
|
|
triggers:
|
|
- trigger: time
|
|
at: "00:00:00"
|
|
conditions:
|
|
- condition: template
|
|
value_template: "{{ now().day == 1 }}"
|
|
actions:
|
|
- action: input_number.set_value
|
|
target:
|
|
entity_id:
|
|
- input_number.internet_speed_tests_this_month
|
|
- input_number.internet_download_month_average
|
|
- input_number.internet_upload_month_average
|
|
data:
|
|
value: 0
|
|
mode: single
|