[Solved] SMHI Weather

Hi

I want to use SMHI as weather provider.
They have an API

http://opendata-download-metfcst.smhi.se/api/category/pmp2g/version/2/geotype/point/lon/17.12/lat/60.65/data.json

that gives this json:

{"approvedTime":"2017-02-07T16:24:24Z","referenceTime":"2017-02-07T14:00:00Z","geometry":{"type":"Point","coordinates":[[17.12,60.65]]},"timeSeries":[{"validTime":"2017-02-07T15:00:00Z","parameters":[{"name":"msl","levelType":"hmsl","level":0,"unit":"hPa","values":[1044]},{"name":"t","levelType":"hl","level":2,"unit":"Cel","values":[-5.2]},{"name":"vis","levelType":"hl","level":2,"unit":"km","values":[51.0]},{"name":"wd","levelType":"hl","level":10,"unit":"degree","values":[84]},{"name":"ws","levelType":"hl","level":10,"unit":"m/s","values":[2.9]},{"name":"r","levelType":"hl","level":2,"unit":"percent","values":[67]},{"name":"tstm","levelType":"hl","level":0,"unit":"percent","values":[0]},{"name":"tcc_mean","levelType":"hl","level":0,"unit":"octas","values":[5]},{"name":"lcc_mean","levelType":"hl","level":0,"unit":"octas","values":[5]},{"name":"mcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"hcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"gust","levelType":"hl","level":10,"unit":"m/s","values":[6.7]},{"name":"pmin","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmax","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"spp","levelType":"hl","level":0,"unit":"percent","values":[-9]},{"name":"pcat","levelType":"hl","level":0,"unit":"category","values":[0]},{"name":"pmean","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmedian","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"Wsymb","levelType":"hl","level":0,"unit":"category","values":[3]}]},{"validTime":"2017-02-07T16:00:00Z","parameters":[{"name":"msl","levelType":"hmsl","level":0,"unit":"hPa","values":[1045]},{"name":"t","levelType":"hl","level":2,"unit":"Cel","values":[-5.8]},{"name":"vis","levelType":"hl","level":2,"unit":"km","values":[33.0]},{"name":"wd","levelType":"hl","level":10,"unit":"degree","values":[76]},{"name":"ws","levelType":"hl","level":10,"unit":"m/s","values":[2.5]},{"name":"r","levelType":"hl","level":2,"unit":"percent","values":[73]},{"name":"tstm","levelType":"hl","level":0,"unit":"percent","values":[0]},{"name":"tcc_mean","levelType":"hl","level":0,"unit":"octas","values":[4]},{"name":"lcc_mean","levelType":"hl","level":0,"unit":"octas","values":[4]},{"name":"mcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"hcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"gust","levelType":"hl","level":10,"unit":"m/s","values":[4.6]},{"name":"pmin","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmax","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"spp","levelType":"hl","level":0,"unit":"percent","values":[-9]},{"name":"pcat","levelType":"hl","level":0,"unit":"category","values":[0]},{"name":"pmean","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmedian","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"Wsymb","levelType":"hl","level":0,"unit":"category","values":[3]}]}
,...

What is the best way to approach this.
HTTP binding with exec transform or run an script and set the values with REST?

/Mike

1 Like

Take a look at JSONPath Transformation add-on

This json includes data for every hour for 10 days in the future.

I want to have this for forecast data.

Is it possible to use JSONPath Transformation to get the values that have validtime tommorrow 13.00.

/Mike

Then I believe you need to configure HTTP binding properly.
See Robert’s example - he’s utilizing HTTP and JSONPath to achieve something similar.

1 Like

In my example I decided to do all parsing through a rule. If you use the http binding and caching you can use the JSONPATH transformation directly on your items if you only need to get the raw values. In my case I needed some extra processing for some of the data, so I needed a rule for that anyway and decided to keep al code in one place.

The problem with JSONPath is that i want to get an value from json with tomorrow date and 13.00 time and i do not think you can do that type of calculations in Items.

/Mike

I don’t know if this is possible but perhaps you can try to combine 2 transformations with adding a dot in between?

The first wood be the JSONPATH and the second a JS?

I need some help with JSONPath syntax.
How do i get the “t” parameters value from timeSerie “2017-02-07T17:00:00Z”

{"approvedTime":"2017-02-07T16:24:24Z",
"referenceTime":"2017-02-07T14:00:00Z",
"geometry":{"type":"Point","coordinates":[[17.12,60.65]]},
"timeSeries":[
{"validTime":"2017-02-07T15:00:00Z",
"parameters":[{"name":"msl","levelType":"hmsl","level":0,"unit":"hPa","values":[1044]},{"name":"t","levelType":"hl","level":2,"unit":"Cel","values":[-5.2]},{"name":"vis","levelType":"hl","level":2,"unit":"km","values":[51.0]},{"name":"wd","levelType":"hl","level":10,"unit":"degree","values":[84]},{"name":"ws","levelType":"hl","level":10,"unit":"m/s","values":[2.9]},{"name":"r","levelType":"hl","level":2,"unit":"percent","values":[67]},{"name":"tstm","levelType":"hl","level":0,"unit":"percent","values":[0]},{"name":"tcc_mean","levelType":"hl","level":0,"unit":"octas","values":[5]},{"name":"lcc_mean","levelType":"hl","level":0,"unit":"octas","values":[5]},{"name":"mcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"hcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"gust","levelType":"hl","level":10,"unit":"m/s","values":[6.7]},{"name":"pmin","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmax","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"spp","levelType":"hl","level":0,"unit":"percent","values":[-9]},{"name":"pcat","levelType":"hl","level":0,"unit":"category","values":[0]},{"name":"pmean","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmedian","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"Wsymb","levelType":"hl","level":0,"unit":"category","values":[3]}]},
{"validTime":"2017-02-07T16:00:00Z",
"parameters":[{"name":"msl","levelType":"hmsl","level":0,"unit":"hPa","values":[1045]},{"name":"t","levelType":"hl","level":2,"unit":"Cel","values":[-5.8]},{"name":"vis","levelType":"hl","level":2,"unit":"km","values":[33.0]},{"name":"wd","levelType":"hl","level":10,"unit":"degree","values":[76]},{"name":"ws","levelType":"hl","level":10,"unit":"m/s","values":[2.5]},{"name":"r","levelType":"hl","level":2,"unit":"percent","values":[73]},{"name":"tstm","levelType":"hl","level":0,"unit":"percent","values":[0]},{"name":"tcc_mean","levelType":"hl","level":0,"unit":"octas","values":[4]},{"name":"lcc_mean","levelType":"hl","level":0,"unit":"octas","values":[4]},{"name":"mcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"hcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"gust","levelType":"hl","level":10,"unit":"m/s","values":[4.6]},{"name":"pmin","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmax","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"spp","levelType":"hl","level":0,"unit":"percent","values":[-9]},{"name":"pcat","levelType":"hl","level":0,"unit":"category","values":[0]},{"name":"pmean","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmedian","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"Wsymb","levelType":"hl","level":0,"unit":"category","values":[3]}]},
{"validTime":"2017-02-07T17:00:00Z",
"parameters":[{"name":"msl","levelType":"hmsl","level":0,"unit":"hPa","values":[1045]},{"name":"t","levelType":"hl","level":2,"unit":"Cel","values":[-6.4]},{"name":"vis","levelType":"hl","level":2,"unit":"km","values":[21.0]},{"name":"wd","levelType":"hl","level":10,"unit":"degree","values":[81]},{"name":"ws","levelType":"hl","level":10,"unit":"m/s","values":[2.4]},{"name":"r","levelType":"hl","level":2,"unit":"percent","values":[79]},{"name":"tstm","levelType":"hl","level":0,"unit":"percent","values":[0]},{"name":"tcc_mean","levelType":"hl","level":0,"unit":"octas","values":[3]},{"name":"lcc_mean","levelType":"hl","level":0,"unit":"octas","values":[2]},{"name":"mcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"hcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"gust","levelType":"hl","level":10,"unit":"m/s","values":[4.5]},{"name":"pmin","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmax","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"spp","levelType":"hl","level":0,"unit":"percent","values":[-9]},{"name":"pcat","levelType":"hl","level":0,"unit":"category","values":[0]},{"name":"pmean","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmedian","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"Wsymb","levelType":"hl","level":0,"unit":"category","values":[2]}]},
{"validTime":"2017-02-07T18:00:00Z",
"parameters":[{"name":"msl","levelType":"hmsl","level":0,"unit":"hPa","values":[1045]},{"name":"t","levelType":"hl","level":2,"unit":"Cel","values":[-7.1]},{"name":"vis","levelType":"hl","level":2,"unit":"km","values":[16.0]},{"name":"wd","levelType":"hl","level":10,"unit":"degree","values":[80]},{"name":"ws","levelType":"hl","level":10,"unit":"m/s","values":[2.4]},{"name":"r","levelType":"hl","level":2,"unit":"percent","values":[82]},{"name":"tstm","levelType":"hl","level":0,"unit":"percent","values":[0]},{"name":"tcc_mean","levelType":"hl","level":0,"unit":"octas","values":[2]},{"name":"lcc_mean","levelType":"hl","level":0,"unit":"octas","values":[2]},{"name":"mcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"hcc_mean","levelType":"hl","level":0,"unit":"octas","values":[0]},{"name":"gust","levelType":"hl","level":10,"unit":"m/s","values":[4.4]},{"name":"pmin","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmax","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"spp","levelType":"hl","level":0,"unit":"percent","values":[-9]},{"name":"pcat","levelType":"hl","level":0,"unit":"category","values":[0]},{"name":"pmean","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"pmedian","levelType":"hl","level":0,"unit":"kg/m2/h","values":[0.0]},{"name":"Wsymb","levelType":"hl","level":0,"unit":"category","values":[2]}]}]

/Mike

I have now solved the parse

var String var1= transform("JSONPATH", "$.timeSeries.[?(@.validTime=='2017-02-19T01:00:00Z')].parameters.[?(@.name=='t')].values[0]", smhijson)

But not i have problem to get rud ot the last brackets [1.3].
Does someone have any input on this?

/mike

I have now solved the brackets

This is the current code

import java.util.Date
import java.text.SimpleDateFormat

    var SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:00:00'Z'")
	var String Curvaliddate = df.format(new Date())
 
	var String smhijson = sendHttpGetRequest("http://opendata-download-metfcst.smhi.se/api/category/pmp2g/version/2/geotype/point/lon/17.12/lat/60.65/data.json")
	var String temp = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Curvaliddate+"')].parameters.[?(@.name=='t')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_TEMP.postUpdate(temp)

Now i want to get the temperature for tomorrow 13:00 how do i add one day to Date() .

/mike

This is what i have tried but it seems that i can not mix Joda with Java Date

    var SimpleDateFormat cdf = new SimpleDateFormat( "yyyy-MM-dd'T'HH:00:00'Z'")
	var String Curvaliddate = cdf.format(new Date())
	
	var SimpleDateFormat fdf = new SimpleDateFormat( "yyyy-MM-dd'T'13:00:00'Z'")
	var String Tomorrowvaliddate = fdf.format(now.plusDays(1) as Date )
 
	var String smhijson = sendHttpGetRequest("http://opendata-download-metfcst.smhi.se/api/category/pmp2g/version/2/geotype/point/lon/17.12/lat/60.65/data.json")
	var String t = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Curvaliddate+"')].parameters.[?(@.name=='t')].values[0]", smhijson).replace('[','').replace(']','')
	var String r = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Curvaliddate+"')].parameters.[?(@.name=='r')].values[0]", smhijson).replace('[','').replace(']','')
	var String msl = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Curvaliddate+"')].parameters.[?(@.name=='msl')].values[0]", smhijson).replace('[','').replace(']','')
	var String wsymb = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Curvaliddate+"')].parameters.[?(@.name=='msl')].values[0]", smhijson).replace('[','').replace(']','')

	SMHI_Temperature.postUpdate(t)
	SMHI_Humidity.postUpdate(r)
	SMHI_Pressure.postUpdate(msl)
	SMHI_Condition.postUpdate(wsymb)

It is here where i mix joda and java date

	var String Tomorrowvaliddate = fdf.format(now.plusDays(1) as Date )

I am having problem to do this in both java and joda.

/mike

SOLVED

Create this items:

Group Smhi (All)
Number SMHI_Pressure    			"Lufttryck  [%.1f mb]"				<pressure>   	(Smhi)
Number SMHI_Temperature				"Temperatur [%.1f °C]"				<temperature>  	(Smhi)
Number SMHI_Visibility				"Sikt [%.1f km]"					<temperature>  	(Smhi)
Number SMHI_WindDirection			"Vindriktning [%.0f °]"				<wind>  		(Smhi)
Number SMHI_WindSpeed				"Vindhastighet [%.1f m/s]"			<wind>  		(Smhi)
Number SMHI_Humidity				"Luftfuktighet [%.1f %%]"			<humidity>  	(Smhi)
Number SMHI_ThunderProbability		"Åska sanolikhet [%.0f %%]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCover				"MolntÀckning [%.0f]"				<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverLow			"MolntÀckning LÄg [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverMedium		"MolnTĂ€ckning Medel [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverHigh			"MolnTÀckning Hög [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_WindGustSpeed			"Byvindar [%.1f m/s]"				<wind>  		(Smhi)
Number SMHI_PrecipitationMin		"Nederbörd Min [%.1f mm/h]"			<rain>   		(Smhi)
Number SMHI_PrecipitationMax		"Nederbörd Max [%.1f mm/h]"			<rain>		   	(Smhi)
Number SMHI_PrecipitationFrozen		"Frysen nederbörd [%.0f %%]"		<climate>  		(Smhi)
Number SMHI_PrecipitationCat		"Nederbörd Kategori [%.0f]"			<rain>  		(Smhi)
Number SMHI_PrecipitationMean		"Nederbörd Medel [%.1f mm/h]"		<rain>  		(Smhi)
Number SMHI_PrecipitationMedian		"Nederbörd Median [%.1f mm/h]"		<rain>  		(Smhi)
Number SMHI_Condition   			"FörhÄllande  [%.0f]" 				<sun_clouds>	(Smhi)

Number SMHI_Pressure_1    			"Lufttryck  P1 [%.1f mb]"			<pressure>   	(Smhi)
Number SMHI_Temperature_1			"Temperatur P1 [%.1f °C]"			<temperature>  	(Smhi)
Number SMHI_Visibility_1			"Sikt P1 [%.1f km]"					<temperature>  	(Smhi)
Number SMHI_WindDirection_1			"Vindriktning P1 [%.0f °]"			<wind>  		(Smhi)
Number SMHI_WindSpeed_1				"Vindhastighet P1 [%.1f m/s]"		<wind>  		(Smhi)
Number SMHI_Humidity_1				"Luftfuktighet P1 [%.1f %%]"		<humidity>  	(Smhi)
Number SMHI_ThunderProbability_1	"Åska sanolikhet P1 [%.0f %%]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCover_1			"MolntÀckning P1 [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverLow_1			"MolntÀckning LÄg P1 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverMedium_1		"MolnTĂ€ckning Medel P1 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverHigh_1		"MolnTÀckning Hög P1 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_WindGustSpeed_1			"Byvindar P1 [%.1f m/s]"			<wind>  		(Smhi)
Number SMHI_PrecipitationMin_1		"Nederbörd Min P1 [%.1f mm/h]"		<rain>   		(Smhi)
Number SMHI_PrecipitationMax_1		"Nederbörd Max P1 [%.1f mm/h]"		<rain>		   	(Smhi)
Number SMHI_PrecipitationFrozen_1	"Frysen nederbörd P1 [%.0f %%]"		<climate>  		(Smhi)
Number SMHI_PrecipitationCat_1		"Nederbörd Kategori P1 [%.0f]"		<rain>  		(Smhi)
Number SMHI_PrecipitationMean_1		"Nederbörd Medel P1 [%.1f mm/h]"	<rain>  		(Smhi)
Number SMHI_PrecipitationMedian_1	"Nederbörd Median P1 [%.1f mm/h]"	<rain>  		(Smhi)
Number SMHI_Condition_1   			"FörhÄllande  P1 [%.0f]" 			<sun_clouds>	(Smhi)	


Number SMHI_Pressure_2    			"Lufttryck  P2 [%.1f mb]"			<pressure>   	(Smhi)
Number SMHI_Temperature_2			"Temperatur P2 [%.1f °C]"			<temperature>  	(Smhi)
Number SMHI_Visibility_2			"Sikt P2 [%.1f km]"					<temperature>  	(Smhi)
Number SMHI_WindDirection_2			"Vindriktning P2 [%.0f °]"			<wind>  		(Smhi)
Number SMHI_WindSpeed_2				"Vindhastighet P2 [%.1f m/s]"		<wind>  		(Smhi)
Number SMHI_Humidity_2				"Luftfuktighet P2 [%.1f %%]"		<humidity>  	(Smhi)
Number SMHI_ThunderProbability_2	"Åska sanolikhet P2 [%.0f %%]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCover_2			"MolntÀckning P2 [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverLow_2			"MolntÀckning LÄg P2 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverMedium_2		"MolnTĂ€ckning Medel P2 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverHigh_2		"MolnTÀckning Hög P2 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_WindGustSpeed_2			"Byvindar P2 [%.1f m/s]"			<wind>  		(Smhi)
Number SMHI_PrecipitationMin_2		"Nederbörd Min P2 [%.1f mm/h]"		<rain>   		(Smhi)
Number SMHI_PrecipitationMax_2		"Nederbörd Max P2 [%.1f mm/h]"		<rain>		   	(Smhi)
Number SMHI_PrecipitationFrozen_2	"Frysen nederbörd P2 [%.0f %%]"		<climate>  		(Smhi)
Number SMHI_PrecipitationCat_2		"Nederbörd Kategori P2 [%.0f]"		<rain>  		(Smhi)
Number SMHI_PrecipitationMean_2		"Nederbörd Medel P2 [%.1f mm/h]"	<rain>  		(Smhi)
Number SMHI_PrecipitationMedian_2	"Nederbörd Median P2 [%.1f mm/h]"	<rain>  		(Smhi)
Number SMHI_Condition_2   			"FörhÄllande  P2 [%.0f]" 			<sun_clouds>	(Smhi)	
Switch	SMHI_TEST (Smhi) 

Create this Rule

import java.util.Date
import java.text.SimpleDateFormat

rule "SMHI"
when
	Time cron "0 0 * * * ?" or
	Item SMHI_TEST changed to ON
then

    var SimpleDateFormat cdf = new SimpleDateFormat( "yyyy-MM-dd'T'HH:00:00'Z'")
	var String Currentvaliddate = cdf.format(new Date())
	
	var SimpleDateFormat fdf = new SimpleDateFormat( "yyyy-MM-dd'T'12:00:00'Z'")
	var String Tomorrowvaliddate = fdf.format(now.plusDays(1).toDate )
	var String DayafterTomorrowvaliddate = fdf.format(now.plusDays(2).toDate )
 
	var String smhijson = sendHttpGetRequest("http://opendata-download-metfcst.smhi.se/api/category/pmp2g/version/2/geotype/point/lon/17.12/lat/60.65/data.json")

	//Current Forecast
	logInfo("Smhi", "Start Current Forecast "+Currentvaliddate)
	//Air pressure
	var String msl = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='msl')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Pressure.postUpdate(msl)

	//Air temperature
	var String t = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='t')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Temperature.postUpdate(t)
	
	//Horizontal visibility
	var String vis = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='vis')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Visibility.postUpdate(vis)
	
	//Wind direction
	var String wd = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='wd')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindDirection.postUpdate(wd)

	//Wind speed
	var String ws = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='ws')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindSpeed.postUpdate(ws)

	//Relative humidity
	var String r = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='r')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Humidity.postUpdate(r)

	//Thunder probability
	var String tstm = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='tstm')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_ThunderProbability.postUpdate(tstm)

	//Mean value of total cloud cover
	var String tcc_mean = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='tcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCover.postUpdate(tcc_mean)

	//Mean value of low level cloud cover
	var String lcc_mean = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='lcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverLow.postUpdate(lcc_mean)

	//Mean value of medium level cloud cover
	var String mcc_mean = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='mcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverMedium.postUpdate(mcc_mean)

	//Mean value of high level cloud cover
	var String hcc_mean = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='hcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverHigh.postUpdate(hcc_mean)

	//Wind gust speed
	var String gust = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='gust')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindGustSpeed.postUpdate(gust)

	//Minimum precipitation intensity
	var String pmin = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='pmin')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMin.postUpdate(pmin)

	//Maximum precipitation intensity
	var String pmax = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='pmax')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMax.postUpdate(pmax)

	//Percent of precipitation in frozen form
	var String spp = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='spp')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationFrozen.postUpdate(spp)

	//Precipitation category
	var String pcat = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='pcat')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationCat.postUpdate(pcat)

	//Mean precipitation intensity
	var String pmean = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='pmean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMean.postUpdate(pmean)

	//Median precipitation intensity
	var String pmedian = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='pmedian')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMedian.postUpdate(pmedian)

	//Weather symbol
	var String wsymb = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='Wsymb')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Condition.postUpdate(wsymb)
	logInfo("Smhi", "Updated Current Forecast "+Currentvaliddate)


	//Tomorrow Forecast
	logInfo("Smhi", "Start Forecast 1 "+Tomorrowvaliddate)
	//Air pressure
	var String msl1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='msl')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Pressure_1.postUpdate(msl1)

	//Air temperature
	var String t1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='t')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Temperature_1.postUpdate(t1)
	
	//Horizontal visibility
	var String vis1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='vis')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Visibility_1.postUpdate(vis1)
	
	//Wind direction
	var String wd1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='wd')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindDirection_1.postUpdate(wd1)

	//Wind speed
	var String ws1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='ws')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindSpeed_1.postUpdate(ws1)

	//Relative humidity
	var String r1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='r')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Humidity_1.postUpdate(r1)

	//Thunder probability
	var String tstm1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='tstm')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_ThunderProbability_1.postUpdate(tstm1)

	//Mean value of total cloud cover
	var String tcc_mean1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='tcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCover_1.postUpdate(tcc_mean1)

	//Mean value of low level cloud cover
	var String lcc_mean1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='lcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverLow_1.postUpdate(lcc_mean1)

	//Mean value of medium level cloud cover
	var String mcc_mean1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='mcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverMedium_1.postUpdate(mcc_mean1)

	//Mean value of high level cloud cover
	var String hcc_mean1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='hcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverHigh_1.postUpdate(hcc_mean1)

	//Wind gust speed
	var String gust1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='gust')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindGustSpeed_1.postUpdate(gust1)

	//Minimum precipitation intensity
	var String pmin1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='pmin')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMin_1.postUpdate(pmin1)

	//Maximum precipitation intensity
	var String pmax1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='pmax')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMax_1.postUpdate(pmax1)

	//Percent of precipitation in frozen form
	var String spp1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='spp')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationFrozen_1.postUpdate(spp1)

	//Precipitation category
	var String pcat1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='pcat')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationCat_1.postUpdate(pcat1)

	//Mean precipitation intensity
	var String pmean1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='pmean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMean_1.postUpdate(pmean1)

	//Median precipitation intensity
	var String pmedian1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='pmedian')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMedian_1.postUpdate(pmedian1)

	//Weather symbol
	var String wsymb1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='Wsymb')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Condition_1.postUpdate(wsymb1)
	logInfo("Smhi", "Updated Forecast 1 "+Tomorrowvaliddate)

	logInfo("Smhi", "Start Forecast 2 "+DayafterTomorrowvaliddate)

	//DayafterTomorrow Forecast
	//Air pressure
	var String msl2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='msl')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Pressure_2.postUpdate(msl2)

	//Air temperature
	var String t2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='t')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Temperature_2.postUpdate(t2)
	
	//Horizontal visibility
	var String vis2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='vis')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Visibility_2.postUpdate(vis2)
	
	//Wind direction
	var String wd2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='wd')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindDirection_2.postUpdate(wd2)

	//Wind speed
	var String ws2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='ws')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindSpeed_2.postUpdate(ws2)

	//Relative humidity
	var String r2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='r')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Humidity_2.postUpdate(r2)

	//Thunder probability
	var String tstm2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='tstm')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_ThunderProbability_2.postUpdate(tstm2)

	//Mean value of total cloud cover
	var String tcc_mean2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='tcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCover_2.postUpdate(tcc_mean2)

	//Mean value of low level cloud cover
	var String lcc_mean2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='lcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverLow_2.postUpdate(lcc_mean2)

	//Mean value of medium level cloud cover
	var String mcc_mean2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='mcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverMedium_2.postUpdate(mcc_mean2)

	//Mean value of high level cloud cover
	var String hcc_mean2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='hcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverHigh_2.postUpdate(hcc_mean2)

	//Wind gust speed
	var String gust2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='gust')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindGustSpeed_2.postUpdate(gust2)

	//Minimum precipitation intensity
	var String pmin2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='pmin')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMin_2.postUpdate(pmin2)

	//Maximum precipitation intensity
	var String pmax2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='pmax')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMax_2.postUpdate(pmax2)

	//Percent of precipitation in frozen form
	var String spp2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='spp')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationFrozen_2.postUpdate(spp2)

	//Precipitation category
	var String pcat2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='pcat')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationCat_2.postUpdate(pcat2)

	//Mean precipitation intensity
	var String pmean2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='pmean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMean_2.postUpdate(pmean2)

	//Median precipitation intensity
	var String pmedian2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='pmedian')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMedian_2.postUpdate(pmedian2)

	//Weather symbol
	var String wsymb2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='Wsymb')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Condition_2.postUpdate(wsymb2)
	logInfo("Smhi", "Updated Forecast 2 "+DayafterTomorrowvaliddate)
	
	SMHI_TEST.sendCommand(OFF)
	logInfo("Smhi", "SMHI Ready")
