Descarga de datos de la estación meteorológica Oregon Scientific WMR500

Una vez decidimos que el sitio necesita su propio clima real fuera de la ventana. Esto significa que necesita algún tipo de estación meteorológica con conexión a Internet. Barato. Por tomar algo como Davis Vantage Pro2 Plus por más de 100 mil rublos, e incluso tener una computadora separada para conectarse (como lo hicieron en mail.ru ) no quería, tanto en términos de presupuesto como de complejidad.







La elección recayó en una estación meteorológica barata y bastante nueva, Oregon Scientific WMR500. No lo revisaré, puede buscar en Internet usted mismo. Es suficiente que pueda medir la temperatura, la humedad, la presión, la velocidad y la dirección del viento. En teoría, también conoce la calidad del aire y el nivel de radiación ultravioleta, pero no encontramos a la venta los sensores adicionales correspondientes. El precio por el presupuesto fue la forma en que funcionó. Ella misma envía datos a la nube a través de Wi-Fi. El acceso a los datos está disponible en la aplicación móvil, así como desde la web, pero un poco extraño. Esto, de hecho, se discutirá.



Para acceder al elemento web, necesita una cuenta que se crea en la aplicación móvil. En realidad, la configuración de la estación en términos de qué Wi-Fi usar para la conexión ocurre solo en la aplicación cuando se conecta inicialmente a un punto de acceso temporal de la propia estación. Aquí todo se hace según las instrucciones y no hay nada complicado. Como resultado, en la aplicación obtenemos el dispositivo agregado, cuya identificación necesitaremos más.







La interfaz web se encuentra en http://web-wmr500.idtlive.com/







Una vez ingresado, puede ver gráficos de belleza promedio haciendo clic en el botón Mostrar, así como exportar datos en formato XLS para el período seleccionado (botón Exportar). Debo decir de inmediato que mostrar la humedad en el gráfico funciona, pero la exportación no, porque los datos de humedad se exportan junto con los datos de temperatura. Esa es la extraña situación. Al observar las solicitudes, puede ver que hay una cierta api para gráficos que devuelve datos a json, lo cual ya es bueno. ¡Puedes robar vacas!







Por ejemplo, "robamos" un conjunto de datos sobre la temperatura por día. La solicitud irá a web-wmr500.idtlive.com/index/api.show/index.html , con parámetros (aquí hay una matriz de parámetros PHP para un ejemplo):



$request = [
	'type'		=> 'temperature',
	'unit'		=> '°C',
	'id'		=> 'id--',
	'channel'	=> '---',
	'start'		=> "'2020-07-20T00:00:00Z'",
	'end'		=> "'2020-07-21T00:00:00Z'",
];


Las fechas se requieren entre comillas simples y en formato ISO 8601 sin TimeZone. El número de canal (canal): 1, 2 o 3, según el canal al que esté conectada la unidad de sensor. Los datos solicitados por tipos difieren en el tipo real de los datos solicitados (tipo) y las unidades de medida (unidad).



Todos los tipos y unidades disponibles:



temperature – °C  °F
humidity – %
rain – mm/h  inch/h
wind – m/s, knots, kph, mph
pressure – mbar,hPa,mmHg,inHg


Una cosa es mala, a través de api.show puede obtener datos solo de los parámetros especificados, por ejemplo, no puede encontrar la dirección del viento o el punto de rocío, pero hay mucha información estadística. Me gustaría. Y aquí EXPORTAR nos ayudará.



Realizamos la primera solicitud a la dirección web-wmr500.idtlive.com/index/api.export/index.html con los mismos parámetros. En respuesta, el servidor en algún lugar de la naturaleza genera un archivo XLS estático y le da un enlace. Puede descargarlo después de eso en cualquier momento (vi los archivos de otras personas para 2018 en el servidor, la carpeta está abierta para indexar). Ya hay mucha más información en los archivos, o mejor dicho, está toda disponible allí.







Pero esto también tiene sus pros y sus contras. Además, puede obtener datos durante el período requerido. Menos: estos datos se envían al elemento web con un intervalo de 15 minutos. Incluso es bueno para almacenar el clima en su base de datos, puede descargar todos los datos a la vez desde el momento en que se inició la estación y todo eso. Pero si desea recibir información actualizada con más frecuencia o más rápido, tendrá que realizar una investigación más avanzada.



Me "asusté" y decidí interceptar el tráfico de la aplicación, recibe datos casi al instante. Más bien, recibe datos "directamente" de la estación, que proporciona los últimos datos recibidos de la unidad de sensor. Y sondea la unidad del sensor una vez cada 15 segundos.



Resultó que la aplicación a través del protocolo MQTT va a algún lugar de la instancia de Amazon (la dirección 35.161.38.128 se obtuvo al interceptar el tráfico, tos-tos), se suscribe a un tema con un ID de tema aleatorio, lo envía al tema de la estación (ella misma a través de wi-fi y conectado solo a MQTT solo allí, la parte web, aparentemente, también recibe periódicamente los mismos datos del bróker MQTT) con su identificación un comando como "querido, dame tu estado, responde en topic-id". Y si usé php + curl para obtener datos del elemento web (puede usar lo que quiera), entonces se necesita asincronía dentro de una conexión. Rápidamente y de rodillas, solo pensé en usar node.js. Necesitará el módulo mqtt.



En mi caso, es solo un script de consola que "extraigo" a través de exec en php.



#!/usr/bin/node

var mqtt  = require('mqtt');
var md5   = require('md5');

String.prototype.insert = function (index, string) {
  if (index > 0)
   return this.substring(0, index) + string + this.substring(index, this.length);
  else
    return string + this;
};

var host       = 'mqtt.idtlive.com';
var your_mail  = 'your_account_mail@somehost.com'; // see in app, registered account
var clientId   = 'Android_' + your_mail;
var deviceId   = 'your-device-id'; // see in app connected device section, something like F9987D92-E180-64DE-A202-D43AAD0D5784
var channelId  = 1; // channel beetwen station & external sensors block

var timeInMs   = Date.now();
var uniqTopic  = md5(timeInMs).toUpperCase().insert(8,'-').insert(13,'-').insert(18,'-').insert(23,'-');

var client = mqtt.connect( {
  host : host,
  port : 1883,
  cliendId : clientId
});

client.on('connect', function() {
  client.subscribe('enno/out/json/'+uniqTopic,
    function(err) {
      if (!err) {
        client.publish('enno/out/json/'+deviceId, '{"command":"getChannel'+channelId+'Status","id":"'+uniqTopic+'"}');
      } else {
        console.log('connect error');
      }
    })
});

client.on('message', function(topic, message) {
  console.log(message.toString())
  client.end()
});


No te diré cómo analizar datos desde un elemento web (JSON), exportar (Excel) o desde MQTT (JSON), aquí puedes manejarlo como quieras.



Eso es todo. Si alguien me ayuda de repente, solo me alegraré.



PS> Actualización, el código del script se combina, se ha agregado la generación de un tema MQTT aleatorio, para simular el trabajo tanto desde la aplicación, como también publicado aquí



All Articles