Axeda Groovy Script: Get Precipitation by a given latitude and Longitude

    This Groovy script gets the weather forecast for a given lat/long by calling an external web service.


    Use in an Expression rule like this:


    If: something

    Then: SetDataItem ("precipitation", round(ExecuteCustomObject ("GetPrecipitation", location) ))

    This sets the dataitem "precipitation" to the value returned by this script.




    Variable Name               Display Name
    location                         localtion (lat, lon)


    import org.apache.commons.httpclient.methods.*
    import org.apache.commons.httpclient.*
    import java.text.SimpleDateFormat
    def location = parameters.location.toString()
    def locparts = location.split(',')
    def lat = locparts[0]
    def lon = locparts[1]
    def hostname = ""
    def url = "/forecasts/xml/sample_products/browser_interface/ndfdXMLclient.php"
    String ndfdElement = "pop12" // see
    def perceptTimeFormat = new SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss");
    def cal = Calendar.getInstance();
    Date startDate = cal.getTime()
    Date endDate = cal.getTime()
    def client = new HttpClient ()
    HostConfiguration host = client.getHostConfiguration()
    host.setHost(hostname, 80, "http")
    GetMethod get = new GetMethod (url)
    NameValuePair [] params = new NameValuePair [6]
    params[0] = new NameValuePair ("lat", lat);
    params[1] = new NameValuePair ("lon", lon);
    params[2] = new NameValuePair ("product", 'time-series');
    params[3] = new NameValuePair ("begin", perceptTimeFormat.format(startDate));
    params[4] = new NameValuePair ("end", perceptTimeFormat.format(endDate));
    params[5] = new NameValuePair (ndfdElement, ndfdElement);
    client.executeMethod(host, get);
    message = "Status:" + get.getStatusText()
    content = get.getResponseBodyAsString()
    // parse result XML and compute average
    def dwml = new XmlSlurper ().parseText(content)
    readings ="probability-of-precipitation".value.collect { Integer.parseInt(it.toString()) }
    average = readings.sum() / readings.size()
    // "Expected precipitation for $location is $readings"
    return readings[0]