end

Now you have current forecast + 2 days :slight_smile:

/Mike

1 Like

Now i am struggling with getting Min and Max temperatures from the json.

Trying JSONPath type
$.timeSeries.[?(@.validTime==‘2017-02-22*’)].parameters.[?(@.name==‘t’)].values[0].min()
but that does not work.

Can someone help me with the JSONPath syntax or can i move json into an array and achive this?

/Mike

Was also struggling with getting data from SMHI into Openhab. I was writing a JavaScript transformation for the http binding when I stumled upon your solution, which seems much cleaner. Will borrow this for my own system. Thank you for sharing!

//Anders

And thank you @pacive for bumping this thread :slight_smile: I just copied it straight into my oh and it worked straight away (after changing long/lat of course).

@tnemrap Thanks for your work! Did you ever get the min temp working?

This is my latest version with Min/Max
In the Min/Max I had to use a Python Script and my Outdoor Temperature’s Max in item Weather_Temp_Max according to Sample Rules.

Items:

Group Smhi (All)
//String SMHI_TEMP	"Temperatur [%s]"	<temperature>  		(Smhi) { http="<[http://opendata-download-metobs.smhi.se/api/version/1.0/parameter/1/station/107420/period/latest-hour/data.json:60000:JSONPATH($..0.value)]"}
Number SMHI_Pressure    			"Lufttryck  [%.1f mb]"				<pressure>   	(Smhi)
Number SMHI_Temperature				"Temperatur [%.1f °C]"				<temperature>  	(Smhi)
Number SMHI_Temperature_Min			"Temperatur Min [%.1f °C]"			<temperature>  	(Smhi)
Number SMHI_Temperature_Max			"Temperatur Max [%.1f °C]"			<temperature>  	(Smhi)
Number SMHI_Visibility				"Sikt [%.1f km]"					<temperature>  	(Smhi)
Number SMHI_WindDirection			"Vindriktning [%.0f °]"				<wind>  		(Smhi)
Number SMHI_WindSpeed				"Vindhastighet [%.1f m/s]"			<wind>  		(Smhi)
Number SMHI_Humidity				"Luftfuktighet [%.1f %%]"			<humidity>  	(Smhi)
Number SMHI_ThunderProbability		"Åska sanolikhet [%.0f %%]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCover				"MolntÀckning [%.0f]"				<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverLow			"MolntÀckning LÄg [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverMedium		"MolnTĂ€ckning Medel [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverHigh			"MolnTÀckning Hög [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_WindGustSpeed			"Byvindar [%.1f m/s]"				<wind>  		(Smhi)
Number SMHI_PrecipitationMin		"Nederbörd Min [%.1f mm/h]"			<rain>   		(Smhi)
Number SMHI_PrecipitationMax		"Nederbörd Max [%.1f mm/h]"			<rain>		   	(Smhi)
Number SMHI_PrecipitationFrozen		"Frysen nederbörd [%.0f %%]"		<climate>  		(Smhi)
Number SMHI_PrecipitationCat		"Nederbörd Kategori [MAP(smhi_precip_cat.map):%s]"			<rain>  		(Smhi)
Number SMHI_PrecipitationMean		"Nederbörd Medel [%.1f mm/h]"		<rain>  		(Smhi)
Number SMHI_PrecipitationMedian		"Nederbörd Median [%.1f mm/h]"		<rain>  		(Smhi)
Number SMHI_Condition_No   			"VĂ€drerkod [%s]" 					<sun_clouds>	(Smhi)
String SMHI_Condition   			"VÀdret Àr [%s]" 					<sun_clouds>	(Smhi)
DateTime SMHI_ObsTime   			"Prognos tid [%1$tY-%1$td-%1$tm %1$tH:%1$tM]" 			<clock>	(Smhi)	

Number SMHI_Pressure_1    			"Lufttryck  P1 [%.1f mb]"			<pressure>   	(Smhi)
Number SMHI_Temperature_1			"Temperatur P1 [%.1f °C]"			<temperature>  	(Smhi)
Number SMHI_Temperature_Min_1		"Temperatur Min P1 [%.1f °C]"		<temperature>  	(Smhi)
Number SMHI_Temperature_Max_1		"Temperatur Max P1 [%.1f °C]"		<temperature>  	(Smhi)
Number SMHI_Visibility_1			"Sikt P1 [%.1f km]"					<temperature>  	(Smhi)
Number SMHI_WindDirection_1			"Vindriktning P1 [%.0f °]"			<wind>  		(Smhi)
Number SMHI_WindSpeed_1				"Vindhastighet P1 [%.1f m/s]"		<wind>  		(Smhi)
Number SMHI_Humidity_1				"Luftfuktighet P1 [%.1f %%]"		<humidity>  	(Smhi)
Number SMHI_ThunderProbability_1	"Åska sanolikhet P1 [%.0f %%]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCover_1			"MolntÀckning P1 [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverLow_1			"MolntÀckning LÄg P1 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverMedium_1		"MolnTĂ€ckning Medel P1 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverHigh_1		"MolnTÀckning Hög P1 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_WindGustSpeed_1			"Byvindar P1 [%.1f m/s]"			<wind>  		(Smhi)
Number SMHI_PrecipitationMin_1		"Nederbörd Min P1 [%.1f mm/h]"		<rain>   		(Smhi)
Number SMHI_PrecipitationMax_1		"Nederbörd Max P1 [%.1f mm/h]"		<rain>		   	(Smhi)
Number SMHI_PrecipitationFrozen_1	"Frysen nederbörd P1 [%.0f %%]"		<climate>  		(Smhi)
Number SMHI_PrecipitationCat_1		"Nederbörd Kategori P1 [MAP(smhi_precip_cat.map):%s]"		<rain>  		(Smhi)
Number SMHI_PrecipitationMean_1		"Nederbörd Medel P1 [%.1f mm/h]"	<rain>  		(Smhi)
Number SMHI_PrecipitationMedian_1	"Nederbörd Median P1 [%.1f mm/h]"	<rain>  		(Smhi)
Number SMHI_Condition_No_1 			"VĂ€drerkod P1 [%s]" 				<sun_clouds>	(Smhi)
String SMHI_Condition_1   			"VÀdret imorgon Àr [%s]" 			<sun_clouds>	(Smhi)	
DateTime SMHI_ObsTime_1   			"Prognos tid P1 [%1$tY-%1$td-%1$tm %1$tH:%1$tM]" 			<clock>	(Smhi)	

Number SMHI_Pressure_2    			"Lufttryck  P2 [%.1f mb]"			<pressure>   	(Smhi)
Number SMHI_Temperature_2			"Temperatur P2 [%.1f °C]"			<temperature>  	(Smhi)
Number SMHI_Temperature_Min_2		"Temperatur Min P2 [%.1f °C]"		<temperature>  	(Smhi)
Number SMHI_Temperature_Max_2		"Temperatur Max P2 [%.1f °C]"		<temperature>  	(Smhi)
Number SMHI_Visibility_2			"Sikt P2 [%.1f km]"					<temperature>  	(Smhi)
Number SMHI_WindDirection_2			"Vindriktning P2 [%.0f °]"			<wind>  		(Smhi)
Number SMHI_WindSpeed_2				"Vindhastighet P2 [%.1f m/s]"		<wind>  		(Smhi)
Number SMHI_Humidity_2				"Luftfuktighet P2 [%.1f %%]"		<humidity>  	(Smhi)
Number SMHI_ThunderProbability_2	"Åska sanolikhet P2 [%.0f %%]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCover_2			"MolntÀckning P2 [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverLow_2			"MolntÀckning LÄg P2 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverMedium_2		"MolnTĂ€ckning Medel P2 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverHigh_2		"MolnTÀckning Hög P2 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_WindGustSpeed_2			"Byvindar P2 [%.1f m/s]"			<wind>  		(Smhi)
Number SMHI_PrecipitationMin_2		"Nederbörd Min P2 [%.1f mm/h]"		<rain>   		(Smhi)
Number SMHI_PrecipitationMax_2		"Nederbörd Max P2 [%.1f mm/h]"		<rain>		   	(Smhi)
Number SMHI_PrecipitationFrozen_2	"Frysen nederbörd P2 [%.0f %%]"		<climate>  		(Smhi)
Number SMHI_PrecipitationCat_2		"Nederbörd Kategori P2 [MAP(smhi_precip_cat.map):%s]"		<rain>  		(Smhi)
Number SMHI_PrecipitationMean_2		"Nederbörd Medel P2 [%.1f mm/h]"	<rain>  		(Smhi)
Number SMHI_PrecipitationMedian_2	"Nederbörd Median P2 [%.1f mm/h]"	<rain>  		(Smhi)
Number SMHI_Condition_No_2   		"VĂ€drerkod P2 [%s]" 					<sun_clouds>	(Smhi)
String SMHI_Condition_2   			"VÀdret överimorgon Àr [%s]" 		<sun_clouds>	(Smhi)
DateTime SMHI_ObsTime_2   			"Prognos tid P2 [%1$tY-%1$td-%1$tm %1$tH:%1$tM]" 			<clock>	(Smhi)	

Number SMHI_Pressure_3    			"Lufttryck  P3 [%.1f mb]"			<pressure>   	(Smhi)
Number SMHI_Temperature_3			"Temperatur P3 [%.1f °C]"			<temperature>  	(Smhi)
Number SMHI_Temperature_Min_3		"Temperatur Min P3 [%.1f °C]"		<temperature>  	(Smhi)
Number SMHI_Temperature_Max_3		"Temperatur Max P3 [%.1f °C]"		<temperature>  	(Smhi)
Number SMHI_Visibility_3			"Sikt P3 [%.1f km]"					<temperature>  	(Smhi)
Number SMHI_WindDirection_3			"Vindriktning P3 [%.0f °]"			<wind>  		(Smhi)
Number SMHI_WindSpeed_3				"Vindhastighet P3 [%.1f m/s]"		<wind>  		(Smhi)
Number SMHI_Humidity_3				"Luftfuktighet P3 [%.1f %%]"		<humidity>  	(Smhi)
Number SMHI_ThunderProbability_3	"Åska sanolikhet P3 [%.0f %%]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCover_3			"MolntÀckning P3 [%.0f]"			<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverLow_3			"MolntÀckning LÄg P3 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverMedium_3		"MolnTĂ€ckning Medel P3 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_CloudCoverHigh_3		"MolnTÀckning Hög P3 [%.0f]"		<sun_clouds>  	(Smhi)
Number SMHI_WindGustSpeed_3			"Byvindar P3 [%.1f m/s]"			<wind>  		(Smhi)
Number SMHI_PrecipitationMin_3		"Nederbörd Min P3 [%.1f mm/h]"		<rain>   		(Smhi)
Number SMHI_PrecipitationMax_3		"Nederbörd Max P3 [%.1f mm/h]"		<rain>		   	(Smhi)
Number SMHI_PrecipitationFrozen_3	"Frysen nederbörd P3 [%.0f %%]"		<climate>  		(Smhi)
Number SMHI_PrecipitationCat_3		"Nederbörd Kategori P3 [MAP(smhi_precip_cat.map):%s]"		<rain>  		(Smhi)
Number SMHI_PrecipitationMean_3		"Nederbörd Medel P3 [%.1f mm/h]"	<rain>  		(Smhi)
Number SMHI_PrecipitationMedian_3	"Nederbörd Median P3 [%.1f mm/h]"	<rain>  		(Smhi)
Number SMHI_Condition_No_3   		"VĂ€drerkod P3 [%s]" 					<sun_clouds>	(Smhi)
String SMHI_Condition_3   			"VÀdret överöverimorgon Àr [%s]" 		<sun_clouds>	(Smhi)
DateTime SMHI_ObsTime_3   			"Prognos tid P3 [%1$tY-%1$td-%1$tm %1$tH:%1$tM]" 			<clock>	(Smhi)	

Rule

import java.util.Date
import java.text.SimpleDateFormat

rule "SMHI"
when
	Time cron "0 10 * * * ?" 
	
then

    var SimpleDateFormat cdf = new SimpleDateFormat( "yyyy-MM-dd'T'HH:00:00'Z'")
	var String Currentvaliddate = cdf.format(new Date())
	
	var SimpleDateFormat fdf = new SimpleDateFormat( "yyyy-MM-dd'T'12:00:00'Z'")
	var String Tomorrowvaliddate = fdf.format(now.plusDays(1).toDate )
	var String DayafterTomorrowvaliddate = fdf.format(now.plusDays(2).toDate )
	var String Day3validdate = fdf.format(now.plusDays(3).toDate )

	var String smhijson = sendHttpGetRequest("http://opendata-download-metfcst.smhi.se/api/category/pmp2g/version/2/geotype/point/lon/XX.XXXX/lat/YY.YYYY/data.json")
 

	//Current Forecast

	//Air pressure
	var String msl = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='msl')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Pressure.postUpdate(msl)

	//Air temperature
	var String t = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='t')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Temperature.postUpdate(t)
	
	//Horizontal visibility
	var String vis = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='vis')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Visibility.postUpdate(vis)
	
	//Wind direction
	var String wd = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='wd')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindDirection.postUpdate(wd)

	//Wind speed
	var String ws = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='ws')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindSpeed.postUpdate(ws)

	//Relative humidity
	var String r = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='r')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Humidity.postUpdate(r)

	//Thunder probability
	var String tstm = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='tstm')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_ThunderProbability.postUpdate(tstm)

	//Mean value of total cloud cover
	var String tcc_mean = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='tcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCover.postUpdate(tcc_mean)

	//Mean value of low level cloud cover
	var String lcc_mean = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='lcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverLow.postUpdate(lcc_mean)

	//Mean value of medium level cloud cover
	var String mcc_mean = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='mcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverMedium.postUpdate(mcc_mean)

	//Mean value of high level cloud cover
	var String hcc_mean = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='hcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverHigh.postUpdate(hcc_mean)

	//Wind gust speed
	var String gust = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='gust')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindGustSpeed.postUpdate(gust)

	//Minimum precipitation intensity
	var String pmin = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='pmin')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMin.postUpdate(pmin)

	//Maximum precipitation intensity
	var String pmax = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='pmax')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMax.postUpdate(pmax)

	//Percent of precipitation in frozen form
	var String spp = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='spp')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationFrozen.postUpdate(spp)

	//Precipitation category
	var String pcat = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='pcat')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationCat.postUpdate(pcat)

	//Mean precipitation intensity
	var String pmean = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='pmean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMean.postUpdate(pmean)

	//Median precipitation intensity
	var String pmedian = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='pmedian')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMedian.postUpdate(pmedian)

	//Weather symbol
	var String wsymb = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Currentvaliddate+"')].parameters.[?(@.name=='Wsymb')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Condition_No.postUpdate(wsymb)
	
	SMHI_ObsTime.sendCommand(Currentvaliddate)
	


	//Tomorrow Forecast
	//Air pressure
	var String msl1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='msl')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Pressure_1.postUpdate(msl1)

	//Air temperature
	var String t1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='t')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Temperature_1.postUpdate(t1)
	
	//Horizontal visibility
	var String vis1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='vis')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Visibility_1.postUpdate(vis1)
	
	//Wind direction
	var String wd1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='wd')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindDirection_1.postUpdate(wd1)

	//Wind speed
	var String ws1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='ws')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindSpeed_1.postUpdate(ws1)

	//Relative humidity
	var String r1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='r')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Humidity_1.postUpdate(r1)

	//Thunder probability
	var String tstm1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='tstm')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_ThunderProbability_1.postUpdate(tstm1)

	//Mean value of total cloud cover
	var String tcc_mean1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='tcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCover_1.postUpdate(tcc_mean1)

	//Mean value of low level cloud cover
	var String lcc_mean1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='lcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverLow_1.postUpdate(lcc_mean1)

	//Mean value of medium level cloud cover
	var String mcc_mean1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='mcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverMedium_1.postUpdate(mcc_mean1)

	//Mean value of high level cloud cover
	var String hcc_mean1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='hcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverHigh_1.postUpdate(hcc_mean1)

	//Wind gust speed
	var String gust1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='gust')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindGustSpeed_1.postUpdate(gust1)

	//Minimum precipitation intensity
	var String pmin1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='pmin')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMin_1.postUpdate(pmin1)

	//Maximum precipitation intensity
	var String pmax1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='pmax')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMax_1.postUpdate(pmax1)

	//Percent of precipitation in frozen form
	var String spp1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='spp')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationFrozen_1.postUpdate(spp1)

	//Precipitation category
	var String pcat1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='pcat')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationCat_1.postUpdate(pcat1)

	//Mean precipitation intensity
	var String pmean1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='pmean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMean_1.postUpdate(pmean1)

	//Median precipitation intensity
	var String pmedian1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='pmedian')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMedian_1.postUpdate(pmedian1)

	//Weather symbol
	var String wsymb1 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Tomorrowvaliddate+"')].parameters.[?(@.name=='Wsymb')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Condition_No_1.postUpdate(wsymb1)

	SMHI_ObsTime_1.postUpdate(new DateTimeType(Tomorrowvaliddate))


	//DayafterTomorrow Forecast
	//Air pressure
	var String msl2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='msl')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Pressure_2.postUpdate(msl2)

	//Air temperature
	var String t2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='t')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Temperature_2.postUpdate(t2)
	
	//Horizontal visibility
	var String vis2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='vis')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Visibility_2.postUpdate(vis2)
	
	//Wind direction
	var String wd2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='wd')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindDirection_2.postUpdate(wd2)

	//Wind speed
	var String ws2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='ws')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindSpeed_2.postUpdate(ws2)

	//Relative humidity
	var String r2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='r')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Humidity_2.postUpdate(r2)

	//Thunder probability
	var String tstm2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='tstm')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_ThunderProbability_2.postUpdate(tstm2)

	//Mean value of total cloud cover
	var String tcc_mean2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='tcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCover_2.postUpdate(tcc_mean2)

	//Mean value of low level cloud cover
	var String lcc_mean2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='lcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverLow_2.postUpdate(lcc_mean2)

	//Mean value of medium level cloud cover
	var String mcc_mean2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='mcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverMedium_2.postUpdate(mcc_mean2)

	//Mean value of high level cloud cover
	var String hcc_mean2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='hcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverHigh_2.postUpdate(hcc_mean2)

	//Wind gust speed
	var String gust2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='gust')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindGustSpeed_2.postUpdate(gust2)

	//Minimum precipitation intensity
	var String pmin2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='pmin')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMin_2.postUpdate(pmin2)

	//Maximum precipitation intensity
	var String pmax2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='pmax')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMax_2.postUpdate(pmax2)

	//Percent of precipitation in frozen form
	var String spp2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='spp')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationFrozen_2.postUpdate(spp2)

	//Precipitation category
	var String pcat2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='pcat')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationCat_2.postUpdate(pcat2)

	//Mean precipitation intensity
	var String pmean2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='pmean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMean_2.postUpdate(pmean2)

	//Median precipitation intensity
	var String pmedian2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='pmedian')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMedian_2.postUpdate(pmedian2)

	//Weather symbol
	var String wsymb2 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+DayafterTomorrowvaliddate+"')].parameters.[?(@.name=='Wsymb')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Condition_No_2.postUpdate(wsymb2)

	SMHI_ObsTime_2.postUpdate(new DateTimeType(DayafterTomorrowvaliddate))

	//Day3 Forecast
	//Air pressure
	var String msl3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='msl')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Pressure_3.postUpdate(msl3)

	//Air temperature
	var String t3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='t')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Temperature_3.postUpdate(t3)
	
	//Horizontal visibility
	var String vis3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='vis')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Visibility_3.postUpdate(vis3)
	
	//Wind direction
	var String wd3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='wd')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindDirection_3.postUpdate(wd3)

	//Wind speed
	var String ws3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='ws')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindSpeed_3.postUpdate(ws3)

	//Relative humidity
	var String r3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='r')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Humidity_3.postUpdate(r3)

	//Thunder probability
	var String tstm3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='tstm')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_ThunderProbability_3.postUpdate(tstm3)

	//Mean value of total cloud cover
	var String tcc_mean3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='tcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCover_3.postUpdate(tcc_mean3)

	//Mean value of low level cloud cover
	var String lcc_mean3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='lcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverLow_3.postUpdate(lcc_mean3)

	//Mean value of medium level cloud cover
	var String mcc_mean3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='mcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverMedium_3.postUpdate(mcc_mean3)

	//Mean value of high level cloud cover
	var String hcc_mean3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='hcc_mean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_CloudCoverHigh_3.postUpdate(hcc_mean3)

	//Wind gust speed
	var String gust3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='gust')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_WindGustSpeed_3.postUpdate(gust3)

	//Minimum precipitation intensity
	var String pmin3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='pmin')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMin_3.postUpdate(pmin3)

	//Maximum precipitation intensity
	var String pmax3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='pmax')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMax_3.postUpdate(pmax3)

	//Percent of precipitation in frozen form
	var String spp3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='spp')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationFrozen_3.postUpdate(spp3)

	//Precipitation category
	var String pcat3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='pcat')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationCat_3.postUpdate(pcat3)

	//Mean precipitation intensity
	var String pmean3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='pmean')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMean_3.postUpdate(pmean3)

	//Median precipitation intensity
	var String pmedian3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='pmedian')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_PrecipitationMedian_3.postUpdate(pmedian3)

	//Weather symbol
	var String wsymb3 = transform("JSONPATH", "$.timeSeries.[?(@.validTime=='"+Day3validdate+"')].parameters.[?(@.name=='Wsymb')].values[0]", smhijson).replace('[','').replace(']','')
	SMHI_Condition_No_3.postUpdate(wsymb3)

	SMHI_ObsTime_3.postUpdate(new DateTimeType(Day3validdate))

	
	//Pythonscript for minmax
	logInfo("Smhi", "SMHI Min/Max")

	var String command = "python@@/home/openhab/smhi_minmax.py"
    var String smhiminmaxjson = executeCommandLine(command , 360000)

	var Number tmin = Float::parseFloat(String::format("%s",transform("JSONPATH", "$.tmin", smhiminmaxjson)))
	if (tmin > Weather_Temp_Min.state  as DecimalType){tmin = Weather_Temp_Min.state as DecimalType}
	SMHI_Temperature_Min.postUpdate(tmin)
	var Number tmax = Float::parseFloat(String::format("%s",transform("JSONPATH", "$.tmax", smhiminmaxjson)))
	if (tmax < Weather_Temp_Max.state  as DecimalType){tmax = Weather_Temp_Max.state as DecimalType}
	SMHI_Temperature_Max.postUpdate(tmax)

	var Number tmin1 = Float::parseFloat(String::format("%s",transform("JSONPATH", "$.tmin1", smhiminmaxjson)))
	SMHI_Temperature_Min_1.postUpdate(tmin1)
	var Number tmax1 = Float::parseFloat(String::format("%s",transform("JSONPATH", "$.tmax1", smhiminmaxjson)))
	SMHI_Temperature_Max_1.postUpdate(tmax1)

	var Number tmin2 = Float::parseFloat(String::format("%s",transform("JSONPATH", "$.tmin2", smhiminmaxjson)))
	SMHI_Temperature_Min_2.postUpdate(tmin2)
	var Number tmax2 = Float::parseFloat(String::format("%s",transform("JSONPATH", "$.tmax2", smhiminmaxjson)))
	SMHI_Temperature_Max_2.postUpdate(tmax2)

	var Number tmin3 = Float::parseFloat(String::format("%s",transform("JSONPATH", "$.tmin3", smhiminmaxjson)))
	SMHI_Temperature_Min_3.postUpdate(tmin3)
	var Number tmax3 = Float::parseFloat(String::format("%s",transform("JSONPATH", "$.tmax3", smhiminmaxjson)))
	SMHI_Temperature_Max_3.postUpdate(tmax3)
	
	SMHI_TEST.sendCommand(OFF)
	logInfo("Smhi", "SMHI Ready")

