Baixando dados da estação meteorológica Oregon Scientific WMR500

Depois de decidirmos que o local precisa de seu próprio clima real fora da janela. Isso significa que precisamos de algum tipo de estação meteorológica com conexão à Internet. Barato. Por pegar algo como Davis Vantage Pro2 Plus por mais de 100 mil rublos e até mesmo manter um computador separado para se conectar a ele (como fizeram em mail.ru ) não queria, tanto em termos de orçamento quanto em complexidade.







A escolha recaiu sobre uma estação meteorológica barata e relativamente nova, Oregon Scientific WMR500. Não vou revê-lo, você pode pesquisar na Internet você mesmo. Basta que ela possa medir a temperatura, umidade, pressão, velocidade e direção do vento. Em teoria, ele também conhece a qualidade do ar e o nível de radiação ultravioleta, mas não encontramos os sensores adicionais correspondentes à venda. O preço pelo orçamento era a maneira como funcionava. Ela mesma envia dados para a nuvem via wi-fi. O acesso aos dados está disponível no aplicativo móvel, assim como na web, mas um pouco estranho. Isso, de fato, será discutido.



Para acessar a web part, você precisa de uma conta, que é criada no aplicativo móvel. Na verdade, a configuração da estação em termos de qual Wi-Fi usar para conexão ocorre apenas no aplicativo durante a conexão inicial ao ponto de acesso temporário da própria estação. Aqui tudo é feito de acordo com as instruções e não há nada complicado. Como resultado, no aplicativo obtemos o dispositivo adicionado, cujo id precisaremos posteriormente.







A interface da web está localizada em http://web-wmr500.idtlive.com/







Após acessá-lo, você pode visualizar gráficos de beleza média clicando no botão Mostrar, bem como exportar dados em formato XLS para o período selecionado (botão Exportar). Devo dizer desde já que mostrar a umidade no gráfico funciona, mas exportar não, porque os dados de umidade são exportados junto com os dados de temperatura. Essa é a situação estranha. Olhando as solicitações, você pode ver que existe uma certa API para gráficos que retorna dados para json, o que já é bom. Você pode roubar vacas!







Por exemplo, "roubamos" um conjunto de dados de temperatura por dia. A solicitação irá para web-wmr500.idtlive.com/index/api.show/index.html , com parâmetros (aqui está uma matriz de parâmetros PHP para um exemplo):



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


As datas são obrigatórias em aspas simples e no formato ISO 8601 sem fuso horário. O número do canal (canal) - 1, 2 ou 3, dependendo do canal ao qual a unidade do sensor está conectada. Os dados solicitados por tipos diferem pelo tipo real dos dados solicitados (tipo) e unidades de medida (unidade).



Todos os tipos e unidades disponíveis:



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


Uma coisa é ruim, através de api.show você pode obter dados apenas dos parâmetros especificados, por exemplo, você não pode descobrir a direção do vento ou o ponto de orvalho, mas há muitas informações estatísticas. Eu gostaria de. E aqui a EXPORT vai ajudar-nos.



Fazemos a primeira solicitação para o endereço web-wmr500.idtlive.com/index/api.export/index.html com os mesmos parâmetros. Em resposta, o servidor em algum lugar remoto gera um arquivo XLS estático e fornece um link para ele. Depois disso, você pode baixá-lo a qualquer momento (vi os arquivos de outras pessoas de 2018 no servidor, a pasta está aberta para indexação). Os arquivos já contêm muito mais informações, ou melhor, tudo está disponível lá.







Mas isso também tem seus prós e contras. Além disso, você pode obter dados para o período necessário. Menos - esses dados são enviados para a web part com um intervalo de 15 minutos. É até bom para guardar a meteorologia na tua base de dados, podes fazer download de todos os dados desde o início da estação e tudo mais. Mas se você quiser receber informações atualizadas com mais frequência ou mais rápido, terá que conduzir pesquisas mais avançadas.



Eu "surtei" e resolvi interceptar o tráfego do aplicativo, ele recebe dados quase instantaneamente. Em vez disso, ele recebe dados "diretamente" da estação, que fornece os dados mais recentes recebidos da unidade do sensor. E controla a unidade do sensor uma vez a cada 15 segundos.



Descobriu-se que o aplicativo por meio do protocolo MQTT vai a algum lugar na instância Amazon (o endereço 35.161.38.128 foi obtido pela interceptação de tráfego, tosse-tosse), inscreve-se em um tópico com um ID de tópico aleatório, envia para o tópico da estação (ela mesma via wi-fi e ela está conectada apenas via MQTT apenas lá, a web part, aparentemente, também recebe periodicamente os mesmos dados do broker MQTT) com seu id um comando do tipo "querido, me dê seu status, responda no tópico-id". E se eu usei php + curl para obter dados da web part (você pode usar o que quiser), a assincronia é necessária em uma conexão. Rapidamente e de joelhos, só pensei em usar node.js. Você precisará do módulo mqtt.



No meu caso, é apenas um script de console que "puxo" do exec para o 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()
});


Não vou lhe dizer como analisar dados da web part (JSON), exportar (Excel) ou do MQTT (JSON), aqui você pode manipulá-los como quiser.



Isso é tudo. Se alguém ajudar de repente, ficarei feliz.



PS> Update, o código do script é penteado, a geração de um tópico MQTT aleatório foi adicionada, para simular o trabalho do aplicativo, e também postado aqui



All Articles