BME280과 Elasticserch를 사용하여 시각화 해 봅시다.

소개



온습도·기압 센서 모듈인 BME280으로부터 취득한 데이터를, Elasticsearch에 데이터를 투입해, Kibana로 분석할 때까지를 해 보았습니다.

이런 느낌을 목표로 합니다.



이 스크린샷에서는 센서를 2대 하고, 1대는 유선이고, 다른 1대는 무선으로 데이터 날고 있다.
라디오는 이 기사을 참조하십시오.

필요한 것



작업에 필요한 것을 정렬합니다.
  • BME280
  • 라즈파이
  • Elasticsearch 및 Kibana

  • BME280



    센서이지만, 아키즈키 전자 통상 씨로부터 구입합시다.
    이 센서는 납땜 인두가 필요합니다. 조금 장애물이 높을지도 모르지만, 마이크로 컴퓨터에는 최소한 필요한 스킬이므로 할 수 있도록되어있는 것이 좋습니다.

    BME280 사용 온습도·기압 센서 모듈 키트
    htp // 아키즈키덴시. 코 m/타타 g/g/gK-09421/

    라즈파이



    GPIO를 사용할 수 있는 라즈파이를 준비합니다.
    셋업, I2C의 초기 설정은 기재하지 않으므로, 사전에 끝내 두어 주세요.
    여기를 참고하십시오.

    제39회 “라즈베리 파이로 온도·습도·기압을 정리해 취득!AE-BME280으로 IC2 통신”
    htps : //에서 ゔぃせ pぅs. jp / 허 by / 등

    Elasticsearch와 Kibana



    여러 가지 시작 방법이 있지만 Amazon Elasticsearch Service를 사용했습니다.
    Amazon ES는 약간 높은 서비스이지만 매니지드 서비스이므로 운영면에서는 비교적 즐겁지 않을까 생각합니다.
    콘솔에서 힘내면 10분 정도로 인스턴스를 만들 수 있습니다.
    이전에는, EC2라든지 ECS, 온프레에서도 하고 있었습니다만, 운용 주위가 힘들었으므로, 그것을 생각하면 싼 것일지도 모릅니다.

    라즈파이로 로직 생성



    이번에는 Node.js를 사용합니다.
    파이썬에서도 하고 있었는데, Node.js도 좀처럼 쓰기 쉽다고 말한 느낌입니다.
    비동기 처리의 부분이 매우 이해하기 어려운 것이 난점입니다만・・・.

    라즈파이에 적당하게 디렉토리를 작성해, 바삭바삭 작업해 갑니다.
    Node.js, npm 설치는 여기에서 생략됩니다.
    $ npm init
    (エコーのところは割愛します)
    

    필요한 패키지를 추가합니다.
    $ npm install --save bme280-sensor
    $ npm install --save date-utils
    $ npm install --save request
    

    이런 느낌이 들었습니다.

    package.json
    {
      "name": "bme280_nodejs",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "dependencies": {
        "bme280-sensor": "^0.1.6",
        "date-utils": "^1.2.21",
        "request": "^2.88.0",
      }
    }
    

    샘플 소스를 참조하여 Elasticsearch에 PUT 부분을 추가합니다.
    htps //w w. 음 pmjs. 코 m / Pac 게이지 / b 280- 전단 r

    1초마다 PUT해도・・・라고 하는 것으로, 2분 간격으로 PUT합니다.
    key의 부분은, 인덱스가 비대화하지 않게 분할하려고 생각하고 있었습니다만, 우선 독특한 id로서 사용했습니다.
    Node.js의 비동기 처리가 제대로 되어 있지 않다고 생각하므로, 진심으로 사용할 때는 주의해 주세요.
    나중에 제대로 할 것입니다. 죄송합니다.

    index.js
    require('date-utils');
    var webclient = require("request");
    const BME280 = require('bme280-sensor');
    
    // The BME280 constructor options are optional.
    // 
    const options = {
      i2cBusNo   : 1, // defaults to 1
      i2cAddress : 0x76
    };
    
    const bme280 = new BME280(options);
    
    // Read BME280 sensor data, repeat
    //
    const readSensorData = () => {
      bme280.readSensorData()
        .then((data) => {
          // temperature_C, pressure_hPa, and humidity are returned by default.
          // I'll also calculate some unit conversions for display purposes.
          //
          data.temperature_F = BME280.convertCelciusToFahrenheit(data.temperature_C);
          data.pressure_inHg = BME280.convertHectopascalToInchesOfMercury(data.pressure_hPa);
    
          console.log(`data = ${JSON.stringify(data, null, 2)}`);
          espost(data);
          setTimeout(readSensorData, 2000 * 60);
        })
        .catch((err) => {
          console.log(`BME280 read error: ${err}`);
          setTimeout(readSensorData, 2000 * 60);
        });
    };
    
    function espost(data) {
        var jdata = {};
        jdata.temperature = Math.round(data.temperature_C * 10)/10;
        jdata.humidity = Math.round(data.humidity * 10)/10;
        jdata.pressure_hPa = Math.round(data.pressure_hPa * 10)/10;
        var dt = new Date();
        jdata.dtjst = dt.toFormat("YYYY-MM-DDTHH24:MI:SS+0900");
        console.log(JSON.stringify(jdata));
        var key = dt.toFormat("YYYYMMDDHH24MISS");
        webclient({
          method: 'PUT',
          url: "https://xxx.yyy.zz/aaa/bbb/" + key,
          headers: {
            "content-type": "application/json"
          },
          body: JSON.stringify(jdata)
          }, function (error, response, body){
            console.log(body);
        });
    }
    
    // Initialize the BME280 sensor
    //
    bme280.init()
      .then(() => {
        console.log('BME280 initialization succeeded');
        readSensorData();
      })
      .catch((err) => console.error(`BME280 initialization failed: ${err} `));
    

    어쨌든 할 수 있으면, 시작해 봅시다.
    센서에서 값을 받으면 콘솔에 로그가 표시되어야 합니다.
    $ node index.js
    {"temperature":26.1,"humidity":36.1,"pressure_hPa":1012.5,"dtjst":"2018-12-05T10:59:22+0900"}
    

    시각화



    Kibana를 사용하여 시각화해 봅시다.
    자세한 작업은 생략하지만 Kibana에서 볼 수 있도록 인덱스에 추가합니다.



    그리고는 Visualize로 그래프를 만들거나 여러가지 해보세요.

    좋은 웹페이지 즐겨찾기