end

rule "SMHI Condition"
when
	Item SMHI_Condition_No received update
then
	SMHI_Condition.postUpdate(transform("MAP","smhi_weather_code_se.map",SMHI_Condition_No.state.toString))
end

rule "SMHI Condition 1"
when
	Item SMHI_Condition_No_1 received update
then
	SMHI_Condition_1.postUpdate(transform("MAP","smhi_weather_code_se.map",SMHI_Condition_No_1.state.toString))
end

rule "SMHI Condition 2"
when
	Item SMHI_Condition_No_2 received update
then
	SMHI_Condition_2.postUpdate(transform("MAP","smhi_weather_code_se.map",SMHI_Condition_No_2.state.toString))
end

rule "SMHI Condition 3"
when
	Item SMHI_Condition_No_3 received update
then
	SMHI_Condition_3.postUpdate(transform("MAP","smhi_weather_code_se.map",SMHI_Condition_No_3.state.toString))
end

/Mike

Had to split the message depending in length.
Here is the rest.

Python Script:

import sys
from urllib2 import urlopen
import json
import datetime

date = str(datetime.datetime.now())[:10]
date1 = str(datetime.datetime.now() + datetime.timedelta(days=1))[:10]
date2 = str(datetime.datetime.now() + datetime.timedelta(days=2))[:10]
date3 = str(datetime.datetime.now() + datetime.timedelta(days=3))[:10]
url = 'http://opendata-download-metfcst.smhi.se/api/category/pmp2g/version/2/geotype/point/lon/17.11934/lat/60.65622/data.json'
response = urlopen(url)
#response = sys.argv[1]
json_obj = json.load(response)

