Bitcoin-Preis Tracker mit Raspberry Pi, Sense Hat und Python basteln
Mit dem Sense Hat kann man richtig Spaß haben, mitunter eine eigene Wetterstation basteln. Hängt der Zusatz an einem Raspberry Pi 4 und Du betreibst den Pi headless, dann startet die Kombination vielleicht nicht. Die Lösung findest Du hier. Nun habe ich mir gedacht, dass man damit doch auch einen Bitcoin-Preis Tracker basteln kann. Es geht natürlich auch für andere Kryptowährungen. Funktioniert hat die Sache, aber es gab ein paar Stolperfallen. Ich möchte hier einfach den Weg zu meiner Lösung beschreiben, wie Du mit dem Raspberry Pi und Python 3 den Bitcoin-Preis abfragen kannst.
Mit diesem T-Shirt kannst Du übrigens angeben, dass sich Deine ₿-Investition gelohnt hat.
Wahrscheinlich packen Programmier-Gurus mein Vorhaben in einen Einzeiler. Ich programmiere aber nicht so viel und meine Lösung funktioniert. Von daher bin ich zufrieden damit. Ich gehe Schritt für Schritt durch, was ich gemacht habe. Das komplette Script findest Du am im Laufe des Beitrags.
Bitcoin-Preis mit Python und Raspberry Pi abfragen
Da gibt es nun etliche Websites, die man anzapfen kann. Ich habe mich für cryptonator.com entschieden, weil es den gewünschten Wert praktisch im JSON-Format liefert. Außerdem unterstützt der Anbieter eine Menge Währungen und Kryptowährungen und Du kannst kombinieren, wie Du willst. Auch ein Euro-Dollar-Paar ist möglich. Hinzu kommt noch, dass Du Werte von mehreren Exchanges bekommst und wenn Du willst, kannst Du Dir den Wert von einer bestimmten Börse anzeigen lassen.
Mir reicht aber der Ticker und deswegen werde ich das als URL benutze (der Unterschied ist, dass in der URL full gegen ticker getauscht wird):
https://api.cryptonator.com/api/ticker/btc-usd
Damit bekomme ich die gleiche Ausgabe wie im Screenshot, aber ohne die Märkte. Hole ich mir die URL über Pythons requests, dann stoße ich direkt auf das erste Problem.
Cloudflare funkt dazwischen
Ich wollte mir die JSON-Daten ausgeben lassen und habe eine Fehlermeldung bekommen.
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Nun habe ich mir anzeigen lassen, was ich mir da eigentlich von der Website hole und das kam dabei heraus:
Anders gesagt funkt Cloudflare dazwischen und macht eine Bot-Prüfung. Ein Aufruf mit curl hat aber funktioniert. Nun gibt es zwei Optionen.
- Ich hole mir die Daten mit curl und verarbeite sie weiter
- Ich verwende cfscrape – das habe ich nach etwas Recherche gefunden
Letzteres ist ein einfaches Python-Modul, dass die Anti-Bot-Seite von Cloudflare umgeht. Es scheint mir an dieser Stelle eleganter und deswegen habe ich mich dafür entschieden. Du installierst das Modul auf dem Raspberry Pi via pip. Vielleicht musst Du das Programm selbst erst installieren:
sudo apt install python3-pip
Danach folgt ein
pip3 install cfscrape
Nun komme ich an die Daten, kann das JSON-Format verarbeiten und den Preis heraussuchen. Da ich persönlich keine Nachkommastellen brauche, nehme ich nur der Wert vor dem Punkt:
import json import cfscrape scraper = cfscrape.create_scraper() url = 'https://api.cryptonator.com/api/ticker/btc-usd' cfurl = scraper.get(url).content data = json.loads(cfurl) price = data['ticker']['price'] rounded = price.partition('.') # Der Punkt ist der Trenner print(rounded[0]) # Preis vor dem Komma
Das war im Prinzip schon die gesamte Magie. Wie hier beschrieben kannst Du auf dem Raspberry Pi (Raspbian) oder einem System mit Python den Bitcoin-Preis abfragen. Da ich nun den Wert habe, kann ich ihn auf dem Sense HAT anzeigen lassen oder auf dem Raspberry Pi verarbeiten, wie ich möchte.
Bitcoin-Preis auf dem Sense HAT ausgeben
Ab hier sind der Fantasie echt keine Grenzen gesetzt. Ich habe mich passend zur momentanen Situation entschieden, den Wert rot ausgeben zu lassen, wenn Bitcoin unter 10.000 US-Dollar ist und grün, wenn es die psychologische wichtige Marke wieder knackt.
Dafür definiere ich auch die Farben für den Sense HAT und importiere die Bibliothek natürlich. Die Zeile mit der Rotation brauche ich nur, weil mein Sense HAT so an der Wand hängt. Das gesamte Script sieht wie folgt aus:
from sense_hat import SenseHat
import json
import cfscrape
scraper = cfscrape.create_scraper()
sense = SenseHat()
blue = (0, 0, 255)
yellow = (255, 255, 0)
red = (255, 0, 0)
green = (0, 255, 0)
url = 'https://api.cryptonator.com/api/ticker/btc-usd'
cfurl = scraper.get(url).content
data = json.loads(cfurl)
price = data['ticker']['price']
rounded = price.partition('.')
sense.set_rotation(90) #optional, weil mein Sense Hat an der Wand hängt
if int(rounded[0]) >= 10000:
sense.show_message(rounded[0], text_colour=green, scroll_speed=0.1)
else:
sense.show_message(rounded[0], text_colour=red, scroll_speed=0.1)
sense.clear() # brauchst Du nur, wen Du
die gesamte Matrix löschen willst
Mögliche Variationen
Als Idee könntest Du rot und grün auch wie bei den Börsen verwenden und damit anzeigen, ob sich der Wert nach unten oder oben verändert hat. Den Wert dafür hast Du aus change:
data['ticker']['change']
Ist er negativ, ging es nach unten (rot). Ist er positiv, zeigen wir die Sache grün an. Das Ende des Scripts könnte dann so aussehen:
if float(data['ticker']['change']) >= 0: sense.show_message(rounded[0], text_colour=green, scroll_speed=0.1) else: sense.show_message(rounded[0], text_colour=red, scroll_speed=0.1) sense.clear()
Oder Du lässt Dir den Wert ausgeben, änderst aber den Hintergrund je nach change. Die Hintergrundfarbe beim Sense HAT änderst Du mit back_colour – habe mir noch die Farbe Schwarz definiert – black = (0, 0, 0):
if float(data['ticker']['change']) >= 0: sense.show_message(rounded[0], text_colour=black, back_colour=green, scroll_speed=0.1) else: sense.show_message(rounded[0], text_colour=yellow, back_colour=red, scroll_speed=0.1) sense.clear() # hier nutze ich es, sonst würde die Hintergrundfarbe nach Ablauf des Scripts weiter leuchten
Den Wert in Binärform auf der Sense-Hat-Matrix anzuzeigen, lasse ich lieber. Da wird der Platz früher oder später nicht mehr ausreichen. 😉
Was sind Deine Ideen? Gerne als Kommentar!
Bitcoin-Preis alle 5 Minuten auf dem Sense HAT anzeigen lassen
Möchtest Du den Bitcoin-Preis zum Beispiel alle 5 Minuten über Deinen Sense HAT flimmern lassen, dann ist das einfach. Ich gehe davon aus, dass Du den Code in einer Datei mit Namen btc-ticker.py gespeichert hast und sie im Verzeichnis /home/pi liegt. Erstelle auf Deinem Raspberry Pi nun einen Cronjob. Zunächst öffnest Du mit nachfolgendem Befehl die sogenannte crontab:
crontab -e
Danach fügst Du so eine Zeile ein:
*/5 * * * * /usr/bin/python3 /home/pi/btc-ticker.py >> /dev/null 2>&1
Der Befehl wird alle 5 Minuten ausgeführt. Zum Beispiel 14:00, 14:05, 14:10 und so weiter.
Nette Pi-Konstellation
Suchst Du ein VPN für den Raspberry Pi? NordVPN* bietet einen Client, der mit Raspberry Pi OS (32-Bit / 64-Bit) und Ubuntu für Raspberry Pi (64-Bit) funktioniert.