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