Le choix s'est porté sur une station météorologique peu coûteuse et assez fraîche Oregon Scientific WMR500. Je ne vais pas l'examiner, vous pouvez rechercher vous-même sur Internet. Il suffit qu'elle puisse mesurer la température, l'humidité, la pression, la vitesse et la direction du vent. En théorie, il connaît également la qualité de l'air et le niveau de rayonnement UV, mais nous n'avons pas trouvé les capteurs supplémentaires correspondants en vente. Le prix du budget était la façon dont il fonctionnait. Elle envoie elle-même des données dans le cloud via Wi-Fi. L'accès aux données est disponible dans l'application mobile, ainsi que depuis le Web, mais un peu étrange. Ceci, en fait, sera discuté.
Pour accéder au composant WebPart, vous avez besoin d'un compte créé dans l'application mobile. En fait, la configuration de la station en termes de Wi-Fi à utiliser pour la connexion se produit uniquement dans l'application lors de la connexion initiale au point d'accès temporaire de la station elle-même. Ici, tout est fait selon les instructions et il n'y a rien de compliqué. En conséquence, dans l'application, nous obtenons le périphérique ajouté, dont nous aurons besoin davantage.
L'interface Web se trouve à l' adresse http://web-wmr500.idtlive.com/
Une fois entré, vous pouvez afficher des graphiques de beauté moyenne en cliquant sur le bouton Afficher, ainsi que exporter les données au format XLS pour la période sélectionnée (bouton Exporter). Je dois dire tout de suite que l'affichage de l'humidité sur le graphique fonctionne, mais pas l'exportation, car les données d'humidité sont exportées avec les données de température. Telle est la situation étrange. En regardant les demandes, vous pouvez voir qu'il existe une certaine api pour les graphiques qui renvoie des données à json, ce qui est déjà bon. Vous pouvez voler des vaches!
Par exemple, nous «volons» l'ensemble de données sur la température par jour. La requête ira à web-wmr500.idtlive.com/index/api.show/index.html , avec des paramètres (voici un tableau PHP de paramètres pour un exemple):
$request = [
'type' => 'temperature',
'unit' => '°C',
'id' => 'id--',
'channel' => '---',
'start' => "'2020-07-20T00:00:00Z'",
'end' => "'2020-07-21T00:00:00Z'",
];
Les dates sont obligatoires entre guillemets simples et au format ISO 8601 sans TimeZone. Le numéro de canal (canal) - 1, 2 ou 3, selon le canal auquel le capteur est connecté. Les données de demande par types diffèrent par le type réel des données demandées (type) et les unités de mesure (unité).
Tous les types et unités disponibles:
temperature – °C °F
humidity – %
rain – mm/h inch/h
wind – m/s, knots, kph, mph
pressure – mbar,hPa,mmHg,inHg
Une chose est mauvaise, via api.show, vous ne pouvez obtenir des données que pour les paramètres spécifiés, par exemple, vous ne pouvez pas trouver la direction du vent ou le point de rosée, mais il y a beaucoup d'informations statistiques. J'aimerais. Et ici, EXPORT nous aidera.
Nous faisons la première demande à l'adresse web-wmr500.idtlive.com/index/api.export/index.html avec les mêmes paramètres. En réponse, le serveur quelque part dans la nature génère un fichier XLS statique et donne un lien vers celui-ci. Vous pouvez le télécharger après cela à tout moment (j'ai vu les fichiers d'autres personnes pour 2018 sur le serveur, le dossier est ouvert pour l'indexation). Les fichiers contiennent déjà beaucoup plus d'informations, ou plutôt, tout y est disponible.
Mais cela a aussi ses avantages et ses inconvénients. De plus, vous pouvez obtenir des données pour la période requise. Moins: ces données sont envoyées au composant WebPart avec un intervalle de 15 minutes. C'est même bon pour stocker la météo dans votre base de données, vous pouvez télécharger toutes les données à la fois à partir du moment où la station a été démarrée et tout ça. Mais si vous souhaitez recevoir des informations à jour plus souvent ou plus rapidement, vous devrez alors mener des recherches plus avancées.
J'ai paniqué et j'ai décidé d'intercepter le trafic de l'application, elle reçoit des données presque instantanément. Au contraire, il reçoit des données «directement» de la station, ce qui donne les dernières données reçues de l'unité de détection. Et il interroge le capteur une fois toutes les 15 secondes.
Il s'est avéré que l'application via le protocole MQTT va quelque part dans l'instance Amazon (l'adresse 35.161.38.128 a été obtenue en interceptant le trafic, toux-toux), s'abonne à un sujet avec un topic-id aléatoire, l'envoie au sujet de la station (elle-même via wi-fi et connecté uniquement via MQTT uniquement là-bas, le composant WebPart, apparemment, reçoit également périodiquement les mêmes données du courtier MQTT) avec son id une commande du type "cher, donne-moi ton statut, réponds dans le topic-id". Et si j'ai utilisé php + curl pour obtenir des données du composant WebPart (vous pouvez utiliser ce que vous voulez), alors l'asynchronie est nécessaire dans une seule connexion. Rapidement et à genoux, je n'ai pensé qu'à utiliser node.js. Vous aurez besoin du module mqtt.
Dans mon cas, c'est juste un script de console que je "tire" de exec dans 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()
});
Je ne vous dirai pas comment analyser les données d'un composant WebPart (JSON), export (Excel) ou de MQTT (JSON), ici vous pouvez les gérer comme vous le souhaitez.
C'est tout. Si quelqu'un m'aide soudainement, je ne serai que content.
PS> Update, le code du script est peigné, la génération d'un sujet MQTT aléatoire a été ajoutée, pour simuler le travail à la fois depuis l'application, et également publiée ici