ThingSpeak API 사용하기 with Python
본 문서는 Python으로 ThingSpeak API를 사용해 데이터를 보내고, 받아오는 방법을 담고 있다.
ThingSpeak
ThingSpeak 는 사용자가 인터넷 지원 장치 와 통신할 수 있도록 해주는 Ruby 로 작성된 오픈 소스 소프트웨어이다. 장치와 소셜 네트워크 웹사이트 모두에 API를 제공하여 데이터 액세스, 검색 및 데이터 로깅에 용이하다.
1. ThingSpeak 시작하기
1-1. ThingSpeak 가입하기
ThingSpeak에 접속하여 회원가입을 한다.
1-2. Channel 개설
새로운 채널을 개설한다. 채널 공개 여부를 결정할 수 있으며, 무료 계정은 채널을 최대 4개까지 개설할 수 있다.
- Name: 채널 이름
- Filed: 값 이름
1-3. Write & Read API Key 확인
API Keys 탭에서 Write & Read API Key, API 사용 예시를 확인할 수 있다.
- Write API Key: ThingSpeak에 데이터를 전송하기 위한 Key
- Read API Key: ThingSpeak에서 데이터를 추출하기 위한 Key
1-4. ThingSpeak 데이터 로깅
http 기반으로 데이터를 로깅할 때 아래와 같은 포맷을 사용한다. 아래의 url을 완성하여 웹 브라우저의 주소창에 적어주면, filed1에 3 값이 들어가게 된다.
https://api.thingspeak.com/update?api_key={자신의 Write API Key}&{field1=3}
Json 포맷으로 응답을 받고 싶다면 update 대신에 update.json을 쓰면 된다.
여러 필드에 동시에 값을 넣어주려면 {field1=4}&{field2=80}
형식으로 이어서 써주면 된다.
https://api.thingspeak.com/update.json?api_key={자신의 Write API Key}&{field1=4}&{field2=80}
1-5. ThingSpeak 데이터 액세스
데이터를 읽을 때 json, xml, csv 등의 형태로 가져올 수 있다. Python에서 쉽게 사용하기 위해 csv파일 형태로 가져온다.
https://api.thingspeak.com/channels/{자신의 채널 ID}/feeds.csv?api_key={자신의 Read API Key}&results={number}
입력한 Channel에서 number개의 데이터를 가져온다. 데이터는 최근에 갱신된 것부터 차례로 가져온다.
2. Python으로 ThingSpeak API 사용하기
2-1. Import Library
import time
import pytz
import requests
import pandas as pd
import urllib.request
from datetime import datetime
2-2. 데이터 로깅
last_data
가 1분 단위로 업데이트 되는 데이터라고 가정한다.
각 filed에 매칭하여 값이 들어갈 수 있도록 하고, ThingSpeak의 Write URL 요청 변수에 맞추어 URL을 완성하고 HTTP 요청을 수행한다.
write_api_key = 'ThingSpeak Write API Key'
while True:
last_data = ['temp', 'humid', 'rad', 'wd', 'ws', 'rain', 'max_ws', 'voltage']
filed_text = 'field1={:0.1f}&field2={:0.1f}&field3={:0.1f}&field4={:0.1f}&field5={:0.1f}&field6={:0.1f}&field7={:0.1f}&field8={:0.1f}'.format(
float(last_data[1]), float(last_data[2]), float(last_data[3]), float(last_data[4]), float(last_data[5]),
float(last_data[6]), float(last_data[7]), float(last_data[8]))
thing_write_url = f'https://api.thingspeak.com/update?api_key={write_api_key}&{filed_text}'
urllib.request.urlopen(thing_write_url)
time.sleep(60)
해당 채널에서 값이 실시간으로 잘 들어가고 있는 것을 확인할 수 있다.
2-3. 데이터 불러오기
ThingSpeak의 Read URL 요청 변수에 맞추어 URL을 완성하고 csv 형식으로 불러오도록 한다.
timezone
을 맞춰줘야 datetime 값이 알맞게 들어온다.
pd.read_csv()
로 DataFrame 형태로 만든다.
channel_id = 'ThingSpeak Channel ID'
read_api_key = 'ThingSpeak Read API Key'
number = 10
thing_read_url = f'https://api.thingspeak.com/channels/{channel_id}/feeds.csv?timezone=Asia%2FSeoul&api_key={read_api_key}&results={number}'
df = pd.read_csv(thing_read_url)
df.columns = ['datetime', 'entry_id', 'temp', 'humid', 'rad', 'wd', 'ws', 'rain', 'max_ws', 'voltage']
display(df)
datetime | entry_id | temp | humid | rad | wd | ws | rain | max_ws | voltage | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 2024-01-20 01:19:38 +0900 | 10 | 7.0 | 73.7 | 0.0 | 94.0 | 0.1 | 0.0 | 0.9 | 12.9 |
1 | 2024-01-20 01:20:38 +0900 | 11 | 7.0 | 73.6 | 0.0 | 41.0 | 0.4 | 0.0 | 0.9 | 12.9 |
2 | 2024-01-20 01:21:39 +0900 | 12 | 7.0 | 73.6 | 0.0 | 41.0 | 0.4 | 0.0 | 0.9 | 12.9 |
3 | 2024-01-20 01:22:40 +0900 | 13 | 7.0 | 73.6 | 0.0 | 41.0 | 0.4 | 0.0 | 0.9 | 12.9 |
4 | 2024-01-20 01:23:40 +0900 | 14 | 7.0 | 73.6 | 0.0 | 41.0 | 0.4 | 0.0 | 0.9 | 12.9 |
5 | 2024-01-20 01:24:41 +0900 | 15 | 7.0 | 73.6 | 0.0 | 41.0 | 0.4 | 0.0 | 0.9 | 12.9 |
6 | 2024-01-20 01:25:42 +0900 | 16 | 7.0 | 73.6 | 0.0 | 41.0 | 0.4 | 0.0 | 0.9 | 12.9 |
7 | 2024-01-20 01:26:42 +0900 | 17 | 7.0 | 73.6 | 0.0 | 41.0 | 0.4 | 0.0 | 0.9 | 12.9 |
8 | 2024-01-20 01:27:43 +0900 | 18 | 7.0 | 73.6 | 0.0 | 41.0 | 0.4 | 0.0 | 0.9 | 12.9 |
9 | 2024-01-20 01:28:44 +0900 | 19 | 7.0 | 73.6 | 0.0 | 41.0 | 0.4 | 0.0 | 0.9 | 12.9 |