@golemio/microclimate 1.0.4 → 1.0.5-dev.740164088

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,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
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@golemio/microclimate",
3
- "version": "1.0.4",
3
+ "version": "1.0.5-dev.740164088",
4
4
  "description": "Golemio Microclimate Module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -66,4 +66,4 @@
66
66
  "dependencies": {
67
67
  "geojson": "^0.5.0"
68
68
  }
69
- }
69
+ }