tmax=tmax1=tmax2=tmax3=-40
tmin=tmin1=tmin2=tmin3=40

for ts in json_obj['timeSeries']:

	if date in ts['validTime']:
	
		if ts['parameters'][1]['values'][0] > tmax:
			tmax=ts['parameters'][1]['values'][0]
		if ts['parameters'][1]['values'][0] < tmin:
			tmin=ts['parameters'][1]['values'][0]
	
	if date1 in ts['validTime']:
		if ts['parameters'][1]['values'][0] > tmax1:
			tmax1=ts['parameters'][1]['values'][0]
		if ts['parameters'][1]['values'][0] < tmin1:
			tmin1=ts['parameters'][1]['values'][0]

	if date2 in ts['validTime']:
		if ts['parameters'][1]['values'][0] > tmax2:
			tmax2=ts['parameters'][1]['values'][0]
		if ts['parameters'][1]['values'][0] < tmin2:
			tmin2=ts['parameters'][1]['values'][0]

	if date3 in ts['validTime']:
		if ts['parameters'][1]['values'][0] > tmax3:
			tmax3=ts['parameters'][1]['values'][0]
		if ts['parameters'][1]['values'][0] < tmin3:
			tmin3=ts['parameters'][1]['values'][0]

print '{"tmax": "' + str(tmax) + '","tmin": "' + str(tmin) + '","tmax1": "' + str(tmax1) + '","tmin1": "' + str(tmin1) + '","tmax2": "' + str(tmax2) + '","tmin2": "' + str(tmin2)+ '","tmax3": "' + str(tmax3) + '","tmin3": "' + str(tmin3)+ '"}'

