Post

ThingSpeak API 사용하기 with Python

본 문서는 Python으로 ThingSpeak API를 사용해 데이터를 보내고, 받아오는 방법을 담고 있다.

ThingSpeak


ThingSpeak 는 사용자가 인터넷 지원 장치 와 통신할 수 있도록 해주는 Ruby 로 작성된 오픈 소스 소프트웨어이다. 장치와 소셜 네트워크 웹사이트 모두에 API를 제공하여 데이터 액세스, 검색 및 데이터 로깅에 용이하다.

1. ThingSpeak 시작하기


1-1. ThingSpeak 가입하기

ThingSpeak에 접속하여 회원가입을 한다.

1-2. Channel 개설

새로운 채널을 개설한다. 채널 공개 여부를 결정할 수 있으며, 무료 계정은 채널을 최대 4개까지 개설할 수 있다.

그림1

  • Name: 채널 이름
  • Filed: 값 이름

1-3. Write & Read API Key 확인

API Keys 탭에서 Write & Read API Key, API 사용 예시를 확인할 수 있다.

그림1

  • Write API Key: ThingSpeak에 데이터를 전송하기 위한 Key
  • Read API Key: ThingSpeak에서 데이터를 추출하기 위한 Key

1-4. ThingSpeak 데이터 로깅

http 기반으로 데이터를 로깅할 때 아래와 같은 포맷을 사용한다. 아래의 url을 완성하여 웹 브라우저의 주소창에 적어주면, filed1에 3 값이 들어가게 된다.

1
https://api.thingspeak.com/update?api_key={자신의 Write API Key}&{field1=3}

그림1

Json 포맷으로 응답을 받고 싶다면 update 대신에 update.json을 쓰면 된다. 여러 필드에 동시에 값을 넣어주려면 {field1=4}&{field2=80} 형식으로 이어서 써주면 된다.

1
https://api.thingspeak.com/update.json?api_key={자신의 Write API Key}&{field1=4}&{field2=80}

그림1

1-5. ThingSpeak 데이터 액세스

데이터를 읽을 때 json, xml, csv 등의 형태로 가져올 수 있다. Python에서 쉽게 사용하기 위해 csv파일 형태로 가져온다.

1
https://api.thingspeak.com/channels/{자신의 채널 ID}/feeds.csv?api_key={자신의 Read API Key}&results={number}

입력한 Channel에서 number개의 데이터를 가져온다. 데이터는 최근에 갱신된 것부터 차례로 가져온다.

그림1

2. Python으로 ThingSpeak API 사용하기

2-1. Import Library

1
2
3
4
5
6
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 요청을 수행한다.

1
2
3
4
5
6
7
8
9
10
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)

해당 채널에서 값이 실시간으로 잘 들어가고 있는 것을 확인할 수 있다.

그림1

2-3. 데이터 불러오기

ThingSpeak의 Read URL 요청 변수에 맞추어 URL을 완성하고 csv 형식으로 불러오도록 한다. timezone을 맞춰줘야 datetime 값이 알맞게 들어온다. pd.read_csv()로 DataFrame 형태로 만든다.

1
2
3
4
5
6
7
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)
datetimeentry_idtemphumidradwdwsrainmax_wsvoltage
02024-01-20 01:19:38 +0900107.073.70.094.00.10.00.912.9
12024-01-20 01:20:38 +0900117.073.60.041.00.40.00.912.9
22024-01-20 01:21:39 +0900127.073.60.041.00.40.00.912.9
32024-01-20 01:22:40 +0900137.073.60.041.00.40.00.912.9
42024-01-20 01:23:40 +0900147.073.60.041.00.40.00.912.9
52024-01-20 01:24:41 +0900157.073.60.041.00.40.00.912.9
62024-01-20 01:25:42 +0900167.073.60.041.00.40.00.912.9
72024-01-20 01:26:42 +0900177.073.60.041.00.40.00.912.9
82024-01-20 01:27:43 +0900187.073.60.041.00.40.00.912.9
92024-01-20 01:28:44 +0900197.073.60.041.00.40.00.912.9
This post is licensed under CC BY 4.0 by the author.