サーバーと可視化と自称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女子連載、最終回になります😮✍️

 

 

次回はこれまでのことを振り返る的な内容なので、テックブログ的な要素はほぼありません🐻

気が向いたら読んでいただければと思います。

 

 

あなたにおすすめの記事