here is my complete rule file
import java.io.InputStreamReader;
import java.nio.CharBuffer;
import java.net.URL;
import java.lang.StringBuilder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
rule "Get weather forecast data from BOM"
when
Time cron "0 */5 * ? * *" // update every 10 minutes
// Time cron "0 0 */6 ? * *" // update every 6 hours
then
//logInfo("BOM data","reading forecast data")
val URL url = new URL("ftp://ftp.bom.gov.au/anon/gen/fwo/IDS10044.xml");
val InputStreamReader instream = new InputStreamReader(url.openStream())
var StringBuilder sb = new StringBuilder();
var CharBuffer cb = CharBuffer.allocate(1024);
var int read = instream.read ( cb );
while(read != -1) {
sb.append(cb.array(), 0, read )
cb.clear
read = instream.read( cb )
}
instream.close();
val String bom_data = sb.toString();
for(var int i=0; i<7; i++)
{
//logInfo("BOM data","day index="+i)
val String start_time = transform ("XPATH", "//forecast/area[@aac='SA_PT013']/forecast-period[@index='"+i+"']/@start-time-local", bom_data)
//logInfo("BOM data","start_time="+start_time)
postUpdate("BOM_Date_"+i, start_time)
val String air_temperature_maximum = transform ("XPATH", "//forecast/area[@aac='SA_PT013']/forecast-period[@index='"+i+"']/element[@type='air_temperature_maximum']/text()", bom_data)
//logInfo("BOM data","air_temperature_maximum="+air_temperature_maximum)
postUpdate("BOM_Temp_Max_"+i, air_temperature_maximum)
val String air_temperature_minimum = transform ("XPATH", "//forecast/area[@aac='SA_PT013']/forecast-period[@index='"+i+"']/element[@type='air_temperature_minimum']/text()", bom_data)
//logInfo("BOM data","air_temperature_minimum="+air_temperature_minimum)
postUpdate("BOM_Temp_Min_"+i, air_temperature_minimum)
val String precipitation_range = transform ("XPATH", "//forecast/area[@aac='SA_PT013']/forecast-period[@index='"+i+"']/element[@type='precipitation_range']/text()", bom_data)
//logInfo("BOM data","precipitation_range="+precipitation_range)
postUpdate("BOM_Precipitation_Range_"+i, precipitation_range)
val String forecast_icon_code = transform ("XPATH", "//forecast/area[@aac='SA_PT013']/forecast-period[@index='"+i+"']/element[@type='forecast_icon_code']/text()", bom_data)
//logInfo("BOM data","forecast_icon_code="+forecast_icon_code)
postUpdate("BOM_Forecast_Icon_Code_"+i, forecast_icon_code)
var String precis = transform ("XPATH", "//forecast/area[@aac='SA_PT013']/forecast-period[@index='"+i+"']/text[@type='precis']/text()", bom_data)
//logInfo("BOM data","precis="+precis)
postUpdate("BOM_Precis_"+i, precis)
val String probability_of_precipitation = transform ("XPATH", "//forecast/area[@aac='SA_PT013']/forecast-period[@index='"+i+"']/text[@type='probability_of_precipitation']/text()", bom_data)
//logInfo("BOM data","probability_of_precipitation="+probability_of_precipitation)
postUpdate("BOM_Precipitation_"+i, probability_of_precipitation)
val String forecast = transform ("XPATH", "//forecast/area[@aac='SA_PW001']/forecast-period[@index='"+i+"']/text[@type='forecast']/text()", bom_data)
//logInfo("BOM data","forecast="+forecast)
postUpdate("BOM_Forecast_"+i, forecast)
var String wind_range = "";
var Pattern pattern = Pattern.compile("([0-9]+ to [0-9]+ km/h)");
var Matcher matcher = pattern.matcher(forecast);
if (matcher.find())
{
wind_range = matcher.group(1);
}
else if (forecast.indexOf("Light winds")>=0)
{
wind_range = "Light winds"
}
//logInfo("BOM data","wind_range_"+i+"="+wind_range)
postUpdate("BOM_Wind_Range_"+i, wind_range)
}
end
rule "Get weather observation data from BOM"
when
Time cron "0 */10 * ? * *" // update every 10 minutes
then
//logInfo("BOM data","reading observation data")
val URL url = new URL("http://www.bom.gov.au/fwo/IDS60801/IDS60801.95676.json");
val InputStreamReader instream = new InputStreamReader(url.openStream())
var StringBuilder sb = new StringBuilder();
var CharBuffer cb = CharBuffer.allocate(1024);
var int read = instream.read ( cb );
while(read != -1) {
sb.append(cb.array(), 0, read )
cb.clear
read = instream.read( cb )
}
instream.close();
val String bom_data = sb.toString();
var String time = transform("JSONPATH", "$.observations.data[0].local_date_time", bom_data)
time = time.substring(time.indexOf('/')+1,time.length())
//logInfo("BOM data","observation_time="+time)
postUpdate("BOM_Observation_Time", time)
val air_temp = transform("JSONPATH", "$.observations.data[0].air_temp", bom_data)
//logInfo("BOM data","air_temp="+air_temp)
postUpdate("BOM_AirTemp", air_temp)
val apparent_t = transform("JSONPATH", "$.observations.data[0].apparent_t", bom_data)
//logInfo("BOM data","apparent_t="+apparent_t)
postUpdate("BOM_ApparentTemp", apparent_t)
val wind_dir = transform("JSONPATH", "$.observations.data[0].wind_dir", bom_data)
//logInfo("BOM data","wind_dir="+wind_dir)
postUpdate("BOM_WindDir", wind_dir)
val wind_spd = transform("JSONPATH", "$.observations.data[0].wind_spd_kmh", bom_data)
//logInfo("BOM data","wind_spd="+wind_spd)
postUpdate("BOM_WindSpeed", wind_spd)
val rain = transform("JSONPATH", "$.observations.data[0].rain_trace", bom_data)
//logInfo("BOM data","rain="+rain)
postUpdate("BOM_Rain_Amount", rain)
val rel_hum = transform("JSONPATH", "$.observations.data[0].rel_hum", bom_data)
//logInfo("BOM data","rel_hum="+rel_hum)
postUpdate("BOM_Relative_Humidity", rel_hum)
end