Mengunduh data dari stasiun meteorologi Oregon Scientific WMR500

Setelah kami memutuskan bahwa situs tersebut memerlukan cuaca aktualnya sendiri di luar jendela. Ini berarti Anda memerlukan semacam stasiun meteorologi dengan koneksi Internet. Murah. Untuk mengambil sesuatu seperti Davis Vantage Pro2 Plus untuk lebih dari 100 ribu rubel, dan bahkan menjaga komputer terpisah untuk menyambungkannya (seperti yang mereka lakukan di mail.ru ) tidak mau, baik dari segi anggaran maupun dalam hal kerumitan.







Pilihannya jatuh pada stasiun meteorologi yang murah dan cukup segar, Oregon Scientific WMR500. Saya tidak akan memeriksanya, Anda dapat mencari sendiri di Internet. Cukup dia bisa mengukur suhu, kelembaban, tekanan, kecepatan dan arah angin. Secara teori, ia juga mengetahui tentang kualitas udara dan tingkat radiasi UV, tetapi kami tidak menemukan sensor tambahan yang sesuai yang dijual. Harga untuk anggaran adalah cara kerjanya. Dia sendiri mengirimkan data ke cloud melalui Wi-Fi. Akses data tersedia di aplikasi seluler, serta dari web, tetapi agak aneh. Ini sebenarnya akan dibahas.



Untuk mengakses komponen web, Anda memerlukan akun yang dibuat di aplikasi seluler. Sebenarnya, konfigurasi stasiun dalam hal mana Wi-Fi yang akan digunakan untuk sambungan hanya terjadi dalam aplikasi selama sambungan awal ke titik akses sementara stasiun itu sendiri. Di sini semuanya dilakukan sesuai petunjuk dan tidak ada yang rumit. Akibatnya, dalam aplikasi kita mendapatkan perangkat tambahan, id yang akan kita butuhkan lebih lanjut.







Antarmuka web terletak di http://web-wmr500.idtlive.com/







Setelah memasukkannya, Anda dapat melihat grafik kecantikan rata-rata dengan mengklik tombol Tampilkan, serta mengekspor data dalam format XLS untuk periode yang dipilih (tombol Ekspor). Saya harus segera mengatakan bahwa menampilkan kelembaban pada grafik berfungsi, tetapi ekspor tidak berfungsi, karena data kelembaban diekspor bersama dengan data suhu. Itulah situasi yang aneh. Melihat permintaannya, Anda dapat melihat bahwa ada api tertentu untuk grafik yang mengembalikan data ke json, yang sudah bagus. Anda bisa merampok sapi!







Misalnya, kami "merampok" sekumpulan data tentang suhu per hari. Permintaan akan menuju ke web-wmr500.idtlive.com/index/api.show/index.html , dengan parameter (berikut adalah contoh array PHP):



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


Tanggal diperlukan dalam tanda kutip tunggal dan dalam format ISO 8601 tanpa TimeZone. Nomor saluran (saluran) - 1, 2 atau 3, tergantung pada saluran mana unit sensor terhubung. Data permintaan menurut jenis berbeda dalam jenis sebenarnya dari data yang diminta (jenis) dan satuan ukuran (unit).



Semua tipe dan unit yang tersedia:



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


Satu hal yang buruk, melalui api.show Anda bisa mendapatkan data hanya untuk parameter yang ditentukan, misalnya Anda tidak dapat mengetahui arah angin, atau titik embun, tetapi ada banyak informasi statistik. Saya minta. Dan di sini EKSPOR akan membantu kami.



Kami membuat request pertama ke alamat web-wmr500.idtlive.com/index/api.export/index.html dengan parameter yang sama. Sebagai tanggapan, server di suatu tempat di alam liar menghasilkan file XLS statis dan memberikan tautan ke sana. Anda dapat mengunduhnya setelah itu kapan saja (saya melihat file orang lain untuk 2018 di server, folder terbuka untuk pengindeksan). Sudah ada lebih banyak informasi di dalam file, atau lebih tepatnya, semuanya tersedia di sana.







Tetapi ini juga memiliki pro dan kontra. Plus - Anda bisa mendapatkan data untuk periode yang diperlukan. Minus - data ini dikirim ke komponen web dengan interval 15 menit. Bahkan bagus untuk menyimpan cuaca di database Anda, Anda dapat mengunduh semua data sekaligus dari saat stasiun dimulai dan sebagainya. Tetapi jika Anda ingin menerima informasi terkini lebih sering atau lebih cepat, maka Anda harus melakukan penelitian yang lebih lanjut.



Saya "ketakutan" dan memutuskan untuk mencegat lalu lintas aplikasi, itu menerima data hampir seketika. Sebaliknya, ia menerima data "langsung" dari stasiun, yang memberikan data terbaru yang diterima dari unit sensor. Dan itu mengumpulkan unit sensor setiap 15 detik sekali.



Ternyata aplikasi melalui protokol MQTT berjalan ke suatu tempat di instans Amazon (alamat 35.161.38.128 diperoleh dengan mencegat lalu lintas, batuk-batuk), berlangganan topik dengan id topik acak, mengirimkannya ke topik stasiun (dia sendiri melalui wi-fi dan terkoneksi hanya lewat MQTT saja disana, web part ternyata juga secara periodik menerima data yang sama dari broker MQTT) dengan id nya perintah seperti "dear, give me your status, answer in topic-id". Dan jika saya menggunakan php + curl untuk mendapatkan data dari komponen web (Anda dapat menggunakan apa pun yang Anda suka), maka asynchrony diperlukan dalam satu koneksi. Dengan cepat dan berlutut, saya hanya berpikir untuk menggunakan node.js. Anda akan membutuhkan modul mqtt.



Dalam kasus saya, ini hanyalah sebuah konsol script yang saya "tarik" melalui exec ke 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()
});


Saya tidak akan memberi tahu Anda cara mengurai data dari komponen web (JSON), mengekspor (Excel) atau dari MQTT (JSON), di sini Anda dapat menanganinya sesuka Anda.



Itu saja. Jika seseorang tiba-tiba membantu, saya hanya akan senang.



PS> Perbarui, kode skrip disisir, pembuatan topik MQTT acak telah ditambahkan, untuk mensimulasikan pekerjaan baik dari aplikasi, dan juga diposting di sini



All Articles