Carpincho/src/core/redes_meteorologicas.js
2024-12-10 10:03:23 -03:00

440 lines
21 KiB
JavaScript

/**
* Este archivo es parte del proyecto EMA Libre
*
* Contiene el codigo fuente, que brinda la funcionalidad de envio
* de datos metorologicos a una RED ABIERTA (ej:Ema Libre Center, wunderground, pws, etc),
* siendo la principal la red EMA Libre.
*
* El codigo, contiene un metodo el cual recibe como parametro una red, y los datos
* que se desean enviar a la misma, cada red tiene su configuracion particular la cual es incluida
* ej:(require('./redes/wunderground-pws')).
*
* LICENSE: This file is part of EMA Libre.
* EMA Libre is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EMA Libre is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with EMA Libre. If not, see <http://www.gnu.org/licenses/>.
*
* @copyright Copyright (c) 2019 GUGLER (http://www.gugler.com.ar)
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL License
* @version 3.0
* @link http://www.gugler.com.ar
* @since File available since Release 3.0
*/
module.exports = {
// --- Informacion recibida -------
// PARAMETROS[0][X]: 0-TipoRed, 1-Usuario, 2-Password, 3-Server, 4-Puerto, 5-Ruta, 6 - Llave de Escritura, 7-Nombre de Red
// PARAMETROS[1] : Datos meteorologicos registro para enviar
// PARAMETROS[2] : Id red
// --- Informacion devuelta -------
// cbFunc(nombre_red, estado, error, idRed, ParametrosEnviadosAlaRed)
EviarRedesMeteorologicas: function (versionEMA,Parametros, cbFunc) {
// Se define las variables.
var temperaturaExternaF = Parametros[1].temperatura_externa * (9 / 5) + 32; // En farenheit
var temperaturaInternaF = Parametros[1].temperatura_interna * (9 / 5) + 32; // En farenheit
var temperaturaExternaC = Parametros[1].temperatura_externa; // En celsius
var temperaturaInternaC = Parametros[1].temperatura_interna; // En celsius
var puntoDeRocioF = Parametros[1].punto_de_rocio * (9 / 5) + 32; // En farenheit
var puntoDeRocioC = Parametros[1].punto_de_rocio; // En celsius
var presionRelIn = Parametros[1].presion_relativa * 0.0295299830714; // En inches
var presionRelhpa = Parametros[1].presion_relativa; // hpa
var vientoEnMh = (Parametros[1].viento_velocidad / 3.6) * 2.2369; // En millas
var rafagaEnMh = (Parametros[1].viento_rafagas / 3.6) * 2.2369; // En millas
var rafagaEnMs = Parametros[1].viento_rafagas / 3.6; // En m/S
var rafagaEnKh = Parametros[1].viento_rafagas; // En Km/h
var vientoEnMs = Parametros[1].viento_velocidad / 3.6; // En m/S
var vientoEnKh = Parametros[1].viento_velocidad; // En Km/h
var vientoEnNudos = (Parametros[1].viento_velocidad) * 0.539957; // En nudos
var vientoNombre = Parametros[1].viento_direccion_nombre; // Texto
var rafagaEnNudos = (Parametros[1].viento_rafagas) * 0.539957; // En nudos
var lluviaHoraMm = Parametros[1].lluvia_acu_hora; // En mm
var lluviaHorain = Parametros[1].lluvia_acu_hora * 0.03937008; // En pulgadas/inches
var lluviaDiaMm = Parametros[1].lluvia_acu_diaria; // En mm
var lluviaDiain = Parametros[1].lluvia_acu_diaria * 0.03937008; // En pulgadas/inches
var luxerIntencidad = Parametros[1].luxer_intencidad / 683; // luxerIntencidad en w/m²
var luxerIntencidadLux = Parametros[1].luxer_intencidad; // luxerIntencidad en Klux
// Fecha Formatos
var fechaformato = Parametros[1].fecha.substring(6, 10) + '-' + Parametros[1].fecha.substring(3, 5) + '-' + Parametros[1].fecha.substring(0, 2) + '+' + Parametros[1].fecha.substring(11, 19);
// Se pregunta por el tipo de red
switch (Parametros[0][0]) {
case 'wow':
var WOW = require('./redes/wow');
var wow = new WOW(Parametros[0][1], Parametros[0][2]);
var idRed = Parametros[2];
wow.resetObservations();
wow.setObservations({
dateutc: Parametros[1].fechaUTC, // fecha actual
tempf: temperaturaExternaF, // Temp. Externa
humidity: Parametros[1].humedad_externa, // Humedad Externa
dewptf: puntoDeRocioF.toFixed(2), // Punto de Rocio
winddir: Parametros[1].viento_direccion, // Direccion del Viento
windgustmph: rafagaEnMh, // Rafagas
windspeedmph: vientoEnMh, // Viento
raininm: lluviaHoraMm, // Lluvia Acumulado Hora
dailyraininm: lluviaDiaMm, // Lluvia Acumulado Dia
baromin: presionRelIn.toFixed(2), // Presion Relativa
softwaretype: versionEMA // Software
});
var ParametrosTemp1 = JSON.stringify(Parametros, null, 4);
wow.sendObservations(function (err, success) {
if (err !== null) {
cbFunc('wow', 'ERROR', err, idRed, ParametrosTemp1);
} else {
// codigo de respuesta 430 No enviado - por tiempo limite no superado
if (success[0] === 430) { cbFunc('wow', 430, success[1], idRed, ParametrosTemp1);}
else{
// codigo de respuesta 429 red congestionada
if (success[0] === 429) {
cbFunc('wow', 429, success[1], idRed, ParametrosTemp1);
} else {
cbFunc('wow', 'OK', 'ok', idRed, ParametrosTemp1);
}
}
}
});
wow = null;
WOW = null;
break;
case 'wunderground':
var WUNDER = require('./redes/wunderground');
var wunder = new WUNDER(Parametros[0][1], Parametros[0][2]);
var idRed2 = Parametros[2];
wunder.resetObservations();
wunder.setObservations({
dateutc: 'now', // fecha actual
tempf: temperaturaExternaF, // Temp. Externa
indoortempf: temperaturaInternaF, // Temp. Interna
indoorhumidity: Parametros[1].humedad_interna, // Humedad Interna
humidity: Parametros[1].humedad_externa, // Humedad Externa
dewptf: puntoDeRocioF.toFixed(2), // Punto de Rocio
UV: Parametros[1].luxer_uv, // UV
solarradiation: luxerIntencidad.toFixed(2), // Solar radiacion
winddir: Parametros[1].viento_direccion, // Direccion del Viento
windgustmph: rafagaEnMh.toFixed(2), // Rafagas
windspeedmph: vientoEnMh.toFixed(2), // Viento
rainin: lluviaHorain.toFixed(2), // Lluvia Acumulado Hora
dailyrainin: lluviaDiain.toFixed(2), // Lluvia Acumulado Dia
baromin: presionRelIn.toFixed(2), // Presion Relativa
softwaretype: versionEMA // Software
});
var ParametrosTemp2 = JSON.stringify(Parametros, null, 4);
wunder.sendObservations(function (err, success) {
if (err != null) {
cbFunc('wunderground', 'ERROR', err, idRed2, ParametrosTemp2);
} else {
cbFunc('wunderground', 'OK', 'ok', idRed2, ParametrosTemp2);
}
});
wunder = null;
WUNDER = null;
break;
case 'pws':
var PW = require('./redes/pws');
var idRed3 = Parametros[2];
var pw = new PW(Parametros[0][1], Parametros[0][2]);
pw.resetObservations();
pw.setObservations({
dateutc: fechaformato, // Fecha actual
tempf: temperaturaExternaF.toFixed(2), // Temp. Externa
humidity: Parametros[1].humedad_externa, // Humedad Externa
dewptf: puntoDeRocioF.toFixed(2), // Punto de Rocio
UV: Parametros[1].luxer_uv, // UV
solarradiation: luxerIntencidad.toFixed(2), // Solar radiacion
windspeedmph: vientoEnMh.toFixed(2), // Viento
winddir: Parametros[1].viento_direccion, // Direccion del Viento
windgustmph: rafagaEnMh.toFixed(2), // Rafagas
rainin: lluviaHorain.toFixed(2), // Lluvia Acumulado Hora
dailyrainin: lluviaDiain.toFixed(2), // Lluvia Acumulado Dia
baromin: presionRelIn.toFixed(2), // Presion Relativa
softwaretype: versionEMA, // Software
action: 'updateraw' // Tipo de actualizacion
});
var ParametrosTemp3 = JSON.stringify(Parametros, null, 4);
pw.sendObservations(function (err, success) {
if (err != null) {
cbFunc('pws', 'ERROR', err, idRed3, ParametrosTemp3);
} else {
cbFunc('pws', 'OK', 'ok', idRed3, ParametrosTemp3);
}
});
pw = null;
PW = null;
break;
case 'windguru':
var WG = require('./redes/windguru');
var windguru = new WG(Parametros[0][1], Parametros[0][2]);
var idRed4 = Parametros[2];
windguru.resetObservations();
windguru.setObservations({
interval: 60,
precip_interval: 3600,
wind_avg: vientoEnNudos.toFixed(2), // Viento
wind_max: rafagaEnNudos.toFixed(2), // Viento Rafagas
wind_direction: Parametros[1].viento_direccion, // Viento Direccion
temperature: temperaturaExternaC, // Temperatura Externa
rh: Parametros[1].humedad_externa, // Humedad Externa
mslp: presionRelhpa.toFixed(2), // Presion Relativa
precip: lluviaHoraMm // Lluvia Acumulado Hora
});
var ParametrosTemp4 = JSON.stringify(Parametros, null, 4);
windguru.sendObservations(function (err, success) {
if (err != null) {
cbFunc('windguru', 'ERROR', err, idRed4, ParametrosTemp4);
} else {
cbFunc('windguru', 'OK', 'ok', idRed4, ParametrosTemp4);
}
});
windguru = null;
WG = null;
break;
case 'emacenter':
var idRed5 = Parametros[2];
var EMACENTER_PARTICULAR = require('./redes/emacenter');
var centerp = new EMACENTER_PARTICULAR(Parametros[0][3], Parametros[0][4], Parametros[0][6]);
// Se convierte la informacion a la medidas que la red utiliza
if (Parametros[1].luxer_uv == null || Parametros[1].luxer_intencidad == null) {
Parametros[1].luxer_uv = 0;
Parametros[1].luxer_intencidad = 0;
}
centerp.resetObservations();
centerp.setObservations({
fecha: Parametros[1].fechaISO, // fecha actual
temperatura_externa: temperaturaExternaC, // Temp. Externa
temperatura_interna: temperaturaInternaC, // Temp. Interna
humedad_interna: Parametros[1].humedad_interna, // Humedad Interna %
humedad_externa: Parametros[1].humedad_externa, // Humedad Externa %
punto_de_rocio: puntoDeRocioC, // Punto de Rocio
luxer_uv: Parametros[1].luxer_uv, // UV
luxer_intencidad: luxerIntencidadLux.toFixed(2), // Solar radiacion
viento_direccion: Parametros[1].viento_direccion, // Direccion del Viento
viento_direccion_nombre: vientoNombre, // Direccion Nombre
viento_rafagas: rafagaEnKh, // Rafagas
viento_velocidad: vientoEnKh, // Viento
lluvia_actual: Parametros[1].lloviendo, // Lluvia Actual
lluvia_acumulado_hora: lluviaHoraMm, // Lluvia Acumulado
lluvia_acumulado_diario: lluviaDiaMm, // Lluvia Acumulado Dia
lluvia_acumulado_total: Parametros[1].lluvia_acumulado_total, // Lluvia Acumulado Total
presion_relativa: presionRelhpa, // Presion Relativa
presion_absoluta: presionRelhpa, // Presion Absoluta
software: versionEMA, // Software
tanque: Parametros[1].tanque // Si el registro es tanqueado (true o false)
});
var ParametrosTemp5 = JSON.stringify(Parametros, null, 4);
centerp.sendObservations(function (err, success) {
if (err != null) {
cbFunc('emacenter', 'ERROR', err, idRed5, ParametrosTemp5);
} else {
cbFunc('emacenter', 'OK', 'ok', idRed5, ParametrosTemp5);
}
});
centerp = null;
EMACENTER_PARTICULAR = null;
break;
case 'emacentergugler':
var idRed6 = Parametros[2];
var EMACENTER = require('./redes/emacenter');
var center = new EMACENTER('emacenter.gugler.com.ar', 443, Parametros[0][6]);
// Se convierte la informacion a la medidas que la red utiliza
if (Parametros[1].luxer_uv == null || Parametros[1].luxer_intencidad == null) {
Parametros[1].luxer_uv = 0;
Parametros[1].luxer_intencidad = 0;
}
center.resetObservations();
center.setObservations({
fecha: Parametros[1].fechaISO, // fecha actual
temperatura_externa: temperaturaExternaC, // Temp. Externa
temperatura_interna: temperaturaInternaC, // Temp. Interna
humedad_interna: Parametros[1].humedad_interna, // Humedad Interna %
humedad_externa: Parametros[1].humedad_externa, // Humedad Externa %
punto_de_rocio: puntoDeRocioC, // Punto de Rocio
luxer_uv: Parametros[1].luxer_uv, // UV
luxer_intencidad: luxerIntencidadLux.toFixed(2), // Solar radiacion
viento_direccion: Parametros[1].viento_direccion, // Direccion del Viento
viento_direccion_nombre: vientoNombre, // Direccion Nombre
viento_rafagas: rafagaEnKh, // Rafagas
viento_velocidad: vientoEnKh, // Viento
lluvia_actual: Parametros[1].lloviendo, // Lluvia Actual
lluvia_acumulado_hora: lluviaHoraMm, // Lluvia Acumulado
lluvia_acumulado_diario: lluviaDiaMm, // Lluvia Acumulado Dia
lluvia_acumulado_total: Parametros[1].lluvia_acumulado_total, // Lluvia Acumulado Total
presion_relativa: presionRelhpa, // Presion Relativa
presion_absoluta: presionRelhpa, // Presion Absoluta
software: versionEMA, // Software
tanque: Parametros[1].tanque // Si el registro es tanqueado (true o false)
});
var ParametrosTemp6 = JSON.stringify(Parametros, null, 4);
center.sendObservations(function (err, success) {
if (err != null) {
cbFunc('emacentergugler', 'ERROR', err, idRed6, ParametrosTemp6);
} else {
cbFunc('emacentergugler', 'OK', 'ok', idRed6, ParametrosTemp6);
}
});
center = null;
EMACENTER = null;
break;
case 'awekas':
var AWEKAS = require('./redes/awekas');
var awekas = new AWEKAS(Parametros[0][1], Parametros[0][2]);
var idRed7 = Parametros[2];
awekas.resetObservations();
awekas.setObservations({
dateutc: 'now', // fecha actual
tempf: temperaturaExternaF, // Temp. Externa
indoortempf: temperaturaInternaF, // Temp. Interna
indoorhumidity: Parametros[1].humedad_interna, // Humedad Interna
humidity: Parametros[1].humedad_externa, // Humedad Externa
dewptf: puntoDeRocioF.toFixed(2), // Punto de Rocio
UV: Parametros[1].luxer_uv, // UV
solarradiation: luxerIntencidad.toFixed(2), // Solar radiacion
winddir: Parametros[1].viento_direccion, // Direccion del Viento
windgustmph: rafagaEnMh.toFixed(2), // Rafagas
windspeedmph: vientoEnMh.toFixed(2), // Viento
rainin: lluviaHorain.toFixed(2), // Lluvia Acumulado Hora
dailyrainin: lluviaDiain.toFixed(2), // Lluvia Acumulado Dia
baromin: presionRelIn.toFixed(2), // Presion Relativa
softwaretype: versionEMA // Software
});
var ParametrosTemp7 = JSON.stringify(Parametros, null, 4);
awekas.sendObservations(function (err, success) {
if (err != null) {
cbFunc('awekas', 'ERROR', err, idRed7, ParametrosTemp7);
} else {
cbFunc('awekas', 'OK', 'ok', idRed7, ParametrosTemp7);
}
});
awekas = null;
AWEKA = null;
break;
case 'windy':
var WINDY = require('./redes/windy');
var windy = new WINDY(Parametros[0][1], Parametros[0][2]);
var idRed8 = Parametros[2];
windy.resetObservations();
windy.setObservations({
dateutc: Parametros[1].fechaUTC, // Fecha actual UTC
tempf: temperaturaExternaF.toFixed(2), // Temp. Externa
winddir: Parametros[1].viento_direccion, // Direccion del Viento
windspeedmph: vientoEnMh.toFixed(2), // Viento en millas
windgustmph: rafagaEnMh.toFixed(2), // Rafagas
rh: Parametros[1].humedad_externa, // Humedad Externa
rainin: lluviaHorain.toFixed(2), // Lluvia Acumulado Hora
uv: Parametros[1].luxer_uv, // UV
dewpoint: puntoDeRocioC.toFixed(2), // Punto de Rocio
baromin: presionRelIn.toFixed(2) // Presion Relativa
});
var ParametrosTemp8 = JSON.stringify(Parametros, null, 4);
windy.sendObservations(function (err, success) {
if (err != null) {
cbFunc('windy', 'ERROR', err, idRed8, ParametrosTemp8);
} else {
// codigo de respuesta 430 No enviado - por tiempo limite no superado
if (success[0] === 430) { cbFunc('windy', 430, success[1], idRed8, ParametrosTemp8);}
else{
// codigo de respuesta 429 red congestionada
if (success[0] === 429) {
cbFunc('windy', 429, success[1], idRed8, ParametrosTemp8);
} else {
cbFunc('windy', 'OK', 'ok', idRed8, ParametrosTemp8);
}
}
}
});
windy = null;
WINDY = null;
break;
case 'openweathermap':
var OPENW = require('./redes/openweathermap');
var openw = new OPENW(Parametros[0][1]);
var idRed9 = Parametros[2];
openw.resetObservations();
openw.setObservations({
dt: Parametros[1].fechaUTC, // fecha actual UNIX
temperature: temperaturaExternaC, // Temp. Externa
humidity: Parametros[1].humedad_externa, // Humedad Externa %
dew_point: puntoDeRocioC, // Punto de Rocio
wind_deg: Parametros[1].viento_direccion, // Direccion del Viento
wind_gust: rafagaEnMs, // Rafagas
wind_speed: vientoEnMs, // Viento
rain_1h: lluviaHoraMm, // Lluvia Acumulado Hora
rain_24h: lluviaDiaMm, // Lluvia Acumulado Dia
pressure: presionRelhpa // Presion Relativa
});
var ParametrosTemp9 = JSON.stringify(Parametros, null, 4);
openw.sendObservations(function (err, success) {
if (err != null) {
cbFunc('openweathermap', 'ERROR', err, idRed, ParametrosTemp9);
} else { // codigo de respuesta 429 red congestionada
if (success[0] === 429) {
cbFunc('openweathermap', 429, success[1], idRed9, ParametrosTemp9);
} else {
cbFunc('openweathermap', 'OK', 'ok', idRed9, ParametrosTemp9);
}
}
});
openw = null;
OPENW = null;
break;
default:
console.log('No Existe la red metorologica: ' + Parametros[0][0]);
}
// Se eliminan las variables utilizadas.
temperaturaExternaF = null; puntoDeRocioF = null; vientoEnMh = null;
presionRelIn = null; rafagaEnMh = null; lluviaHoraMm = null;
lluviaDiaMm = null; lluviaHorain = null; lluviaDiain = null;
luxerIntencidad = null; temperaturaInternaF = null; temperaturaExternaC = null;
luxerIntencidadLux = null;
vientoEnNudos = null; rafagaEnNudos = null; presionRelhpa = null;
fechaformato = null; temperaturaInternaC = null; puntoDeRocioC = null;
vientoEnKh = null; rafagaEnKh = null; vientoNombre = null;
vientoEnMs = null; rafagaEnMs = null;
},
// En desarrollo
RegistrarRedesMeteorologicas: function (Parametros, cbFunc) {
switch (Parametros[0][0]) {
case 'openweathermap':
var OPENW = require('./redes/openweathermap');
var openw = new OPENW(Parametros[0][2]);
var idRed8 = Parametros[2];
var ParametrosTemp8 = JSON.stringify(Parametros, null, 4);
openw.resetObservations();
openw.sendObservations(function (err, success) {
if (err != null) {
cbFunc('openweathermap', 'ERROR', err, idRed8, ParametrosTemp8);
} else { // codigo de respuesta 429 red congestionada
if (success[0] === 429) {
cbFunc('openweathermap', 429, success[1], idRed8, ParametrosTemp8);
} else {
cbFunc('openweathermap', 'OK', 'ok', idRed8, ParametrosTemp8);
}
}
});
openw = null;
OPENW = null;
break;
default:
console.log('No Existe la red metorologica: ' + Parametros[0][0]);
}
}
};