From a731424cf0aaf91792485a2ee8d659ccf1aed171 Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Mon, 15 Jun 2020 16:23:05 +1000 Subject: [PATCH] [plugins/weather/wunderground] Add plugin to query station data from Weather Underground It's a bit backwards, but works a treat when you don't own the station but want the data in a better format. Includes warnings on UV and heat indices, and visible lines for wind direction and indices. Signed-off-by: Olivier Mehani --- .../wunderground_STATION-week.png | Bin 0 -> 44221 bytes plugins/weather/wunderground_ | 361 ++++++++++++++++++ 2 files changed, 361 insertions(+) create mode 100644 plugins/weather/example_graphs/wunderground_STATION-week.png create mode 100755 plugins/weather/wunderground_ diff --git a/plugins/weather/example_graphs/wunderground_STATION-week.png b/plugins/weather/example_graphs/wunderground_STATION-week.png new file mode 100644 index 0000000000000000000000000000000000000000..e978abb2510f0184e84dd026ac4f22469b7d3eeb GIT binary patch literal 44221 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�=;_D{!4OJ$Y)CR*WCQr0sJDMiH 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/wunderground_ b/plugins/weather/wunderground_ new file mode 100755 index 00000000..c81f0d87 --- /dev/null +++ b/plugins/weather/wunderground_ @@ -0,0 +1,361 @@ +#!/bin/sh +# -*- sh -*- + +: << =cut + +=head1 NAME + +wunderground - Plugin to monitor weather stations through Weather Underground + +The precipitation rate is recalculated from the daily cumulative sum +precipTotal, as a DERIVE value, rather than using the immediate precipRate as a +GAUGE. This allows to have more correct aggregates for the +weekly/monstly/yearly graphs, particularly in case of missing values. + +However, to work around the limitation that DERIVE only supports integers, the +decimal point is also shifted two places right (*100) from the reported value, +so even small values can be represented. The value is then rescaled to cancel +this shift (/100), and expressed per hour rather than second (*3600), as it is +the usual unit for precipitation. + +=head1 CONFIGURATION + + [wunderground] + env.api_key 6532d6454b8aa370768e63d6ba5a832e # this is the default; it seems to be what the website uses + env.station_id KCASANFR1708 + env.units metric # optional, this is the default + env.base_url # optional, default to https://api.weather.com/v2/pws/observations/current + env.connect_timeout 1 # optional, amount to wait for requests, in seconds + +Alternatively, the station_id can be encoded in the name of the symlink as +wunderground_STATIONID (e.g., wundergound_KCASANFR1708). This allows to monitor +multiple stations at once. The configuration can then omit the station_id (it +will be ignored if present), and only one section can be used for all instances +of the plugin. + + [wunderground_*] + env.api_key 6532d6454b8aa370768e63d6ba5a832e # this is the default; it seems to be what the website uses + env.units metric # optional, this is the default + env.base_url # optional, default to https://api.weather.com/v2/pws/observations/current + env.connect_timeout 1 # optional, amount to wait for requests, in seconds + +=head1 AUTHOR + +Olivier Mehani + +Copyright (C) 2020 Olivier Mehani + +=head1 LICENSE + +SPDX-License-Identifier: GPL-3.0-or-later + +=head1 MAGIC MARKERS + + #%# family=manual + +=cut + +# Example output +# +# curl 'https://api.weather.com/v2/pws/observations/current?apiKey=6532d6454b8aa370768e63d6ba5a832e&stationId=KCASANFR1708&numericPrecision=decimal&format=json&units=m' +#{"observations":[{"stationID":"KCASANFR1708","obsTimeUtc":"2020-06-15T06:30:54Z","obsTimeLocal":"2020-06-14 23:30:54","neighborhood":"Van Ness - Civic Center","softwareType":"Weather logger V3.0.8","country":"US","solarRadiation":null,"lon":-122.423,"realtimeFrequency":null,"epoch":1592202654,"lat":37.788,"uv":null,"winddir":null,"humidity":90.0,"qcStatus":1,"imperial":{"temp":58.6,"heatIndex":58.6,"dewpt":55.8,"windChill":null,"windSpeed":null,"windGust":null,"pressure":29.85,"precipRate":null,"precipTotal":null,"elev":187.0}}]} + +set -eu + +# shellcheck disable=SC1090 +. "${MUNIN_LIBDIR}/plugins/plugin.sh" + +if [ "${MUNIN_DEBUG:-0}" = 1 ]; then + set -x +fi + +PLUGIN_NAME="$(basename "${0}")" +STATION_ID="$(echo "${PLUGIN_NAME}" | sed 's/.*_//')" +# Use the station ID from the config only if the plugin doesn't specify one +STATION_ID=${STATION_ID:-${station_id:-KCASANFR1708}} + +API_KEY=${api_key:-6532d6454b8aa370768e63d6ba5a832e} +UNITS=${units:-metric} +BASE_URL=${base_url:-https://api.weather.com/v2/pws/observations/current} +CONNECT_TIMEOUT=${connect_timeout:-1} + +UNITS_ARG='&units=m' +DISTANCE_UNIT='m' +PRESSURE_UNIT='hPa' +PRECIPITATION_UNIT='mm' +SPEED_UNIT='km/h' +TEMP_UNIT='°C' +# https://en.wikipedia.org/wiki/Wind_chill#/media/File:Windchill_effect_en.svg +WIND_CHILL_CAUTION=-35: +WIND_CHILL_DANGER=-60: +# https://en.wikipedia.org/wiki/Heat_index#Table_of_values +HEAT_INDEX_CAUTION=27 +HEAT_INDEX_EXTREME_CAUTION=33 +HEAT_INDEX_DANGER=41 +HEAT_INDEX_EXTREME_DANGER=54 +if [ "${UNITS}" = "imperial" ]; then + UNITS_ARG='&units=e' + DISTANCE_UNIT='ft' + PRESSURE_UNIT='in' + PRECIPITATION_UNIT='in' + SPEED_UNIT='mph' + TEMP_UNIT='°F' + WIND_CHILL_CAUTION=-31: + WIND_CHILL_DANGER=-76:w + HEAT_INDEX_CAUTION=80 + HEAT_INDEX_EXTREME_CAUTION=91 + HEAT_INDEX_DANGER=105 + HEAT_INDEX_EXTREME_DANGER=130 +fi +API_URL="${BASE_URL}?apiKey=${API_KEY}&stationId=${STATION_ID}&numericPrecision=decimal&format=json${UNITS_ARG}" + +check_deps() { + for CMD in curl jq; do + if ! command -v "${CMD}" >/dev/null; then + echo "no (${CMD} not found)" + fi + done +} + +CURL_ARGS="-s --connect-timeout ${CONNECT_TIMEOUT}" +fetch() { + # shellcheck disable=SC2086 + curl -f ${CURL_ARGS} "$@" \ + || { echo "error fetching ${*}" >&2; false; } +} + +config() { + local STATION_INFO="in \(.neighborhood), \(.country) reported by station \(.stationID) (\(.lon), \(.lat), \(.${UNITS}.elev) m) at \(.obsTimeLocal) (\(.obsTimeUtc))" + fetch "${API_URL}" | jq -r ".observations[0] + | @text \" +multigraph wunderground_${STATION_ID} +graph_title Weather in \(.neighborhood) +graph_info Weather ${STATION_INFO} +graph_category weather +graph_vlabel Temperature / UV Index / Precipitation +temp.label Temperature [${TEMP_UNIT}] +windChill.label Wind chill [${TEMP_UNIT}] +heatIndex.label Heat index [$TEMP_UNIT] +uv.label UV index +precipRate.draw AREA +precipRate.label Precipitation rate [${PRECIPITATION_UNIT} per hour] + +multigraph wunderground_${STATION_ID}.air_humidity +graph_title Humidity in \(.neighborhood) +graph_info Humidity ${STATION_INFO} +graph_category weather +graph_args -l 0 --upper-limit 100 +graph_vlabel Humidity [%] +humidity.label Humidity +humidity.min 0 +humidity.max 100 + +multigraph wunderground_${STATION_ID}.location +graph_title Location of \(.stationID) +graph_info Track geographic coordinates of station \(.stationID); last: \(.lon), \(.lat), \(.${UNITS}.elev) ${DISTANCE_UNIT} at \(.obsTimeLocal) (\(.obsTimeUtc)) +graph_category weather +graph_scale no +graph_vlabel lon/lat [°] / elevation [${DISTANCE_UNIT}] +lon.label Longitude [°] +lat.label Latitude [°] +elev.label Elevation [${DISTANCE_UNIT}] + +multigraph wunderground_${STATION_ID}.precipitation +graph_title Precipitation in \(.neighborhood) +graph_info Precipitation ${STATION_INFO} +graph_category weather +graph_args -l 0 --base 1000 +graph_vlabel Precipitation [${PRECIPITATION_UNIT} per hour] +precipRate.label Precipitation rate +avgRate.label Average precipitation rate +avgRate.type DERIVE +avgRate.draw AREA +avgRate.min 0 +avgRate.cdef avgRate,36,* + +multigraph wunderground_${STATION_ID}.air_pressure +graph_title Pressure in \(.neighborhood) +graph_info Pressure ${STATION_INFO} +graph_category weather +graph_scale no +graph_vlabel Pressure [${PRESSURE_UNIT}] +pressure.label Pressure + +multigraph wunderground_${STATION_ID}.solar_radiation +graph_title Solar radiation in \(.neighborhood) +graph_info Solar radiation ${STATION_INFO} +graph_category weather +graph_args -l 0 --base 1000 +graph_vlabel Solar radiation [W/m^2] +solarRadiation.label Solar radiation + +multigraph wunderground_${STATION_ID}.temperature +temp.label Temperature +graph_title Temperature in \(.neighborhood) +graph_info Temperature ${STATION_INFO} +graph_category weather +graph_vlabel Temperature [${TEMP_UNIT}] +temp.label Temperature + +dewpt.label Dew point +dewpt.info Temperature to which air must be cooled to become saturated with water vapor. When cooled further, the airborne water vapor will condense to form liquid water (dew). When air cools to its dew point through contact with a surface that is colder than the air, water will condense on the surface. When the temperature is below the freezing point of water, the dew point is called the frost point, as frost is formed rather than dew. + +windChill.label Wind chill +windChill.info Represent the lowering of body temperature due to the passing-flow of lower-temperature air. Wind chill numbers are always lower than the air temperature for values where the formula is valid. When the apparent temperature is higher than the air temperature, the heat index is used instead. +windChill.warning ${WIND_CHILL_CAUTION} +windChill.critical ${WIND_CHILL_DANGER} +windChillCaution.label Wind chill Caution +windChillCaution.info Danger of frostbite +windChillCaution.colour 5358f6 +windChillCaution.line ${WIND_CHILL_CAUTION} +windChillDanger.label Wind chill Danger +windChillDanger.info Great danger of frostbite +windChillDanger.colour 5c1ff5 +windChillDanger.line ${WIND_CHILL_DANGER} + +heatIndex.label Heat index +heatIndex.info Index that combines air temperature and relative humidity, in shaded areas, to posit a human-perceived equivalent temperature, as how hot it would feel if the humidity were some other value in the shade. +heatIndex.warning ${HEAT_INDEX_EXTREME_CAUTION} +heatIndex.critical ${HEAT_INDEX_DANGER} +heatIndexCaution.label Heat index Caution +heatIndexCaution.info Fatigue is possible with prolonged exposure and activity. Continuing activity could result in heat cramps. +heatIndexCaution.colour ffff66 +heatIndexCaution.line ${HEAT_INDEX_CAUTION} +heatIndexECaution.label Heat index Extreme Caution +heatIndexECaution.info Heat cramps and heat exhaustion are possible. Continuing activity could result in heat stroke. +heatIndexECaution.colour ffd700 +heatIndexECaution.line ${HEAT_INDEX_EXTREME_CAUTION} +heatIndexDanger.label Heat index Danger +heatIndexDanger.info Heat cramps and heat exhaustion are likely; heat stroke is probable with continued activity. +heatIndexDanger.colour ff8c00 +heatIndexDanger.line ${HEAT_INDEX_DANGER} +heatIndexEDanger.label Heat index Extreme Danger +heatIndexEDanger.info Heat stroke is imminent. +heatIndexEDanger.colour ff0000 +heatIndexEDanger.line ${HEAT_INDEX_EXTREME_DANGER} + +multigraph wunderground_${STATION_ID}.uv_index +graph_title UV Index in \(.neighborhood) +graph_info UV index ${STATION_INFO} +graph_category weather +graph_args -l 0 +graph_vlabel UV index +uv.label UV index +uv.min 0 +uv.warning 5 +uv.critical 7 +moderate.label Moderate +moderate.info Stay in shade near midday when the Sun is strongest. If outdoors, wear Sun protective clothing, a wide-brimmed hat, and UV-blocking sunglasses. Generously apply broad spectrum SPF 30+ sunscreen every 1.5 hours, even on cloudy days, and after swimming or sweating. Bright surfaces, such as sand, water, and snow, will increase UV exposure. +moderate.colour fff300 +moderate.line 3 +high.label High +high.info Reduce time in the Sun between 10 a.m. and 4 p.m. If outdoors, seek shade and wear Sun protective clothing, a wide-brimmed hat, and UV-blocking sunglasses. Generously apply broad spectrum SPF 30+ sunscreen every 1.5 hours, even on cloudy days, and after swimming or sweating. Bright surfaces, such as sand, water, and snow, will increase UV exposure. +high.colour f18b00 +high.line 6 +veryhigh.label Very high +veryhigh.info Minimize Sun exposure between 10 a.m. and 4 p.m. If outdoors, seek shade and wear Sun protective clothing, a wide-brimmed hat, and UV-blocking sunglasses. Generously apply broad spectrum SPF 30+ sunscreen every 1.5 hours, even on cloudy days, and after swimming or sweating. Bright surfaces, such as sand, water, and snow, will increase UV exposure. +veryhigh.colour e53210 +veryhigh.line 8 +extreme.label Extreme +extreme.info Try to avoid Sun exposure between 10 a.m. and 4 p.m. If outdoors, seek shade and wear Sun protective clothing, a wide-brimmed hat, and UV-blocking sunglasses. Generously apply broad spectrum SPF 30+ sunscreen every 1.5 hours, even on cloudy days, and after swimming or sweating. Bright surfaces, such as sand, water, and snow, will increase UV exposure. +extreme.colour b567a4 +extreme.line 11 + +multigraph wunderground_${STATION_ID}.wind +graph_title Wind Speed in \(.neighborhood) +graph_info Wind speed and gusts ${STATION_INFO} +graph_category weather +graph_args -l 0 --base 1000 +graph_vlabel Wind speed [${SPEED_UNIT}] +windSpeed.label Wind speed +windGust.label Wind gusts + +multigraph wunderground_${STATION_ID}.wind_direction +graph_title Wind Direction in \(.neighborhood) +graph_info Wind direction ${STATION_INFO} +graph_category weather +graph_args --base 1000 -l 0 --upper-limit 360 +graph_vlabel Wind [°] +winddir.label Wind origin +winddir.min 0 +winddir.max 360 +winddir.line 0 +north.label North +north.colour COLOUR0 +north.line 360 +east.label East +east.colour COLOUR1 +east.line 90 +south.label South +south.colour COLOUR2 +south.line 180 +west.label West +west.colour COLOUR9 +west.line 270 +\"" +} + +get_data() { + fetch "${API_URL}" | jq -r ".observations[0] + | @text \" +multigraph wunderground_${STATION_ID} +temp.value \(.${UNITS}.temp) +windChill.value \(.${UNITS}.windChill) +heatIndex.value \(.${UNITS}.heatIndex) +uv.value \(.uv) +precipRate.value \(.${UNITS}.precipRate) + +multigraph wunderground_${STATION_ID}.air_humidity +humidity.value \(.humidity) + +multigraph wunderground_${STATION_ID}.location +lon.value \(.lon) +lat.value \(.lat) +elev.value \(.${UNITS}.elev) + +multigraph wunderground_${STATION_ID}.precipitation +precipRate.value \(.${UNITS}.precipRate) +avgRate.value \(.${UNITS}.precipTotal*100 | round) +avgRate.extinfo Immediate precipitation: \(.${UNITS}.precipRate) ${PRECIPITATION_UNIT}/h; Daily total: \(.${UNITS}.precipTotal) ${PRECIPITATION_UNIT} + +multigraph wunderground_${STATION_ID}.air_pressure +pressure.value \(.${UNITS}.pressure) + +multigraph wunderground_${STATION_ID}.solar_radiation +solarRadiation.value \(.solarRadiation) + +multigraph wunderground_${STATION_ID}.temperature +temp.value \(.${UNITS}.temp) +dewpt.value \(.${UNITS}.dewpt) +windChill.value \(.${UNITS}.windChill) +heatIndex.value \(.${UNITS}.heatIndex) + +multigraph wunderground_${STATION_ID}.uv_index +uv.value \(.uv) + +multigraph wunderground_${STATION_ID}.wind +windSpeed.value \(.${UNITS}.windSpeed) +windGust.value \(.${UNITS}.windGust) + +multigraph wunderground_${STATION_ID}.wind_direction +winddir.value \(.winddir) +\"" | sed 's/ null$/U/' +} + +main () { + check_deps + + case ${1:-} in + config) + config + if [ "${MUNIN_CAP_DIRTYCONFIG:-0}" = "1" ]; then + get_data + fi + ;; + *) + get_data + ;; + esac +} + +main "${1:-}"