smhi_precip_cat.map

0=Ingen nederbörd
1=Snö
2=Snö och regn
3=Regn
4=Duggregn
5=Underkylt regn
6=Underkylt duggregn
UNDEF=OkÀnd
-=OkÀnd
NULL=OkÀnd
Undefined=OkÀnd

smhi_weather_code_se.map

1=Klart
2=Mest klart
3=VĂ€xlande molnighet
4=Halvklart
5=Molnigt
6=Mulet
7=Dimma
8=Regnskur
9=Åskskurar
10=Byar av snöblandat regn
11=Snöbyar
12=Regn
13=Åska
14=Snöblandat regn
15=Snöfall
UNDEF=OkÀnd
-=OkÀnd
NULL=OkÀnd
Undefined=OkÀnd

/Mike

1 Like

I also have an Habpanel Custom Template if someone is Interested.

/Mike

1 Like

Thank you! This might get interesting for controlling the heating system in my house. :slight_smile:

I wouldn’t mind your habpanel custom template
 :sunny: - I have yet to do a proper habpanel, but maybe it is time now.

I used @tnemrap’s code as inspiration, but created a different approach. Instead of getting a single value I extracted all values for a day, and then created some lambda functions (thank the xbase-creators for those!) to calculate max, min, mean and mode, which can then be used to put into items. I’m still in the testing phase, but all that is left to do is to write the code to put the values into items.

