サーバーと可視化と自称IoT女子

こんにちは🙋色々とマイナーチェンジを図りたいです👧五十嵐a.k.a自称IoT女子です☻☻☻

profile_image五十嵐a.k.a.自称IoT女子
2016入社☝️大学院で花の遺伝子を研究するも、日本のインダストリー4.0に夢中となり、その実現を目指す&その恩恵を直接受けるべく4月より入社し奮闘中✊💥💨
三度の飯よりでんぱ組.inc⚡️

今回は、こちら→ラズパイと対話する植物と自称IoT女子の続きです✏️
前回は取得したデータをメイさんが喋ってくれる、ということをやりました😗
今回はそのデータをサーバーに送ってデータ集積し、更に可視化する、ということをやっていきます💪💪
 
 

こんな構成になってます👺

サーバー1
 

センサーデータをとって可視化するまでの流れはこうです👺

サーバー2
 

データ表示はこうなってます👺

サーバー3
 

ソースコードです👺

🐤以前に上げたものが元になっていて、センサーの値を取得します。

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import glob
import time
import datetime
import re
import subprocess
import spidev
import Adafruit_DHT
from slacker import Slacker
import RPi.GPIO as GPIO
spi = spidev.SpiDev()
spi.open(0, 0)
def get_temp_and_humid(sensor=11, pin=4):
    """温度湿度センサー(DHT11)から温度と湿度を取得する
    """
    # 湿度と温度を取得
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    # 湿度と温度が正常に取得できていたら、値を返す
    if humidity is not None and temperature is not None:
        return (temperature, humidity)
    else:
        print('Failed to get reading. Try again!')
        sys.exit(1)
def get_moisture(channel):
    """ADCの指定したチャンネルのデータを取得する
    """
    adc = spi.xfer2([1,(8+channel)<<4,0])
    data = ((adc[1]&3) << 8) + adc[2]
    return data
if __name__ == '__main__':
    print("温度,湿度:", get_temp_and_humid())
    print("水分量:",  get_moisture(0))

🐤RaspberryPiに設置しているもの (RP→kafka)

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import datetime
from sensordata import *
from kafka import KafkaProducer
def get_date():
    """ 現在時刻を取得する
    """
    now = datetime.datetime.now()
    return now.strftime("%Y-%m-%d %H:%M:%S")
def shape_data():
    """ 取得したセンサーデータを整形する
    """
    temp, humid = get_temp_and_humid()
    moisture = get_moisture(0)
    date = get_date()
    result = {"temp": temp,
              "humid": humid,
              "moisture": moisture,
              "date": date}
    return result
def post_kafka():
    """ Kafkaにデータを送信する
    """
    producer = KafkaProducer(bootstrap_servers=["203.104.251.126:9092"])
    message = shape_data()
    producer.send("sensor_data001",
                  str(message).encode("utf-8"))
    producer.flush()
if __name__ == '__main__':
    post_kafka()

🐤サーバーサイドに設置しているもの (kafka→mongoDB)

#! /usr/bin/env python
# -*- coding: utf-8 -*-
from ast import literal_eval
from kafka import KafkaConsumer
from pymongo import MongoClient
def str_to_dict(data):
    """Kafkaで受け取った文字列を辞書型に変換する
    """
    return literal_eval(data)
def insert_data(data):
    """ MongoDBにデータを保存する
    """
    client = MongoClient("localhost:27017")
    db_connect = client["plant001"]
    db_connect["sensor_data"].insert_one(data)
def reseive_kafka():
    """ Kafkaからデータを受け取り、MongoDBに保存する
    """
    consumer = KafkaConsumer("sensor_data001",
                             bootstrap_servers=["localhost:9092"])
    for c in consumer:
        dic = str_to_dict(c.value.decode("utf-8"))
        insert_data(dic)
if __name__ == '__main__':
    reseive_kafka()

 

可視化しました👀

redash画像2
re:dashというツールでデータの可視化・分析を行いました。
水を上げた直後は土壌水分量が急激に高くなっています。
 
 

Time to say goodbye👺

 
実は、次回でこの自称IoT女子連載、最終回になります😮✍️
 
 
次回はこれまでのことを振り返る的な内容なので、テックブログ的な要素はほぼありません🐻
気が向いたら読んでいただければと思います。
 
 

AWS移行支援キャンペーン

あなたにおすすめの記事