Skip to content

Instantly share code, notes, and snippets.

@smoki3
Last active July 5, 2023 08:00
Show Gist options
  • Save smoki3/95886fb6b3f1356d10ed0a0f13b3ca88 to your computer and use it in GitHub Desktop.
Save smoki3/95886fb6b3f1356d10ed0a0f13b3ca88 to your computer and use it in GitHub Desktop.
WUnderground upload
blueprint:
name: WUnderground upload
description:
"Upload data from Home Assistant to WUnderground.\nConfig:\n The station_id
and station_key variable must be fetched from WUnderground.\n The sensor_* variables
are the sensors whos data will be uploaded\n The trigger_entities variable specifies
the entries to trigger state changes on (this could be a list)\n The curl_command_service
variable specifies the CURL-service to execute.\n The refresh_frequency variable
specifies the frequency the sensors update their data\n The dewpoint temperature
can be calculated based on the outdoor temperature and the outdoor humidity.\n
\ By default, it will be calculated, to disable this set calculate_dewpt to
false.\n\nThe CURL-service must exist in Home Assistant. This can be configured
with the following YAML\n shell_command:\n curl_get: 'curl -X GET {{ url }}'\n\nAutomation
config example:\n automation:\n - id: wunderground_data_upload\n alias:
WUnderground data upload\n use_blueprint:\n path: wunderground_upload.yaml\n
\ input:\n station_id: !secret wunderground_station_id\n station_key:
!secret wunderground_station_key\n sensor_baro: 'sensor.outdoor_pressure'\n
\ sensor_temp: 'sensor.outdoor_temperature'\n sensor_humidity:
'sensor.outdoor_humidity'\n sensor_rain: 'sensor.outdoor_rain'\n sensor_dailyrain:
'sensor.outdoor_rain_today'\n refresh_frequency: 300\n trigger_entities:\n
\ - sensor.outdoor_temperature\n - sensor.outdoor_humidity\n
\ - sensor.outdoor_rain\n - sensor.outdoor_rain_today\n curl_command_service:
shell_command.curl_get\n"
domain: automation
source_url: https://gist.github.com/smoki3/95886fb6b3f1356d10ed0a0f13b3ca88
input:
station_id:
name: Station ID
default: ""
station_key:
name: Station key
default: ""
sensor_baro:
name: Barometer sensor
selector:
entity:
domain:
- sensor
device_class: atmospheric_pressure
default: ""
sensor_temp:
name: Temperature sensor
selector:
entity:
domain:
- sensor
device_class: temperature
default: ""
sensor_dewpt:
name: Dew point sensor
selector:
entity:
domain:
- sensor
device_class: temperature
default: ""
calculate_dewpt:
name: Calculate dewpoint
description:
Dewpoint calculation is only possible if the outdoor temperature
and outdoor humidity sensor are available.
selector:
boolean: {}
default: true
sensor_humidity:
name: Humidity sensor
selector:
entity:
domain:
- sensor
device_class: humidity
default: ""
sensor_windspeed:
name: Wind speed sensor
selector:
entity:
domain:
- sensor
default: ""
sensor_windgust:
name: Wind gust sensor
selector:
entity:
domain:
- sensor
default: ""
sensor_winddir:
name: Wind direction sensor
selector:
entity:
domain:
- sensor
default: ""
sensor_rain:
name: Rain sensor
selector:
entity:
domain:
- sensor
default: ""
sensor_dailyrain:
name: Daily rain sensor
selector:
entity:
domain:
- sensor
default: ""
sensor_indoortemp:
name: Indoor temperature sensor
selector:
entity:
domain:
- sensor
device_class: temperature
default: ""
sensor_indoorhumidity:
name: Indoor humidity sensor
selector:
entity:
domain:
- sensor
device_class: humidity
default: ""
sensor_solarradiation:
name: Solar Radiation sensor
selector:
entity:
domain:
- sensor
default: ""
sensor_UV:
name: UV Index sensor
selector:
entity:
domain:
- sensor
default: ""
refresh_frequency:
name: Refresh frequency (seconds)
selector:
number:
min: 1.0
max: 10800.0
step: 1.0
unit_of_measurement: seconds
mode: slider
default: 300
trigger_entities:
name: Trigger entities
selector:
entity:
multiple: true
default: ""
curl_command_service:
name: CURL command service
selector:
text: {}
default: "shell_command.curl_get"
delay:
name: Delay after publishing results
selector:
number:
min: 0.0
max: 10800.0
step: 1.0
unit_of_measurement: seconds
mode: slider
default: 10
mode: single
max_exceeded: silent
trigger:
- platform: state
entity_id: !input trigger_entities
variables:
station_id: !input station_id
station_key: !input station_key
sensor_baro: !input sensor_baro
sensor_temp: !input sensor_temp
sensor_dewpt: !input sensor_dewpt
calculate_dewpt: !input calculate_dewpt
sensor_humidity: !input sensor_humidity
sensor_windspeed: !input sensor_windspeed
sensor_windgust: !input sensor_windgust
sensor_winddir: !input sensor_winddir
sensor_rain: !input sensor_rain
sensor_dailyrain: !input sensor_dailyrain
sensor_indoortemp: !input sensor_indoortemp
sensor_indoorhumidity: !input sensor_indoorhumidity
sensor_solarradiation: !input sensor_solarradiation
sensor_UV: !input sensor_UV
rtfreq: !input refresh_frequency
delay: !input delay
baromin:
"{% set unit_of_measurement = state_attr(sensor_baro, 'unit_of_measurement')
%} {{ sensor_baro if sensor_baro == ''\n else ((states(sensor_baro) | float(default=0))
if unit_of_measurement not in ['mbar', 'hPa']\n else ((states(sensor_baro)
| float(default=0)) / 33.8639)) }}\n"
tempf:
"{% set unit_of_measurement = state_attr(sensor_temp, 'unit_of_measurement')
%} {{ sensor_temp if sensor_temp == ''\n else ((states(sensor_temp) | float(default=0))
if unit_of_measurement == '°F'\n else ((states(sensor_temp) | float(default=0))
* 1.8) + 32) }}\n"
humidity:
"{{ sensor_humidity if sensor_humidity == '' else (states(sensor_humidity)
| float(default=0)) }}
"
windspeedmph:
"{% set unit_of_measurement = state_attr(sensor_windspeed, 'unit_of_measurement')
%} {{ sensor_windspeed if sensor_windspeed == ''\n else (states(sensor_windspeed)
| float(default=0)) * (0.6213 if unit_of_measurement == 'km/h' else 1) }}\n"
windgustmph:
"{% set unit_of_measurement = state_attr(sensor_windgust, 'unit_of_measurement')
%} {{ sensor_windgust if sensor_windgust == ''\n else (states(sensor_windgust)
| float(default=0)) * (0.6213 if unit_of_measurement == 'km/h' else 1) }}\n"
winddir:
"{{ sensor_winddir if sensor_winddir == ''\n else (states(sensor_winddir)
| float(default=0)) }}\n"
rainin:
"{% set unit_of_measurement = state_attr(sensor_rain, 'unit_of_measurement')
%} {{ sensor_rain if sensor_rain == ''\n else ((states(sensor_rain) | float(default=0))
/ (25.4 if unit_of_measurement == 'mm' else 1)) }}\n"
dailyrainin:
"{% set unit_of_measurement = state_attr(sensor_dailyrain, 'unit_of_measurement')
%} {{ sensor_dailyrain if sensor_dailyrain == ''\n else ((states(sensor_dailyrain)
| float(default=0)) / (25.4 if unit_of_measurement == 'mm' else 1)) }}\n"
indoortempf:
"{% set unit_of_measurement = state_attr(sensor_indoortemp, 'unit_of_measurement')
%} {{ sensor_indoortemp if sensor_indoortemp == ''\n else ((states(sensor_indoortemp)
| float(default=0)) if unit_of_measurement == '°F'\n else ((states(sensor_indoortemp)
| float(default=0)) * 1.8) + 32) }}\n"
indoorhumidity:
"{{ sensor_indoorhumidity if sensor_indoorhumidity == ''\n else
(states(sensor_indoorhumidity) | float(default=0)) }}\n"
solarradiation:
"{% set unit_of_measurement = state_attr(sensor_solarradiation,
'unit_of_measurement') %} {{ sensor_solarradiation if sensor_solarradiation ==
''\n else ((states(sensor_solarradiation) / 126.7) | float(default=0)) if unit_of_measurement
== 'lux'\n else (states(sensor_solarradiation) | float(default=0)) }}\n"
UV:
"{{ sensor_UV if sensor_UV == ''\n else (states(sensor_UV) | int(default=0))
}}\n"
dewptf_calculated:
"{% set unit_of_measurement = state_attr(sensor_temp, 'unit_of_measurement')
%} {% set T = ((states(sensor_temp) | float(default=0)) if unit_of_measurement
== '°C'\n else ((states(sensor_temp) | float(default=0)) - 32) / 1.8)
%}\n{% set RH = humidity %} {% set dewpt = '' %} {% if sensor_temp != '' and sensor_humidity
!= '' %}\n {% set A = log(RH / 100, default=0.0) + (17.62 * T / (243.12 + T))
%}\n {% set dewpt = 243.12 * A / (17.62 - A) %}\n {% set dewpt = (dewpt * 1.8)
+ 32 %}\n{% endif %} {{ dewpt }}\n"
dewptf:
"{% set unit_of_measurement = state_attr(sensor_dewpt, 'unit_of_measurement')
%} {{ (dewptf_calculated if calculate_dewpt is true\n else sensor_dewpt) if
sensor_dewpt == ''\n else ((states(sensor_dewpt) | float(default=0)) if unit_of_measurement
== '°F'\n else ((states(sensor_dewpt) | float(default=0)) * 1.8) + 32)
}}\n"
payload:
"{% set data = namespace(sensors=[]) %}\n{% for i in [['rtfreq', rtfreq]\n
\ ,['baromin', baromin]\n ,['tempf', tempf]\n ,['dewptf', dewptf]\n
\ ,['humidity', humidity]\n ,['windspeedmph', windspeedmph]\n ,['windgustmph',
windgustmph]\n ,['winddir', winddir]\n ,['rainin', rainin]\n ,['dailyrainin',
dailyrainin]\n ,['indoortempf', indoortempf]\n ,['indoorhumidity', indoorhumidity]\n
\ ,['solarradiation', solarradiation]\n ,['UV', UV]\n ]%}\n {%
if i[1] != '' %}\n {% set data.sensors = data.sensors + ['{}={}'.format(i[0],
(i[1] if i[0] == 'rtfreq'\n else (i[1]
| round(3)) | string))] %}\n {% endif %}\n{% endfor %}\n{% set _payload = 'ID='
+ station_id %} {% set _payload = _payload + '&PASSWORD=' + station_key %} {%
set _payload = _payload + '&action=updateraww' %} {% set _payload = _payload +
'&realtime=1' %} {% set _payload = _payload + '&dateutc=now' %} {% set _payload
= _payload + '&' if data.sensors | length > 0 else '' %} {% set _payload = _payload
+ data.sensors | join('&') %} {{ _payload }}\n"
action:
- alias: Check if station_id and station_key exist
if: "{{ station_id != ''\n and station_key != ''\n}}\n"
then:
- service: !input curl_command_service
data:
url:
https://weatherstation.wunderground.com/weatherstation/updateweatherstation.php?{{
payload }}
- alias: Wait to prevent multiple uploads
delay:
seconds: "{{ delay | int }}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment