iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 30
0
自我挑戰組

從python入門到物聯網系列 第 30

Day30 - python 連接 InfluxDB 應用

  • 分享至 

  • twitterImage
  •  

前言

今天來把最後的步驟完成吧!將前面實作 Publish 之後 Subscribe 收到的資料上傳到昨天所介紹的 influxDB 上,以及利用python 連接 InfluxDB 查詢資料的資料,取得資料後繪製成簡單的圖表。

接著最後會對於這30天的鐵人賽做個簡單的Summary與整理、回顧,以及個人的心得分享。

終於來到最後天啦~~~ /images/emoticon/emoticon07.gif

架構圖

Python Publish 程式碼

import paho.mqtt.client as mqtt
import random
import json  
import time

# 連線設定
client = mqtt.Client()
client.username_pw_set("sensor","xxxx")
client.connect("54.xx.xx.xx", 1883, 60)

while True:
    t0 = random.randint(10,30)
    payload = {'Tem' : t0 }
    print (json.dumps(payload))
    #要發布的主題和內容
    client.publish("Sensor/Temperature", json.dumps(payload))
    time.sleep(30)

結果:

Python Subscribe 後將資料上傳儲存到 influxdb

import paho.mqtt.client as mqtt
import json

# 當地端程式連線伺服器得到回應時,要做的動作
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    # 將訂閱主題寫在on_connet中
    client.subscribe("Sensor/Temperature")

# 當接收到從伺服器發送的訊息時要進行的動作
def on_message(client, userdata, msg):
    print(msg.topic+" "+ msg.payload.decode('utf-8'))
    savedata(msg.topic , msg.payload.decode('utf-8'))

# 儲存到 influxdb
def savedata(topic, data):
    from influxdb import InfluxDBClient
    # influxdb 連線設定
    client = InfluxDBClient('54.xx.xx.xx', 8086, 'root', '', 'Sensor') 
    
    data = json.loads(data)
    datas = [
        {
            "measurement": "Temperature",
            "tags": {
                "topic": topic
            },
            "fields": data
        }
    ]
    # 寫入數據
    client.write_points(datas)

# 連線設定
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.username_pw_set("python","xxxx")
client.connect("54.xx.xx.xx", 1883, 60)
client.loop_forever()

結果:

在終端機用 influx 指令查看資料庫資料
結果:

Python 連接 influxdb 資料庫運用(抓資料、畫圖表)

import matplotlib.pyplot as plt
import json

from influxdb import InfluxDBClient
client = InfluxDBClient('54.227.227.143', 8086, 'root', '', 'Sensor')

# 將從資料庫select到的資料取內容(get_points())再將型態轉成list
result = list(client.query('select * from Temperature').get_points())
print(result)

time =[]
tem = []
for item in result:
    # 時間部分只取小分秒的地方
    time.append(item["time"][11:19])
    tem.append(item["Tem"])

# 畫圖
plt.xlabel('Time')
plt.ylabel('Temperature')
plt.plot(time, tem ,'b-o')
plt.show()

資料查詢結果:

簡單的溫度圖表:

鐵人賽30天 Summary

  • 學習基礎的Python運用

    • 參數型態、運算、判斷式、迴圈、檔案 i/o、函式、類別、套件
  • 物聯網介紹

    • 物聯網的架構
    • 物聯網相關技術
    • 物聯網實務應用方面
    • 物聯網基礎傳輸協議 - MQTT
    • 物聯網低功耗廣域網路(LPWAN)
  • 雲端介紹

    • 雲端物聯網服務
    • Azure IoT
    • AWS IoT
    • 物聯網從雲端搬到邊緣的模式
  • Python 實作

    • 在AWS EC2 架 MQTT Broker - Mosquitto
    • 介紹MQTTlens 還有手機使用 MQTT 的app
    • Python 實作 MQTT Client Publish & Subscribe
    • Python Subscribe 接收資料後轉發(Publish)
    • InfluxDB 時序資料庫(Time Series Datebase) - 適合物聯網應用的資料庫
    • Python 連接 InfluxDB
    • Python Subscribe接收資料後上傳到 InfluxDB
    • python 查詢 InfluxDB 的資料並且畫成圖表

鐵人賽30天 心得

每天都寫一篇學習文章真的是滿不簡單的,有時候明明就已經發文了卻還以為自己沒有發,到晚上快12點的時候都要再檢查自己到底發文了沒有XDDDD。剛開始寫的時候總覺得時間還很久,但是後來就逐漸習慣每天邊學習邊整理成文章發表,我覺得學習並不困難,困難的是把學習到的東西整理出來。最後想說的就是這30天過得很充實啦!鐵人賽完賽啦!!!/images/emoticon/emoticon12.gif


上一篇
Day29 - python 連接 InfluxDB
系列文
從python入門到物聯網30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言