Speichern Sie Ihre Herzfrequenz in Echtzeit (?) Mit der Python x Fitbit API in SpreadSheets!

Einführung

Es ist fast ein Jahr her, seit ich angefangen habe, Fitbit zu verwenden, aber ich habe die API nicht so sehr berührt, weil ich nur das Zifferblatt und die Apps entwickelt habe, und aufgrund meiner eigenen Forschung habe ich diesmal versucht, Aktivitätsdaten in Echtzeit zu erfassen. Es war.

Es war in Ordnung, in die Datenbank zu schreiben, aber ich entschied mich, schnell auf das Blatt zu schreiben, da mein Wissen immer noch auf der Babyebene liegt. (Ich möchte bald lernen)

Der Grund, warum (?) Nach der Echtzeit hinzugefügt wird, wird später erläutert. ..

Implementierungsschritte

Grob teilen und mit dem folgenden Verfahren fortfahren.

1. Registrierung für die Fitbit-API

2. Registrierung für Google Cloud Platform (GCP)

3. Klicken Sie auf die API, um Fitbit-Daten abzurufen

4. Schreiben Sie auf das Blatt

5. (einfache) Visualisierung

Ich werde sofort fortfahren!

SCHRITT 1: Registrierung der Fitbit-API-Nutzung

Dies ist eine weitere Energieanwendung von Anfang an, die sich jedoch auf den Artikel [hier] bezieht (http://sakanaaas.hateblo.jp/entry/2017/03/19/215758).

Bitte holen und einstellen. Meine App-Registrierungseinstellungen lauten übrigens wie folgt.

Artikel Eingaben eingegeben
Application Name HeartRate Watcher
Description watch my heart rate
Application Website http://localhost/
Organization personal
Organization Website http://localhost/
OAuth 2.0 Application Type Personal
Callback URL http://127.0.0.1:8080/
Default Access Type Read-Only

Was ich in diesem Schritt getan habe

get_hr.py


import fitbit
from ast import literal_eval

CLIENT_ID     = "XXXXXX"
CLIENT_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
TOKEN_FILE    = "token.txt" #Im selben Verzeichnis.Machen Sie txt

tokens = open(TOKEN_FILE).read()
token_dict = literal_eval(tokens)
access_token = token_dict['access_token']
refresh_token = token_dict['refresh_token']

def updateToken(token):
    f = open(TOKEN_FILE, 'w')
    f.write(str(token))
    f.close()
    return

authed_client = fitbit.Fitbit(CLIENT_ID, CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN, refresh_cb=updateToken)

Sobald der "authed_client" genehmigt wurde, können Sie die Daten nach Belieben abrufen.

Dies ist das Ende von STEP1.

SCHRITT 2: GCP-Einstellungen

Da Python in die Tabelle schreibt, registrieren wir hier auch die API.

STEP2 hat auch eine sehr sehr höfliche Erklärung unter hier, stellen Sie sie also beim Lesen ein.

Was ich in diesem Schritt getan habe

get_hr.py


import gspread
import json
from oauth2client.service_account import ServiceAccountCredentials 

scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('************.json', scope)
gc = gspread.authorize(credentials)
SPREADSHEET_KEY = '******************'
worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1

Vorsichtsmaßnahmen

Sobald Sie die oben genannten Informationen registriert haben, können Sie so viel lesen und schreiben, wie Sie möchten!

Ich würde gerne sagen, aber da es ein ** Anforderungslimit von 100 pro 100 Sekunden ** gibt, werde ich unerwartet erwischt. Es wird als eine Anforderung für jede Erfassung oder Aktualisierung des Zellenwerts betrachtet. Vermeiden Sie daher wiederverwendbare Stellen und zusätzliches Schreiben so weit wie möglich. (Ich weiß nicht, ob es mir gut geht.)

Dies ist das Ende von STEP2.

SCHRITT 3: Drücken Sie die API, um Daten abzurufen

Nach der Registrierung verschiedener Informationen ist es endlich Zeit, die Daten abzurufen.

Erfassungsmethode

data_sec = authed_client.intraday_time_series('activities/heart', 'YYYY-MM-DD', detail_level='1sec')
heart_sec = data_sec["activities-heart-intraday"]["dataset"]

Stellen Sie das Datum der Daten, die Sie erfassen möchten, mit "JJJJ-MM-TT" und das Datenintervall mit "detail_level" ein. detail_level kann aus [1sec, 1min, 15min] ausgewählt werden.

Ein wenig deformiert

heart_sec enthält die Herzfrequenz in Form von "{Zeit: mm: hh: ss, Wert: **}". Sie können es so lassen, wie es ist, aber ich wollte Datumsinformationen hinzufügen, deshalb habe ich es vor der Ausgabe ein wenig wie folgt geändert.

def get_heartrate_data(date):
	data_sec = authed_client.intraday_time_series('activities/heart', date, detail_level='1sec')
	heart_sec = data_sec["activities-heart-intraday"]["dataset"]
	for data in heart_sec:
		datetime = date + " " + data['time']
		data['datetime'] = datetime
		del data['time']
	return heart_sec

Danach werde ich es auf das Blatt werfen, also belasse es im JSON-Format.

Dies ist das Ende von SCHRITT 3.

Für diejenigen, die andere Informationen erhalten möchten

Es gibt auch Personen, die die Erfassungsmethode sorgfältig zusammengefasst haben. Wenn Sie also eine andere Methode als die Herzfrequenz ausprobieren möchten, lesen Sie bitte hier. ..

SCHRITT 4: Schreiben Sie in Tabellenkalkulationen

Der letzte Schritt ist das Schreiben auf das Blatt.

Erstellen Sie eine Liste der Daten, die Sie eingeben möchten, und werfen Sie sie nacheinander. Es ist gut, append () zu verwenden, um in die letzte Zelle zu schreiben, also überlasse ich alles Ihnen.

headers = ['value', 'datetime'] # keys

def set_data_to_sheet(datas):
	for data in datas:
		column = []
		for header in headers:
			column.append(data[header])
		
		worksheet.append_row(column)

Periodische Ausführung

Erstellen Sie nach Abschluss der obigen Vorbereitungen eine job () - Funktion für die regelmäßige Ausführung.


def get_latest_data(data):
	list_num = len(data)
	new_list = []
	for i in range(list_num-30, list_num):
		new_list.append(data[i])
	return new_list

def job():
	now = datetime.datetime.now()
	date = now.strftime('%Y-%m-%d')

	data = get_heartrate_data(date)
	latest_data = get_latest_data(data)
	set_data_to_sheet(latest_data)

Holen Sie sich einfach die letzten 30 Daten mit der Datumseinstellung "get_latest_data" und schreiben Sie sie auf das Blatt.

Danach wird, um eine ** Echtzeit ** -Erfassung zu realisieren, diese regelmäßig alle 30 Sekunden von cron usw. ausgeführt. Da die Grenze der Fitbit-API bei 150 Zugriff / 1H liegt, wird sie mit einem kleinen Spielraum festgelegt.

Ergebnisansage

** Echtzeit-Herzfrequenz kann erhalten werden !! **

Es lief nicht gut und das Ergebnis war wie folgt. .. (Auszug aus 1 Exemplar) スクリーンショット 2020-06-03 0.20.15.png

Es wurde erwartet, dass es alle 30 Sekunden aktualisiert wird, aber die Aktualisierung der neuesten Informationen verzögert sich um etwa 15 Minuten. Relevant ist hier die Spezifikation zum Daten-Upload. Da Sie von fitbit aus keine direkte Verbindung zur Cloud herstellen können, müssen Sie Ihr Smartphone während der Kommunikation einmal durchlaufen. Es scheint jedoch, dass Fitbit und das Smartphone nur in Intervallen von etwa 15 Minuten synchronisiert werden. Ich denke, dieses Problem tritt auf. (Die Synchronisation ist immer eingeschaltet, aber es ist ein Gleichgewicht mit verschiedenen Batterien)

Auf diese Weise scheint die Echtzeiterfassung in 30-Sekunden-Intervallen mithilfe der API bisher streng zu sein, daher habe ich sie wie folgt geändert.

Von Echtzeit zu ungefähr Echtzeit (?)

Wenn Sie die Situation organisieren

Daher werden zum Zeitpunkt des Hochladens der neuesten Informationen 12 x 15 = etwa 180 Datensätze akkumuliert.

Die Lösung ist ...

Schreiben Sie dann 180 Daten, indem Sie cron alle 15 Minuten ausführen!

Ich dachte, aber hier stecke ich mit ** 100 Anforderungslimit pro 100 Sekunden ** fest.

Ich habe versucht, 180 Daten gleichzeitig zu schreiben, war aber begrenzt. (Natürlich) Also schaffte ich es, mit der Krafttechnik, jedes Mal, wenn ich schrieb, 1 Sekunde lang zu schlafen, die Grenze zu überschreiten. (Es dauert sehr lange) (Das Werfen in die Datenbank ist überwältigend intelligenter.)

SCHRITT 4 Zusammenfassung

Schließlich konnte ich Daten nicht sofort abrufen und schreiben "Einmal alle 15 Minuten werden in 180 Sekunden 180 nicht hochgeladene Daten auf das Blatt geschrieben." Es wurde ein sehr klobiges System.

Da das Blatt die Daten jedoch ohne Erlaubnis aufzeichnet, scheint es, dass sie für irgendeine Art von Analyse verwendet werden können.

SCHRITT 5: Visualisierung

Alles was Sie tun müssen, ist auf das Blatt zu schreiben und Sie können es sofort visualisieren. Ich meine, auch wenn Sie es nicht schreiben, können Sie ein Diagramm einfacher erstellen, indem Sie es in einen DataFrame konvertieren. Daher werde ich die Details hier weglassen.

Das folgende Beispiel zeigt 24 Stunden Herzfrequenz pro Tag. Sie können sehen, dass die Herzfrequenz von Mitternacht bis zum frühen Morgen bei tiefem Schlaf niedrig ist und nach dem Aufwachen allmählich ansteigt.

Figure_1.png

Wenn Sie es ordnungsgemäß in der Datenbank verwalten, können Sie coole und dynamische Diagramme erstellen. Dies ist also ein zukünftiges Problem.

abschließend

Wir haben eine Reihe von Schritten ausgeführt, z. B. das Festlegen verschiedener APIs, das Erfassen von Fitbit-Informationen, das Schreiben auf ein Blatt und das Visualisieren.

Es war nicht gerade in Echtzeit, aber ich möchte ein intelligentes Visualisierungssystem und interessante Apps erstellen, die sogar 15-Minuten-Intervalle tolerieren können.

Zusätzlich zur Herzfrequenz können Sie Kalorien, Schritte, Schlaf usw. aufzeichnen. Probieren Sie es also sowohl für Fitbit-Benutzer als auch für Nicht-Fitbit-Benutzer aus!

Recommended Posts

Speichern Sie Ihre Herzfrequenz in Echtzeit (?) Mit der Python x Fitbit API in SpreadSheets!
Holen Sie sich Ihre Herzfrequenz von der Fitbit-API in Python!
So schreiben Sie offline in Echtzeit Lösen von E04-Problemen mit Python
Versuchen Sie, sich mit Python auf Ihrem PC automatisch bei Netflix anzumelden
[EV3 x Python] Streame Kamerabilder mit mjpg-streamer auf deinen PC.
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
Versuchen Sie es mit der Wunderlist-API in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Tweet mit der Twitter-API in Python
Melden Sie sich mit Anforderungen in Python bei Slack an
Holen Sie sich Youtube-Daten in Python mithilfe der Youtube-Daten-API
So senden Sie automatisch E-Mails mit Anhängen mithilfe der Google Mail-API in Python
Rufen Sie weiterhin Tweets mit bestimmten Schlüsselwörtern mithilfe der Streaming-API in Python ab
3 Möglichkeiten, Zeitzeichenfolgen mit Python zu analysieren [Hinweis]
Vorgehensweise zur Verwendung der WEG-API von TeamGant (mit Python)
E-Mail-Anhänge über Ihr Google Mail-Konto mit Python.
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Holen Sie sich die Bild-URL mithilfe der Flickr-API in Python
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
Lassen Sie uns Emotionen mithilfe der Emotions-API in Python beurteilen
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
Zur Darstellung von Datum, Uhrzeit, Uhrzeit und Sekunden in Python
So testen Sie eine Funktion, die die aktuelle Zeit enthält, mit Freezegun in Python
Konvertieren Sie Datum und Uhrzeit in Zeitzonen in Unixtime in Python2.7
Laden Sie eine JPG-Datei mit der Google Drive-API in Python hoch
So messen Sie die Verarbeitungszeit mit Python oder Java
Grundeinstellungen bei Verwendung der foursquare-API mit Python
Holen Sie sich LEAD-Daten mit der REST-API von Marketo in Python
Holen Sie sich die Standardausgabe in Echtzeit mit dem Python-Unterprozess
Versuchen Sie, Tweets mithilfe der Twitter-API in großen Mengen zu löschen
OpenVINO verwendet die Inference Engine Python API in einer PC-Umgebung
Konvertieren Sie die asynchrone API im Callback-Stil in async / await in Python
Versuchen Sie die Gesichtserkennung in Echtzeit mit einer Webkamera
Posten Sie mit der API auf Twitter in Ihrem Konto
Erstellen Sie Ihre erste GDSII-Datei in Python mit gdspy
Beenden bei Verwendung von Python in Terminal (Mac)
[Road to Intermediate Python] Definieren Sie in Ihrer eigenen Klasse
Mehrstellige Multiplikationszeit bis zu 300 Millionen Stellen in Python
So rufen Sie mehrere Arrays mit Slice in Python ab.
Verwenden Sie die Such-API der National Parliament Library in Python
So führen Sie einen Befehl mit einem Unterprozess in Python aus
Ich habe versucht, "ein Herz, auch wenn es getrennt ist" mithilfe eines genetischen Algorithmus in Python zu automatisieren