Weather Control
(TimeSeries
) consists of a dashboard that shows weather for different pre-registered cities.
The information will be updated every 10 minutes using a table with a TimeSeries
row.
1 Data model
The following sections will follow the displayed data model in order to create the application and its transaction forms, graphs and lists.
In this data model, we can see a vitrual copy of our main table owm_cities_data_hist_ts
, which will allow us easy
access to insert, update and delete the values stored in the TimeSeries
row of owm_cities_data_hist_ts
.
We also have a cities table, owm_cities
, where the main information of the cities wanted for the weather cast will be found.
Specially the city_id
, which is given by Open Weather Map
in this file
here.
The table owm_apikey
, stores the information of the API where we will direct our requests. This API only allows 60
requests per hour using the given key. If the key gets outdated it can be modified by a new one. To get a new key, access the
Open Weather Map to get more information about how it.
2 Tables
2.1 Cities
The table owm_cities
stores the city identification number given by Open Weather Map
, its name, coordinates and country.
<table name='owm_cities'> <!-- COLUMNS --> <column name='city_id' type='int' size='10' required='y' info='City id'/> <column name='city_name' type='char' size='50' info='Name of the city'/> <column name='city_coord_lon' type='decimal' size='14,10' required='y' info='City coordinates longitude'/> <column name='city_coord_lat' type='decimal' size='14,10' required='y' info='City coordinates latitude'/> <column name='city_country' type='char' size='2' info='Country of the city'/> <!-- INDEXES --> <primary name='p_owm_cities1' columns='city_id' /> </table>
-- ************************************************************************** -- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:12:48 CEST 2019 Engine: informix -- owm_cities -- ************************************************************************** CREATE TABLE owm_cities ( city_id int not null, city_name char(50), city_coord_lon decimal(14,10) not null, city_coord_lat decimal(14,10) not null, city_country char(2) ); ALTER TABLE owm_cities LOCK MODE (ROW); -- Index to avoid automatic named by database (named with pk name). CREATE UNIQUE INDEX p_owm_cities1 ON owm_cities(city_id); ALTER TABLE owm_cities ADD CONSTRAINT PRIMARY KEY (city_id) CONSTRAINT p_owm_cities1;
-- ************************************************************************** -- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:13:01 CEST 2019 Engine: postgres -- owm_cities -- ************************************************************************** CREATE TABLE owm_cities ( city_id int not null, city_name varchar(50), city_coord_lon decimal(14,10) not null, city_coord_lat decimal(14,10) not null, city_country varchar(2) ) WITH OIDS; -- Database Server on Postgres, DB2 will be created a index automatically with the same name of pk ALTER TABLE owm_cities ADD CONSTRAINT p_owm_cities1 PRIMARY KEY (city_id);
Column | Type | Details | Definition |
---|---|---|---|
city_id
|
integer | Primary key. | City identifier given by the host. |
city_name | char | City name. | |
city_coord_lat | decimal | City latitude's coordinates. | |
city_coord_lon | decimal | City longitude's coordinates. | |
city_country | char | Country of the city, acronym. |
2.2 API
The table owm_apikey
stores the information about the API, such as the host and the API key.
<table name='owm_apikey'> <!-- COLUMNS --> <column name='linid' type='serial' required='y' info='Line id' /> <column name='host' type='char' size='50' info='Website URL' /> <column name='apikey' type='char' size='50' required='y' info='API key for website' /> <column name='user_created' type='char' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='char' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_owm_apikey1' columns='linid' /> </table>
-- ************************************************************************** -- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:24:12 CEST 2019 Engine: informix -- owm_apikey -- ************************************************************************** CREATE TABLE owm_apikey ( linid serial not null, host char(50), apikey char(50) not null, user_created char(20) default user not null, date_created datetime year to second default current year to second not null, user_updated char(20) default user not null, date_updated datetime year to second default current year to second not null ); ALTER TABLE owm_apikey LOCK MODE (ROW); -- Index to avoid automatic named by database (named with pk name). CREATE UNIQUE INDEX p_owm_apikey1 ON owm_apikey(linid); ALTER TABLE owm_apikey ADD CONSTRAINT PRIMARY KEY (linid) CONSTRAINT p_owm_apikey1;
-- ************************************************************************** -- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:24:22 CEST 2019 Engine: postgres -- owm_apikey -- ************************************************************************** CREATE TABLE owm_apikey ( linid serial not null, host varchar(50), apikey varchar(50) not null, user_created varchar(20) default user not null, date_created timestamp default CURRENT_TIMESTAMP not null, user_updated varchar(20) default user not null, date_updated timestamp default CURRENT_TIMESTAMP not null ) WITH OIDS; -- Database Server on Postgres, DB2 will be created a index automatically with the same name of pk ALTER TABLE owm_apikey ADD CONSTRAINT p_owm_apikey1 PRIMARY KEY (linid);
Column | Type | Details | Definition |
---|---|---|---|
linid | serial | Primary key. | Line identifier. |
host | char | Host URL. | |
apikey | char | API key. | |
user_created | char | User created. | |
date_created | datetime | Date created. | |
user_updated | char | User updated. | |
date_updated | datetime | Date updated. |
2.3 Icons
The table owm_weather_icons stores the images used to represent weather phenomena, those icons are obtained from OpenWeatherMap.
<table name='owm_weather_icons'> <column name='img_id' type='serial' required='y' info='Identifier'/> <column name='img_name' type='varchar' size='40' info='Name'/> <column name='img_type' type='varchar' size='40' /> <column name='img_size' type='int' /> <column name='img_data' type='blob' /> <!-- PRIMARY --> <primary name='p_owm_weather_icons' columns='img_id' /> </table>
-- ************************************************************************** -- DEISTER WebStudio XSQL-SCHEMA Thu Aug 08 10:01:50 CEST 2019 Engine: informix -- owm_weather_icons -- ************************************************************************** CREATE TABLE owm_weather_icons ( img_id serial not null, img_name varchar(40), img_type varchar(40), img_size int, img_data blob ); ALTER TABLE owm_weather_icons LOCK MODE (ROW); -- Index to avoid automatic named by database (named with pk name). CREATE UNIQUE INDEX p_owm_weather_icons ON owm_weather_icons(img_id); ALTER TABLE owm_weather_icons ADD CONSTRAINT PRIMARY KEY (img_id) CONSTRAINT p_owm_weather_icons;
Column | Type | Details | Definition |
---|---|---|---|
img_id | serial | Primary key. | Image identifier. |
img_name | varchar | Image name. | |
img_type | varchar | Image type. | |
img_size | int | Image size. | |
img_data | blob | Image. |
2.4 Data
The table owm_cities_data_hist_ts
stores the city identifier and the data given by the api response.
For easier access to the timeseries row, a virtual table, owm_cities_data_hist_ts
, is created in ordrer to
visualize all the columns.
<table name='owm_cities_data_hist_ts'> <!-- COLUMNS --> <column name='city_id' type='int' required='y' info='City id'/> <tseries rowtype_name='rowtype_owm_cities_data' pattern_name='patt_10min' pattern_on='1' pattern_off='599' pattern_unit='second' calendar_name='cal_10min_2019' calendar_start='2019-01-01 00:00:00' container_name='container_owm_cities_data' container_dbspace='d_data' column_name='owm_data' view_name='owm_cities_data_hist_ts_vti' > <column name='date_received' type='datetime' size='year to fraction(5)' default='current' info='Data received date'/> <column name='city_sun_rise' type='datetime' size='year to second' info='Time of city sunrise'/> <column name='city_sun_set' type='datetime' size='year to second' info='Time of city sunset'/> <column name='temperature_value' type='decimal' size='4,2' info='Current temperature'/> <column name='temperature_min' type='decimal' size='4,2' info='Minimum temperature'/> <column name='temperature_max' type='decimal' size='4,2' info='Maximum temperature'/> <column name='temperature_unit' type='char' size='12' info='Units format'/> <column name='humidity_value' type='int' info='Current humidity'/> <column name='humidity_unit' type='char' size='12' info='Units format'/> <column name='pressure_value' type='int' info='Current pressure'/> <column name='pressure_unit' type='char' size='12' info='Units format'/> <column name='wind_speed_value' type='decimal' size='10,2' info='Current wind speed'/> <column name='wind_speed_name' type='char' size='50' info='Wind description'/> <!-- Wind gusts don't usually appear on the data load and we don't know how they are represented, although they can be included in the fututre.--> <!-- <column name='wind_gusts' type=' ' size=' ' info='Wind gusts'/> --> <column name='wind_direction_value' type='int' info='Wind direction in degrees'/> <column name='wind_direction_code' type='char' size='4' info='Wind direction code'/> <column name='wind_direction_name' type='char' size='12' info='Wind direction description'/> <column name='clouds_value' type='int' info='Cloudiness percentage'/> <column name='clouds_name' type='char' size='20' info='Cloudiness description'/> <column name='visibility_value' type='int' info='Current visibility'/> <column name='precipitation_value' type='decimal' size='6,2' info='Current precipitation'/> <column name='precipitation_mode' type='char' size='10' info='Precipitation marker'/> <column name='precipitation_unit' type='char' size='12' info='Units format'/> <column name='lastupdate_value' type='datetime' size='year to second' info='Last updated'/> </tseries> <!-- INDEXES --> <index name='i_owm_cities_data_hist_ts1' columns='city_id' /> <!-- FOREIGNS --> <foreign name='f_owm_cities_data_hist_ts1' columns='city_id' references='owm_cities' refcols='city_id' ondeletecascade='y' /> </table>
-- ************************************************************************** -- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:39:37 CEST 2019 Engine: informix -- owm_cities_data_hist_ts -- ************************************************************************** INSERT INTO CalendarPatterns VALUES ('patt_10min', '{1 on, 599 off}, second'); INSERT INTO CalendarTable (c_name, c_calendar) VALUES ('cal_10min_2019', 'startdate(2019-01-01 00:00:00), pattstart(2019-01-01 00:00:00), pattname(patt_10min)'); CREATE ROW TYPE rowtype_owm_cities_data( date_received datetime year to fraction(5), city_sun_rise datetime year to second, city_sun_set datetime year to second, temperature_value decimal(4,2), temperature_min decimal(4,2), temperature_max decimal(4,2), temperature_unit char(12), humidity_value int, humidity_unit char(12), pressure_value int, pressure_unit char(12), wind_speed_value decimal(10,2), wind_speed_name char(50), wind_direction_value int, wind_direction_code char(4), wind_direction_name char(12), clouds_value int, clouds_name char(20), visibility_value int, precipitation_value decimal(6,2), precipitation_mode char(10), precipitation_unit char(12), lastupdate_value datetime year to second ); EXECUTE PROCEDURE TSContainerCreate ('container_owm_cities_data', 'd_data', 'rowtype_owm_cities_data', 0, 0); CREATE TABLE owm_cities_data_hist_ts ( city_id int not null ,owm_data TimeSeries(rowtype_owm_cities_data) ); ALTER TABLE owm_cities_data_hist_ts LOCK MODE (ROW); EXECUTE PROCEDURE tscreatevirtualtab('owm_cities_data_hist_ts_vti','owm_cities_data_hist_ts'); CREATE INDEX i_owm_cities_data_hist_ts1 ON owm_cities_data_hist_ts(city_id); -- Omitido indice f_owm_cities_data_hist_ts1 dado que ya existe un indice sobre las columnas ALTER TABLE owm_cities_data_hist_ts ADD CONSTRAINT FOREIGN KEY (city_id) REFERENCES owm_cities(city_id) ON DELETE CASCADE CONSTRAINT f_owm_cities_data_hist_ts1;
-- ************************************************************************** -- DEISTER WebStudio XSQL-SCHEMA Thu Aug 01 12:39:46 CEST 2019 Engine: postgres -- owm_cities_data_hist_ts -- ************************************************************************** CREATE TABLE owm_cities_data_hist_ts ( city_id int not null ) WITH OIDS; CREATE INDEX i_owm_cities_data_hist_ts1 ON owm_cities_data_hist_ts(city_id); -- Omitido indice f_owm_cities_data_hist_ts1 dado que ya existe un indice sobre las columnas ALTER TABLE owm_cities_data_hist_ts ADD CONSTRAINT f_owm_cities_data_hist_ts1 FOREIGN KEY (city_id) REFERENCES owm_cities(city_id) ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE ;
Column | Type | Details | Definition |
---|---|---|---|
city_id
|
integer | Primary key. | City identifier given by the host. |
owm_data | row type timeseries | Weather data. |
If trouble appears when inserting rows into this table, such as a no permission exception, execute using the name of the created rowtype and specifying the group of users 'public' the following command: GRANT USAGE ON TYPE rowtype_owm_cities_data TO public
Column | Type | Details | Definition |
---|---|---|---|
city_id
|
integer | Primary key. | City identifier given by the host. |
date_received | datetime year to fraction(5) | This column must ALWAYS be the first one defined in the row type. If the first column of the rowtipe is not
a datetime year to fraction(5) it will trigger an exception. Default is set to CURRENT. |
Datetime of the received api response. |
city_sun_rise | datetime year to second | Sunrise time. | |
city_sun_set | datetime year to second | Sunset time. | |
temperature_value | decimal | Current temperature. | |
temperature_min | decimal | Minimum temperature. | |
temperature_max | decimal | Maximum temperature. | |
temperature_unit | char | Units format. | |
humidity_value | decimal | Current humidity. | |
humidity_unit | char | Units format. | |
pressure_value | decimal | Current pressure. | |
pressure_unit | char | Units format. | |
wind_speed_value | decimal | Current wind speed. | |
wind_speed_name | char | Wind description. | |
wind_direction_value | decimal | Wind direction degrees. | |
wind_direction_code | char | Wind direction abreviation. | |
wind_direction_name | char | Wind direction description. | |
clouds_value | decimal | Cloudiness percentage. | |
clouds_name | char | Cloudiness description. | |
visibility_value | decimal | Current visibility. | |
precipitation_value | decimal | Current precipitation. | |
precipitation_mode | char | Precipitation marker. | |
precipitation_unit | char | Units format. | |
lastupdated_value | datetime year to second | Last weather updated. |
This view shows the values given by owm_cities_data_hist_ts_vti
, owm_cities
and owm_weather_icons and combined values from those tables in order to have easy access to more human readable
information to show in lists and graphs.
<view name='owm_cities_data_v'> <columns> city_id, location_name, city_name, city_country, date_received, datetime_received, city_sun_rise, city_sun_set, weather_description, weather_icon_id, weather_icon_name, weather_icon_data, weather_icon_size, weather_icon_type, temperature_value_u, temperature_min_u, temperature_max_u, temperature_value, temperature_unit_short, temperature_min, temperature_max, temperature_unit, humidity_u, humidity_value, humidity_unit, pressure_u, pressure_value, pressure_unit, wind_u, wind_speed_u, wind_speed_value_u, wind_0, wind_E, wind_ENE, wind_ESE, wind_N, wind_NE, wind_NNE, wind_NNW, wind_NW, wind_S, wind_SE, wind_SSE, wind_SSW, wind_SW, wind_W, wind_WNW, wind_WSW, wind_speed_value, wind_speed_name, wind_speed_unit, wind_direction_u, wind_direction_value_u, wind_direction_value, wind_direction_unit, wind_direction_code, wind_direction_name, clouds_u, clouds_value, clouds_unit, clouds_name, visibility_u, visibility_value, visibility_unit, precipitation_mode, precipitation_description, precipitation_u, precipitation_value_10min, precipitation_value, precipitation_unit_time, precipitation_unit, lastupdate_value </columns> <select> <columns> owm_cities.city_id, (owm_cities.city_name || ', ' || owm_cities.city_country) <alias name='location_name'/>, city_name, city_country, DATE(date_received) <alias name='date_received'/>, date_received <alias name='datetime_received'/>, city_sun_rise, city_sun_set, (owm_cities_data_hist_ts_vti.clouds_name || (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode='no' THEN ' ' ELSE ' - ' END) || (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode='no' THEN ' ' ELSE owm_cities_data_hist_ts_vti.precipitation_mode END) ) <alias name='weather_description'/>, (SELECT img_id FROM owm_weather_icons WHERE img_name = (CASE WHEN clouds_name = 'clear sky' AND precipitation_mode = 'no' THEN '01d' ELSE CASE WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no' THEN '02d' ELSE CASE WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no' THEN '03d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no' THEN '04d' ELSE CASE WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain' THEN '10d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain' THEN '09d' ELSE CASE WHEN precipitation_mode = 'snow' THEN '13d' ELSE '01n' END END END END END END END)) <alias name='weather_icon_id'/>, (SELECT img_name FROM owm_weather_icons WHERE img_name = (CASE WHEN clouds_name = 'clear sky' AND precipitation_mode = 'no' THEN '01d' ELSE CASE WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no' THEN '02d' ELSE CASE WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no' THEN '03d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no' THEN '04d' ELSE CASE WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain' THEN '10d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain' THEN '09d' ELSE CASE WHEN precipitation_mode = 'snow' THEN '13d' ELSE '01n' END END END END END END END)) <alias name='weather_icon_name'/>, (SELECT img_data FROM owm_weather_icons WHERE img_name = (CASE WHEN clouds_name = 'clear sky' AND precipitation_mode = 'no' THEN '01d' ELSE CASE WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no' THEN '02d' ELSE CASE WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no' THEN '03d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no' THEN '04d' ELSE CASE WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain' THEN '10d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain' THEN '09d' ELSE CASE WHEN precipitation_mode = 'snow' THEN '13d' ELSE '01n' END END END END END END END)) <alias name='weather_icon_data'/>, (SELECT img_size FROM owm_weather_icons WHERE img_name = (CASE WHEN clouds_name = 'clear sky' AND precipitation_mode = 'no' THEN '01d' ELSE CASE WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no' THEN '02d' ELSE CASE WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no' THEN '03d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no' THEN '04d' ELSE CASE WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain' THEN '10d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain' THEN '09d' ELSE CASE WHEN precipitation_mode = 'snow' THEN '13d' ELSE '01n' END END END END END END END)) <alias name='weather_icon_size'/>, (SELECT img_type FROM owm_weather_icons WHERE img_name = (CASE WHEN clouds_name = 'clear sky' AND precipitation_mode = 'no' THEN '01d' ELSE CASE WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no' THEN '02d' ELSE CASE WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no' THEN '03d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no' THEN '04d' ELSE CASE WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain' THEN '10d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain' THEN '09d' ELSE CASE WHEN precipitation_mode = 'snow' THEN '13d' ELSE '01n' END END END END END END END)) <alias name='weather_icon_type'/>, (temperature_value || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) ) <alias name='temperature_value_u'/>, (temperature_min || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) ) <alias name='temperature_min_u'/>, (temperature_max || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) ) <alias name='temperature_max_u'/>, temperature_value, (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) <alias name='temperature_unit_short'/>, temperature_min, temperature_max, temperature_unit, (owm_cities_data_hist_ts_vti.humidity_value || ' ' || owm_cities_data_hist_ts_vti.humidity_unit) <alias name='humidity_u'/>, humidity_value, humidity_unit, (owm_cities_data_hist_ts_vti.pressure_value || ' ' || owm_cities_data_hist_ts_vti.pressure_unit) <alias name='pressure_u'/>, pressure_value, pressure_unit, (owm_cities_data_hist_ts_vti.wind_speed_name || ' (' || owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s) | ' || owm_cities_data_hist_ts_vti.wind_direction_value || 'º ' || owm_cities_data_hist_ts_vti.wind_direction_code) <alias name='wind_u'/>, (owm_cities_data_hist_ts_vti.wind_speed_name || ' (' || owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s)') <alias name='wind_speed_u'/>, (owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s') <alias name='wind_speed_value_u'/>, (CASE WHEN wind_direction_value = '0' THEN wind_speed_value ELSE 0 END) <alias name='wind_0'/>, (CASE WHEN wind_direction_code = 'E' THEN wind_speed_value ELSE 0 END) <alias name='wind_E'/>, (CASE WHEN wind_direction_code = 'ENE' THEN wind_speed_value ELSE 0 END) <alias name='wind_ENE'/>, (CASE WHEN wind_direction_code = 'ESE' THEN wind_speed_value ELSE 0 END) <alias name='wind_ESE'/>, (CASE WHEN wind_direction_code = 'N' THEN wind_speed_value ELSE 0 END) <alias name='wind_N'/>, (CASE WHEN wind_direction_code = 'NE' THEN wind_speed_value ELSE 0 END) <alias name='wind_NE'/>, (CASE WHEN wind_direction_code = 'NNE' THEN wind_speed_value ELSE 0 END) <alias name='wind_NNE'/>, (CASE WHEN wind_direction_code = 'NNW' THEN wind_speed_value ELSE 0 END) <alias name='wind_NNW'/>, (CASE WHEN wind_direction_code = 'NW' THEN wind_speed_value ELSE 0 END) <alias name='wind_NW'/>, (CASE WHEN wind_direction_code = 'S' THEN wind_speed_value ELSE 0 END) <alias name='wind_S'/>, (CASE WHEN wind_direction_code = 'SE' THEN wind_speed_value ELSE 0 END) <alias name='wind_SE'/>, (CASE WHEN wind_direction_code = 'SSE' THEN wind_speed_value ELSE 0 END) <alias name='wind_SSE'/>, (CASE WHEN wind_direction_code = 'SSW' THEN wind_speed_value ELSE 0 END) <alias name='wind_SSW'/>, (CASE WHEN wind_direction_code = 'SW' THEN wind_speed_value ELSE 0 END) <alias name='wind_SW'/>, (CASE WHEN wind_direction_code = 'W' THEN wind_speed_value ELSE 0 END) <alias name='wind_W'/>, (CASE WHEN wind_direction_code = 'WNW' THEN wind_speed_value ELSE 0 END) <alias name='wind_WNW'/>, (CASE WHEN wind_direction_code = 'WSW' THEN wind_speed_value ELSE 0 END) <alias name='wind_WSW'/>, wind_speed_value, wind_speed_name, 'm/s' <alias name='wind_speed_unit'/>, (owm_cities_data_hist_ts_vti.wind_direction_value || 'º ' || owm_cities_data_hist_ts_vti.wind_direction_code) <alias name='wind_direction_u'/>, (owm_cities_data_hist_ts_vti.wind_direction_value || 'º') <alias name='wind_direction_value_u'/>, wind_direction_value, ' º' <alias name='wind_direction_unit'/>, wind_direction_code, wind_direction_name, (clouds_name || ' (' || clouds_value || '%)') <alias name='clouds_u'/>, clouds_value, '%' <alias name='clouds_unit'/>, clouds_name, (owm_cities_data_hist_ts_vti.visibility_value || ' m') <alias name='visibility_u'/>, visibility_value, 'm' <alias name='visibility_unit'/>, precipitation_mode, CASE WHEN precipitation_mode == 'no' THEN '-' ELSE (precipitation_mode || ' | ' || owm_cities_data_hist_ts_vti.precipitation_value || ' mm - ' || owm_cities_data_hist_ts_vti.precipitation_unit) END <alias name='precipitation_description'/>, (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode == 'no' THEN '-' ELSE (owm_cities_data_hist_ts_vti.precipitation_value || ' mm - ' || owm_cities_data_hist_ts_vti.precipitation_unit) END) <alias name='precipitation_u'/>, owm_cities_data_hist_ts_vti.precipitation_value/(CASE WHEN LENGTH(owm_cities_data_hist_ts_vti.precipitation_unit) < 2 THEN 1 ELSE (to_number(substr(owm_cities_data_hist_ts_vti.precipitation_unit,0,1))*6) END) <alias name='precipitation_value_10min'/>, precipitation_value, precipitation_unit <alias name='precipitation_unit_time'/>, 'mm' <alias name='precipitation_unit'/>, lastupdate_value </columns> <from table='owm_cities_data_hist_ts_vti'> <join table='owm_cities'> <on>owm_cities.city_id = owm_cities_data_hist_ts_vti.city_id</on> </join> </from> </select> </view>
-- ************************************************************************** -- DEISTER WebStudio XSQL-SCHEMA Mon Aug 12 09:14:33 CEST 2019 Engine: informix -- owm_cities_data_v -- ************************************************************************** CREATE VIEW owm_cities_data_v( city_id, location_name, city_name, city_country, date_received, datetime_received, city_sun_rise, city_sun_set, weather_description, weather_icon_id, weather_icon_name, weather_icon_data, weather_icon_size, weather_icon_type, temperature_value_u, temperature_min_u, temperature_max_u, temperature_value, temperature_unit_short, temperature_min, temperature_max, temperature_unit, humidity_u, humidity_value, humidity_unit, pressure_u, pressure_value, pressure_unit, wind_u, wind_speed_u, wind_speed_value_u, wind_0, wind_E, wind_ENE, wind_ESE, wind_N, wind_NE, wind_NNE, wind_NNW, wind_NW, wind_S, wind_SE, wind_SSE, wind_SSW, wind_SW, wind_W, wind_WNW, wind_WSW, wind_speed_value, wind_speed_name, wind_speed_unit, wind_direction_u, wind_direction_value_u, wind_direction_value, wind_direction_unit, wind_direction_code, wind_direction_name, clouds_u, clouds_value, clouds_unit, clouds_name, visibility_u, visibility_value, visibility_unit, precipitation_mode, precipitation_description, precipitation_u, precipitation_value_10min, precipitation_value, precipitation_unit_time, precipitation_unit, lastupdate_value ) AS SELECT owm_cities.city_id, (owm_cities.city_name || ', ' || owm_cities.city_country) location_name, city_name, city_country, DATE(date_received) date_received, date_received datetime_received, city_sun_rise, city_sun_set, (owm_cities_data_hist_ts_vti.clouds_name || (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode='no' THEN ' ' ELSE ' - ' END) || (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode='no' THEN ' ' ELSE owm_cities_data_hist_ts_vti.precipitation_mode END) ) weather_description, (SELECT img_id FROM owm_weather_icons WHERE img_name = (CASE WHEN clouds_name = 'clear sky' AND precipitation_mode = 'no' THEN '01d' ELSE CASE WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no' THEN '02d' ELSE CASE WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no' THEN '03d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no' THEN '04d' ELSE CASE WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain' THEN '10d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain' THEN '09d' ELSE CASE WHEN precipitation_mode = 'snow' THEN '13d' ELSE '01n' END END END END END END END)) weather_icon_id, (SELECT img_name FROM owm_weather_icons WHERE img_name = (CASE WHEN clouds_name = 'clear sky' AND precipitation_mode = 'no' THEN '01d' ELSE CASE WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no' THEN '02d' ELSE CASE WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no' THEN '03d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no' THEN '04d' ELSE CASE WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain' THEN '10d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain' THEN '09d' ELSE CASE WHEN precipitation_mode = 'snow' THEN '13d' ELSE '01n' END END END END END END END)) weather_icon_name, (SELECT img_data FROM owm_weather_icons WHERE img_name = (CASE WHEN clouds_name = 'clear sky' AND precipitation_mode = 'no' THEN '01d' ELSE CASE WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no' THEN '02d' ELSE CASE WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no' THEN '03d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no' THEN '04d' ELSE CASE WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain' THEN '10d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain' THEN '09d' ELSE CASE WHEN precipitation_mode = 'snow' THEN '13d' ELSE '01n' END END END END END END END)) weather_icon_data, (SELECT img_size FROM owm_weather_icons WHERE img_name = (CASE WHEN clouds_name = 'clear sky' AND precipitation_mode = 'no' THEN '01d' ELSE CASE WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no' THEN '02d' ELSE CASE WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no' THEN '03d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no' THEN '04d' ELSE CASE WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain' THEN '10d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain' THEN '09d' ELSE CASE WHEN precipitation_mode = 'snow' THEN '13d' ELSE '01n' END END END END END END END)) weather_icon_size, (SELECT img_type FROM owm_weather_icons WHERE img_name = (CASE WHEN clouds_name = 'clear sky' AND precipitation_mode = 'no' THEN '01d' ELSE CASE WHEN clouds_name = 'few clouds' AND precipitation_mode = 'no' THEN '02d' ELSE CASE WHEN clouds_name = 'scattered clouds' AND precipitation_mode = 'no' THEN '03d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'no' THEN '04d' ELSE CASE WHEN (clouds_name = 'clear sky' OR clouds_name = 'few clouds' OR clouds_name = 'scattered clouds') AND precipitation_mode = 'rain' THEN '10d' ELSE CASE WHEN (clouds_name = 'broken clouds' OR clouds_name = 'overcast clouds') AND precipitation_mode = 'rain' THEN '09d' ELSE CASE WHEN precipitation_mode = 'snow' THEN '13d' ELSE '01n' END END END END END END END)) weather_icon_type, (temperature_value || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) ) temperature_value_u, (temperature_min || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) ) temperature_min_u, (temperature_max || (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) ) temperature_max_u, temperature_value, (CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='celsius' THEN ' ºC' ELSE CASE WHEN owm_cities_data_hist_ts_vti.temperature_unit='kelvin' THEN ' K' ELSE owm_cities_data_hist_ts_vti.temperature_unit END END) temperature_unit_short, temperature_min, temperature_max, temperature_unit, (owm_cities_data_hist_ts_vti.humidity_value || ' ' || owm_cities_data_hist_ts_vti.humidity_unit) humidity_u, humidity_value, humidity_unit, (owm_cities_data_hist_ts_vti.pressure_value || ' ' || owm_cities_data_hist_ts_vti.pressure_unit) pressure_u, pressure_value, pressure_unit, (owm_cities_data_hist_ts_vti.wind_speed_name || ' (' || owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s) | ' || owm_cities_data_hist_ts_vti.wind_direction_value || 'º ' || owm_cities_data_hist_ts_vti.wind_direction_code) wind_u, (owm_cities_data_hist_ts_vti.wind_speed_name || ' (' || owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s)') wind_speed_u, (owm_cities_data_hist_ts_vti.wind_speed_value || ' m/s') wind_speed_value_u, (CASE WHEN wind_direction_value = '0' THEN wind_speed_value ELSE 0 END) wind_0, (CASE WHEN wind_direction_code = 'E' THEN wind_speed_value ELSE 0 END) wind_E, (CASE WHEN wind_direction_code = 'ENE' THEN wind_speed_value ELSE 0 END) wind_ENE, (CASE WHEN wind_direction_code = 'ESE' THEN wind_speed_value ELSE 0 END) wind_ESE, (CASE WHEN wind_direction_code = 'N' THEN wind_speed_value ELSE 0 END) wind_N, (CASE WHEN wind_direction_code = 'NE' THEN wind_speed_value ELSE 0 END) wind_NE, (CASE WHEN wind_direction_code = 'NNE' THEN wind_speed_value ELSE 0 END) wind_NNE, (CASE WHEN wind_direction_code = 'NNW' THEN wind_speed_value ELSE 0 END) wind_NNW, (CASE WHEN wind_direction_code = 'NW' THEN wind_speed_value ELSE 0 END) wind_NW, (CASE WHEN wind_direction_code = 'S' THEN wind_speed_value ELSE 0 END) wind_S, (CASE WHEN wind_direction_code = 'SE' THEN wind_speed_value ELSE 0 END) wind_SE, (CASE WHEN wind_direction_code = 'SSE' THEN wind_speed_value ELSE 0 END) wind_SSE, (CASE WHEN wind_direction_code = 'SSW' THEN wind_speed_value ELSE 0 END) wind_SSW, (CASE WHEN wind_direction_code = 'SW' THEN wind_speed_value ELSE 0 END) wind_SW, (CASE WHEN wind_direction_code = 'W' THEN wind_speed_value ELSE 0 END) wind_W, (CASE WHEN wind_direction_code = 'WNW' THEN wind_speed_value ELSE 0 END) wind_WNW, (CASE WHEN wind_direction_code = 'WSW' THEN wind_speed_value ELSE 0 END) wind_WSW, wind_speed_value, wind_speed_name, 'm/s' wind_speed_unit, (owm_cities_data_hist_ts_vti.wind_direction_value || 'º ' || owm_cities_data_hist_ts_vti.wind_direction_code) wind_direction_u, (owm_cities_data_hist_ts_vti.wind_direction_value || 'º') wind_direction_value_u, wind_direction_value, ' º' wind_direction_unit, wind_direction_code, wind_direction_name, (clouds_name || ' (' || clouds_value || '%)') clouds_u, clouds_value, '%' clouds_unit, clouds_name, (owm_cities_data_hist_ts_vti.visibility_value || ' m') visibility_u, visibility_value, 'm' visibility_unit, precipitation_mode, CASE WHEN precipitation_mode == 'no' THEN '-' ELSE (precipitation_mode || ' | ' || owm_cities_data_hist_ts_vti.precipitation_value || ' mm - ' || owm_cities_data_hist_ts_vti.precipitation_unit) END precipitation_description, (CASE WHEN owm_cities_data_hist_ts_vti.precipitation_mode == 'no' THEN '-' ELSE (owm_cities_data_hist_ts_vti.precipitation_value || ' mm - ' || owm_cities_data_hist_ts_vti.precipitation_unit) END) precipitation_u, owm_cities_data_hist_ts_vti.precipitation_value/(CASE WHEN LENGTH(owm_cities_data_hist_ts_vti.precipitation_unit) < 2 THEN 1 ELSE (to_number(substr(owm_cities_data_hist_ts_vti.precipitation_unit,0,1))*6) END) precipitation_value_10min, precipitation_value, precipitation_unit precipitation_unit_time, 'mm' precipitation_unit, lastupdate_value FROM owm_cities_data_hist_ts_vti ,owm_cities WHERE owm_cities.city_id = owm_cities_data_hist_ts_vti.city_id ; GRANT SELECT ON owm_cities_data_v TO public;
Column | Type | Details | Definition |
---|---|---|---|
city_id
|
integer | Primary key. | City identifier given by the host. |
city_name | char | City name. | |
location_name | char | 'city_name, city_country'. | |
city_country | char | Country of the city, acronym. | |
date_received | date year to day | DATE(owm_cities_data_hist_ts_vti .date_received) |
|
datetime_received | datetime year to fraction(5) |
owm_cities_data_hist_ts_vti .date_received |
|
city_sun_rise | datetime year to second | Sunrise time. | |
city_sun_set | datetime year to second | Sunset time. | |
weather_description | char | 'clouds_name - precipitation_mode' | |
weather_icon_id | int | Primary key. | Image identifier. |
weather_icon_name | varchar | Image name. | |
weather_icon_type | varchar | Image type. | |
weather_icon_size | int | Image size. | |
weather_icon_data | blob | Image. | |
temperature_value_u | varchar | 'temperature_value temperature_unit_short' | |
temperature_min_u | varchar | 'temperature_min temperature_unit_short' | |
temperature_max_u | varchar | 'temperature_max temperature_unit_short' | |
temperature_value | decimal | Current temperature. | |
temperature_unit_short | varchar | Short version of the value in temperature_unit. | |
temperature_min | decimal | Minimum temperature. | |
temperature_max | decimal | Maximum temperature. | |
temperature_unit | char | Units format. | |
humidity_u | varchar | 'humidity_value humidity_unit' | |
humidity_value | decimal | Current humidity. | |
humidity_unit | char | Units format. | |
pressure_u | varchar | 'pressure_value pressure_unit' | |
pressure_value | decimal | Current pressure. | |
pressure_unit | char | Units format. | |
wind_u | decimal | 'wind_speed_name (wind_speed_value wind_speed_unit) | wind_direction_value wind_direction_unit wind direction_code' | |
wind_speed_u | decimal | 'wind_speed_value wind_speed_unit' | |
wind_[direction_code] | decimal | There is a column for each possible value of wind_direction_code, for easier representation of channel graph. It contains the value of wind_speed_value. Example: wind_0, wind_N, wind_SSE, wind_NW... |
|
wind_speed_value | decimal | Current wind speed. | |
wind_speed_name | char | Wind description. | |
wind_speed_unit | varchar | As long as the request to the API is done with the units atribute set to metric, this value should always be 'm/s'. | |
wind_direction_value | decimal | Wind direction degrees. | |
wind_direction_unit | varchar | As long as the request to the API is done with the units atribute set to metric, this value should always be 'º'. | |
wind_direction_code | char | Wind direction abreviation. | |
wind_direction_name | char | Wind direction description. | |
clouds_u | varchar | 'clouds_name (clouds_value clouds_unit)' | |
clouds_value | decimal | Cloudiness percentage. | |
clouds_name | char | Cloudiness description. | |
clouds_unit | char | As long as the request to the API is done with the units atribute set to metric, this value should always be '%'. | |
visibility_u | varchar | 'visibility_value visibility_unit' | |
visibility_value | decimal | Current visibility. | |
visibility_unit | varchar | As long as the request to the API is done with the units atribute set to metric, this value should always be 'm'. | |
precipitation_mode | char | Precipitation marker. | |
precipitation_description | varchar | 'precipitation mode | precipitation_value precipitation_unit - precipitation_unit_time' | |
precipitation_u | varchar | 'precipitation_value precipitation_unit - precipitation_unit_time' | |
precipitation_value_10min | decimal | precipitation_value/int(precipitation_unit_time)*6 | |
precipitation_value | decimal | Current precipitation. | |
precipitation_unit_time | char |
owm_cities_data_hist_ts_vti .precipitation_unit |
|
precipitation_unit | char | As long as the request to the API is done with the units atribute set to metric, this value should always be 'mm'. | |
lastupdated_value | datetime year to second | Last weather updated. |
3 Triggers, functions and scripts
In this section the triggers, fucntions and scripts used will be explained. All data manipulation regarding the response of the API will be
done with this structure in mind. This is an example of the data provided by Open Weather Map
, and can be found in
this link with an explanation on each attribute's values.
<current> <city id="2643741" name="City of London"> <coord lon="-0.09" lat="51.51"> <country>GB</country> <sun rise="2015-06-30T03:46:57" set="2015-06-30T20:21:12"> </city> <temperature value="72.34" min="66.2" max="79.88" unit="fahrenheit"/> <humidity value="43" unit="%"> <pressure value="1020" unit="hPa"> <wind> <speed value="7.78" name="Moderate breeze"> <direction value="140" code="SE" name="SouthEast"> </wind> <clouds value="0" name="clear sky"> <visibility value="10000"> <precipitation mode="rain" value="0.2" unit="1h"> <weather number="800" value="Sky is Clear" icon="01d"> <lastupdate value="2015-06-30T08:36:14"> </current>
3.1 Triggers
3.1.1 owm_cities_ins
This trigger follows the table owm_cities
so that when a city is inserted, the corresponding TimeSeries
row is also initialized.
<xsql-trigger name="owm_cities_ins" table="owm_cities" event="insert"> <foreach-row> <insert table='owm_cities_data_hist_ts'> <column name='city_id' ><nxt>city_id</nxt></column> <column name='owm_data' >"origin(2019-01-01 00:00:00.00000), calendar(cal_10min_2019), container(container_owm_cities_data), threshold(0),irregular,[]"</column> </insert> </foreach-row> </xsql-trigger>
-- ************************************************************************** -- owm_cities_ins -- DEISTER WebStudio XSQL-TRIGGER Thu Aug 08 12:20:01 CEST 2019 Engine: informix -- ************************************************************************** CREATE TRIGGER owm_cities_ins INSERT ON owm_cities REFERENCING NEW AS nxt FOR EACH ROW ( INSERT INTO owm_cities_data_hist_ts (city_id, owm_data) VALUES (nxt.city_id, "origin(2019-01-01 00:00:00.00000), calendar(cal_10min_2019), container(container_owm_cities_data), threshold(0),irregular,[]") ) ;
3.2 Funtions
3.2.1 function_get_value_attribute
This function is described inside the loading script. It helps retrieve information from the XML response by giving it a node, a tag name and an argument.
<function name='function_get_value_attribute'> <args> <arg name='p_node'/> <arg name='p_tag_name'/> <arg name='p_arg'/> </args> <body> <set name='m_element'> <dom.getElementsByTagName tagname='#p_tag_name'> <p_node/> </dom.getElementsByTagName> </set> <set name='m_attribute'> <dom.element.getAttribute attr='#p_arg'> <array.get name='m_element'>0</array.get> </dom.element.getAttribute> </set> <if> <expr> <isnotnull><m_attribute/></isnotnull> </expr> <then> <return> <m_attribute/> </return> </then> <else> <return> <set name='m_attribute'>0</set> </return> </else> </if> </body> </function>
3.3 Scripts
3.3.1 owm_cities_get_data
The function of this script is to send requests to the host API, for each city stored in owm_cities
, to receive weather
information in an XML response. This information is then casted if necessari and stored into variables to finally be inserted into the
owm_cities_data_hist_ts_vti
table.
This script is executed by a cron every 10 minutes and stored by the TimeSeries
module into the row type created for it.
<!-- ================================================================================ --> <!-- --> <!-- XSQL: owm_cities_get_data --> <!-- --> <!-- ================================================================================ --> <xsql-script name='owm_cities_get_data'> <body> <!-- ================================================================================== --> <!-- --> <!-- FUNCT: From Node, Tag name with position and Atribute returns the value (String) --> <!-- --> <!-- ================================================================================== --> <function name='function_get_value_attribute'> <args> <arg name='p_node'/> <arg name='p_tag_name'/> <arg name='p_arg'/> </args> <body> <set name='m_element'> <dom.getElementsByTagName tagname='#p_tag_name'> <p_node/> </dom.getElementsByTagName> </set> <set name='m_attribute'> <dom.element.getAttribute attr='#p_arg'> <array.get name='m_element'>0</array.get> </dom.element.getAttribute> </set> <if> <expr> <isnotnull><m_attribute/></isnotnull> </expr> <then> <return> <m_attribute/> </return> </then> <else> <return> <set name='m_attribute'>0</set> </return> </else> </if> </body> </function> <select prefix='m_api_'> <columns> apikey, host </columns> <from table='owm_apikey'/> </select> <foreach> <select prefix='m_city_'> <columns> city_id <alias name='id'/> </columns> <from table='owm_cities'/> </select> <do> <set name='response'> <http.connection.read> <http.connection url = '/data/2.5/weather?id=#m_city_id&units=metric&mode=xml&APPID=#m_api_apikey' protocol= 'http' host='#m_api_host' /> </http.connection.read> </set> <set name='m_root'><dom.parse><response/></dom.parse></set> <set name='m_city_sun_rise'> <date.timestamp format='yyyy-MM-dd HH:mm:ss'> <string.replace> <function_get_value_attribute> <m_root/> <string>sun</string> <string>rise</string> </function_get_value_attribute> <string>T</string> <string.space/> </string.replace> </date.timestamp> </set> <set name='m_city_sun_set'> <date.timestamp format='yyyy-MM-dd HH:mm:ss'> <string.replace> <function_get_value_attribute> <m_root/> <string>sun</string> <string>set</string> </function_get_value_attribute> <string>T</string> <string.space/> </string.replace> </date.timestamp> </set> <set name='m_temperature_value'> <number> <function_get_value_attribute> <m_root/> <string>temperature</string> <string>value</string> </function_get_value_attribute> </number> </set> <set name='m_temperature_min'> <number> <function_get_value_attribute> <m_root/> <string>temperature</string> <string>min</string> </function_get_value_attribute> </number> </set> <set name='m_temperature_max'> <number> <function_get_value_attribute> <m_root/> <string>temperature</string> <string>max</string> </function_get_value_attribute> </number> </set> <set name='m_temperature_unit'> <string.trim> <function_get_value_attribute> <m_root/> <string>temperature</string> <string>unit</string> </function_get_value_attribute> </string.trim> </set> <set name='m_humidity_value'> <number> <function_get_value_attribute> <m_root/> <string>humidity</string> <string>value</string> </function_get_value_attribute> </number> </set> <set name='m_humidity_unit'> <string.trim> <function_get_value_attribute> <m_root/> <string>humidity</string> <string>unit</string> </function_get_value_attribute> </string.trim> </set> <set name='m_pressure_value'> <number> <function_get_value_attribute> <m_root/> <string>pressure</string> <string>value</string> </function_get_value_attribute> </number> </set> <set name='m_pressure_unit'> <string.trim> <function_get_value_attribute> <m_root/> <string>pressure</string> <string>unit</string> </function_get_value_attribute> </string.trim> </set> <!-- WIND --> <set name='m_wind_speed_value'> <number> <function_get_value_attribute> <m_root/> <string>speed</string> <string>value</string> </function_get_value_attribute> </number> </set> <set name='m_wind_speed_name'> <string.trim> <function_get_value_attribute> <m_root/> <string>speed</string> <string>name</string> </function_get_value_attribute> </string.trim> </set> <set name='m_wind_direction_value'> <number> <function_get_value_attribute> <m_root/> <string>direction</string> <string>value</string> </function_get_value_attribute> </number> </set> <set name='m_wind_direction_code'> <string.trim> <function_get_value_attribute> <m_root/> <string>direction</string> <string>code</string> </function_get_value_attribute> </string.trim> </set> <set name='m_wind_direction_name'> <string.trim> <function_get_value_attribute> <m_root/> <string>direction</string> <string>name</string> </function_get_value_attribute> </string.trim> </set> <!-- CLOUDS --> <set name='m_clouds_value'> <number> <function_get_value_attribute> <m_root/> <string>clouds</string> <string>value</string> </function_get_value_attribute> </number> </set> <set name='m_clouds_name'> <string.trim> <function_get_value_attribute> <m_root/> <string>clouds</string> <string>name</string> </function_get_value_attribute> </string.trim> </set> <!-- VISIBILITY --> <set name='m_visibility_value'> <number> <function_get_value_attribute> <m_root/> <string>visibility</string> <string>value</string> </function_get_value_attribute> </number> </set> <!-- PRECIPITATION --> <set name='m_precipitation_mode'> <string.trim> <function_get_value_attribute> <m_root/> <string>precipitation</string> <string>mode</string> </function_get_value_attribute> </string.trim> </set> <if> <expr> <ne> <m_precipitation_mode/> <string>no</string> </ne> </expr> <then> <set name='m_precipitation_value'> <number> <function_get_value_attribute> <m_root/> <string>precipitation</string> <string>value</string> </function_get_value_attribute> </number> </set> <set name='m_precipitation_unit'> <string.trim> <function_get_value_attribute> <m_root/> <string>precipitation</string> <string>unit</string> </function_get_value_attribute> </string.trim> </set> </then> <else> <set name='m_precipitation_value'>0</set> <set name='m_precipitation_unit'><string>-</string></set> </else> </if> <set name='m_lastupdate_value'> <date.timestamp format='yyyy-MM-dd HH:mm:ss'> <string.replace> <function_get_value_attribute> <m_root/> <string>lastupdate</string> <string>value</string> </function_get_value_attribute> <string>T</string> <string.space/> </string.replace> </date.timestamp> </set> <select prefix='m_date_'> <columns> ROUND(CURRENT,'MI') <alias name='current'/> </columns> <from table='systables'/> <where> tabid = 100 </where> </select> <insert table='owm_cities_data_hist_ts_vti'> <column name='city_id'><m_city_id/></column> <column name='date_received'><m_date_current/></column> <column name='city_sun_rise'><m_city_sun_rise/></column> <column name='city_sun_set'><m_city_sun_set/></column> <column name='temperature_value'><m_temperature_value/></column> <column name='temperature_min'><m_temperature_min/></column> <column name='temperature_max'><m_temperature_max/></column> <column name='temperature_unit'><m_temperature_unit/></column> <column name='humidity_value'><m_humidity_value/></column> <column name='humidity_unit'><m_humidity_unit/></column> <column name='pressure_value'><m_pressure_value/></column> <column name='pressure_unit'><m_pressure_unit/></column> <column name='wind_speed_value'><m_wind_speed_value/></column> <column name='wind_speed_name'><m_wind_speed_name/></column> <column name='wind_direction_value'><m_wind_direction_value/></column> <column name='wind_direction_code'><m_wind_direction_code/></column> <column name='wind_direction_name'><m_wind_direction_name/></column> <column name='clouds_value'><m_clouds_value/></column> <column name='clouds_name'><m_clouds_name/></column> <column name='visibility_value'><m_visibility_value/></column> <column name='precipitation_value'><m_precipitation_value/></column> <column name='precipitation_mode'><m_precipitation_mode/></column> <column name='precipitation_unit'><m_precipitation_unit/></column> <column name='lastupdate_value'><m_lastupdate_value/></column> </insert> </do> </foreach> </body> </xsql-script>