From c3d00fd83d995b2d96540c4541990e8e75c1808a Mon Sep 17 00:00:00 2001 From: Christopher Fenner <9592452+CFenner@users.noreply.github.com> Date: Mon, 24 Jun 2024 13:33:26 +0200 Subject: [PATCH] feat: respect user prefs on UoMs (#387) --- helper.js | 2 +- netatmo.js | 77 ++++++++++- sample/sample.json | 314 +++++++++++++++++++++++---------------------- 3 files changed, 236 insertions(+), 157 deletions(-) diff --git a/helper.js b/helper.js index b5dd4722..b30a2cee 100644 --- a/helper.js +++ b/helper.js @@ -110,7 +110,7 @@ module.exports = { }; this.sendSocketNotification(this.notifications.DATA_RESPONSE, { - payloadReturn: result.body.devices, + payloadReturn: result.body, status: 'OK', }) } catch (error) { diff --git a/netatmo.js b/netatmo.js index 4e942af5..fda41818 100755 --- a/netatmo.js +++ b/netatmo.js @@ -32,6 +32,7 @@ Module.register('netatmo', { fontClassMeasurement: 'xsmall', thresholdCO2Average: 800, thresholdCO2Bad: 1800, + unitOfMeasurementWind: '', mockData: false, }, notifications: { @@ -80,6 +81,12 @@ Module.register('netatmo', { this.sendSocketNotification(this.notifications.DATA) }, this.config.updateInterval * 60 * 1000 + this.config.initialDelay * 1000) }, + updateUnitOfMeasurements (userPreferences) { + if (this.config.unitOfMeasurementWind === '') { + this.config.unitOfMeasurementWind = this.convertNetatmoWindUnit(userPreferences.windunit) + console.log('Using user preferred unit of measurement for wind values %o', this.config.unitOfMeasurementWind) + } + }, updateModuleList (stationList) { let moduleList = [] @@ -285,7 +292,7 @@ Module.register('netatmo', { return value.toFixed(1)// + ' mm/h' case this.measurement.WIND_STRENGTH: case this.measurement.GUST_STRENGTH: - return value.toFixed(0)// + ' km/h' + return this.convertWindUnit(value, this.config.unitOfMeasurementWind) case this.measurement.WIND_ANGLE: case this.measurement.GUST_ANGLE: return `${this.getDirection(value)} | ${value}`// + '°' @@ -296,6 +303,51 @@ Module.register('netatmo', { return value } }, + convertNetatmoWindUnit (unit) { + switch (unit) { + case 4: + return 'KT' + case 3: + return 'BFT' + case 2: + return 'MS' + case 1: + return 'MPH' + case 0: + default: + return 'KPH' + } + }, + convertWindUnit (value, unit) { + switch (unit) { + case 'MPH': + return (value / 1.609).toFixed(1) + case 'MS': + return (value / 3.6).toFixed(1) + case 'BFT': + return this.convertToBeaufort(value) + case 'KT': + return (value / 1.852).toFixed(1) + case 'KPH': + default: + return value.toFixed(1) + } + }, + convertToBeaufort (value) { + if (value < 1) return 0 + if (value <= 5) return 1 + if (value <= 11) return 2 + if (value <= 19) return 3 + if (value <= 28) return 4 + if (value <= 38) return 5 + if (value <= 49) return 6 + if (value <= 61) return 7 + if (value <= 74) return 8 + if (value <= 88) return 9 + if (value <= 102) return 10 + if (value <= 117) return 11 + return 12 + }, getUnit (measurement) { switch (measurement) { case this.measurement.CO2: @@ -317,7 +369,7 @@ Module.register('netatmo', { return 'mm/h' case this.measurement.WIND_STRENGTH: case this.measurement.GUST_STRENGTH: - return 'km/h' + return this.getWindUnitLabel(this.config.unitOfMeasurementWind) case this.measurement.WIND_ANGLE: case this.measurement.GUST_ANGLE: return '°' @@ -325,6 +377,21 @@ Module.register('netatmo', { return '' } }, + getWindUnitLabel (unit) { + switch (unit) { + case 'MPH': + return 'mph' + case 'MS': + return 'm/s' + case 'BFT': + return 'Bft' + case 'KT': + return 'kt' + case 'KPH': + default: + return 'km/h' + } + }, getDirection (value) { if (value < 11.25) return 'N' if (value < 33.75) return 'NNE' @@ -443,8 +510,10 @@ Module.register('netatmo', { break case this.notifications.DATA_RESPONSE: if (payload.status === 'OK') { - console.log('Devices %o', payload.payloadReturn) - const stationList = payload.payloadReturn + console.log('Devices %o', payload.payloadReturn.devices) + const stationList = payload.payloadReturn.devices + const userPreferences = payload.payloadReturn.user.administrative + this.updateUnitOfMeasurements(userPreferences) this.updateModuleList(stationList) this.updateDom(this.config.animationSpeed) } else if (payload.status === 'INVALID_TOKEN') { diff --git a/sample/sample.json b/sample/sample.json index 4fbec021..8ea1155b 100644 --- a/sample/sample.json +++ b/sample/sample.json @@ -1,158 +1,168 @@ -[ - { - "station_name": "Hamburg (Wohnzimmer)", - "type": "NAMain", - "module_name": "Main", - "wifi_status": 50, - "reachable": true, - "co2_calibrating": false, - "data_type": [ - "Temperature", - "CO2", - "Humidity", - "Noise", - "Pressure" - ], - "place": { - "altitude": 0, - "city": "Hamburg", - "country": "DE", - "timezone": "Europe/Berlin", - "location": [ - 10, - 10 - ] - }, - "home_name": "Hamburg", - "dashboard_data": { - "Temperature": 12.2, - "CO2": 1114, - "Humidity": 84, - "Noise": 39, - "Pressure": 1014.2, - "AbsolutePressure": 1011.2, - "min_temp": 9.3, - "max_temp": 13.3, - "pressure_trend": "stable" - }, - "modules": [ - { - "type": "NAModule4", - "module_name": "Indoor", - "data_type": [ - "Temperature", - "CO2", - "Humidity" - ], - "battery_percent": 50, - "reachable": true, - "rf_status": 50, - "battery_vp": 5040, - "dashboard_data": { - "Temperature": 12.7, - "CO2": 995, - "Humidity": 72, - "min_temp": 12.2, - "max_temp": 12.8 - } +{ + "user": { + "administrative": { + "feel_like_algo": 0, + "pressureunit": 0, + "unit": 0, + "windunit": 4 + } + }, + "devices": [ + { + "station_name": "Hamburg (Wohnzimmer)", + "type": "NAMain", + "module_name": "Main", + "wifi_status": 50, + "reachable": true, + "co2_calibrating": false, + "data_type": [ + "Temperature", + "CO2", + "Humidity", + "Noise", + "Pressure" + ], + "place": { + "altitude": 0, + "city": "Hamburg", + "country": "DE", + "timezone": "Europe/Berlin", + "location": [ + 10, + 10 + ] }, - { - "type": "NAModule1", - "module_name": "Outdoor", - "data_type": [ - "Temperature", - "Humidity" - ], - "battery_percent": 90, - "reachable": true, - "rf_status": 50, - "battery_vp": 5040, - "dashboard_data": { - "Temperature": 15.4, - "temp_trend": "down", - "Humidity": 36, - "min_temp": 2.2, - "max_temp": 19.7 - } + "home_name": "Hamburg", + "dashboard_data": { + "Temperature": 12.2, + "CO2": 1114, + "Humidity": 84, + "Noise": 39, + "Pressure": 1014.2, + "AbsolutePressure": 1011.2, + "min_temp": 9.3, + "max_temp": 13.3, + "pressure_trend": "stable" }, - { - "type": "NAModule2", - "module_name": "Wind", - "data_type": [ - "Wind" - ], - "battery_percent": 10, - "reachable": true, - "rf_status": 50, - "battery_vp": 5040, - "dashboard_data": { - "WindAngle": 221, - "WindStrength": 2, - "GustAngle": 208, - "GustStrength": 4, - "WindHistoric": [], - "min_temp": 0, - "max_temp": 0, - "max_wind_angle": 44, - "max_wind_str": 20 + "modules": [ + { + "type": "NAModule4", + "module_name": "Indoor", + "data_type": [ + "Temperature", + "CO2", + "Humidity" + ], + "battery_percent": 50, + "reachable": true, + "rf_status": 50, + "battery_vp": 5040, + "dashboard_data": { + "Temperature": 12.7, + "CO2": 995, + "Humidity": 72, + "min_temp": 12.2, + "max_temp": 12.8 + } + }, + { + "type": "NAModule1", + "module_name": "Outdoor", + "data_type": [ + "Temperature", + "Humidity" + ], + "battery_percent": 90, + "reachable": true, + "rf_status": 50, + "battery_vp": 5040, + "dashboard_data": { + "Temperature": 15.4, + "temp_trend": "down", + "Humidity": 36, + "min_temp": 2.2, + "max_temp": 19.7 + } + }, + { + "type": "NAModule2", + "module_name": "Wind", + "data_type": [ + "Wind" + ], + "battery_percent": 10, + "reachable": true, + "rf_status": 50, + "battery_vp": 5040, + "dashboard_data": { + "WindAngle": 221, + "WindStrength": 2, + "GustAngle": 208, + "GustStrength": 4, + "WindHistoric": [], + "min_temp": 0, + "max_temp": 0, + "max_wind_angle": 44, + "max_wind_str": 20 + } + }, + { + "type": "NAModule3", + "module_name": "Rain", + "data_type": [ + "Rain" + ], + "battery_percent": 30, + "reachable": true, + "rf_status": 50, + "battery_vp": 5040, + "dashboard_data": { + "Rain": 0, + "sum_rain_24": 0, + "sum_rain_1": 0 + } } + ] + }, + { + "station_name": "Altona (Wohnzimmer)", + "type": "NAMain", + "module_name": "Main", + "wifi_status": 50, + "reachable": false, + "co2_calibrating": false, + "data_type": [ + "Temperature", + "CO2", + "Humidity", + "Noise", + "Pressure" + ], + "place": { + "altitude": 0, + "city": "Altona", + "country": "DE", + "timezone": "Europe/Berlin", + "location": [ + 10, + 10 + ] }, - { - "type": "NAModule3", - "module_name": "Rain", - "data_type": [ - "Rain" - ], - "battery_percent": 30, - "reachable": true, - "rf_status": 50, - "battery_vp": 5040, - "dashboard_data": { - "Rain": 0, - "sum_rain_24": 0, - "sum_rain_1": 0 + "home_name": "Altona", + "modules": [ + { + "type": "NAModule1", + "module_name": "Outdoor", + "data_type": [ + "Temperature", + "Humidity" + ], + "battery_percent": 50, + "reachable": false, + "rf_status": 50, + "battery_vp": 5040 } - } - ] - }, - { - "station_name": "Altona (Wohnzimmer)", - "type": "NAMain", - "module_name": "Main", - "wifi_status": 50, - "reachable": false, - "co2_calibrating": false, - "data_type": [ - "Temperature", - "CO2", - "Humidity", - "Noise", - "Pressure" - ], - "place": { - "altitude": 0, - "city": "Altona", - "country": "DE", - "timezone": "Europe/Berlin", - "location": [ - 10, - 10 ] - }, - "home_name": "Altona", - "modules": [ - { - "type": "NAModule1", - "module_name": "Outdoor", - "data_type": [ - "Temperature", - "Humidity" - ], - "battery_percent": 50, - "reachable": false, - "rf_status": 50, - "battery_vp": 5040 - } - ] - } -] + } + ] +}