import java.text.SimpleDateFormat
import java.util.Date
import java.util.List

//Extract values from a JSONstring and put in a list of Doubles
val getNumberList = [
	String json, String date, int index |
		
		var String[] stringArray = transform("JSONPATH", "$.timeSeries.[?(@.validTime=~ /.*" + date + ".*/i)].parameters[" + index + "].values[0]", json).replace("[", "").replace("]", "").split(",")
		var List<Number> numberList = newArrayList()
		
		for (var i = 0; i < stringArray.length; i++) {
			numberList.add(Double::parseDouble(stringArray.get(i)))
		}
		return numberList
]

//Extract values from a JSONstring and put in a list of Integers
val getIntList = [
	String json, String date, int index |
		
		var String[] stringArray = transform("JSONPATH", "$.timeSeries.[?(@.validTime=~ /.*" + date + ".*/i)].parameters[" + index + "].values[0]", json).replace("[", "").replace("]", "").split(",")
		var List<Number> numberList = newArrayList()
		
		for (var i = 0; i < stringArray.length; i++) {
			numberList.add(Integer::parseInt(stringArray.get(i)))
		}
		return numberList
]

//Get highest value from a list of numbers
val getMax = [
	List<Number> numberList |
	
		var Number maxValue = -100
		for (var i = 0; i < numberList.length; i++) {
			if (numberList.get(i) > maxValue) maxValue = numberList.get(i)
		}
		return maxValue
]

