@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.
@@ -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,5 @@
1
+ drop view analytic.v_microclimate_sensor_devices;
2
+ drop view analytic.v_microclimate_measurements_daily_w_hights;
3
+ drop view analytic.v_microclimate_measurements_daily;
4
+ drop view analytic.v_microclimate_measurement_hights;
5
+
@@ -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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@golemio/microclimate",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Golemio Microclimate Module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",