Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Python x MQTT x WebsocketでThingSpeakにPublish

More than 1 year has passed since last update.

背景

ThingSpeakにHTTP GETでデータを渡すのも飽きてきた。

ThingSpeakに登録してcurlでデータを送ってグラフを表示するまで - Qiita
Nature Remoで測定した室温をThingSpeakに渡して表示。 - Qiita
MESH温度・湿度タグで冷蔵庫の温度を取得+MESH SDKとThingSpeakでグラフ表示 - Qiita

せっかくなんでMQTTでやってみようと思った。パブリッシュしたい。

あと、いままで、OpenWeatherMap使ってたけど、他のも使ってみようと思ってLivedoorのん使ってみた。シンプル。

お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報

環境

  • GCP f1-micro(vCPU x 1、メモリ 0.6 GB)
  • Ubuntu 16.04.3 LTS
  • Python 3.6.3 :: Anaconda, Inc.
  • ThingSpeak

準備

paho-mqttをインストール
pip install paho-mqtt

paho-mqtt · PyPI

実装

ThingSpeakにパブリッシュするところは、MathWorksのをそのまま使った。
client IDをランダムにする意図がよくわからない。
__future__はpython3でやるのでいらない。

Raspberry Pi 上の Python で WebSocket を使用したパブリッシュ - MATLAB & Simulink - MathWorks 日本

天気はLivedoorのいう通りアクセスしたらすぐ動いた。

お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報

# for mqtt                                                                                                                                                                       
# from __future__ import print_function
import paho.mqtt.publish as publish
import string
import random

# for Forecasts                                                                                                                                                                  
import requests
import json

import time

# Forecasts                                                                                                                                                                      
city_id = "280010" # Kobe                                                                                                                                                        
url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=" + str(city_id)

# MQTT                                                                                                                                                                           
string.alphanum='1234567890avcdefghijklmnopqrstuvwxyzxABCDEFGHIJKLMNOPQRSTUVWXYZ'

channelID = "aaa"
writeAPIKey = "bbb"
mqttHost = "mqtt.thingspeak.com"

mqttUsername = "ccc"
mqttAPIKey = "ddd"

tTransport = "websockets"
tPort = 80

topic = "channels/" + channelID + "/publish/" + writeAPIKey

while(1):

    clientID=''

    for x in range(1,16):
        clientID+=random.choice(string.alphanum)

    response = requests.get(url)
    data = response.json()
    temp_max = data['forecasts'][1]['temperature']['max']['celsius']
    temp_min = data['forecasts'][1]['temperature']['min']['celsius']
    print(temp_max)
    print(temp_min)
    payload = "field1=" + str(temp_max) + "&field2=" + str(temp_min)

    try:
        publish.single(topic, payload, hostname=mqttHost, transport=tTransport, port=tPort, auth={'username':mqttUsername, 'password':mqttAPIKey})
        print("Max temperature =", temp_max, " Min temperature=", temp_min, " to host: ", mqttHost, " clientID= ", clientID)

    except (KeyboardInterrupt):
        break

    except:
        print("There was an error while publishing the data.")

    time.sleep(2)

結果

当たり前だけど、天気予報はすぐには変化ない…。グラフ書く意味ないな。

image.png

次したいこと

MQTTで通信してる実感がない。REST API? Web API?との違いがわかりにくい。
Wiresharkでパケットのやりとり見てみようかな。

optimisuke
Feedback Welcome
acall
ACALLは、「Life in Work and Work in Life for Happiness」をVISIONとして、どこでも安心・安全・快適なワークスタイルを実現するスマートオフィスプラットフォーム「WorkstyleOS」を開発・提供しています。オフィスワークとリモートワークのベストミックスを通じて、人々の「くらし」と「はたらく」を自由にデザインできる世界を目指します。
https://www.workstyleos.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away