@golemio/microclimate 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/db/migrations/postgresql/20221222125423-analytic-view.js +53 -0
- package/db/migrations/postgresql/20230110142233-fixed_microclimate_measurement.js +53 -0
- package/db/migrations/postgresql/20230131102732-fix_compass.js +53 -0
- package/db/migrations/postgresql/sqls/20221222125423-analytic-view-down.sql +5 -0
- package/db/migrations/postgresql/sqls/20221222125423-analytic-view-up.sql +206 -0
- package/db/migrations/postgresql/sqls/20230110142233-fixed_microclimate_measurement-down.sql +184 -0
- package/db/migrations/postgresql/sqls/20230110142233-fixed_microclimate_measurement-up.sql +208 -0
- package/db/migrations/postgresql/sqls/20230131102732-fix_compass-down.sql +141 -0
- package/db/migrations/postgresql/sqls/20230131102732-fix_compass-up.sql +141 -0
- package/package.json +1 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var dbm;
|
|
4
|
+
var type;
|
|
5
|
+
var seed;
|
|
6
|
+
var fs = require('fs');
|
|
7
|
+
var path = require('path');
|
|
8
|
+
var Promise;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* We receive the dbmigrate dependency from dbmigrate initially.
|
|
12
|
+
* This enables us to not have to rely on NODE_PATH.
|
|
13
|
+
*/
|
|
14
|
+
exports.setup = function(options, seedLink) {
|
|
15
|
+
dbm = options.dbmigrate;
|
|
16
|
+
type = dbm.dataType;
|
|
17
|
+
seed = seedLink;
|
|
18
|
+
Promise = options.Promise;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.up = function(db) {
|
|
22
|
+
var filePath = path.join(__dirname, 'sqls', '20221222125423-analytic-view-up.sql');
|
|
23
|
+
return new Promise( function( resolve, reject ) {
|
|
24
|
+
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
|
|
25
|
+
if (err) return reject(err);
|
|
26
|
+
console.log('received data: ' + data);
|
|
27
|
+
|
|
28
|
+
resolve(data);
|
|
29
|
+
});
|
|
30
|
+
})
|
|
31
|
+
.then(function(data) {
|
|
32
|
+
return db.runSql(data);
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.down = function(db) {
|
|
37
|
+
var filePath = path.join(__dirname, 'sqls', '20221222125423-analytic-view-down.sql');
|
|
38
|
+
return new Promise( function( resolve, reject ) {
|
|
39
|
+
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
|
|
40
|
+
if (err) return reject(err);
|
|
41
|
+
console.log('received data: ' + data);
|
|
42
|
+
|
|
43
|
+
resolve(data);
|
|
44
|
+
});
|
|
45
|
+
})
|
|
46
|
+
.then(function(data) {
|
|
47
|
+
return db.runSql(data);
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
exports._meta = {
|
|
52
|
+
"version": 1
|
|
53
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var dbm;
|
|
4
|
+
var type;
|
|
5
|
+
var seed;
|
|
6
|
+
var fs = require('fs');
|
|
7
|
+
var path = require('path');
|
|
8
|
+
var Promise;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* We receive the dbmigrate dependency from dbmigrate initially.
|
|
12
|
+
* This enables us to not have to rely on NODE_PATH.
|
|
13
|
+
*/
|
|
14
|
+
exports.setup = function(options, seedLink) {
|
|
15
|
+
dbm = options.dbmigrate;
|
|
16
|
+
type = dbm.dataType;
|
|
17
|
+
seed = seedLink;
|
|
18
|
+
Promise = options.Promise;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.up = function(db) {
|
|
22
|
+
var filePath = path.join(__dirname, 'sqls', '20230110142233-fixed_microclimate_measurement-up.sql');
|
|
23
|
+
return new Promise( function( resolve, reject ) {
|
|
24
|
+
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
|
|
25
|
+
if (err) return reject(err);
|
|
26
|
+
console.log('received data: ' + data);
|
|
27
|
+
|
|
28
|
+
resolve(data);
|
|
29
|
+
});
|
|
30
|
+
})
|
|
31
|
+
.then(function(data) {
|
|
32
|
+
return db.runSql(data);
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.down = function(db) {
|
|
37
|
+
var filePath = path.join(__dirname, 'sqls', '20230110142233-fixed_microclimate_measurement-down.sql');
|
|
38
|
+
return new Promise( function( resolve, reject ) {
|
|
39
|
+
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
|
|
40
|
+
if (err) return reject(err);
|
|
41
|
+
console.log('received data: ' + data);
|
|
42
|
+
|
|
43
|
+
resolve(data);
|
|
44
|
+
});
|
|
45
|
+
})
|
|
46
|
+
.then(function(data) {
|
|
47
|
+
return db.runSql(data);
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
exports._meta = {
|
|
52
|
+
"version": 1
|
|
53
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var dbm;
|
|
4
|
+
var type;
|
|
5
|
+
var seed;
|
|
6
|
+
var fs = require('fs');
|
|
7
|
+
var path = require('path');
|
|
8
|
+
var Promise;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* We receive the dbmigrate dependency from dbmigrate initially.
|
|
12
|
+
* This enables us to not have to rely on NODE_PATH.
|
|
13
|
+
*/
|
|
14
|
+
exports.setup = function(options, seedLink) {
|
|
15
|
+
dbm = options.dbmigrate;
|
|
16
|
+
type = dbm.dataType;
|
|
17
|
+
seed = seedLink;
|
|
18
|
+
Promise = options.Promise;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.up = function(db) {
|
|
22
|
+
var filePath = path.join(__dirname, 'sqls', '20230131102732-fix_compass-up.sql');
|
|
23
|
+
return new Promise( function( resolve, reject ) {
|
|
24
|
+
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
|
|
25
|
+
if (err) return reject(err);
|
|
26
|
+
console.log('received data: ' + data);
|
|
27
|
+
|
|
28
|
+
resolve(data);
|
|
29
|
+
});
|
|
30
|
+
})
|
|
31
|
+
.then(function(data) {
|
|
32
|
+
return db.runSql(data);
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.down = function(db) {
|
|
37
|
+
var filePath = path.join(__dirname, 'sqls', '20230131102732-fix_compass-down.sql');
|
|
38
|
+
return new Promise( function( resolve, reject ) {
|
|
39
|
+
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
|
|
40
|
+
if (err) return reject(err);
|
|
41
|
+
console.log('received data: ' + data);
|
|
42
|
+
|
|
43
|
+
resolve(data);
|
|
44
|
+
});
|
|
45
|
+
})
|
|
46
|
+
.then(function(data) {
|
|
47
|
+
return db.runSql(data);
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
exports._meta = {
|
|
52
|
+
"version": 1
|
|
53
|
+
};
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
CREATE SCHEMA IF NOT EXISTS analytic;
|
|
2
|
+
|
|
3
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_measurement_hights
|
|
4
|
+
AS SELECT DISTINCT s.sensor_id,
|
|
5
|
+
unpivot.measure,
|
|
6
|
+
unpivot.hight_cm
|
|
7
|
+
FROM microclimate.sensor_devices_import s, -- z široké tabulky, která obsahuje všechny veličiny a jejich výšky ve oddělených sloupcích (pro jedno id více veličin a výšek v jednom řádku) nám funce LATERAL převede hodnotu (výška v cm) do jednoho sloupce a popis veličiny do druhého sloupce, vznikne tak dlouhá tabulka, kterou pak spojíme s tabulkou měření-v_microclimate_measurements_daily na základě id a názvu veličiny (proto se veličiny rovnou nazývají názvy pro výpočty)
|
|
8
|
+
LATERAL ( VALUES ('avg_temperature'::text,s.air_temp), ('max_temperature'::text,s.air_temp), ('min_temperature'::text,s.air_temp), ('avg_air_hum'::text,s.air_hum), ('avg_pressure'::text,s.pressure), ('max_wind_speed'::text,s.wind_speed), ('avg_wind_speed'::text,s.wind_speed), ('sum_precip'::text,s.precip), ('avg_soil_temp'::text,s.soil_temp), ('avg_water_pot'::text,s.water_pot), ('wind_dir_at_max_speed'::text,s.wind_dir)) unpivot(measure, hight_cm);
|
|
9
|
+
|
|
10
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_measurements_daily
|
|
11
|
+
AS WITH calendar AS (
|
|
12
|
+
SELECT calendar_1.date,
|
|
13
|
+
sensors_1.sensor_id
|
|
14
|
+
FROM ( SELECT generate_series('2022-08-02 00:00:00+02'::timestamp with time zone, CURRENT_DATE::timestamp with time zone, '1 day'::interval)::date AS date) calendar_1
|
|
15
|
+
CROSS JOIN ( SELECT DISTINCT sensor_devices_import.sensor_id
|
|
16
|
+
FROM microclimate.sensor_devices_import) sensors_1
|
|
17
|
+
), first_measurement_per_hour AS (
|
|
18
|
+
SELECT DISTINCT ON (m.sensor_id, (timezone('CET'::text, m.measured_at)::date), (date_part('hour'::text, timezone('CET'::text, m.measured_at)))) m.sensor_id,
|
|
19
|
+
timezone('CET'::text, m.measured_at) AS measured_at,
|
|
20
|
+
timezone('CET'::text, m.measured_at)::date AS date,
|
|
21
|
+
date_part('hour'::text, timezone('CET'::text, m.measured_at)) AS hour,
|
|
22
|
+
m.air_temp,
|
|
23
|
+
m.air_hum,
|
|
24
|
+
m.pressure,
|
|
25
|
+
m.wind_speed,
|
|
26
|
+
m.water_pot,
|
|
27
|
+
m.soil_temp
|
|
28
|
+
FROM microclimate.measurements m
|
|
29
|
+
WHERE date_part('hour'::text, timezone('CET'::text, m.measured_at)) = ANY (ARRAY[7::double precision, 14::double precision, 21::double precision])
|
|
30
|
+
ORDER BY m.sensor_id, (timezone('CET'::text, m.measured_at)::date), (date_part('hour'::text, timezone('CET'::text, m.measured_at))), m.measured_at
|
|
31
|
+
), seven AS (
|
|
32
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
33
|
+
first_measurement_per_hour.measured_at,
|
|
34
|
+
first_measurement_per_hour.date,
|
|
35
|
+
first_measurement_per_hour.hour,
|
|
36
|
+
first_measurement_per_hour.air_temp,
|
|
37
|
+
first_measurement_per_hour.air_hum,
|
|
38
|
+
first_measurement_per_hour.pressure,
|
|
39
|
+
first_measurement_per_hour.wind_speed,
|
|
40
|
+
first_measurement_per_hour.water_pot,
|
|
41
|
+
first_measurement_per_hour.soil_temp
|
|
42
|
+
FROM first_measurement_per_hour
|
|
43
|
+
WHERE first_measurement_per_hour.hour = 7::double precision
|
|
44
|
+
), two AS (
|
|
45
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
46
|
+
first_measurement_per_hour.measured_at,
|
|
47
|
+
first_measurement_per_hour.date,
|
|
48
|
+
first_measurement_per_hour.hour,
|
|
49
|
+
first_measurement_per_hour.air_temp,
|
|
50
|
+
first_measurement_per_hour.air_hum,
|
|
51
|
+
first_measurement_per_hour.pressure,
|
|
52
|
+
first_measurement_per_hour.wind_speed,
|
|
53
|
+
first_measurement_per_hour.water_pot,
|
|
54
|
+
first_measurement_per_hour.soil_temp
|
|
55
|
+
FROM first_measurement_per_hour
|
|
56
|
+
WHERE first_measurement_per_hour.hour = 14::double precision
|
|
57
|
+
), nine AS (
|
|
58
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
59
|
+
first_measurement_per_hour.measured_at,
|
|
60
|
+
first_measurement_per_hour.date,
|
|
61
|
+
first_measurement_per_hour.hour,
|
|
62
|
+
first_measurement_per_hour.air_temp,
|
|
63
|
+
first_measurement_per_hour.air_hum,
|
|
64
|
+
first_measurement_per_hour.pressure,
|
|
65
|
+
first_measurement_per_hour.wind_speed,
|
|
66
|
+
first_measurement_per_hour.water_pot,
|
|
67
|
+
first_measurement_per_hour.soil_temp
|
|
68
|
+
FROM first_measurement_per_hour
|
|
69
|
+
WHERE first_measurement_per_hour.hour = 21::double precision
|
|
70
|
+
), wind AS (
|
|
71
|
+
SELECT DISTINCT ON (m.sensor_id, (timezone('CET'::text, m.measured_at)::date)) m.sensor_id,
|
|
72
|
+
timezone('CET'::text, m.measured_at)::date AS date,
|
|
73
|
+
m.wind_speed AS max_wind_speed,
|
|
74
|
+
CASE
|
|
75
|
+
WHEN m.wind_dir::text = 'N'::text THEN 0
|
|
76
|
+
WHEN m.wind_dir::text = 'S'::text THEN 180
|
|
77
|
+
WHEN m.wind_dir::text = 'E'::text THEN 90
|
|
78
|
+
WHEN m.wind_dir::text = 'W'::text THEN 270
|
|
79
|
+
WHEN m.wind_dir::text = 'SW'::text THEN 200
|
|
80
|
+
WHEN m.wind_dir::text = 'NW'::text THEN 320
|
|
81
|
+
WHEN m.wind_dir::text = 'NE'::text THEN 45
|
|
82
|
+
ELSE NULL::integer
|
|
83
|
+
END AS wind_dir_at_max_speed
|
|
84
|
+
FROM microclimate.measurements m
|
|
85
|
+
ORDER BY m.sensor_id, (timezone('CET'::text, m.measured_at)::date), m.wind_speed DESC
|
|
86
|
+
), min_max_daily_temp AS (
|
|
87
|
+
SELECT m.sensor_id,
|
|
88
|
+
timezone('-04'::text, m.measured_at)::date AS date,
|
|
89
|
+
max(m.air_temp) AS max_temperature,
|
|
90
|
+
min(m.air_temp) AS min_temperature
|
|
91
|
+
FROM microclimate.measurements m
|
|
92
|
+
GROUP BY m.sensor_id, (timezone('-04'::text, m.measured_at)::date)
|
|
93
|
+
ORDER BY m.sensor_id, (timezone('-04'::text, m.measured_at)::date)
|
|
94
|
+
), precip AS (
|
|
95
|
+
SELECT m.sensor_id,
|
|
96
|
+
timezone('-08'::text, m.measured_at)::date AS date,
|
|
97
|
+
sum(m.precip) AS sum_precip
|
|
98
|
+
FROM microclimate.measurements m
|
|
99
|
+
GROUP BY m.sensor_id, (timezone('-08'::text, m.measured_at)::date)
|
|
100
|
+
ORDER BY m.sensor_id, (timezone('-08'::text, m.measured_at)::date)
|
|
101
|
+
), calc AS (
|
|
102
|
+
SELECT sensors.address,
|
|
103
|
+
sensors.sensor_position_detail,
|
|
104
|
+
sensors.point_id,
|
|
105
|
+
sensors.air_temp,
|
|
106
|
+
sensors.air_hum,
|
|
107
|
+
sensors.pressure,
|
|
108
|
+
sensors.precip,
|
|
109
|
+
sensors.wind_dir,
|
|
110
|
+
sensors.wind_impact,
|
|
111
|
+
sensors.wind_speed,
|
|
112
|
+
sensors.sun_irr,
|
|
113
|
+
sensors.soil_temp,
|
|
114
|
+
sensors.water_pot,
|
|
115
|
+
sensors.dendro_circ,
|
|
116
|
+
sensors.dendro_gain,
|
|
117
|
+
calendar.date,
|
|
118
|
+
calendar.sensor_id,
|
|
119
|
+
(seven.air_temp + two.air_temp + 2::double precision * nine.air_temp) / 4::double precision AS avg_temperature,
|
|
120
|
+
(seven.air_hum + two.air_hum + nine.air_hum) / 3::double precision AS avg_air_hum,
|
|
121
|
+
(seven.pressure + two.pressure + nine.pressure) / 3 / 100 AS avg_pressure,
|
|
122
|
+
(seven.wind_speed + two.wind_speed + nine.wind_speed) / 3::double precision AS avg_wind_speed,
|
|
123
|
+
(seven.water_pot + two.water_pot + nine.water_pot) / 3::double precision AS avg_water_pot,
|
|
124
|
+
(seven.soil_temp + two.soil_temp + nine.soil_temp) / 3::double precision AS avg_soil_temp,
|
|
125
|
+
wind.max_wind_speed,
|
|
126
|
+
wind.wind_dir_at_max_speed,
|
|
127
|
+
min_max_daily_temp.max_temperature,
|
|
128
|
+
min_max_daily_temp.min_temperature,
|
|
129
|
+
precip.sum_precip
|
|
130
|
+
FROM calendar
|
|
131
|
+
LEFT JOIN seven ON calendar.sensor_id::text = seven.sensor_id::text AND calendar.date = seven.date
|
|
132
|
+
LEFT JOIN two ON calendar.sensor_id::text = two.sensor_id::text AND calendar.date = two.date
|
|
133
|
+
LEFT JOIN nine ON calendar.sensor_id::text = nine.sensor_id::text AND calendar.date = nine.date
|
|
134
|
+
LEFT JOIN wind ON calendar.sensor_id::text = wind.sensor_id::text AND calendar.date = wind.date
|
|
135
|
+
LEFT JOIN min_max_daily_temp ON calendar.sensor_id::text = min_max_daily_temp.sensor_id::text AND calendar.date = min_max_daily_temp.date
|
|
136
|
+
LEFT JOIN precip ON calendar.sensor_id::text = precip.sensor_id::text AND calendar.date = precip.date
|
|
137
|
+
LEFT JOIN microclimate.sensor_devices_import sensors ON calendar.sensor_id::text = sensors.sensor_id::text
|
|
138
|
+
)
|
|
139
|
+
SELECT calc.address,
|
|
140
|
+
calc.sensor_position_detail,
|
|
141
|
+
calc.date,
|
|
142
|
+
calc.sensor_id,
|
|
143
|
+
calc.point_id,
|
|
144
|
+
unpivot.metrika,
|
|
145
|
+
unpivot.value
|
|
146
|
+
FROM calc, -- funkcí LATERAL převedeme širokou tabulku obsahující metriky v sloupcích po dnech na dlouhou, kde se všechny sloupce s metrikami převedou na dvojici sloupců metrika - hodnota.
|
|
147
|
+
LATERAL ( VALUES ('avg_temperature'::text,calc.avg_temperature), ('avg_air_hum'::text,calc.avg_air_hum), ('avg_pressure'::text,calc.avg_pressure), ('avg_wind_speed'::text,calc.avg_wind_speed), ('avg_water_pot'::text,calc.avg_water_pot), ('avg_soil_temp'::text,calc.avg_soil_temp), ('max_wind_speed'::text,calc.max_wind_speed), ('max_temperature'::text,calc.max_temperature), ('min_temperature'::text,calc.min_temperature), ('sum_precip'::text,calc.sum_precip), ('wind_dir_at_max_speed'::text,calc.wind_dir_at_max_speed)) unpivot(metrika, value)
|
|
148
|
+
WHERE unpivot.value IS NOT NULL;
|
|
149
|
+
|
|
150
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_measurements_daily_w_hights
|
|
151
|
+
AS SELECT m.date,
|
|
152
|
+
m.sensor_id,
|
|
153
|
+
m.address,
|
|
154
|
+
m.sensor_position_detail,
|
|
155
|
+
h.measure,
|
|
156
|
+
m.value,
|
|
157
|
+
h.hight_cm,
|
|
158
|
+
CASE
|
|
159
|
+
WHEN h.measure = 'wind_dir_at_max_speed'::text THEN 'Směr maximální rychlosti větru'::text
|
|
160
|
+
WHEN h.measure = 'sum_precip'::text THEN 'Denní úhrn srážek'::text
|
|
161
|
+
WHEN h.measure = 'avg_temperature'::text THEN 'Průměrná denní teplota vzduchu'::text
|
|
162
|
+
WHEN h.measure = 'max_wind_speed'::text THEN 'Maximální rychlost větru'::text
|
|
163
|
+
WHEN h.measure = 'avg_water_pot'::text THEN 'Průměrná denní vlhkost půdy'::text
|
|
164
|
+
WHEN h.measure = 'avg_wind_speed'::text THEN 'Průměrná denní rychlost větru'::text
|
|
165
|
+
WHEN h.measure = 'avg_air_hum'::text THEN 'Průměrná denní relativní vlhkost vzduchu'::text
|
|
166
|
+
WHEN h.measure = 'avg_pressure'::text THEN 'Průměrný denní tlak vzduchu'::text
|
|
167
|
+
WHEN h.measure = 'max_temperature'::text THEN 'Maximální denní teplota vzduchu'::text
|
|
168
|
+
WHEN h.measure = 'avg_soil_temp'::text THEN 'Průměrná denní teplota půdy'::text
|
|
169
|
+
WHEN h.measure = 'min_temperature'::text THEN 'Minimální denní teplota vzduchu'::text
|
|
170
|
+
ELSE NULL::text
|
|
171
|
+
END AS measure_cz,
|
|
172
|
+
CASE
|
|
173
|
+
WHEN h.measure = 'wind_dir_at_max_speed'::text THEN 'm/s'::text
|
|
174
|
+
WHEN h.measure = 'sum_precip'::text THEN 'mm'::text
|
|
175
|
+
WHEN h.measure = 'avg_temperature'::text THEN '°C'::text
|
|
176
|
+
WHEN h.measure = 'max_wind_speed'::text THEN 'm/s'::text
|
|
177
|
+
WHEN h.measure = 'avg_water_pot'::text THEN 'kPa'::text
|
|
178
|
+
WHEN h.measure = 'avg_wind_speed'::text THEN 'm/s'::text
|
|
179
|
+
WHEN h.measure = 'avg_air_hum'::text THEN '%'::text
|
|
180
|
+
WHEN h.measure = 'avg_pressure'::text THEN 'hPa'::text
|
|
181
|
+
WHEN h.measure = 'max_temperature'::text THEN '°C'::text
|
|
182
|
+
WHEN h.measure = 'avg_soil_temp'::text THEN '°C'::text
|
|
183
|
+
WHEN h.measure = 'min_temperature'::text THEN '°C'::text
|
|
184
|
+
ELSE NULL::text
|
|
185
|
+
END AS unit
|
|
186
|
+
FROM analytic.v_microclimate_measurements_daily m
|
|
187
|
+
LEFT JOIN analytic.v_microclimate_measurement_hights h ON m.sensor_id::text = h.sensor_id::text AND m.metrika = h.measure
|
|
188
|
+
ORDER BY m.sensor_id, m.date;
|
|
189
|
+
|
|
190
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_sensor_devices
|
|
191
|
+
AS SELECT sdi.sensor_id,
|
|
192
|
+
sdi.location_id,
|
|
193
|
+
sdi.point_id,
|
|
194
|
+
sdi.location,
|
|
195
|
+
sdi.loc_description,
|
|
196
|
+
sdi.loc_orientation,
|
|
197
|
+
sdi.loc_surface,
|
|
198
|
+
sdi.point_name,
|
|
199
|
+
sdi.address,
|
|
200
|
+
sdi.sensor_position,
|
|
201
|
+
sdi.sensor_position_detail,
|
|
202
|
+
sdi.lat,
|
|
203
|
+
sdi.lng,
|
|
204
|
+
('https://storage.golemio.cz/oict-mikroklima/'::text || sdi.sensor_id::text) || '.jpg'::text AS url_foto
|
|
205
|
+
FROM microclimate.sensor_devices_import sdi;
|
|
206
|
+
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_measurements_daily
|
|
2
|
+
AS WITH calendar AS (
|
|
3
|
+
SELECT calendar_1.date,
|
|
4
|
+
sensors_1.sensor_id
|
|
5
|
+
FROM ( SELECT generate_series('2022-08-02 00:00:00+02'::timestamp with time zone, CURRENT_DATE::timestamp with time zone, '1 day'::interval)::date AS date) calendar_1
|
|
6
|
+
CROSS JOIN ( SELECT DISTINCT sensor_devices_import.sensor_id
|
|
7
|
+
FROM microclimate.sensor_devices_import) sensors_1
|
|
8
|
+
), first_measurement_per_hour AS (
|
|
9
|
+
SELECT DISTINCT ON (m.sensor_id, (timezone('CET'::text, m.measured_at)::date), (date_part('hour'::text, timezone('CET'::text, m.measured_at)))) m.sensor_id,
|
|
10
|
+
timezone('CET'::text, m.measured_at) AS measured_at,
|
|
11
|
+
timezone('CET'::text, m.measured_at)::date AS date,
|
|
12
|
+
date_part('hour'::text, timezone('CET'::text, m.measured_at)) AS hour,
|
|
13
|
+
m.air_temp,
|
|
14
|
+
m.air_hum,
|
|
15
|
+
m.pressure,
|
|
16
|
+
m.wind_speed,
|
|
17
|
+
m.water_pot,
|
|
18
|
+
m.soil_temp
|
|
19
|
+
FROM microclimate.measurements m
|
|
20
|
+
WHERE date_part('hour'::text, timezone('CET'::text, m.measured_at)) = ANY (ARRAY[7::double precision, 14::double precision, 21::double precision])
|
|
21
|
+
ORDER BY m.sensor_id, (timezone('CET'::text, m.measured_at)::date), (date_part('hour'::text, timezone('CET'::text, m.measured_at))), m.measured_at
|
|
22
|
+
), seven AS (
|
|
23
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
24
|
+
first_measurement_per_hour.measured_at,
|
|
25
|
+
first_measurement_per_hour.date,
|
|
26
|
+
first_measurement_per_hour.hour,
|
|
27
|
+
first_measurement_per_hour.air_temp,
|
|
28
|
+
first_measurement_per_hour.air_hum,
|
|
29
|
+
first_measurement_per_hour.pressure,
|
|
30
|
+
first_measurement_per_hour.wind_speed,
|
|
31
|
+
first_measurement_per_hour.water_pot,
|
|
32
|
+
first_measurement_per_hour.soil_temp
|
|
33
|
+
FROM first_measurement_per_hour
|
|
34
|
+
WHERE first_measurement_per_hour.hour = 7::double precision
|
|
35
|
+
), two AS (
|
|
36
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
37
|
+
first_measurement_per_hour.measured_at,
|
|
38
|
+
first_measurement_per_hour.date,
|
|
39
|
+
first_measurement_per_hour.hour,
|
|
40
|
+
first_measurement_per_hour.air_temp,
|
|
41
|
+
first_measurement_per_hour.air_hum,
|
|
42
|
+
first_measurement_per_hour.pressure,
|
|
43
|
+
first_measurement_per_hour.wind_speed,
|
|
44
|
+
first_measurement_per_hour.water_pot,
|
|
45
|
+
first_measurement_per_hour.soil_temp
|
|
46
|
+
FROM first_measurement_per_hour
|
|
47
|
+
WHERE first_measurement_per_hour.hour = 14::double precision
|
|
48
|
+
), nine AS (
|
|
49
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
50
|
+
first_measurement_per_hour.measured_at,
|
|
51
|
+
first_measurement_per_hour.date,
|
|
52
|
+
first_measurement_per_hour.hour,
|
|
53
|
+
first_measurement_per_hour.air_temp,
|
|
54
|
+
first_measurement_per_hour.air_hum,
|
|
55
|
+
first_measurement_per_hour.pressure,
|
|
56
|
+
first_measurement_per_hour.wind_speed,
|
|
57
|
+
first_measurement_per_hour.water_pot,
|
|
58
|
+
first_measurement_per_hour.soil_temp
|
|
59
|
+
FROM first_measurement_per_hour
|
|
60
|
+
WHERE first_measurement_per_hour.hour = 21::double precision
|
|
61
|
+
), wind AS (
|
|
62
|
+
SELECT DISTINCT ON (m.sensor_id, (timezone('CET'::text, m.measured_at)::date)) m.sensor_id,
|
|
63
|
+
timezone('CET'::text, m.measured_at)::date AS date,
|
|
64
|
+
m.wind_speed AS max_wind_speed,
|
|
65
|
+
CASE
|
|
66
|
+
WHEN m.wind_dir::text = 'N'::text THEN 0
|
|
67
|
+
WHEN m.wind_dir::text = 'S'::text THEN 180
|
|
68
|
+
WHEN m.wind_dir::text = 'E'::text THEN 90
|
|
69
|
+
WHEN m.wind_dir::text = 'W'::text THEN 270
|
|
70
|
+
WHEN m.wind_dir::text = 'SW'::text THEN 200
|
|
71
|
+
WHEN m.wind_dir::text = 'NW'::text THEN 320
|
|
72
|
+
WHEN m.wind_dir::text = 'NE'::text THEN 45
|
|
73
|
+
ELSE NULL::integer
|
|
74
|
+
END AS wind_dir_at_max_speed
|
|
75
|
+
FROM microclimate.measurements m
|
|
76
|
+
ORDER BY m.sensor_id, (timezone('CET'::text, m.measured_at)::date), m.wind_speed DESC
|
|
77
|
+
), min_max_daily_temp AS (
|
|
78
|
+
SELECT m.sensor_id,
|
|
79
|
+
timezone('-04'::text, m.measured_at)::date AS date,
|
|
80
|
+
max(m.air_temp) AS max_temperature,
|
|
81
|
+
min(m.air_temp) AS min_temperature
|
|
82
|
+
FROM microclimate.measurements m
|
|
83
|
+
GROUP BY m.sensor_id, (timezone('-04'::text, m.measured_at)::date)
|
|
84
|
+
ORDER BY m.sensor_id, (timezone('-04'::text, m.measured_at)::date)
|
|
85
|
+
), precip AS (
|
|
86
|
+
SELECT m.sensor_id,
|
|
87
|
+
timezone('-08'::text, m.measured_at)::date AS date,
|
|
88
|
+
sum(m.precip) AS sum_precip
|
|
89
|
+
FROM microclimate.measurements m
|
|
90
|
+
GROUP BY m.sensor_id, (timezone('-08'::text, m.measured_at)::date)
|
|
91
|
+
ORDER BY m.sensor_id, (timezone('-08'::text, m.measured_at)::date)
|
|
92
|
+
), calc AS (
|
|
93
|
+
SELECT sensors.address,
|
|
94
|
+
sensors.sensor_position_detail,
|
|
95
|
+
sensors.point_id,
|
|
96
|
+
sensors.air_temp,
|
|
97
|
+
sensors.air_hum,
|
|
98
|
+
sensors.pressure,
|
|
99
|
+
sensors.precip,
|
|
100
|
+
sensors.wind_dir,
|
|
101
|
+
sensors.wind_impact,
|
|
102
|
+
sensors.wind_speed,
|
|
103
|
+
sensors.sun_irr,
|
|
104
|
+
sensors.soil_temp,
|
|
105
|
+
sensors.water_pot,
|
|
106
|
+
sensors.dendro_circ,
|
|
107
|
+
sensors.dendro_gain,
|
|
108
|
+
calendar.date,
|
|
109
|
+
calendar.sensor_id,
|
|
110
|
+
(seven.air_temp + two.air_temp + 2::double precision * nine.air_temp) / 4::double precision AS avg_temperature,
|
|
111
|
+
(seven.air_hum + two.air_hum + nine.air_hum) / 3::double precision AS avg_air_hum,
|
|
112
|
+
(seven.pressure + two.pressure + nine.pressure) / 3 / 100 AS avg_pressure,
|
|
113
|
+
(seven.wind_speed + two.wind_speed + nine.wind_speed) / 3::double precision AS avg_wind_speed,
|
|
114
|
+
(seven.water_pot + two.water_pot + nine.water_pot) / 3::double precision AS avg_water_pot,
|
|
115
|
+
(seven.soil_temp + two.soil_temp + nine.soil_temp) / 3::double precision AS avg_soil_temp,
|
|
116
|
+
wind.max_wind_speed,
|
|
117
|
+
wind.wind_dir_at_max_speed,
|
|
118
|
+
min_max_daily_temp.max_temperature,
|
|
119
|
+
min_max_daily_temp.min_temperature,
|
|
120
|
+
precip.sum_precip
|
|
121
|
+
FROM calendar
|
|
122
|
+
LEFT JOIN seven ON calendar.sensor_id::text = seven.sensor_id::text AND calendar.date = seven.date
|
|
123
|
+
LEFT JOIN two ON calendar.sensor_id::text = two.sensor_id::text AND calendar.date = two.date
|
|
124
|
+
LEFT JOIN nine ON calendar.sensor_id::text = nine.sensor_id::text AND calendar.date = nine.date
|
|
125
|
+
LEFT JOIN wind ON calendar.sensor_id::text = wind.sensor_id::text AND calendar.date = wind.date
|
|
126
|
+
LEFT JOIN min_max_daily_temp ON calendar.sensor_id::text = min_max_daily_temp.sensor_id::text AND calendar.date = min_max_daily_temp.date
|
|
127
|
+
LEFT JOIN precip ON calendar.sensor_id::text = precip.sensor_id::text AND calendar.date = precip.date
|
|
128
|
+
LEFT JOIN microclimate.sensor_devices_import sensors ON calendar.sensor_id::text = sensors.sensor_id::text
|
|
129
|
+
)
|
|
130
|
+
SELECT calc.address,
|
|
131
|
+
calc.sensor_position_detail,
|
|
132
|
+
calc.date,
|
|
133
|
+
calc.sensor_id,
|
|
134
|
+
calc.point_id,
|
|
135
|
+
unpivot.metrika,
|
|
136
|
+
unpivot.value
|
|
137
|
+
FROM calc,
|
|
138
|
+
LATERAL ( VALUES ('avg_temperature'::text,calc.avg_temperature), ('avg_air_hum'::text,calc.avg_air_hum), ('avg_pressure'::text,calc.avg_pressure), ('avg_wind_speed'::text,calc.avg_wind_speed), ('avg_water_pot'::text,calc.avg_water_pot), ('avg_soil_temp'::text,calc.avg_soil_temp), ('max_wind_speed'::text,calc.max_wind_speed), ('max_temperature'::text,calc.max_temperature), ('min_temperature'::text,calc.min_temperature), ('sum_precip'::text,calc.sum_precip), ('wind_dir_at_max_speed'::text,calc.wind_dir_at_max_speed)) unpivot(metrika, value)
|
|
139
|
+
WHERE unpivot.value IS NOT NULL;
|
|
140
|
+
|
|
141
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_measurements_daily_w_hights
|
|
142
|
+
AS SELECT m.date,
|
|
143
|
+
m.sensor_id,
|
|
144
|
+
m.address,
|
|
145
|
+
m.sensor_position_detail,
|
|
146
|
+
h.measure,
|
|
147
|
+
m.value,
|
|
148
|
+
h.hight_cm,
|
|
149
|
+
CASE
|
|
150
|
+
WHEN h.measure = 'wind_dir_at_max_speed'::text THEN 'Směr maximální rychlosti větru'::text
|
|
151
|
+
WHEN h.measure = 'sum_precip'::text THEN 'Denní úhrn srážek'::text
|
|
152
|
+
WHEN h.measure = 'avg_temperature'::text THEN 'Průměrná denní teplota vzduchu'::text
|
|
153
|
+
WHEN h.measure = 'max_wind_speed'::text THEN 'Maximální rychlost větru'::text
|
|
154
|
+
WHEN h.measure = 'avg_water_pot'::text THEN 'Průměrná denní vlhkost půdy'::text
|
|
155
|
+
WHEN h.measure = 'avg_wind_speed'::text THEN 'Průměrná denní rychlost větru'::text
|
|
156
|
+
WHEN h.measure = 'avg_air_hum'::text THEN 'Průměrná denní relativní vlhkost vzduchu'::text
|
|
157
|
+
WHEN h.measure = 'avg_pressure'::text THEN 'Průměrný denní tlak vzduchu'::text
|
|
158
|
+
WHEN h.measure = 'max_temperature'::text THEN 'Maximální denní teplota vzduchu'::text
|
|
159
|
+
WHEN h.measure = 'avg_soil_temp'::text THEN 'Průměrná denní teplota půdy'::text
|
|
160
|
+
WHEN h.measure = 'min_temperature'::text THEN 'Minimální denní teplota vzduchu'::text
|
|
161
|
+
ELSE NULL::text
|
|
162
|
+
END AS measure_cz,
|
|
163
|
+
CASE
|
|
164
|
+
WHEN h.measure = 'wind_dir_at_max_speed'::text THEN 'm/s'::text
|
|
165
|
+
WHEN h.measure = 'sum_precip'::text THEN 'mm'::text
|
|
166
|
+
WHEN h.measure = 'avg_temperature'::text THEN '°C'::text
|
|
167
|
+
WHEN h.measure = 'max_wind_speed'::text THEN 'm/s'::text
|
|
168
|
+
WHEN h.measure = 'avg_water_pot'::text THEN 'kPa'::text
|
|
169
|
+
WHEN h.measure = 'avg_wind_speed'::text THEN 'm/s'::text
|
|
170
|
+
WHEN h.measure = 'avg_air_hum'::text THEN '%'::text
|
|
171
|
+
WHEN h.measure = 'avg_pressure'::text THEN 'hPa'::text
|
|
172
|
+
WHEN h.measure = 'max_temperature'::text THEN '°C'::text
|
|
173
|
+
WHEN h.measure = 'avg_soil_temp'::text THEN '°C'::text
|
|
174
|
+
WHEN h.measure = 'min_temperature'::text THEN '°C'::text
|
|
175
|
+
ELSE NULL::text
|
|
176
|
+
END AS unit
|
|
177
|
+
FROM analytic.v_microclimate_measurements_daily m
|
|
178
|
+
LEFT JOIN analytic.v_microclimate_measurement_hights h ON m.sensor_id::text = h.sensor_id::text AND m.metrika = h.measure
|
|
179
|
+
ORDER BY m.sensor_id, m.date;
|
|
180
|
+
|
|
181
|
+
DROP VIEW analytic.v_microclimate_wind_dir_at_max_speed;
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
DROP VIEW analytic.v_microclimate_measurements_daily_w_hights;
|
|
2
|
+
|
|
3
|
+
DROP VIEW analytic.v_microclimate_measurements_daily;
|
|
4
|
+
|
|
5
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_measurements_daily
|
|
6
|
+
AS WITH calendar AS (
|
|
7
|
+
SELECT calendar_1.date,
|
|
8
|
+
sensors_1.sensor_id
|
|
9
|
+
FROM ( SELECT generate_series('2022-08-02 00:00:00+02'::timestamp with time zone, CURRENT_DATE::timestamp with time zone, '1 day'::interval)::date AS date) calendar_1
|
|
10
|
+
CROSS JOIN ( SELECT DISTINCT sensor_devices_import.sensor_id
|
|
11
|
+
FROM microclimate.sensor_devices_import) sensors_1
|
|
12
|
+
), first_measurement_per_hour AS (
|
|
13
|
+
SELECT DISTINCT ON (m.sensor_id, (timezone('CET'::text, m.measured_at)::date), (date_part('hour'::text, timezone('CET'::text, m.measured_at)))) m.sensor_id,
|
|
14
|
+
timezone('CET'::text, m.measured_at) AS measured_at,
|
|
15
|
+
timezone('CET'::text, m.measured_at)::date AS date,
|
|
16
|
+
date_part('hour'::text, timezone('CET'::text, m.measured_at)) AS hour,
|
|
17
|
+
m.air_temp,
|
|
18
|
+
m.air_hum,
|
|
19
|
+
m.pressure,
|
|
20
|
+
m.wind_speed,
|
|
21
|
+
m.water_pot,
|
|
22
|
+
m.soil_temp
|
|
23
|
+
FROM microclimate.measurements m
|
|
24
|
+
WHERE date_part('hour'::text, timezone('CET'::text, m.measured_at)) = ANY (ARRAY[7::double precision, 14::double precision, 21::double precision])
|
|
25
|
+
ORDER BY m.sensor_id, (timezone('CET'::text, m.measured_at)::date), (date_part('hour'::text, timezone('CET'::text, m.measured_at))), m.measured_at
|
|
26
|
+
), seven AS (
|
|
27
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
28
|
+
first_measurement_per_hour.measured_at,
|
|
29
|
+
first_measurement_per_hour.date,
|
|
30
|
+
first_measurement_per_hour.hour,
|
|
31
|
+
first_measurement_per_hour.air_temp,
|
|
32
|
+
first_measurement_per_hour.air_hum,
|
|
33
|
+
first_measurement_per_hour.pressure,
|
|
34
|
+
first_measurement_per_hour.wind_speed,
|
|
35
|
+
first_measurement_per_hour.water_pot,
|
|
36
|
+
first_measurement_per_hour.soil_temp
|
|
37
|
+
FROM first_measurement_per_hour
|
|
38
|
+
WHERE first_measurement_per_hour.hour = 7::double precision
|
|
39
|
+
), two AS (
|
|
40
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
41
|
+
first_measurement_per_hour.measured_at,
|
|
42
|
+
first_measurement_per_hour.date,
|
|
43
|
+
first_measurement_per_hour.hour,
|
|
44
|
+
first_measurement_per_hour.air_temp,
|
|
45
|
+
first_measurement_per_hour.air_hum,
|
|
46
|
+
first_measurement_per_hour.pressure,
|
|
47
|
+
first_measurement_per_hour.wind_speed,
|
|
48
|
+
first_measurement_per_hour.water_pot,
|
|
49
|
+
first_measurement_per_hour.soil_temp
|
|
50
|
+
FROM first_measurement_per_hour
|
|
51
|
+
WHERE first_measurement_per_hour.hour = 14::double precision
|
|
52
|
+
), nine AS (
|
|
53
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
54
|
+
first_measurement_per_hour.measured_at,
|
|
55
|
+
first_measurement_per_hour.date,
|
|
56
|
+
first_measurement_per_hour.hour,
|
|
57
|
+
first_measurement_per_hour.air_temp,
|
|
58
|
+
first_measurement_per_hour.air_hum,
|
|
59
|
+
first_measurement_per_hour.pressure,
|
|
60
|
+
first_measurement_per_hour.wind_speed,
|
|
61
|
+
first_measurement_per_hour.water_pot,
|
|
62
|
+
first_measurement_per_hour.soil_temp
|
|
63
|
+
FROM first_measurement_per_hour
|
|
64
|
+
WHERE first_measurement_per_hour.hour = 21::double precision
|
|
65
|
+
), wind AS (
|
|
66
|
+
SELECT DISTINCT ON (m.sensor_id, (timezone('CET'::text, m.measured_at)::date)) m.sensor_id,
|
|
67
|
+
timezone('CET'::text, m.measured_at)::date AS date,
|
|
68
|
+
m.wind_speed AS max_wind_speed,
|
|
69
|
+
CASE
|
|
70
|
+
WHEN m.wind_dir::text = 'N'::text THEN 0
|
|
71
|
+
WHEN m.wind_dir::text = 'S'::text THEN 180
|
|
72
|
+
WHEN m.wind_dir::text = 'E'::text THEN 90
|
|
73
|
+
WHEN m.wind_dir::text = 'W'::text THEN 270
|
|
74
|
+
WHEN m.wind_dir::text = 'SW'::text THEN 200
|
|
75
|
+
WHEN m.wind_dir::text = 'NW'::text THEN 320
|
|
76
|
+
WHEN m.wind_dir::text = 'NE'::text THEN 45
|
|
77
|
+
ELSE NULL::integer
|
|
78
|
+
END AS wind_dir_at_max_speed
|
|
79
|
+
FROM microclimate.measurements m
|
|
80
|
+
ORDER BY m.sensor_id, (timezone('CET'::text, m.measured_at)::date), m.wind_speed DESC
|
|
81
|
+
), min_max_daily_temp AS (
|
|
82
|
+
SELECT m.sensor_id,
|
|
83
|
+
timezone('-04'::text, m.measured_at)::date AS date,
|
|
84
|
+
max(m.air_temp) AS max_temperature,
|
|
85
|
+
min(m.air_temp) AS min_temperature
|
|
86
|
+
FROM microclimate.measurements m
|
|
87
|
+
GROUP BY m.sensor_id, (timezone('-04'::text, m.measured_at)::date)
|
|
88
|
+
ORDER BY m.sensor_id, (timezone('-04'::text, m.measured_at)::date)
|
|
89
|
+
), precip AS (
|
|
90
|
+
SELECT m.sensor_id,
|
|
91
|
+
timezone('+06'::text, m.measured_at)::date AS date,
|
|
92
|
+
sum(m.precip) AS sum_precip
|
|
93
|
+
FROM microclimate.measurements m
|
|
94
|
+
GROUP BY m.sensor_id, (timezone('+06'::text, m.measured_at)::date)
|
|
95
|
+
ORDER BY m.sensor_id, (timezone('+06'::text, m.measured_at)::date)
|
|
96
|
+
), calc AS (
|
|
97
|
+
SELECT sensors.address,
|
|
98
|
+
sensors.sensor_position_detail,
|
|
99
|
+
sensors.point_id,
|
|
100
|
+
sensors.air_temp,
|
|
101
|
+
sensors.air_hum,
|
|
102
|
+
sensors.pressure,
|
|
103
|
+
sensors.precip,
|
|
104
|
+
sensors.wind_dir,
|
|
105
|
+
sensors.wind_impact,
|
|
106
|
+
sensors.wind_speed,
|
|
107
|
+
sensors.sun_irr,
|
|
108
|
+
sensors.soil_temp,
|
|
109
|
+
sensors.water_pot,
|
|
110
|
+
sensors.dendro_circ,
|
|
111
|
+
sensors.dendro_gain,
|
|
112
|
+
calendar.date,
|
|
113
|
+
calendar.sensor_id,
|
|
114
|
+
(seven.air_temp + two.air_temp + 2::double precision * nine.air_temp) / 4::double precision AS avg_temperature,
|
|
115
|
+
(seven.air_hum + two.air_hum + nine.air_hum) / 3::double precision AS avg_air_hum,
|
|
116
|
+
(seven.pressure + two.pressure + nine.pressure) / 3 / 100 AS avg_pressure,
|
|
117
|
+
(seven.wind_speed + two.wind_speed + nine.wind_speed) / 3::double precision AS avg_wind_speed,
|
|
118
|
+
(seven.water_pot + two.water_pot + nine.water_pot) / 3::double precision AS avg_water_pot,
|
|
119
|
+
(seven.soil_temp + two.soil_temp + nine.soil_temp) / 3::double precision AS avg_soil_temp,
|
|
120
|
+
wind.max_wind_speed,
|
|
121
|
+
wind.wind_dir_at_max_speed,
|
|
122
|
+
min_max_daily_temp.max_temperature,
|
|
123
|
+
min_max_daily_temp.min_temperature,
|
|
124
|
+
precip.sum_precip
|
|
125
|
+
FROM calendar
|
|
126
|
+
LEFT JOIN seven ON calendar.sensor_id::text = seven.sensor_id::text AND calendar.date = seven.date
|
|
127
|
+
LEFT JOIN two ON calendar.sensor_id::text = two.sensor_id::text AND calendar.date = two.date
|
|
128
|
+
LEFT JOIN nine ON calendar.sensor_id::text = nine.sensor_id::text AND calendar.date = nine.date
|
|
129
|
+
LEFT JOIN wind ON calendar.sensor_id::text = wind.sensor_id::text AND calendar.date = wind.date
|
|
130
|
+
LEFT JOIN min_max_daily_temp ON calendar.sensor_id::text = min_max_daily_temp.sensor_id::text AND calendar.date = min_max_daily_temp.date
|
|
131
|
+
LEFT JOIN precip ON calendar.sensor_id::text = precip.sensor_id::text AND calendar.date = precip.date
|
|
132
|
+
LEFT JOIN microclimate.sensor_devices_import sensors ON calendar.sensor_id::text = sensors.sensor_id::text
|
|
133
|
+
)
|
|
134
|
+
SELECT calc.address,
|
|
135
|
+
calc.sensor_position_detail,
|
|
136
|
+
calc.date,
|
|
137
|
+
calc.sensor_id,
|
|
138
|
+
calc.point_id,
|
|
139
|
+
unpivot.metrika,
|
|
140
|
+
unpivot.value
|
|
141
|
+
FROM calc,
|
|
142
|
+
LATERAL ( VALUES ('avg_temperature'::text,calc.avg_temperature), ('avg_air_hum'::text,calc.avg_air_hum), ('avg_pressure'::text,calc.avg_pressure), ('avg_wind_speed'::text,calc.avg_wind_speed), ('avg_water_pot'::text,calc.avg_water_pot), ('avg_soil_temp'::text,calc.avg_soil_temp), ('max_wind_speed'::text,calc.max_wind_speed), ('max_temperature'::text,calc.max_temperature), ('min_temperature'::text,calc.min_temperature), ('sum_precip'::text,calc.sum_precip), ('wind_dir_at_max_speed'::text,calc.wind_dir_at_max_speed)) unpivot(metrika, value)
|
|
143
|
+
WHERE unpivot.value IS NOT NULL;
|
|
144
|
+
|
|
145
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_measurements_daily_w_hights
|
|
146
|
+
AS SELECT m.date,
|
|
147
|
+
m.sensor_id,
|
|
148
|
+
m.address,
|
|
149
|
+
m.sensor_position_detail,
|
|
150
|
+
h.measure,
|
|
151
|
+
m.value,
|
|
152
|
+
h.hight_cm,
|
|
153
|
+
CASE
|
|
154
|
+
WHEN h.measure = 'wind_dir_at_max_speed'::text THEN 'Směr maximální rychlosti větru'::text
|
|
155
|
+
WHEN h.measure = 'sum_precip'::text THEN 'Denní úhrn srážek'::text
|
|
156
|
+
WHEN h.measure = 'avg_temperature'::text THEN 'Průměrná denní teplota vzduchu'::text
|
|
157
|
+
WHEN h.measure = 'max_wind_speed'::text THEN 'Maximální rychlost větru'::text
|
|
158
|
+
WHEN h.measure = 'avg_water_pot'::text THEN 'Průměrná denní vlhkost půdy'::text
|
|
159
|
+
WHEN h.measure = 'avg_wind_speed'::text THEN 'Průměrná denní rychlost větru'::text
|
|
160
|
+
WHEN h.measure = 'avg_air_hum'::text THEN 'Průměrná denní relativní vlhkost vzduchu'::text
|
|
161
|
+
WHEN h.measure = 'avg_pressure'::text THEN 'Průměrný denní tlak vzduchu'::text
|
|
162
|
+
WHEN h.measure = 'max_temperature'::text THEN 'Maximální denní teplota vzduchu'::text
|
|
163
|
+
WHEN h.measure = 'avg_soil_temp'::text THEN 'Průměrná denní teplota půdy'::text
|
|
164
|
+
WHEN h.measure = 'min_temperature'::text THEN 'Minimální denní teplota vzduchu'::text
|
|
165
|
+
ELSE NULL::text
|
|
166
|
+
END AS measure_cz,
|
|
167
|
+
CASE
|
|
168
|
+
WHEN h.measure = 'wind_dir_at_max_speed'::text THEN 'm/s'::text
|
|
169
|
+
WHEN h.measure = 'sum_precip'::text THEN 'mm'::text
|
|
170
|
+
WHEN h.measure = 'avg_temperature'::text THEN '°C'::text
|
|
171
|
+
WHEN h.measure = 'max_wind_speed'::text THEN 'm/s'::text
|
|
172
|
+
WHEN h.measure = 'avg_water_pot'::text THEN 'kPa'::text
|
|
173
|
+
WHEN h.measure = 'avg_wind_speed'::text THEN 'm/s'::text
|
|
174
|
+
WHEN h.measure = 'avg_air_hum'::text THEN '%'::text
|
|
175
|
+
WHEN h.measure = 'avg_pressure'::text THEN 'hPa'::text
|
|
176
|
+
WHEN h.measure = 'max_temperature'::text THEN '°C'::text
|
|
177
|
+
WHEN h.measure = 'avg_soil_temp'::text THEN '°C'::text
|
|
178
|
+
WHEN h.measure = 'min_temperature'::text THEN '°C'::text
|
|
179
|
+
ELSE NULL::text
|
|
180
|
+
END AS unit
|
|
181
|
+
FROM analytic.v_microclimate_measurements_daily m
|
|
182
|
+
LEFT JOIN analytic.v_microclimate_measurement_hights h ON m.sensor_id::text = h.sensor_id::text AND m.metrika = h.measure
|
|
183
|
+
ORDER BY m.sensor_id, m.date;
|
|
184
|
+
|
|
185
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_wind_dir_at_max_speed
|
|
186
|
+
AS WITH max_wind_speed AS (
|
|
187
|
+
SELECT DISTINCT ON (v_microclimate_measurements_daily_w_hights.sensor_id, (date_trunc('month'::text, v_microclimate_measurements_daily_w_hights.date::timestamp with time zone))) v_microclimate_measurements_daily_w_hights.date,
|
|
188
|
+
v_microclimate_measurements_daily_w_hights.sensor_id,
|
|
189
|
+
v_microclimate_measurements_daily_w_hights.value AS wind_speed
|
|
190
|
+
FROM analytic.v_microclimate_measurements_daily_w_hights
|
|
191
|
+
WHERE v_microclimate_measurements_daily_w_hights.measure = 'max_wind_speed'::text
|
|
192
|
+
ORDER BY v_microclimate_measurements_daily_w_hights.sensor_id, (date_trunc('month'::text, v_microclimate_measurements_daily_w_hights.date::timestamp with time zone)), v_microclimate_measurements_daily_w_hights.value DESC
|
|
193
|
+
), dir_wind_speed AS (
|
|
194
|
+
SELECT vmma.date,
|
|
195
|
+
vmma.sensor_id,
|
|
196
|
+
vmma.value AS wind_dir
|
|
197
|
+
FROM analytic.v_microclimate_measurements_daily_w_hights vmma
|
|
198
|
+
WHERE vmma.measure = 'wind_dir_at_max_speed'::text AND vmma.value IS NOT NULL
|
|
199
|
+
)
|
|
200
|
+
SELECT max_wind_speed.date,
|
|
201
|
+
max_wind_speed.wind_speed,
|
|
202
|
+
max_wind_speed.sensor_id,
|
|
203
|
+
dir_wind_speed.wind_dir AS dir
|
|
204
|
+
FROM max_wind_speed
|
|
205
|
+
JOIN dir_wind_speed ON max_wind_speed.sensor_id::text = dir_wind_speed.sensor_id::text AND max_wind_speed.date = dir_wind_speed.date
|
|
206
|
+
ORDER BY max_wind_speed.date;
|
|
207
|
+
|
|
208
|
+
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
-- analytic.v_microclimate_measurements_daily source
|
|
2
|
+
|
|
3
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_measurements_daily
|
|
4
|
+
AS WITH calendar AS (
|
|
5
|
+
SELECT calendar_1.date,
|
|
6
|
+
sensors_1.sensor_id
|
|
7
|
+
FROM ( SELECT generate_series('2022-08-02 00:00:00+02'::timestamp with time zone, CURRENT_DATE::timestamp with time zone, '1 day'::interval)::date AS date) calendar_1
|
|
8
|
+
CROSS JOIN ( SELECT DISTINCT sensor_devices_import.sensor_id
|
|
9
|
+
FROM microclimate.sensor_devices_import) sensors_1
|
|
10
|
+
), first_measurement_per_hour AS (
|
|
11
|
+
SELECT DISTINCT ON (m.sensor_id, (timezone('CET'::text, m.measured_at)::date), (date_part('hour'::text, timezone('CET'::text, m.measured_at)))) m.sensor_id,
|
|
12
|
+
timezone('CET'::text, m.measured_at) AS measured_at,
|
|
13
|
+
timezone('CET'::text, m.measured_at)::date AS date,
|
|
14
|
+
date_part('hour'::text, timezone('CET'::text, m.measured_at)) AS hour,
|
|
15
|
+
m.air_temp,
|
|
16
|
+
m.air_hum,
|
|
17
|
+
m.pressure,
|
|
18
|
+
m.wind_speed,
|
|
19
|
+
m.water_pot,
|
|
20
|
+
m.soil_temp
|
|
21
|
+
FROM microclimate.measurements m
|
|
22
|
+
WHERE date_part('hour'::text, timezone('CET'::text, m.measured_at)) = ANY (ARRAY[7::double precision, 14::double precision, 21::double precision])
|
|
23
|
+
ORDER BY m.sensor_id, (timezone('CET'::text, m.measured_at)::date), (date_part('hour'::text, timezone('CET'::text, m.measured_at))), m.measured_at
|
|
24
|
+
), seven AS (
|
|
25
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
26
|
+
first_measurement_per_hour.measured_at,
|
|
27
|
+
first_measurement_per_hour.date,
|
|
28
|
+
first_measurement_per_hour.hour,
|
|
29
|
+
first_measurement_per_hour.air_temp,
|
|
30
|
+
first_measurement_per_hour.air_hum,
|
|
31
|
+
first_measurement_per_hour.pressure,
|
|
32
|
+
first_measurement_per_hour.wind_speed,
|
|
33
|
+
first_measurement_per_hour.water_pot,
|
|
34
|
+
first_measurement_per_hour.soil_temp
|
|
35
|
+
FROM first_measurement_per_hour
|
|
36
|
+
WHERE first_measurement_per_hour.hour = 7::double precision
|
|
37
|
+
), two AS (
|
|
38
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
39
|
+
first_measurement_per_hour.measured_at,
|
|
40
|
+
first_measurement_per_hour.date,
|
|
41
|
+
first_measurement_per_hour.hour,
|
|
42
|
+
first_measurement_per_hour.air_temp,
|
|
43
|
+
first_measurement_per_hour.air_hum,
|
|
44
|
+
first_measurement_per_hour.pressure,
|
|
45
|
+
first_measurement_per_hour.wind_speed,
|
|
46
|
+
first_measurement_per_hour.water_pot,
|
|
47
|
+
first_measurement_per_hour.soil_temp
|
|
48
|
+
FROM first_measurement_per_hour
|
|
49
|
+
WHERE first_measurement_per_hour.hour = 14::double precision
|
|
50
|
+
), nine AS (
|
|
51
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
52
|
+
first_measurement_per_hour.measured_at,
|
|
53
|
+
first_measurement_per_hour.date,
|
|
54
|
+
first_measurement_per_hour.hour,
|
|
55
|
+
first_measurement_per_hour.air_temp,
|
|
56
|
+
first_measurement_per_hour.air_hum,
|
|
57
|
+
first_measurement_per_hour.pressure,
|
|
58
|
+
first_measurement_per_hour.wind_speed,
|
|
59
|
+
first_measurement_per_hour.water_pot,
|
|
60
|
+
first_measurement_per_hour.soil_temp
|
|
61
|
+
FROM first_measurement_per_hour
|
|
62
|
+
WHERE first_measurement_per_hour.hour = 21::double precision
|
|
63
|
+
), wind AS (
|
|
64
|
+
SELECT DISTINCT ON (m.sensor_id, (timezone('CET'::text, m.measured_at)::date)) m.sensor_id,
|
|
65
|
+
timezone('CET'::text, m.measured_at)::date AS date,
|
|
66
|
+
m.wind_speed AS max_wind_speed,
|
|
67
|
+
CASE
|
|
68
|
+
WHEN m.wind_dir::text = 'N'::text THEN 0
|
|
69
|
+
WHEN m.wind_dir::text = 'S'::text THEN 180
|
|
70
|
+
WHEN m.wind_dir::text = 'E'::text THEN 90
|
|
71
|
+
WHEN m.wind_dir::text = 'W'::text THEN 270
|
|
72
|
+
WHEN m.wind_dir::text = 'SW'::text THEN 200
|
|
73
|
+
WHEN m.wind_dir::text = 'NW'::text THEN 320
|
|
74
|
+
WHEN m.wind_dir::text = 'NE'::text THEN 45
|
|
75
|
+
ELSE NULL::integer
|
|
76
|
+
END AS wind_dir_at_max_speed
|
|
77
|
+
FROM microclimate.measurements m
|
|
78
|
+
ORDER BY m.sensor_id, (timezone('CET'::text, m.measured_at)::date), m.wind_speed DESC
|
|
79
|
+
), min_max_daily_temp AS (
|
|
80
|
+
SELECT m.sensor_id,
|
|
81
|
+
timezone('-04'::text, m.measured_at)::date AS date,
|
|
82
|
+
max(m.air_temp) AS max_temperature,
|
|
83
|
+
min(m.air_temp) AS min_temperature
|
|
84
|
+
FROM microclimate.measurements m
|
|
85
|
+
GROUP BY m.sensor_id, (timezone('-04'::text, m.measured_at)::date)
|
|
86
|
+
ORDER BY m.sensor_id, (timezone('-04'::text, m.measured_at)::date)
|
|
87
|
+
), precip AS (
|
|
88
|
+
SELECT m.sensor_id,
|
|
89
|
+
timezone('+06'::text, m.measured_at)::date AS date,
|
|
90
|
+
sum(m.precip) AS sum_precip
|
|
91
|
+
FROM microclimate.measurements m
|
|
92
|
+
GROUP BY m.sensor_id, (timezone('+06'::text, m.measured_at)::date)
|
|
93
|
+
ORDER BY m.sensor_id, (timezone('+06'::text, m.measured_at)::date)
|
|
94
|
+
), calc AS (
|
|
95
|
+
SELECT sensors.address,
|
|
96
|
+
sensors.sensor_position_detail,
|
|
97
|
+
sensors.point_id,
|
|
98
|
+
sensors.air_temp,
|
|
99
|
+
sensors.air_hum,
|
|
100
|
+
sensors.pressure,
|
|
101
|
+
sensors.precip,
|
|
102
|
+
sensors.wind_dir,
|
|
103
|
+
sensors.wind_impact,
|
|
104
|
+
sensors.wind_speed,
|
|
105
|
+
sensors.sun_irr,
|
|
106
|
+
sensors.soil_temp,
|
|
107
|
+
sensors.water_pot,
|
|
108
|
+
sensors.dendro_circ,
|
|
109
|
+
sensors.dendro_gain,
|
|
110
|
+
calendar.date,
|
|
111
|
+
calendar.sensor_id,
|
|
112
|
+
(seven.air_temp + two.air_temp + 2::double precision * nine.air_temp) / 4::double precision AS avg_temperature,
|
|
113
|
+
(seven.air_hum + two.air_hum + nine.air_hum) / 3::double precision AS avg_air_hum,
|
|
114
|
+
(seven.pressure + two.pressure + nine.pressure) / 3 / 100 AS avg_pressure,
|
|
115
|
+
(seven.wind_speed + two.wind_speed + nine.wind_speed) / 3::double precision AS avg_wind_speed,
|
|
116
|
+
(seven.water_pot + two.water_pot + nine.water_pot) / 3::double precision AS avg_water_pot,
|
|
117
|
+
(seven.soil_temp + two.soil_temp + nine.soil_temp) / 3::double precision AS avg_soil_temp,
|
|
118
|
+
wind.max_wind_speed,
|
|
119
|
+
wind.wind_dir_at_max_speed,
|
|
120
|
+
min_max_daily_temp.max_temperature,
|
|
121
|
+
min_max_daily_temp.min_temperature,
|
|
122
|
+
precip.sum_precip
|
|
123
|
+
FROM calendar
|
|
124
|
+
LEFT JOIN seven ON calendar.sensor_id::text = seven.sensor_id::text AND calendar.date = seven.date
|
|
125
|
+
LEFT JOIN two ON calendar.sensor_id::text = two.sensor_id::text AND calendar.date = two.date
|
|
126
|
+
LEFT JOIN nine ON calendar.sensor_id::text = nine.sensor_id::text AND calendar.date = nine.date
|
|
127
|
+
LEFT JOIN wind ON calendar.sensor_id::text = wind.sensor_id::text AND calendar.date = wind.date
|
|
128
|
+
LEFT JOIN min_max_daily_temp ON calendar.sensor_id::text = min_max_daily_temp.sensor_id::text AND calendar.date = min_max_daily_temp.date
|
|
129
|
+
LEFT JOIN precip ON calendar.sensor_id::text = precip.sensor_id::text AND calendar.date = precip.date
|
|
130
|
+
LEFT JOIN microclimate.sensor_devices_import sensors ON calendar.sensor_id::text = sensors.sensor_id::text
|
|
131
|
+
)
|
|
132
|
+
SELECT calc.address,
|
|
133
|
+
calc.sensor_position_detail,
|
|
134
|
+
calc.date,
|
|
135
|
+
calc.sensor_id,
|
|
136
|
+
calc.point_id,
|
|
137
|
+
unpivot.metrika,
|
|
138
|
+
unpivot.value
|
|
139
|
+
FROM calc,
|
|
140
|
+
LATERAL ( VALUES ('avg_temperature'::text,calc.avg_temperature), ('avg_air_hum'::text,calc.avg_air_hum), ('avg_pressure'::text,calc.avg_pressure), ('avg_wind_speed'::text,calc.avg_wind_speed), ('avg_water_pot'::text,calc.avg_water_pot), ('avg_soil_temp'::text,calc.avg_soil_temp), ('max_wind_speed'::text,calc.max_wind_speed), ('max_temperature'::text,calc.max_temperature), ('min_temperature'::text,calc.min_temperature), ('sum_precip'::text,calc.sum_precip), ('wind_dir_at_max_speed'::text,calc.wind_dir_at_max_speed)) unpivot(metrika, value)
|
|
141
|
+
WHERE unpivot.value IS NOT NULL;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
-- analytic.v_microclimate_measurements_daily source
|
|
2
|
+
|
|
3
|
+
CREATE OR REPLACE VIEW analytic.v_microclimate_measurements_daily
|
|
4
|
+
AS WITH calendar AS (
|
|
5
|
+
SELECT calendar_1.date,
|
|
6
|
+
sensors_1.sensor_id
|
|
7
|
+
FROM ( SELECT generate_series('2022-08-02 00:00:00+02'::timestamp with time zone, CURRENT_DATE::timestamp with time zone, '1 day'::interval)::date AS date) calendar_1
|
|
8
|
+
CROSS JOIN ( SELECT DISTINCT sensor_devices_import.sensor_id
|
|
9
|
+
FROM microclimate.sensor_devices_import) sensors_1
|
|
10
|
+
), first_measurement_per_hour AS (
|
|
11
|
+
SELECT DISTINCT ON (m.sensor_id, (timezone('CET'::text, m.measured_at)::date), (date_part('hour'::text, timezone('CET'::text, m.measured_at)))) m.sensor_id,
|
|
12
|
+
timezone('CET'::text, m.measured_at) AS measured_at,
|
|
13
|
+
timezone('CET'::text, m.measured_at)::date AS date,
|
|
14
|
+
date_part('hour'::text, timezone('CET'::text, m.measured_at)) AS hour,
|
|
15
|
+
m.air_temp,
|
|
16
|
+
m.air_hum,
|
|
17
|
+
m.pressure,
|
|
18
|
+
m.wind_speed,
|
|
19
|
+
m.water_pot,
|
|
20
|
+
m.soil_temp
|
|
21
|
+
FROM microclimate.measurements m
|
|
22
|
+
WHERE date_part('hour'::text, timezone('CET'::text, m.measured_at)) = ANY (ARRAY[7::double precision, 14::double precision, 21::double precision])
|
|
23
|
+
ORDER BY m.sensor_id, (timezone('CET'::text, m.measured_at)::date), (date_part('hour'::text, timezone('CET'::text, m.measured_at))), m.measured_at
|
|
24
|
+
), seven AS (
|
|
25
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
26
|
+
first_measurement_per_hour.measured_at,
|
|
27
|
+
first_measurement_per_hour.date,
|
|
28
|
+
first_measurement_per_hour.hour,
|
|
29
|
+
first_measurement_per_hour.air_temp,
|
|
30
|
+
first_measurement_per_hour.air_hum,
|
|
31
|
+
first_measurement_per_hour.pressure,
|
|
32
|
+
first_measurement_per_hour.wind_speed,
|
|
33
|
+
first_measurement_per_hour.water_pot,
|
|
34
|
+
first_measurement_per_hour.soil_temp
|
|
35
|
+
FROM first_measurement_per_hour
|
|
36
|
+
WHERE first_measurement_per_hour.hour = 7::double precision
|
|
37
|
+
), two AS (
|
|
38
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
39
|
+
first_measurement_per_hour.measured_at,
|
|
40
|
+
first_measurement_per_hour.date,
|
|
41
|
+
first_measurement_per_hour.hour,
|
|
42
|
+
first_measurement_per_hour.air_temp,
|
|
43
|
+
first_measurement_per_hour.air_hum,
|
|
44
|
+
first_measurement_per_hour.pressure,
|
|
45
|
+
first_measurement_per_hour.wind_speed,
|
|
46
|
+
first_measurement_per_hour.water_pot,
|
|
47
|
+
first_measurement_per_hour.soil_temp
|
|
48
|
+
FROM first_measurement_per_hour
|
|
49
|
+
WHERE first_measurement_per_hour.hour = 14::double precision
|
|
50
|
+
), nine AS (
|
|
51
|
+
SELECT first_measurement_per_hour.sensor_id,
|
|
52
|
+
first_measurement_per_hour.measured_at,
|
|
53
|
+
first_measurement_per_hour.date,
|
|
54
|
+
first_measurement_per_hour.hour,
|
|
55
|
+
first_measurement_per_hour.air_temp,
|
|
56
|
+
first_measurement_per_hour.air_hum,
|
|
57
|
+
first_measurement_per_hour.pressure,
|
|
58
|
+
first_measurement_per_hour.wind_speed,
|
|
59
|
+
first_measurement_per_hour.water_pot,
|
|
60
|
+
first_measurement_per_hour.soil_temp
|
|
61
|
+
FROM first_measurement_per_hour
|
|
62
|
+
WHERE first_measurement_per_hour.hour = 21::double precision
|
|
63
|
+
), wind AS (
|
|
64
|
+
SELECT DISTINCT ON (m.sensor_id, (timezone('CET'::text, m.measured_at)::date)) m.sensor_id,
|
|
65
|
+
timezone('CET'::text, m.measured_at)::date AS date,
|
|
66
|
+
m.wind_speed AS max_wind_speed,
|
|
67
|
+
CASE
|
|
68
|
+
WHEN m.wind_dir = 'N' THEN 0
|
|
69
|
+
WHEN m.wind_dir = 'NE' THEN 45
|
|
70
|
+
WHEN m.wind_dir = 'E' THEN 90
|
|
71
|
+
WHEN m.wind_dir = 'SE' THEN 135
|
|
72
|
+
WHEN m.wind_dir = 'S' THEN 180
|
|
73
|
+
WHEN m.wind_dir = 'SW' THEN 225
|
|
74
|
+
WHEN m.wind_dir = 'W' THEN 270
|
|
75
|
+
WHEN m.wind_dir = 'NW' THEN 315
|
|
76
|
+
ELSE NULL END AS wind_dir_at_max_speed
|
|
77
|
+
FROM microclimate.measurements m
|
|
78
|
+
ORDER BY m.sensor_id, (timezone('CET'::text, m.measured_at)::date), m.wind_speed DESC
|
|
79
|
+
), min_max_daily_temp AS (
|
|
80
|
+
SELECT m.sensor_id,
|
|
81
|
+
timezone('-04'::text, m.measured_at)::date AS date,
|
|
82
|
+
max(m.air_temp) AS max_temperature,
|
|
83
|
+
min(m.air_temp) AS min_temperature
|
|
84
|
+
FROM microclimate.measurements m
|
|
85
|
+
GROUP BY m.sensor_id, (timezone('-04'::text, m.measured_at)::date)
|
|
86
|
+
ORDER BY m.sensor_id, (timezone('-04'::text, m.measured_at)::date)
|
|
87
|
+
), precip AS (
|
|
88
|
+
SELECT m.sensor_id,
|
|
89
|
+
timezone('+06'::text, m.measured_at)::date AS date,
|
|
90
|
+
sum(m.precip) AS sum_precip
|
|
91
|
+
FROM microclimate.measurements m
|
|
92
|
+
GROUP BY m.sensor_id, (timezone('+06'::text, m.measured_at)::date)
|
|
93
|
+
ORDER BY m.sensor_id, (timezone('+06'::text, m.measured_at)::date)
|
|
94
|
+
), calc AS (
|
|
95
|
+
SELECT sensors.address,
|
|
96
|
+
sensors.sensor_position_detail,
|
|
97
|
+
sensors.point_id,
|
|
98
|
+
sensors.air_temp,
|
|
99
|
+
sensors.air_hum,
|
|
100
|
+
sensors.pressure,
|
|
101
|
+
sensors.precip,
|
|
102
|
+
sensors.wind_dir,
|
|
103
|
+
sensors.wind_impact,
|
|
104
|
+
sensors.wind_speed,
|
|
105
|
+
sensors.sun_irr,
|
|
106
|
+
sensors.soil_temp,
|
|
107
|
+
sensors.water_pot,
|
|
108
|
+
sensors.dendro_circ,
|
|
109
|
+
sensors.dendro_gain,
|
|
110
|
+
calendar.date,
|
|
111
|
+
calendar.sensor_id,
|
|
112
|
+
(seven.air_temp + two.air_temp + 2::double precision * nine.air_temp) / 4::double precision AS avg_temperature,
|
|
113
|
+
(seven.air_hum + two.air_hum + nine.air_hum) / 3::double precision AS avg_air_hum,
|
|
114
|
+
(seven.pressure + two.pressure + nine.pressure) / 3 / 100 AS avg_pressure,
|
|
115
|
+
(seven.wind_speed + two.wind_speed + nine.wind_speed) / 3::double precision AS avg_wind_speed,
|
|
116
|
+
(seven.water_pot + two.water_pot + nine.water_pot) / 3::double precision AS avg_water_pot,
|
|
117
|
+
(seven.soil_temp + two.soil_temp + nine.soil_temp) / 3::double precision AS avg_soil_temp,
|
|
118
|
+
wind.max_wind_speed,
|
|
119
|
+
wind.wind_dir_at_max_speed,
|
|
120
|
+
min_max_daily_temp.max_temperature,
|
|
121
|
+
min_max_daily_temp.min_temperature,
|
|
122
|
+
precip.sum_precip
|
|
123
|
+
FROM calendar
|
|
124
|
+
LEFT JOIN seven ON calendar.sensor_id::text = seven.sensor_id::text AND calendar.date = seven.date
|
|
125
|
+
LEFT JOIN two ON calendar.sensor_id::text = two.sensor_id::text AND calendar.date = two.date
|
|
126
|
+
LEFT JOIN nine ON calendar.sensor_id::text = nine.sensor_id::text AND calendar.date = nine.date
|
|
127
|
+
LEFT JOIN wind ON calendar.sensor_id::text = wind.sensor_id::text AND calendar.date = wind.date
|
|
128
|
+
LEFT JOIN min_max_daily_temp ON calendar.sensor_id::text = min_max_daily_temp.sensor_id::text AND calendar.date = min_max_daily_temp.date
|
|
129
|
+
LEFT JOIN precip ON calendar.sensor_id::text = precip.sensor_id::text AND calendar.date = precip.date
|
|
130
|
+
LEFT JOIN microclimate.sensor_devices_import sensors ON calendar.sensor_id::text = sensors.sensor_id::text
|
|
131
|
+
)
|
|
132
|
+
SELECT calc.address,
|
|
133
|
+
calc.sensor_position_detail,
|
|
134
|
+
calc.date,
|
|
135
|
+
calc.sensor_id,
|
|
136
|
+
calc.point_id,
|
|
137
|
+
unpivot.metrika,
|
|
138
|
+
unpivot.value
|
|
139
|
+
FROM calc,
|
|
140
|
+
LATERAL ( VALUES ('avg_temperature'::text,calc.avg_temperature), ('avg_air_hum'::text,calc.avg_air_hum), ('avg_pressure'::text,calc.avg_pressure), ('avg_wind_speed'::text,calc.avg_wind_speed), ('avg_water_pot'::text,calc.avg_water_pot), ('avg_soil_temp'::text,calc.avg_soil_temp), ('max_wind_speed'::text,calc.max_wind_speed), ('max_temperature'::text,calc.max_temperature), ('min_temperature'::text,calc.min_temperature), ('sum_precip'::text,calc.sum_precip), ('wind_dir_at_max_speed'::text,calc.wind_dir_at_max_speed)) unpivot(metrika, value)
|
|
141
|
+
WHERE unpivot.value IS NOT NULL;
|