Last active
July 5, 2023 08:00
-
-
Save smoki3/95886fb6b3f1356d10ed0a0f13b3ca88 to your computer and use it in GitHub Desktop.
WUnderground upload
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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