Weather beacon

I wanted to broadcast a weather beacon, but since I don’t have a weather station it became a bit more difficult. After some searching on the internet I came across a site where I can download a file with an api with weather data that is no more than 10 minutes old. Great. After downloading the file looks a little messy.

 "liveweer": [{"plaats": "Kortgene", "station": "DE BILT AWS", "timestamp": "1577030283", "time": "22-12-2019 16:58:03", "temp": "7.3", "gtemp": "4.6", "samenv": "Van tijd tot tijd lichte regenbuien of regen", "image": "regen", "windrgr": "182.7", "windr": "ZZO", "windms": "4.06", "windbft": "3", "windknp": "7.9", "windkmh": "14.6", "windstootms": "5.19", "windstootbft": "3", "windstootknp": "10.1", "windstootkmh": "18.7", "luchttemp": "7.2", "lv": "99", "luchtd"

I can’t do much with this. Let`s manupilate the file. First add some “enters”/”new lines” in the file.

Add a enter after/new line “, ”
sed -i $’s/”, “/),\\\n(/g’ ~/wx-project/meteo.wx

Now the file looks like this

{ "liveweer": [{"plaats": "Kortgene),
(station": "DE BILT AWS),
(timestamp": "1577030283),
(time": "22-12-2019 16:58:03),
(temp": "7.3),
(gtemp": "4.6),
(samenv": "Van tijd tot tijd lichte regenbuien of regen),
(image": "regen),
(windrgr": "182.7),
(windr": "ZZO),
(windms": "4.06),
(windbft": "3),
(windknp": "7.9),
(windkmh": "14.6),
(windstootms": "5.19),
(windstootbft": "3),
(windstootknp": "10.1),
(windstootkmh": "18.7),
(luchttemp": "7.2),
(lv": "99),
(luchtd": "_),

That’s better, just clean up the mess. I end up with this.

# Remove the non-letters/numbers except . and : and –
sed -i -e “s/[^ 0-9a-zA-Z.:-]//g” -e ‘s/ \+/ /’ ~/wx-project/meteo.wx

liveweer: plaats: Kortgene
station: DE BILT AWS
timestamp: 1577030283
time: 22-12-2019 16:58:03
temp: 7.3
gtemp: 4.6
samenv: Van tijd tot tijd lichte regenbuien of regen
image: regen
windrgr: 182.7
windr: ZZO
windms: 4.06
windbft: 3
windknp: 7.9
windkmh: 14.6
windstootms: 5.19
windstootbft: 3
windstootknp: 10.1
windstootkmh: 18.7
luchttemp: 7.2
lv: 99

Now we can read the line and get the value from it. I do this with “awk”

temp=$(awk ‘NR==5{print $2}’ meteo.wx)
echo TEMP=”$temp”°C Temperature degrees Celsius

Read line 5 word number two. And we have…………….

7.3°C Temperature degrees Celsius.

In the Netherlands we work with the mertrice system. Now the weather beacon is displayed in the imperial system. Now some calculation work must take place.

# Do some calulation
# From °Celsius to Fahrenheit
fah=$(echo "(($temp*1.8)+32)" | bc)
fah1=$(echo "$fah" | awk -F'.' '{print $1}')
fah2=$(echo $fah1 | sed -e :a -e 's/^.\{1,2\}$/0&/;ta')
echo FAH="$fah2"F Temperature degrees Fahrenheit
# (Wind speed miles)From kilometer per hour to miles per hour and add leading zero(s)
wpm=$(echo "$wpk"/1.609344 | bc)
wpm0=$(echo $wpm | sed -e :a -e 's/^.\{1,2\}$/0&/;ta')
echo WPM="$wpm0"mph Wind speed in miles per hour
# (Wind guts miles) From kilometer per hour to miles per hour and add leading zero(s)
wgm=$(echo "$wgk"/1.609344 | bc)
wgm0=$(echo $wgm | sed -e :a -e 's/^.\{1,2\}$/0&/;ta')
echo WGM="$wgm0"mph Wind guts in miles per hour
# (Rain in inches) From mm to inches the last hour. Remove the (DOT) and only the first 3 numbers
rni=$(echo "$rn"*0.0039370 | bc)
rni0=$(echo $rni | sed -e 's/^[.]*//g' -e 's/^\(.\{3\}\).*$/\1/')
echo RNI="$rni0"inch Rain in the last hour in inches
# (Rain (24) in inches) From mm to inches the last 24 hour. Remove the (DOT) and only the first 3 numbers
rni24=$(echo "$rn24"*0.0039370 | bc)
rni240=$(echo $rni24 | sed -e 's/^[.]*//g' -e 's/^\(.\{3\}\).*$/\1/')
echo RNI="$rni240"inch Rain in the last 24 hour in inches
# (Rain (12) in inches) From mm to inches the last 12 hour. Remove the (DOT) and only the first 3 numbers
rni12=$(echo "$rn12"*0.0039370 | bc)
rni120=$(echo $rni12 | sed -e 's/^[.]*//g' -e 's/^\(.\{3\}\).*$/\1/')
echo RNI="$rni120"inch Rain in the last 12 hour in inches

We can finally put the beacon together.

# Let show what we have and put it on the place it belong.
echo !5133.52N/00348.15E_"$grd"/"$wpm0"g"$wgm0"t"$fah2"r"$rni0"p"$rni240"P"$rni120"h"$hum"b"$bar"
echo !5133.52N/00348.15E_"$grd"/"$wpm0"g"$wgm0"t"$fah2"r"$rni0"p"$rni240"P"$rni120"h"$hum"b"$bar" > /home/pd9q/jnos/wx/current.wx

Output

!5133.52N/00348.15E_272/010g022t046r005p028P017h92b0987

The compleet output looks like this.

TEMP=8°C Temperature degrees Celsius
WPK=16.8km/h Wind speed in Kilometers per hour
WGK=35.6km/h Wind guts in Kilometers per hour
GRD=272° Wind direction in degrees
RAIN=1.48067mm Rain in the last hour in mm
RAIN24=7.23632mm Rain in the last 24 hour in mm
RAIN12=4.53765mm Rain in the last 12 hour in mm
HUM=92% Humidity in procent
Bar=0987mb Barometric pressure in millibars
FAH=046F Temperature degrees Fahrenheit
WPM=010mph Wind speed in miles per hour
WGM=022mph Wind guts in miles per hour
RNI=005inch Rain in the last hour in inches
RNI=028inch Rain in the last 24 hour in inches
RNI=017inch Rain in the last 12 hour in inches
!5133.52N/00348.15E_272/010g022t046r005p028P017h92b098

The complete script look like this.

I put it in a cronjob, now it’s running every 15 minutes.
crontab -e
*/15 * * * * /home/pd9q/wx-project/get-wx.sh >/dev/null 2>&1

!/bin/bash
# Date 22-12-2019... Dammmmm what a job :)
# The weather beacon have to look like this....
# @220424z5057.81N/00729.37E_094/002g005t043r000p006P006h89b09783
# !5133.52N/00348.15E_073/013g...t048h85b10040wWXD
#
# Jun 01 2003 08:07
# 272/000g006t069r010p030P020h61b10150
# ***********************************************************
# 272 - wind direction - 272 degrees
# 010 - wind speed - 10 mph
# g015 - wind gust - 15 mph
# t069 - temperature - 69 degrees F
# r010 - rain in last hour in hundredths of an inch - 0.1 inches
# p030 - rain in last 24 hours in hundredths of an inch - 0.3 inches
# P020 - rain since midnight in hundredths of an inch - 0.2 inches
# h61 - humidity 61% (00 = 100%)
# b10153 - barometric pressure in tenths of a MILLIBAR - 1015.3 MILLIBARS
#
# Get the wx data from Weerlive/Meteoserver
#wget -O - "http://weerlive.nl/api/json-data-10min.php?key=?!?!?!?!?!&locatie=Kortgene" > ~/wx-project/weerlive.wx
#
wget -O - "https://data.meteoserver.nl/api/liveweer_synop.php?locatie=Kortgene&key=!?!?!?!?!?!?&select=1" > ~/wx-project/meteo.wx
#
# Some file manipulation on the METEO.WX file
# Add a enter after ", "
sed -i $'s/", "/),\\\n(/g' ~/wx-project/meteo.wx
# Remove the non-letters/numbers except . and : and -
sed -i -e "s/[^ 0-9a-zA-Z.:-]//g" -e 's/ \+/ /' ~/wx-project/meteo.wx
#
# Getting the data sorted....
now=$(date +%d%H%M)
#
temp=$(awk 'NR==5{print $2}' meteo.wx)
echo TEMP="$temp"°C Temperature degrees Celsius
# Wind speed (Kilometers)
wpk=$(awk 'NR==14{print $2}' meteo.wx)
echo WPK="$wpk"km/h Wind speed in Kilometers per hour
# Wind gust (Kilometers)
wgk=$(awk 'NR==18{print $2}' meteo.wx)
echo WGK="$wgk"km/h Wind guts in Kilometers per hour
grd=$(awk 'NR==9{print $2}' meteo.wx | awk -F'.' '{print $1}')
echo GRD="$grd"° Wind direction in degrees
rn=$(awk 'NR==38{print $2}' meteo.wx)
echo RAIN="$rn"mm Rain in the last hour in mm
rn24=$(awk 'NR==39{print $2}' meteo.wx)
echo RAIN24="$rn24"mm Rain in the last 24 hour in mm
rn12=$(awk 'NR==37{print $2}' meteo.wx)
echo RAIN12="$rn12"mm Rain in the last 12 hour in mm
hum=$(awk 'NR==20{print $2}' meteo.wx)
echo HUM="$hum"% Humidity in procent
bar=$(awk 'NR==21{print $2}' meteo.wx | awk -F: '{ printf "%04i", $1,$2 }')
echo Bar="$bar"mb Barometric pressure in millibars

# Do some calulation
# From °Celsius to Fahrenheit
fah=$(echo "(($temp*1.8)+32)" | bc)
fah1=$(echo "$fah" | awk -F'.' '{print $1}')
fah2=$(echo $fah1 | sed -e :a -e 's/^.\{1,2\}$/0&/;ta')
echo FAH="$fah2"F Temperature degrees Fahrenheit
# (Wind speed miles)From kilometer per hour to miles per hour and add leading zero(s)
wpm=$(echo "$wpk"/1.609344 | bc)
wpm0=$(echo $wpm | sed -e :a -e 's/^.\{1,2\}$/0&/;ta')
echo WPM="$wpm0"mph Wind speed in miles per hour
# (Wind guts miles) From kilometer per hour to miles per hour and add leading zero(s)
wgm=$(echo "$wgk"/1.609344 | bc)
wgm0=$(echo $wgm | sed -e :a -e 's/^.\{1,2\}$/0&/;ta')
echo WGM="$wgm0"mph Wind guts in miles per hour
# (Rain in inches) From mm to inches the last hour. Remove the (DOT) and only the first 3 numbers
rni=$(echo "$rn"*0.0039370 | bc)
rni0=$(echo $rni | sed -e 's/^[.]*//g' -e 's/^\(.\{3\}\).*$/\1/')
echo RNI="$rni0"inch Rain in the last hour in inches
# (Rain (24) in inches) From mm to inches the last 24 hour. Remove the (DOT) and only the first 3 numbers
rni24=$(echo "$rn24"*0.0039370 | bc)
rni240=$(echo $rni24 | sed -e 's/^[.]*//g' -e 's/^\(.\{3\}\).*$/\1/')
echo RNI="$rni240"inch Rain in the last 24 hour in inches
# (Rain (12) in inches) From mm to inches the last 12 hour. Remove the (DOT) and only the first 3 numbers
rni12=$(echo "$rn12"*0.0039370 | bc)
rni120=$(echo $rni12 | sed -e 's/^[.]*//g' -e 's/^\(.\{3\}\).*$/\1/')
echo RNI="$rni120"inch Rain in the last 12 hour in inches

#@220424z5057.81N/00729.37E_094/002g005t043r000p006P006h89b09783
# Let show what we have and put it on place it belong.
echo !5133.52N/00348.15E_"$grd"/"$wpm0"g"$wgm0"t"$fah2"r"$rni0"p"$rni240"P"$rni120"h"$hum"b"$bar"
echo !5133.52N/00348.15E_"$grd"/"$wpm0"g"$wgm0"t"$fah2"r"$rni0"p"$rni240"P"$rni120"h"$hum"b"$bar" > /home/pd9q/jnos/wx/current.wx
#