SprinklerD/extras/sprinklerRainProbability.sh

230 lines
7.1 KiB
Bash
Raw Permalink Normal View History

2024-06-21 22:59:09 +00:00
#!/bin/bash
#
# you MUST change at least one of the following API keys, and the lat lng variables.
# openweatherAPI, weatherAPIkey, weatherbitAPIkey, climacellAPIkey
# lat = your latitude
# lon = your longitude
# probabilityOver = Enable rain delay if probability of rain today is grater than this number.
# Range is 0 to 100, so 50 is 50%
# sprinklerdEnableDelay = the URL to SprinklerD
#
# The below are NOT valid, you MUST change them to your information.
2024-12-14 14:17:00 +00:00
#Can use below to track best api for location
#https://www.forecastadvisor.com/
2024-06-21 22:59:09 +00:00
# API Keys from the following are supported
# openweathermap.org weatherapi.com weatherbit.io climacell.co
openweatherAPIkey='-----'
weatherbitAPIkey='-----'
climacellAPIkey='-----'
weatherAPIkey='-----'
2024-12-14 14:17:00 +00:00
accuweatherAPI='-----'
2024-06-21 22:59:09 +00:00
lat='42.3601'
lon='-71.0589'
2024-12-14 14:17:00 +00:00
zip='11111'
2024-06-21 22:59:09 +00:00
# 101 means don't set rain delay from this script, use the SprinklerD config (webUI) to decide if to set delay
probabilityOver=101
# If you are not running this from the same host as SprinklerD, then change localhost in the below.
sprinklerdHost="http://localhost:80"
########################################################################################################################
#
# Should not need to edit below this line.
#
########################################################################################################################
sprinklerdEnableDelay="$sprinklerdHost/?type=option&option=24hdelay&state=reset"
sprinklerdProbability="$sprinklerdHost/?type=sensor&sensor=chanceofrain&value="
openweatherURL="https://api.openweathermap.org/data/2.5/onecall?lat=$lat&lon=$lon&appid=$openweatherAPIkey&exclude=current,minutely,hourly,alerts"
weatherbitURL="https://api.weatherbit.io/v2.0/forecast/daily?key=$weatherbitAPIkey&lat=$lat&lon=$lon"
climacellURL="https://data.climacell.co/v4/timelines?location=$lat%2C$lon&fields=precipitationProbability&timesteps=1d&units=metric&apikey=$climacellAPIkey"
weatherAPIlURL="http://api.weatherapi.com/v1/forecast.json?key=$weatherAPIkey&q=$lat,$lon&days=1&aqi=no&alerts=no"
2024-12-14 14:17:00 +00:00
openmeteoURL="https://api.open-meteo.com/v1/forecast?latitude=$lat&longitude=$lon&daily=precipitation_probability_max&timezone=America%2FChicago&forecast_days=1"
accuweatherURL="http://dataservice.accuweather.com/forecasts/v1/daily/1day/$zip?apikey=$accuweatherAPI&details=true"
pirateweatherURL="https://api.pirateweather.net/forecast/$pirateweatherAPI/$lat%2C$lon?exclude=minutely%2Chourly%2Calerts"
2024-06-21 22:59:09 +00:00
true=0
false=1
2024-12-14 14:17:00 +00:00
OUT_FIRST=1
OUT_MAX=2
OUT_MIN=3
OUT_AVERAGE=4
OUT_PRINT_ONLY=5
output=$OUT_FIRST
2024-06-21 22:59:09 +00:00
echoerr() { printf "%s\n" "$*" >&2; }
echomsg() { if [ -t 1 ]; then echo "$@" 1>&2; fi; }
2024-12-14 14:17:00 +00:00
2024-06-21 22:59:09 +00:00
function getURL() {
url=$1
jq=$2
factor=$3
JSON=$(curl -s "$url")
if [ $? -ne 0 ]; then
echoerr "Error reading URL, '$1' please check!"
echoerr "Maybe you didn't configure your API and location?"
echo 0;
return $false
else
probability=$(echo $JSON | jq "$jq" )
fi
2024-12-14 14:17:00 +00:00
if ! [[ $probability =~ ^[0-9]+([.][0-9]+)?$ ]]; then
echoerr "Did not get a number from probability API result=$probability"
return $false
fi
2024-06-21 22:59:09 +00:00
probability=$(echo "$probability * $factor / 1" | bc )
echo $probability
return $true
}
# Test we have everything installed
command -v curl >/dev/null 2>&1 || { echoerr "curl is not installed. Aborting!"; exit 1; }
command -v jq >/dev/null 2>&1 || { echoerr "jq is not installed. Aborting!"; exit 1; }
command -v bc >/dev/null 2>&1 || { echoerr "bc not installed. Aborting!"; exit 1; }
2024-12-14 14:17:00 +00:00
probArray=()
2024-06-21 22:59:09 +00:00
if [ "$#" -lt 1 ]; then
2024-12-14 14:17:00 +00:00
echomsg "Pass at least one command line parameter (openweather, weatherbit, climacell, weatherapi, openmeteo, accuweather, pirateweather)"
echomsg "if you pass more than 1 of above, can also use one of folowing -max -min -average -first"
echomsg "Example:-"
echomsg " $0 openweather weatherapi -average"
echomsg ""
2024-06-21 22:59:09 +00:00
exit 1;
fi
for var in "$@"
do
case "$var" in
2024-12-14 14:17:00 +00:00
-max)
output=$OUT_MAX
;;
-min)
output=$OUT_MIN
;;
-average)
output=$OUT_AVERAGE
;;
-first)
output=$OUT_FIRST
;;
-print)
output=$OUT_PRINT_ONLY
;;
2024-06-21 22:59:09 +00:00
openweather)
if [ "$openweatherAPIkey" == "-----" ]; then echomsg "missing OpenWeather API key" && continue; fi
if probability=$(getURL "$openweatherURL" '.["daily"][0].pop' "100"); then
echomsg "OpenWeather probability of rain today is $probability%"
2024-12-14 14:17:00 +00:00
#pop=$(echo "if($probability>$pop)print $probability else print $pop" | bc -l)
probArray+=($probability)
2024-06-21 22:59:09 +00:00
fi
;;
weatherbit)
if [ "$weatherbitAPIkey" == "-----" ]; then echomsg "missing WeatherBit API key" && continue; fi
if probability=$(getURL "$weatherbitURL" '.data[0].pop' "1"); then
echomsg "WeatherBit probability of rain today is $probability%"
2024-12-14 14:17:00 +00:00
#pop=$(echo "if($probability>$pop)print $probability else print $pop" | bc -l)
probArray+=($probability)
2024-06-21 22:59:09 +00:00
fi
;;
climacell)
if [ "$climacellAPIkey" == "-----" ]; then echomsg "missing ClimaCell API key" && continue; fi
if probability=$(getURL "$climacellURL" '.data.timelines[0].intervals[0].values.precipitationProbability' "1"); then
echomsg "ClimaCell probability of rain today is $probability%"
2024-12-14 14:17:00 +00:00
probArray+=($probability)
2024-06-21 22:59:09 +00:00
fi
;;
weatherapi)
if [ "$weatherAPIkey" == "-----" ]; then echomsg "missing WeatherAPI API key" && continue; fi
if probability=$(getURL "$weatherAPIlURL" '.forecast.forecastday[0].day.daily_chance_of_rain' "1"); then
echomsg "WeatherAPI probability of rain today is $probability%"
2024-12-14 14:17:00 +00:00
probArray+=($probability)
fi
;;
openmeteo)
if probability=$(getURL "$openmeteoURL" '.daily.precipitation_probability_max[]' "1"); then
echomsg "Open Meteo probability of rain today is $probability%"
probArray+=($probability)
fi
;;
accuweather)
if probability=$(getURL "$accuweatherURL" '.DailyForecasts[0].Day.PrecipitationProbability' "1"); then
echomsg "AccuWeather probability of rain today is $probability%"
probArray+=($probability)
fi
;;
pirateweather)
if probability=$(getURL "$pirateweatherURL" '.daily.data[0].precipProbability' "100"); then
echomsg "PirateWeather probability of rain today is $probability%"
probArray+=($probability)
2024-06-21 22:59:09 +00:00
fi
;;
esac
done
2024-12-14 14:17:00 +00:00
if [ ${#probArray[@]} -le 0 ]; then
echoerr "No rain probability values found"
2024-06-21 22:59:09 +00:00
exit 1
fi
2024-12-14 14:17:00 +00:00
prop=${probArray[0]}
case $output in
$OUT_PRINT_ONLY)
exit 0;
;;
$OUT_FIRST)
prop=${probArray[0]}
;;
$OUT_MAX)
for n in "${probArray[@]}" ; do
((n > prop)) && prop=$n
done
;;
$OUT_MIN)
for n in "${probArray[@]}" ; do
((n < prop)) && prop=$n
done
;;
$OUT_AVERAGE)
prop=0
for n in "${probArray[@]}" ; do
let prop=prop+n
done
let prop=prop/${#probArray[@]}
;;
esac
echomsg "Chance of rain $prop%"
curl -s "$sprinklerdProbability$prop" > /dev/null
if (( $(echo "$prop > $probabilityOver" | bc -l) )); then
2024-06-21 22:59:09 +00:00
echomsg "Enabeling rain delay"
curl -s "$sprinklerdEnableDelay" > /dev/null
fi
exit 0
2024-12-14 14:17:00 +00:00