Difference between revisions of "NOAA Weather"

From LinuxMCE
Jump to: navigation, search
Line 9: Line 9:
  
 
GSD Code
 
GSD Code
 +
<pre><nowiki>
 
#395 Check for updates
 
#395 Check for updates
 
check_weather()
 
check_weather()
Line 242: Line 243:
 
Weather Changed #75
 
Weather Changed #75
 
Comment - Weather has changed since last update
 
Comment - Weather has changed since last update
 +
</nowiki></pre>
  
  
 
Issues and TODO
 
Issues and TODO

Revision as of 14:50, 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