diff --git a/api_caller.py b/api_caller.py index 4863892..397fdcc 100644 --- a/api_caller.py +++ b/api_caller.py @@ -298,7 +298,7 @@ def updateCurrencies(api_key): json.dump([base, c_dict], open( "csv/currency.json", 'w+' )) -def updateSports(): +def updateSports(api_key): url = 'https://www.thesportsdb.com/api/v1/json/1/lookuptable.php?l=4328&s=2020-2021' # premier league table 'https://www.thesportsdb.com/api/v1/json/1/eventsnext.php?id=133602' # next five events by team ID (paid) use this for upcoming team games 'https://www.thesportsdb.com/api/v2/json/APIKEY/livescore.php?l=4380' #live scores @@ -397,6 +397,7 @@ if __name__ == '__main__': weather_key = 'bd5d5096a5ba30bbcfb57ead42ab3fee' currency_key = '862dbb6d1101ce0c5136' + sports_key = '97436974' updateCurrencies(currency_key) @@ -426,7 +427,7 @@ if __name__ == '__main__': updateCurrencies(currency_key) updateNews() updateWeather(weather_location, weather_key) - updateSports() + updateSports(sports_key) NY_time = datetime.now(NY_zone) symbols, stock_info = readCSV('csv/tickers.csv', max_stocks) diff --git a/csv/crypto.csv b/csv/crypto.csv index f9fbb47..3a9b710 100644 --- a/csv/crypto.csv +++ b/csv/crypto.csv @@ -1,3 +1,3 @@ symbol,name,base,current,24hr change -BTC,bitcoin,usd,36800,1.9889872710237515 -ETH,ethereum,gbp,1747.56,-3.706294583596982 +BTC,bitcoin,usd,41446,3.248036397011369 +ETH,ethereum,gbp,1853.43,1.422507551227988 diff --git a/csv/currency.json b/csv/currency.json index 752f833..db3afc4 100644 --- a/csv/currency.json +++ b/csv/currency.json @@ -1 +1 @@ -["USD", {"AUD": [1.2922, 1.29], "CAD": [1.2107, 1.2078], "CHF": [0.89609, 0.89487], "EUR": [0.82142, 0.82001], "GBP": [0.70883, 0.70564], "JPY": [109.54, 109.37], "NZD": [1.3908, 1.3879]}] \ No newline at end of file +["USD", {"AUD": [1.3001, 1.2959], "CAD": [1.2189, 1.2167], "CHF": [0.90015, 0.89903], "EUR": [0.8259, 0.82563], "GBP": [0.71151, 0.7092], "JPY": [110.08, 109.77], "NZD": [1.403, 1.4002]}] \ No newline at end of file diff --git a/csv/current_weather.json b/csv/current_weather.json index 9a5bc0c..c8a8761 100644 --- a/csv/current_weather.json +++ b/csv/current_weather.json @@ -1 +1 @@ -{"main_weather": "Clouds", "description": "overcast clouds", "temp": 28.57, "min_temp": 27.92, "max_temp": 29.1, "feels_like": 34.55, "humidity": 85, "clouds": 100, "wind_speed": 2.68, "wind_direction": 90, "visibility": 10000, "uv": 0, "rain_chance": 0} \ No newline at end of file +{"main_weather": "Clouds", "description": "overcast clouds", "temp": 29.6, "min_temp": 28.91, "max_temp": 30.21, "feels_like": 35.96, "humidity": 78, "clouds": 100, "wind_speed": 0.45, "wind_direction": 332, "visibility": 10000, "uv": 0, "rain_chance": 0.49} \ No newline at end of file diff --git a/csv/daily_weather.json b/csv/daily_weather.json index cf4de52..88adc8c 100644 --- a/csv/daily_weather.json +++ b/csv/daily_weather.json @@ -1 +1 @@ -[{"main_weather": "Rain", "description": "moderate rain", "min_temp": 27.81, "max_temp": 29.53}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 27.37, "max_temp": 28.25}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 27.02, "max_temp": 28.42}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 27.54, "max_temp": 29.06}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 27.74, "max_temp": 29.65}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 28.14, "max_temp": 29.86}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 28.1, "max_temp": 29.89}, {"main_weather": "Rain", "description": "light rain", "min_temp": 28.42, "max_temp": 29.49}] \ No newline at end of file +[{"main_weather": "Rain", "description": "light rain", "min_temp": 28.77, "max_temp": 30.09}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 28.25, "max_temp": 30.18}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 28.38, "max_temp": 30.34}, {"main_weather": "Rain", "description": "light rain", "min_temp": 28.71, "max_temp": 30.54}, {"main_weather": "Rain", "description": "light rain", "min_temp": 28.64, "max_temp": 30.36}, {"main_weather": "Rain", "description": "light rain", "min_temp": 28.8, "max_temp": 30.44}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 27.04, "max_temp": 29.26}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 26.78, "max_temp": 27.71}] \ No newline at end of file diff --git a/csv/last_update.csv b/csv/last_update.csv index ffc189d..f9afdfe 100644 --- a/csv/last_update.csv +++ b/csv/last_update.csv @@ -1 +1 @@ -14/06/2021 14:19:22 +15/06/2021 14:34:09 diff --git a/csv/news.csv b/csv/news.csv index c4792ab..fa6d8d8 100644 --- a/csv/news.csv +++ b/csv/news.csv @@ -1,21 +1,21 @@ headline,source,date,time -Manchester United have £67m Jadon Sancho bid rejected by Dortmund - The Guardian,The Guardian,2021-06-10,18:35:00Z -1 in 5 children struggle with mental health; here's how you can help - IOL,IOL,2021-06-10,18:21:08Z -State’s uptake of coronavirus vaccines to be among highest worldwide^ says Holohan - The Irish Times,The Irish Times,2021-06-10,18:19:34Z -Manitoba ties vaccination goals to summer holidays but reopening plan short on details - CBC.ca,CBC News,2021-06-10,18:18:14Z -Biden says US to buy and donate half-billion doses of Pfizer's Covid vaccine: 'We know the tragedy. We also know the path to recovery' - CNN ,CNN,2021-06-10,18:16:00Z -Boris Johnson hails Biden administration as ‘breath of fresh air’ after first meeting - Evening Standard,Evening Standard,2021-06-10,18:14:23Z -Study on plant roots challenges nature of ecological trade-offs - EurekAlert,EurekAlert,2021-06-10,18:04:28Z -Ethics committee calls for sweeping reforms in wake of WE Charity scandal - CBC.ca,CBC News,2021-06-10,18:02:27Z -Microsoft teases new Windows 11 startup sound with 11-minute video - The Verge,The Verge,2021-06-10,18:00:39Z -Wife of ‘El Chapo’ Guzmán pleads guilty to aiding husband’s drug trafficking empire - The Washington Post,The Washington Post,2021-06-10,17:59:00Z -No house price fall in sight^ ASB says in quarterly economic forecast - Stuff.co.nz,Stuff.co.nz,2021-06-10,17:58:00Z -Croatia moves to sanction 'revenge porn' - GMA News,GMA News,2021-06-10,17:54:07Z -England boosted by Rory Burns and Dan Lawrence fifties after New Zealand's six-wicket burst following lunch - Sky Sports,Sky Sports,2021-06-10,17:53:22Z -Then there were 3: NASA to collaborate on ESA's new Venus mission - Phys.org,Phys.Org,2021-06-10,17:50:17Z -Fingered for failings he’d forgotten^ Matt Hancock wriggles free - The Guardian,The Guardian,2021-06-10,17:47:00Z -COVID-19 live updates: Montrealers share frustrations – and tips – on speeding up second vaccine doses - Montreal Gazette,Montreal Gazette,2021-06-10,17:46:56Z -California appeals judge's ruling that overturned state's ban on assault-style weapons - CNN ,CNN,2021-06-10,17:45:00Z -Morrisons hit by huge pay revolt The Telegraph - The Telegraph,Telegraph.co.uk,2021-06-10,17:42:00Z -Cricket: Black Caps fight back from slow start on opening day of second test against England - New Zealand Herald,New Zealand Herald,2021-06-10,17:30:35Z -Shikhar Dhawan To Lead India In Sri Lanka ODI^ T20I Series As BCCI Names Squad - NDTVSports.com,NDTV News,2021-06-10,17:26:15Z +Hungary vs Portugal LIVE: Euro 2020 latest score^ goals and updates from fixture today - The Independent,Independent,2021-06-15,16:37:47Z +Smash Bros Ultimate DLC reveal: Tekken's Kazuya revealed as next Fighters Pass 2 brawler - Express,Express,2021-06-15,16:32:33Z +Duterte retains GCQ with restrictions in NCR Plus - The Manila Times,The Manila Times,2021-06-15,16:30:00Z +Noul sistem de operare mobil pentru care 4 milioane de dezvoltatori dezvolta aplicatii - Dojotech.ro,Dojotech.ro,2021-06-15,16:23:19Z +SC orders Disini: Pay government ₧1 billion in damages for $2.2-billion nuke plant | Joel R. San Juan - Business Mirror,Businessmirror.com.ph,2021-06-15,16:14:00Z +MP Yasmin Ratansi put herself in conflict of interest by employing foster sister: ethics commissioner - CBC.ca,CBC News,2021-06-15,16:13:03Z +Chicago mass shooting: 8 shot^ 4 fatally^ in Englewood home - Chicago Sun-Times,Suntimes.com,2021-06-15,16:10:07Z +China^ Its Military Might Expanding^ Accuses NATO of Hypocrisy - The New York Times,New York Times,2021-06-15,16:09:49Z +US retail sales fell in May; UK jobless rate drops and payrolls rise – business live - The Guardian,The Guardian,2021-06-15,16:07:54Z +Beats Studio Buds vs Apple AirPods Pro: the noise-cancelling earbuds compared - TechRadar,TechRadar,2021-06-15,16:06:16Z +India vs Afghanistan^ Highlights^ FIFA World Cup 2022 Qualifiers: India held to 1-1 draw - Firstpost,Firstpost,2021-06-15,16:02:53Z +Cicadas that come out every 17 years may emerge more often in the future - Science Magazine,Science Magazine,2021-06-15,16:00:00Z +Converge investing P1 billion for new data center - Philstar.com,Philippine Star,2021-06-15,16:00:00Z +Garland announces national strategy to combat domestic terrorism^ invoking US Capitol riot - CNN ,CNN,2021-06-15,15:55:00Z +Average Canadian house price up 38% compared to last year^ but down from March - CBC.ca,CBC News,2021-06-15,15:48:45Z +'Pure insanity': Emails detail Trump's pressure on Justice Department to overturn election - NBC News,NBC News,2021-06-15,15:48:26Z +UW astronomer redefines the scientific hero as part of The Great Courses - UW News,UW News,2021-06-15,15:46:44Z +Gone Girl actor Lisa Banes dies 10 days after hit-and-run - Independent.ie,Independent.ie,2021-06-15,15:44:00Z +Electrons can form a strange 2-D 'Flatland' in a superconductor - Games Bollyinside - BollyInside,Bollyinside.com,2021-06-15,15:43:49Z +BREAKING | There are no babies^ admits father of ‘Tembisa 10’ - News24,News24,2021-06-15,15:41:38Z diff --git a/csv/tickers.csv b/csv/tickers.csv index 015bed7..492aeb6 100644 --- a/csv/tickers.csv +++ b/csv/tickers.csv @@ -1,4 +1,4 @@ name,current,opening -MSFT,258.44,257.9 -NFLX,500.93,489.68 -GOOG,2508.46,2513.39 +MSFT,258.05,259.775 +NFLX,492.27,501.23 +GOOG,2519.23,2530.44 diff --git a/final.ppm b/final.ppm index d1c8c07..8d49351 100755 Binary files a/final.ppm and b/final.ppm differ diff --git a/server.py b/server.py index faba4a2..d04f18c 100644 --- a/server.py +++ b/server.py @@ -320,6 +320,16 @@ def matrix(): LastCommand = 'Run display' + + elif "Run League" in request.form: + ticker.sendline('K') + ticker.sendline('L') + + elif "Run Teams" in request.form: + print('teams') + ticker.sendline('K') + ticker.sendline('t') + elif "Stop Display" in request.form: print('run display') diff --git a/stockTicker.py b/stockTicker.py index 7b23efa..dd6f4e3 100644 --- a/stockTicker.py +++ b/stockTicker.py @@ -85,7 +85,6 @@ class StockTicker(): #https://groups.google.com/forum/#!topic/cython-users/Dc1ft5W6KM4 img_width, img_height = image.size - print('args', img_width, img_height, offset_x, offset_y, image) self.matrix.SetPixelsPillow(offset_x, offset_y, img_width, img_height, image) else: # First implementation of a SetImage(). OPTIMIZE_ME: A more native @@ -237,8 +236,6 @@ class StockTicker(): if matrix_height: height = 32 - print(text) - print('dims:', width, height) img = Image.new('RGB', (width + buff + 3, height+3)) d = ImageDraw.Draw(img) @@ -300,7 +297,7 @@ class StockTicker(): logos_path = os.path.join(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logos'), 'news_logos') logo = Image.open(os.path.join(logos_path, 'techcrunch' + '.png')) - print(logo.size) + img = Image.new('RGB', (headline_img.size[0], 32)) img.paste(headline_img, (2, -3)) img.paste(source_img, (2,16)) @@ -333,7 +330,6 @@ class StockTicker(): # To iterate through the entire gif i = 0 while True: - print(gif.tell()) try: gif.seek(i) except EOFError: @@ -459,7 +455,6 @@ class StockTicker(): new_im = Image.new('RGB', (total_width, max_height)) x_offset = 0 for im in image_list: - print(x_offset) new_im.paste(im, (x_offset,0)) x_offset += im.size[0] @@ -510,7 +505,7 @@ class StockTicker(): for i, coin in enumerate(self.coins): info = self.coin_info[coin] - print(info) + change = float(info[3]) #TEXT ticker = info[0] #TEXT current = float(info[2]) #TEXT @@ -546,9 +541,9 @@ class StockTicker(): for i, currency in enumerate(['AUD', 'CAD', 'CHF', 'EUR', 'GBP', 'JPY', 'NZD']): current, yesterday = currency_info[currency] - print(current, yesterday) + change = 1/current - 1/yesterday - print(change) + current = 1/current current = '%.3f' % current @@ -589,13 +584,126 @@ class StockTicker(): elif updated_img == 2: finalDisplayImage.save('final1.ppm') + + def getLeagueImage(self): + + img = Image.new('RGB', (10000, 32)) + league_info = json.load(open('/home/pi/Desktop/stock_ticker/csv/sports/premier_league/past_games.json', 'r')) + print(league_info[0].keys()) + small_font = ImageFont.load("./fonts/5x7.pil") + large_font = ImageFont.load("./fonts/10x20.pil") + + + buff_size = 20 + x_offset = 0 + print(len(league_info)) + + for match in league_info[-15:]: + home_team = match['home_team'] + away_team = match['away_team'] + + home_score = match['home_score'] + away_score = match['away_score'] + + date = match['date'] + + rond = match['round'] + + + try: + home_logo = Image.open('/home/pi/Desktop/stock_ticker/logos/sports/premier_league/' + home_team +'.png') + except: + home_logo = self.textImage(home_team.replace(' ', '\n'), small_font, r = 255, g = 255, b = 255) + print(home_team) + + try: + away_logo = Image.open('/home/pi/Desktop/stock_ticker/logos/sports/premier_league/' + away_team +'.png') + except: + away_logo = self.textImage(away_team.replace(' ', '\n'), small_font, r = 255, g = 255, b = 255) + + + + + home_timage = self.textImage(home_team, small_font, r = 255, g = 255, b = 255) + away_timage = self.textImage(away_team, small_font, r = 255, g = 255, b = 255) + date_timage = self.textImage(date, small_font, r = 255, g = 255, b = 0) + round_timage = self.textImage('round:' + rond, small_font, r = 255, g = 255, b = 255) + + score_image = self.textImage(home_score + '-' + away_score, large_font, r = 255, g = 255, b = 255) + + img.paste(home_logo, (x_offset,0)) + + x_offset += home_logo.size[0] + 2 + + #img.paste(home_timage, (x_offset, 0)) + #img.paste(away_timage, (x_offset, 5)) + img.paste(date_timage, (x_offset, 0)) + img.paste(round_timage, (x_offset+ 7, 8)) + img.paste(score_image, (x_offset+10, 15)) + + #x_offset += max(home_timage.size[0], away_timage.size[0], date_timage.size[0], round_timage.size[0], score_image.size[0]) + x_offset += max( date_timage.size[0], round_timage.size[0], score_image.size[0]) + + img.paste(away_logo, (x_offset,0)) + + x_offset += away_logo.size[0] + 2 + x_offset += buff_size + img = img.crop((0,0,x_offset ,32)) + + return img + + def getTeamsImage(self): + img = Image.new('RGB', (10000, 32)) + team_info = json.load(open('/home/pi/Desktop/stock_ticker/csv/sports/premier_league/team_stats.json', 'r')) + + small_font = ImageFont.load("./fonts/5x7.pil") + med_font = ImageFont.load("./fonts/7x14.pil") + large_font = ImageFont.load("./fonts/10x20.pil") + + buff_size = 20 + x_offset = 0 + for team in team_info: + try: + logo = Image.open('/home/pi/Desktop/stock_ticker/logos/sports/premier_league/' + team['name'] +'.png') + img.paste(logo, (x_offset, 0)) + x_offset += logo.size[0] + 2 + except: + print('no logo for:', team['name']) + + name_timage = self.textImage(team['name'], med_font, r = 255, g = 255, b = 0) + wins_timage = self.textImage('Wins:' + team['wins'], small_font, r = 0, g = 255, b = 0) + loss_timage = self.textImage('Losses:' + team['loss'], small_font, r = 255, g = 0, b = 0) + draw_timage = self.textImage('Draws:' + team['draw'], small_font, r = 0, g = 0, b = 255) + points_timage = self.textImage('Points:' + team['points'], small_font, r = 255, g = 255, b = 255) + standing_timage = self.textImage('Standing:' + team['standing'], small_font, r = 255, g = 255, b = 255) + + + + img.paste(name_timage, (x_offset, -2)) + img.paste(wins_timage, (x_offset, 11)) + img.paste(loss_timage, (x_offset, 18)) + img.paste(draw_timage, (x_offset, 25)) + + x_offset += max( wins_timage.size[0], loss_timage.size[0], draw_timage.size[0]) + img.paste(points_timage, (x_offset, 14)) + img.paste(standing_timage, (x_offset, 22)) + + x_offset += max(points_timage.size[0], standing_timage.size[0]) + buff_size + + + img = img.crop((0,0,x_offset ,32)) + + return img + + + def getTodayWeatherImage(self): img = Image.new('RGB', (200, 32)) f = open( "csv/weather_location.txt", 'r' ) location = f.read() f.close() - print(location) + current_weather = json.load(open('csv/current_weather.json', 'r')) @@ -624,7 +732,7 @@ class StockTicker(): img.paste(temp_img, (36,9)) deg_img = self.textImage('o', small_font) - print(temp_img.size) + img.paste(deg_img, (56, 8)) main = current_weather['main_weather'] @@ -693,8 +801,6 @@ class StockTicker(): vtext_img = self.textImage(str(current_weather['visibility']/1000) + 'km', small_font) img.paste(vtext_img, (168, 22)) - - return img def getDailyWeatherImageAlt(self): @@ -753,8 +859,6 @@ class StockTicker(): rain_img = Image.open(weather_dir + '/rain-chance.png') - - rtext_img = self.textImage(str(int(current_weather['rain_chance']*100)) + '%', extra_small_font) @@ -773,7 +877,7 @@ class StockTicker(): wtext_img = self.textImage(str(current_weather['wind_speed']) + 'm/s', extra_small_font) - print(temp_img.size) + img.paste(location_img, (0,0)) img.paste(weather_img, (0,12)) img.paste(temp_img, (30,9)) @@ -948,10 +1052,6 @@ class StockTicker(): vtext_img = self.textImage(str(current_weather['visibility']/1000) + 'km', small_font) - - - - print(temp_img.size) img.paste(location_img, (0,0)) img.paste(weather_img, (0,12)) img.paste(temp_img, (30,9)) @@ -1024,12 +1124,6 @@ class StockTicker(): return img1 - - #Send the final stitched image to the display for set amount of time - def displayStocks(self): - #os.system("sudo ./demo -D1 final.ppm -t " + str(displayTime) +" -m "+ str(speedDisplay) +" --led-gpio-mapping=adafruit-hat --led-rows=32 --led-cols=256") - #os.system("sudo ./demo -D1 final.ppm -t " + str(self.displayTime) +" -m "+ str(self.speedDisplay) +" --led-gpio-mapping=adafruit-hat --led-rows=64 --led-cols=64 --led-slowdown-gpio=4 ") - self.scrollImageTransition(['final.ppm', 'final.ppm'], offset_x = 0, offset_y = 0) #Retrieve symbols and stock info from the csv file @@ -1067,42 +1161,6 @@ class StockTicker(): f.close() - - - #Main run definition called by server - def runStockTicker(self, runtime, delay, speedtime): - - - self.getSymbols() - - self.GetfullStockImage() - self.keySwapper += 1 - self.running = True - - - while (True): - if (self.running == True): - - - #th = threading.Thread(target=self.displayMatrix) - #th.start() - self.displayMatrix() - time.sleep((int(runtime) - int(delay))) - self.getfullStockImage() - - #th.join() - - - else: - break; - - #Change running to false stopping refresh at next checkpoint - def stopStockTicker(self): - - - self.keySwapper = 0 - self.running = False - print('MATRIX DISPLAY STOP CALLED') def displayDailyWeatherAlt(self): img0, img1 = self.getDailyWeatherImageAlt() @@ -1144,11 +1202,10 @@ class StockTicker(): time.sleep(self.delay*1.1) - - - - - + def displayStocks(self): + + self.scrollImageTransition(['final.ppm', 'final.ppm'], offset_x = 0, offset_y = 0) + def process_msg(self, msg): if msg == 'S': # stocks @@ -1209,16 +1266,31 @@ class StockTicker(): #self.setImage( image) self.scrollImageTransition(['weather.ppm', 'weather.ppm'], stocks = False) + elif msg == 'L': # league + img = self.getLeagueImage() + img.save('league.ppm') + + stock_ticker.scrollImageTransition(['league.ppm', 'league.ppm'], stocks = False) + + elif msg == 't': #teams + img = self.getTeamsImage() + img.save('teams.ppm') + + stock_ticker.scrollImageTransition(['teams.ppm', 'teams.ppm'], stocks = False) + elif msg == 'K': # kill self.resetMatrix() if __name__ == '__main__': - - #print(sys.stdin.readlines()) + with open('log.txt', "w") as log: try: stock_ticker = StockTicker() + #img = stock_ticker.getLeagueImage() + #img.save('league.ppm') + + #stock_ticker.scrollImageTransition(['league.ppm', 'league.ppm'], stocks = False) diff --git a/templates/index.html b/templates/index.html index 9b45362..2f8d725 100644 --- a/templates/index.html +++ b/templates/index.html @@ -14,6 +14,8 @@ + + diff --git a/weather.ppm b/weather.ppm index 933f582..94a2f70 100755 Binary files a/weather.ppm and b/weather.ppm differ