W artykule 5 rzeczy, które sprawiły, że nasze mieszkanie stało się nieco bardziej smart wspominałem, że nie jest to moje ostatnie słowo wokół smart home. Jak to często bywa, między planami, a czynami stoją obowiązki i inne hobbystyczne pomysły do zrealizowania. Nie posunąłem się więc znacząco w temacie. Niemniej jednak zrobiłem mały krok naprzód.
Przy okazji czarnopiątkowych promocji udało mi się wyhaczyć taką żarówkę Yeelight. O zakupie i „zabawie” czymś podobnym myślałem już od dłuższego czasu. Miałem nawet pomysł do jakiej zabawy taką żarówkę wykorzystać. Ostatecznie nie zrealizowałem go, bo chwilowo mi się odechciało, ale zrealizowałem inny 🙂
Wyniki spółki giełdowej w żarówce
Wpadłem na pomysł odzwierciedlania dziennych zmian wartości akcji wybranej spółki giełdowej kolorami żarówki 🙂 I tak, jeżeli cena spada, żarówka świeci na czerwono, jeżeli rośnie, to żarówka zmienia kolor na zielony. Całość realizuje prosty skrypt w Pythonie:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
#!/usr/bin/env python3 import argparse, sys import requests from bs4 import BeautifulSoup import tempfile import os from yeelight import Bulb, BulbException WEBSITE_URL_TEMPLATE = "https://www.bankier.pl/inwestowanie/profile/quote.html?symbol=%s" DB_FILE_NAME_TEMPLATE = "YeeLightGPW.%s.data" def main(args): bulb = Bulb(args.BULB_IP) stockSymbol = args.STOCK_SYMBOL lighterModeFactor = 50 if args.lighter_mode else 0 previousPrice = getPreviousPrice(stockSymbol) currentPrice = getCurrentPrice(stockSymbol) if previousPrice != currentPrice: setBulbColor(bulb, previousPrice, currentPrice, lighterModeFactor) storeCurrentPrice(stockSymbol, currentPrice) def getDb(stockSymbol): tempDir = tempfile.gettempdir() return os.path.join(tempDir, DB_FILE_NAME_TEMPLATE % stockSymbol) def getPreviousPrice(stockSymbol): db = getDb(stockSymbol) if os.path.exists(db): dbContent = open(db, "r") return float(dbContent.readlines()[-1]) else: return 0.0 def getCurrentPrice(stockSymbol): response = requests.get(WEBSITE_URL_TEMPLATE % stockSymbol) response.encoding = "utf-8" if response.status_code != 200: sys.exit("error: cannot find current price of %s" % stockSymbol) soup = BeautifulSoup(response.text, "html.parser") return float(soup.findAll("div", attrs={"class": "profilLast"})[0].string.rstrip(" zł").replace(",", ".")) def setBulbColor(bulb, previousPrice, currentPrice, lighterModeFactor): goingUp = previousPrice < currentPrice try: if goingUp: bulb.set_rgb(lighterModeFactor, 255, lighterModeFactor) else: bulb.set_rgb(255, lighterModeFactor, lighterModeFactor) except BulbException as ex: print(ex) pass def storeCurrentPrice(stockSymbol, currentPrice): dbContent = open(getDb(stockSymbol), "a") dbContent.write(str(currentPrice) + "\n") dbContent.close() if __name__ == "__main__": parser = argparse.ArgumentParser(description="Sets YeeLight bulb color based on GPW stock value change.") parser.add_argument("BULB_IP", help="a bulb IP address") parser.add_argument("STOCK_SYMBOL", help="a GPW stock symbol name") parser.add_argument("-l", "--lighter-mode", help="a lighter mode of the colors", action="store_true") args = parser.parse_args() main(args) |
Dlaczego nie z API giełdy?
Postanowiłem sczytywać bieżącą wartość akcji bezpośrednio ze strony bankier.pl, bo był to prosty sposób, a nie doszukałem się jakiegoś sensownego API, które dostarczałoby aktualnych danych z GPW.
Dlaczego Python?
Pythona wybrałem z dwóch powodów: po pierwsze, ze względu na to, że lubię ten język do pisania prostych skryptów, a po drugie ze względu na dostępną bibliotekę dla żarówki Yeelight.
Zadanie dla cron-a
Teraz wystarczy porozmawiać z cron-em i zlecić mu wykonywanie skryptu o odpowiedniej porze:
|
* 9-17 * * MON-FRI /path/to/YeeLightGPW.py 192.168.0.1 CDPROJEKT |
Powrót do normalnego trybu, gdy cena stoi w miejscu
Powyższy kod i zadanie dla cron-a powodują, że żarówka jest albo zielona, albo czerwona. Po kilku godzinach testowania stwierdziłem, że fajnie by było gdyby żarówka wracała do „normalnego” trybu gdy cena akcji się nie zmienia. Takie założenie można zrealizować dopisując dwie linijki do funkcji main
:
|
else: bulb.set_power_mode(PowerMode.NORMAL) |
oraz dodając odpowiedni import:
|
from yeelight import Bulb, BulbException, PowerMode |
Podsumowanie
Kolory zielony i czerwony towarzyszą mi teraz w codziennej pracy. Zgrało się to idealnie z bożonarodzeniowym okresem, a więc kolory bardzo trafione 😛 A jeżeli już jesteśmy przy Świętach, to przyjmij moje najserdeczniejsze życzenia z okazji rozpoczynających się Świąt Bożego Narodzenia, a także zbliżającego się Nowego Roku. Myślę, że najlepszym życzeniem na chwilę obecną, będzie życzenie jak najszybszego powrotu do normalności, prawda? 🙂
PS. Powyższy kod wrzuciłem do repozytorium w GitHubie. Jeżeli wpadnę na kolejny genialny pomysł wykorzystania żarówki Yeelight, to kod na pewno też tam dorzucę.
PPS. Ciekawe zastosowanie inteligentnej żarówki RGB zaproponowali chłopacy z firmy ecom.software.
Bądź na bieżąco!
Podobają Ci się treści publikowane na moim blogu? Nie chcesz niczego pominąć? Zachęcam Cię do subskrybowania kanału RSS, polubienia fanpage na Facebooku, zapisania się na listę mailingową:
lub śledzenia mnie na Twitterze. Generalnie polecam wykonanie wszystkich tych czynności, bo często zdarza się tak, że daną treść wrzucam tylko w jedno miejsce. Zawsze możesz zrobić to na próbę, a jeśli Ci się nie spodoba – zrezygnować
Dołącz do grup na Facebooku
Chcesz więcej? W takim razie zapraszam Cię do dołączenia do powiązanych grup na Facebooku, gdzie znajdziesz dodatkowe informacje na poruszane tutaj tematy, możesz podzielić się własnymi doświadczeniami i przemyśleniami, a przede wszystkim poznasz ludzi interesujących się tą samą tematyką co Ty.
W grupie Programista Na Swoim znajdziesz wiele doświadczonych osób chętnych do porozmawiania na tematy krążące wokół samozatrudnienia i prowadzenia programistycznej działalności gospodarczej. Vademecum Juniora przeznaczone jest zaś do wymiany wiedzy i doświadczeń na temat życia, kariery i problemów (niekoniecznie młodego) programisty.
Wesprzyj mnie
Jeżeli znalezione tutaj treści sprawiły, że masz ochotę wesprzeć moją działalność online, to zobacz na ile różnych sposobów możesz to zrobić. Niezależnie od tego co wybierzesz, będę Ci za to ogromnie wdzięczny.
Na wsparciu możesz także samemu zyskać. Wystarczy, że rzucisz okiem na listę różnych narzędzi, które używam i polecam. Decydując się na skorzystanie z któregokolwiek linku referencyjnego otrzymasz bonus również dla siebie.
Picture Credits
28 grudnia 2020 at 12:47
Polecam https://github.com/folkien/pyStock
5 stycznia 2021 at 17:54
Pod jakim kątem polecasz? Podobne analizy można znaleźć na różnych portalach. Czy ta jest jakaś szczególna? Poważnie pytam.
5 stycznia 2021 at 22:44
Jako źródło kodu w pythonie do pisania własnej analizy technicznej, fetchowania danych pandasem etc,
Zakładam, że skoro inwestujesz na giełdzie i piszesz kod w pythonie do żarówki to możliwe, że na żarówce się nie skończy i to rozwiniesz.
6 stycznia 2021 at 11:01
A to jak najbardziej. W planach nie mam niczego konkretnego, ale… kto wie, kto wie… jak mawia Sebastian Szczęsny 🙂