NOAA Weather: Difference between revisions
New page: How to setup the NOAA Weather GSD |
No edit summary |
||
| Line 1: | Line 1: | ||
How to setup the NOAA Weather GSD | How to setup the NOAA Weather GSD (Rough Draft) | ||
Description - NOAA Weather | |||
Implements DCE | |||
Device Category - Environment Climate Device #83 | |||
Comm Method - Ethernet | |||
Commands - Ruby internal commands | |||
GSD Code | |||
#395 Check for updates | |||
check_weather() | |||
#396 Check for updates done | |||
check_weather_done() | |||
#373 Private Method Listing | |||
### Logging function | |||
def log(word) | |||
$logFile.print( word + "\n" ) | |||
$logFile.flush() | |||
end | |||
### Weather check function | |||
def check_weather() | |||
log("Backing up previous data") | |||
oldweather = $weather | |||
oldtemp = $temp | |||
oldpressure = $pressure | |||
olddew_point = $dew_point | |||
oldheat_index = $heat_index | |||
oldwindchill = $windchill | |||
oldhumidity = $humidity | |||
oldwind = $wind | |||
oldvisibility = $visibility | |||
log("Checking for weather updates") | |||
### Get xml file from NOAA | |||
# xmlPath = "www.weather.gov/data/current_obs/"+$identifier+".xml" | |||
# h = "GET "+xmlPath+" HTTP/1.0\r\n" | |||
# log("HTTP Request: #{h}") | |||
# conn_.Send(h) | |||
# resv = "" | |||
# while(true) | |||
# buff = conn_.Recv(16384, 5000) | |||
# if buff.length() == 0 | |||
# break | |||
# end | |||
# recv = recv + buff | |||
# end | |||
h = Net::HTTP.new('www.weather.gov', 80) | |||
data_loc = "/data/current_obs/"+$identifier+".xml" | |||
resp, data = h.get(data_loc, nil) | |||
if resp.message == "OK" | |||
# if recv =~ /^HTTP[^\r\n]+200\sOK.+?\r\n\r\n(.+)$/m | |||
# data = $1 | |||
# log("Recieved:\n#{data}") | |||
data.each_line {|line| | |||
if line =~/location>(.*)<\/location>/ | |||
$location = $1 | |||
end | |||
if line =~/observation_time_rfc822>(.*)<\/observation_time_rfc822>/ | |||
$obs_time = $1 | |||
end | |||
if line =~/weather>(.*)<\/weather>/ | |||
$weather = $1 | |||
end | |||
if $units == "F" | |||
if line =~/temp_f>(.*)<\/temp_f>/ | |||
$temp = $1 | |||
end | |||
if line =~/pressure_in>(.*)<\/pressure_in>/ | |||
$pressure = $1 | |||
end | |||
if line =~/dewpoint_f>(.*)<\/dewpoint_f>/ | |||
$dew_point = $1 | |||
end | |||
if line =~/heat_index_f>(.*)<\/heat_index_f>/ | |||
$heat_index = $1 | |||
end | |||
if line =~/windchill_f>(.*)<\/windchill_f>/ | |||
$windchill = $1 | |||
end | |||
else | |||
if line =~/temp_c>(.*)<\/temp_c>/ | |||
$temp = $1 | |||
end | |||
if line =~/pressure_mb>(.*)<\/pressure_mb>/ | |||
$pressure = $1 | |||
end | |||
if line =~/dewpoint_c>(.*)<\/dewpoint_c>/ | |||
$dew_point = $1 | |||
end | |||
if line =~/heat_index_c>(.*)<\/heat_index_c>/ | |||
$heat_index = $1 | |||
end | |||
if line =~/windchill_c>(.*)<\/windchill_c>/ | |||
$windchill = $1 | |||
end | |||
end | |||
if line =~/relative_humidity>(.*)<\/relative_humidity>/ | |||
$humidity = $1 | |||
end | |||
if line =~/wind_string>(.*)<\/wind_string>/ | |||
$wind = $1 | |||
end | |||
if line =~/visibility_mi>(.*)<\/visibility_mi>/ | |||
$visibility = $1 | |||
end | |||
} | |||
end | |||
### Send out events for weather changes | |||
if $weather != oldweather | |||
ms = "/usr/pluto/bin/MessageSend dcerouter "+device_.devid_.to_s+" -1001 2 75 13 \""+$weather+"\"" | |||
system(ms) | |||
log("Message sent: #{ms}") | |||
end | |||
if $temp != oldtemp | |||
ms = "/usr/pluto/bin/MessageSend dcerouter "+device_.devid_.to_s+" -1001 2 25 13 \""+$temp+"\"" | |||
system(ms) | |||
log("Message sent: #{ms}") | |||
end | |||
check_weather_done() | |||
end | |||
### Post weather check | |||
def check_weather_done() | |||
log("Weather data from: "+$obs_time) | |||
log("Weather check complete") | |||
end | |||
#351 Process IDLE | |||
### Auto check weather every quarter past the hour per NOAA | |||
t = Time.now | |||
#355 Process Initialize | |||
### | |||
# NOAA Weather check | |||
# 2008 Jason Speckman | |||
### | |||
require 'net/http' | |||
# Init Vars | |||
$logFile = File.new("/var/log/pluto/NOAA_Weather.log", "w") | |||
$DEVICEDATA_ICAO_CONST = 249 | |||
$DEVICEDATA_UNITS_CONST = 250 | |||
$units = "" | |||
$identifier = "" | |||
$location = "" | |||
$obs_time = "" | |||
$weather = "" | |||
$temp = "" | |||
$pressure = "" | |||
$dew_point = "" | |||
$heat_index = "" | |||
$windchill = "" | |||
$humidity = "" | |||
$wind = "" | |||
$visibility = "" | |||
### Check for identifier and units | |||
if device_.devdata_ != nil | |||
if device_.devdata_[$DEVICEDATA_ICAO_CONST] != nil | |||
$identifier = device_.devdata_[$DEVICEDATA_ICAO_CONST] | |||
log("ICAO identifier: "+$identifier) | |||
else | |||
log("No ICAO identifier specified") | |||
end | |||
if device_.devdata_[$DEVICEDATA_UNITS_CONST] != nil | |||
$units = device_.devdata_[$DEVICEDATA_UNITS_CONST] | |||
else | |||
$units = "F" | |||
end | |||
end | |||
log("Units in degrees "+$units) | |||
if $units == "F" | |||
$press_units = "in. Hg" | |||
else | |||
$press_units = "hPa" | |||
end | |||
### Tell DCE we are a climate device | |||
log("Starting NOAA Weather Check") | |||
log("Setup message intercept for DCERouter") | |||
### | |||
# devIDfrom: device_.devid_ = my device id | |||
# devIDto: -1000 = dcerouter | |||
# priority: | |||
# type: 1 = command, 2 = event | |||
# id: | |||
$devIDfrom = device_.devid_ | |||
devIDto = -1000 | |||
priority = "" | |||
type = 2 | |||
id = "" | |||
#cmd = Command.new(devIDfrom, devIDto, priority, type, id) | |||
#cmd.params_[x] = y | |||
#SendCommand(cmd) | |||
#ms = "/usr/pluto/bin/MessageSend dcerouter " + device_.devid_.to_s + " -1000 8 0 5 2 4 10" | |||
#system(ms) | |||
log("Init complete") | |||
### Initial weather check | |||
check_weather() | |||
#356 Process Release | |||
if ($logFile != nil) then | |||
$logFile.close | |||
end | |||
Device Data | |||
#249 ICAO Location Indicator(string) | |||
Comment - Local airport identifier for weather info | |||
Required and Allowed to modify | |||
#250 Units(string) | |||
Comment - Degree units. Either (F) or (C) | |||
Required and Allowed to modify | |||
Events | |||
Temperature Changed #25 | |||
Comment - Temperature has changed since last update | |||
Weather Changed #75 | |||
Comment - Weather has changed since last update | |||
Issues and TODO | |||
Revision as of 11:26, 27 June 2008
How to setup the NOAA Weather GSD (Rough Draft)
Description - NOAA Weather Implements DCE Device Category - Environment Climate Device #83 Comm Method - Ethernet Commands - Ruby internal commands
GSD Code
- 395 Check for updates
check_weather()
- 396 Check for updates done
check_weather_done()
- 373 Private Method Listing
- Logging function
def log(word)
$logFile.print( word + "\n" ) $logFile.flush()
end
- Weather check function
def check_weather()
log("Backing up previous data")
oldweather = $weather
oldtemp = $temp
oldpressure = $pressure
olddew_point = $dew_point
oldheat_index = $heat_index
oldwindchill = $windchill
oldhumidity = $humidity
oldwind = $wind
oldvisibility = $visibility
log("Checking for weather updates")
- Get xml file from NOAA
- xmlPath = "www.weather.gov/data/current_obs/"+$identifier+".xml"
- h = "GET "+xmlPath+" HTTP/1.0\r\n"
- log("HTTP Request: #{h}")
- conn_.Send(h)
- resv = ""
- while(true)
- buff = conn_.Recv(16384, 5000)
- if buff.length() == 0
- break
- end
- recv = recv + buff
- end
h = Net::HTTP.new('www.weather.gov', 80)
data_loc = "/data/current_obs/"+$identifier+".xml"
resp, data = h.get(data_loc, nil)
if resp.message == "OK"
- if recv =~ /^HTTP[^\r\n]+200\sOK.+?\r\n\r\n(.+)$/m
- data = $1
- log("Recieved:\n#{data}")
data.each_line {|line|
if line =~/location>(.*)<\/location>/
$location = $1
end
if line =~/observation_time_rfc822>(.*)<\/observation_time_rfc822>/
$obs_time = $1
end
if line =~/weather>(.*)<\/weather>/
$weather = $1
end
if $units == "F"
if line =~/temp_f>(.*)<\/temp_f>/
$temp = $1
end
if line =~/pressure_in>(.*)<\/pressure_in>/
$pressure = $1
end
if line =~/dewpoint_f>(.*)<\/dewpoint_f>/
$dew_point = $1
end
if line =~/heat_index_f>(.*)<\/heat_index_f>/
$heat_index = $1
end
if line =~/windchill_f>(.*)<\/windchill_f>/
$windchill = $1
end
else
if line =~/temp_c>(.*)<\/temp_c>/
$temp = $1
end
if line =~/pressure_mb>(.*)<\/pressure_mb>/
$pressure = $1
end
if line =~/dewpoint_c>(.*)<\/dewpoint_c>/
$dew_point = $1
end
if line =~/heat_index_c>(.*)<\/heat_index_c>/
$heat_index = $1
end
if line =~/windchill_c>(.*)<\/windchill_c>/
$windchill = $1
end
end
if line =~/relative_humidity>(.*)<\/relative_humidity>/
$humidity = $1
end
if line =~/wind_string>(.*)<\/wind_string>/
$wind = $1
end
if line =~/visibility_mi>(.*)<\/visibility_mi>/
$visibility = $1
end
}
end
- Send out events for weather changes
if $weather != oldweather
ms = "/usr/pluto/bin/MessageSend dcerouter "+device_.devid_.to_s+" -1001 2 75 13 \""+$weather+"\""
system(ms)
log("Message sent: #{ms}")
end
if $temp != oldtemp
ms = "/usr/pluto/bin/MessageSend dcerouter "+device_.devid_.to_s+" -1001 2 25 13 \""+$temp+"\""
system(ms)
log("Message sent: #{ms}")
end
check_weather_done()
end
- Post weather check
def check_weather_done()
log("Weather data from: "+$obs_time)
log("Weather check complete")
end
- 351 Process IDLE
- Auto check weather every quarter past the hour per NOAA
t = Time.now
- 355 Process Initialize
- NOAA Weather check
- 2008 Jason Speckman
require 'net/http'
- Init Vars
$logFile = File.new("/var/log/pluto/NOAA_Weather.log", "w")
$DEVICEDATA_ICAO_CONST = 249 $DEVICEDATA_UNITS_CONST = 250
$units = "" $identifier = "" $location = "" $obs_time = "" $weather = "" $temp = "" $pressure = "" $dew_point = "" $heat_index = "" $windchill = "" $humidity = "" $wind = "" $visibility = ""
- Check for identifier and units
if device_.devdata_ != nil
if device_.devdata_[$DEVICEDATA_ICAO_CONST] != nil
$identifier = device_.devdata_[$DEVICEDATA_ICAO_CONST]
log("ICAO identifier: "+$identifier)
else
log("No ICAO identifier specified")
end
if device_.devdata_[$DEVICEDATA_UNITS_CONST] != nil
$units = device_.devdata_[$DEVICEDATA_UNITS_CONST]
else
$units = "F"
end
end
log("Units in degrees "+$units)
if $units == "F"
$press_units = "in. Hg"
else
$press_units = "hPa"
end
- Tell DCE we are a climate device
log("Starting NOAA Weather Check") log("Setup message intercept for DCERouter")
- devIDfrom: device_.devid_ = my device id
- devIDto: -1000 = dcerouter
- priority:
- type: 1 = command, 2 = event
- id:
$devIDfrom = device_.devid_ devIDto = -1000 priority = "" type = 2 id = ""
- cmd = Command.new(devIDfrom, devIDto, priority, type, id)
- cmd.params_[x] = y
- SendCommand(cmd)
- ms = "/usr/pluto/bin/MessageSend dcerouter " + device_.devid_.to_s + " -1000 8 0 5 2 4 10"
- system(ms)
log("Init complete")
- Initial weather check
check_weather()
- 356 Process Release
if ($logFile != nil) then $logFile.close end
Device Data
- 249 ICAO Location Indicator(string)
Comment - Local airport identifier for weather info Required and Allowed to modify
- 250 Units(string)
Comment - Degree units. Either (F) or (C) Required and Allowed to modify
Events Temperature Changed #25 Comment - Temperature has changed since last update
Weather Changed #75 Comment - Weather has changed since last update
Issues and TODO