//Get lowest value from a list of numbers
val getMin = [
	List<Number> numberList |
	
		var Number minValue = 100
		for (var i = 0; i < numberList.length; i++) {
			if (numberList.get(i) < minValue) minValue = numberList.get(i)
		}
		return minValue
]

//Get the sum of all values in a list
val getSum = [
	List<Number> numberList |
	
		var Number sum = 0
		for (var i = 0; i < numberList.length; i++) {
			sum = sum + numberList.get(i)
			}
		return sum
]

//Get the mean of all values in a list
val getMean = [
	List<Number> numberList |
	
		var Number sum = 0
		var Number mean = 0
		for (var i = 0; i < numberList.length; i++) {
			sum = sum + numberList.get(i)
			}
		mean = sum / numberList.length
		return mean
]

//Get the most frequent value from a list
val getMode = [
	List<Number> numberList |
	
		var Number mode
		var Number highestCount = 0
		for (var i = 0; i < numberList.length; i++) {
			var count = 0
			for (var j = i + 1; j < numberList.length; j++) {
				if (numberList.get(j) == numberList.get(i)) {
					count++
				}
			}
			if (count > highestCount) {
				mode = numberList.get(i)
				highestCount = count
			}
		}
		return mode
]

//Trim a list to only include values for a specified time range
val getTrimmedList = [
	List<Number> numberList, int startHour, int endHour |
		
		var List<Number> temp = newArrayList()
		
		for (var i = 0; i < numberList.length; i++) {
			temp.add(numberList.get(i))
		}
		while (temp.length > endHour + 1) {
			temp.remove(endHour + 1)
		}
		for (var i = 0; i < startHour; i++) {
			temp.remove(0)
		}
		return temp	
]

rule "SMHI"
	when
		Time cron "0 0 * * * ?" or
		Item SMHI_Test changed to ON
	then
		//Create datestrings
		val SimpleDateFormat cdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:00:00'Z'")
		var String currentValidDate = cdf.format(new Date())
		val SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd")
		var String tomorrowDate = ymd.format(now.plusDays(1).toDate)
		
		//Link value names to respective index for the JSONPATH transform
		val parameters = newLinkedHashMap(	'msl' -> 0,
											't' -> 1, 
											'vis' -> 2,
											'wd' -> 3,
											'ws' -> 4,
											'r' -> 5,
											'tstm' -> 6,
											'tcc_mean' -> 7,
											'lcc_mean' -> 8,
											'mcc_mean' -> 9,
											'hcc_mean' -> 10,
											'gust' -> 11,
											'pmin' -> 12,
											'pmax' -> 13,
											'spp' -> 14,
											'pcat' -> 15,
											'pmean' -> 16,
											'pmedian' -> 17,
											'Wsymb' -> 18
		)
 		
		//Get weatherdata
		var String json = sendHttpGetRequest("http://opendata-download-metfcst.smhi.se/api/category/pmp2g/version/2/geotype/point/lon/12.510362/lat/56.916913/data.json")
 		if (json == null || json == "") {
 			logInfo("SMHI", "Empty response, retrying in 10 sec")
 			Thread::sleep(10000)
			json = sendHttpGetRequest("http://opendata-download-metfcst.smhi.se/api/category/pmp2g/version/2/geotype/point/lon/12.510362/lat/56.916913/data.json")
		}	
			
		//Get all values for a specific day and put them in a List (Double or Integer depending on later use)
		var List<Number> tList = getNumberList.apply(json, tomorrowDate, parameters.get('t'))
		var List<Number> pmeanList = getNumberList.apply(json, tomorrowDate, parameters.get('pmean'))
		var List<Number> wsymbList = getIntList.apply(json, tomorrowDate, parameters.get('Wsymb'))
	
		var maxTemp = getMax.apply(tList)
		var minTemp = getMin.apply(tList)
		var meanTemp = getMean.apply(tList)
		var totalPrecip = getSum.apply(pmeanList)
		var trimmedWsymbList = getTrimmedList.apply(wsymbList, 6, 20)
		var wsymb = getMode.apply(trimmedWsymbList)
		
		logInfo("SMHI", "Maxtemp: " + maxTemp.toString + "°C")
		logInfo("SMHI", "Mintemp: " + minTemp.toString + "°C")
		logInfo("SMHI", "Meantemp: " + meanTemp.toString + "°C")
		logInfo("SMHI", "Total precip: " + totalPrecip.toString + "mm")
		logInfo("SMHI", trimmedWsymbList.toString)
		logInfo("SMHI", "Weather symbol: " + wsymb.toString)
		SMHI_Test.postUpdate(OFF)
	end