From: sandyjmacdonald Date: Mon, 24 Feb 2020 13:46:54 +0000 (+0000) Subject: Python 3-related fixes, moving to pip fonts, fixing Astral errors. X-Git-Url: https://zdv2.bktei.com/gitweb/EVA-2020-02-2.git/commitdiff_plain/20442c9a53edb05b925faa07eb8360bd46442978?hp=-c Python 3-related fixes, moving to pip fonts, fixing Astral errors. --- 20442c9a53edb05b925faa07eb8360bd46442978 diff --git a/examples/adc.py b/examples/adc.py index 82bda41..a345d23 100755 --- a/examples/adc.py +++ b/examples/adc.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import time from enviroplus import gas diff --git a/examples/all-in-one-no-pm.py b/examples/all-in-one-no-pm.py index 6bb6873..db1ca8c 100755 --- a/examples/all-in-one-no-pm.py +++ b/examples/all-in-one-no-pm.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import time import colorsys @@ -18,6 +18,7 @@ from subprocess import PIPE, Popen from PIL import Image from PIL import ImageDraw from PIL import ImageFont +from fonts.ttf import RobotoMedium as UserFont import logging logging.basicConfig( @@ -52,7 +53,8 @@ HEIGHT = st7735.height img = Image.new('RGB', (WIDTH, HEIGHT), color=(0, 0, 0)) draw = ImageDraw.Draw(img) path = os.path.dirname(os.path.realpath(__file__)) -font = ImageFont.truetype(path + "/fonts/Asap/Asap-Bold.ttf", 20) +font_size = 20 +font = ImageFont.truetype(UserFont, FontSize) message = "" @@ -96,7 +98,7 @@ def get_cpu_temperature(): # Tuning factor for compensation. Decrease this number to adjust the # temperature down, and increase to adjust up -factor = 0.8 +factor = 2.25 cpu_temps = [get_cpu_temperature()] * 5 diff --git a/examples/all-in-one.py b/examples/all-in-one.py index 03e4d58..c0423e6 100755 --- a/examples/all-in-one.py +++ b/examples/all-in-one.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import time import colorsys @@ -19,6 +19,7 @@ from subprocess import PIPE, Popen from PIL import Image from PIL import ImageDraw from PIL import ImageFont +from fonts.ttf import RobotoMedium as UserFont import logging logging.basicConfig( @@ -57,8 +58,8 @@ HEIGHT = st7735.height # Set up canvas and font img = Image.new('RGB', (WIDTH, HEIGHT), color=(0, 0, 0)) draw = ImageDraw.Draw(img) -path = os.path.dirname(os.path.realpath(__file__)) -font = ImageFont.truetype(path + "/fonts/Asap/Asap-Bold.ttf", 20) +font_size = 20 +font = ImageFont.truetype(UserFont, font_size) message = "" @@ -102,7 +103,7 @@ def get_cpu_temperature(): # Tuning factor for compensation. Decrease this number to adjust the # temperature down, and increase to adjust up -factor = 0.8 +factor = 2.25 cpu_temps = [get_cpu_temperature()] * 5 diff --git a/examples/combined.py b/examples/combined.py old mode 100644 new mode 100755 index e863de3..43668a5 --- a/examples/combined.py +++ b/examples/combined.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import time import colorsys @@ -19,6 +19,7 @@ from subprocess import PIPE, Popen from PIL import Image from PIL import ImageDraw from PIL import ImageFont +from fonts.ttf import RobotoMedium as UserFont import logging logging.basicConfig( @@ -57,9 +58,10 @@ HEIGHT = st7735.height # Set up canvas and font img = Image.new('RGB', (WIDTH, HEIGHT), color=(0, 0, 0)) draw = ImageDraw.Draw(img) -path = os.path.dirname(os.path.realpath(__file__)) -font = ImageFont.truetype(path + "/fonts/Asap/Asap-Bold.ttf", 20) -smallfont = ImageFont.truetype(path + "/fonts/Asap/Asap-Bold.ttf", 10) +font_size_small = 10 +font_size_large = 20 +font = ImageFont.truetype(UserFont, font_size_large) +smallfont = ImageFont.truetype(UserFont, font_size_small) x_offset = 2 y_offset = 2 @@ -166,7 +168,7 @@ def display_everything(): draw.rectangle((0, 0, WIDTH, HEIGHT), (0, 0, 0)) column_count = 2 row_count = (len(variables)/column_count) - for i in xrange(len(variables)): + for i in range(len(variables)): variable = variables[i] data_value = values[variable][-1] unit = units[i] @@ -175,7 +177,7 @@ def display_everything(): message = "{}: {:.1f} {}".format(variable[:4], data_value, unit) lim = limits[i] rgb = palette[0] - for j in xrange(len(lim)): + for j in range(len(lim)): if data_value > lim[j]: rgb = palette[j+1] draw.text((x, y), message, font=smallfont, fill=rgb) @@ -192,7 +194,7 @@ def get_cpu_temperature(): # Tuning factor for compensation. Decrease this number to adjust the # temperature down, and increase to adjust up -factor = 1.95 +factor = 2.25 cpu_temps = [get_cpu_temperature()] * 5 diff --git a/examples/compensated-temperature.py b/examples/compensated-temperature.py index 74b6bab..b648f57 100755 --- a/examples/compensated-temperature.py +++ b/examples/compensated-temperature.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import time from bme280 import BME280 @@ -38,7 +38,7 @@ def get_cpu_temperature(): # Tuning factor for compensation. Decrease this number to adjust the # temperature down, and increase to adjust up -factor = 0.8 +factor = 2.25 cpu_temps = [get_cpu_temperature()] * 5 diff --git a/examples/fonts/Asap/Asap-Bold.ttf b/examples/fonts/Asap/Asap-Bold.ttf deleted file mode 100644 index 52a14e5..0000000 Binary files a/examples/fonts/Asap/Asap-Bold.ttf and /dev/null differ diff --git a/examples/fonts/Asap/Asap-BoldItalic.ttf b/examples/fonts/Asap/Asap-BoldItalic.ttf deleted file mode 100644 index df29023..0000000 Binary files a/examples/fonts/Asap/Asap-BoldItalic.ttf and /dev/null differ diff --git a/examples/fonts/Asap/Asap-Italic.ttf b/examples/fonts/Asap/Asap-Italic.ttf deleted file mode 100644 index b07a0bc..0000000 Binary files a/examples/fonts/Asap/Asap-Italic.ttf and /dev/null differ diff --git a/examples/fonts/Asap/Asap-Medium.ttf b/examples/fonts/Asap/Asap-Medium.ttf deleted file mode 100644 index 81ef310..0000000 Binary files a/examples/fonts/Asap/Asap-Medium.ttf and /dev/null differ diff --git a/examples/fonts/Asap/Asap-MediumItalic.ttf b/examples/fonts/Asap/Asap-MediumItalic.ttf deleted file mode 100644 index 6f8d906..0000000 Binary files a/examples/fonts/Asap/Asap-MediumItalic.ttf and /dev/null differ diff --git a/examples/fonts/Asap/Asap-Regular.ttf b/examples/fonts/Asap/Asap-Regular.ttf deleted file mode 100644 index af00196..0000000 Binary files a/examples/fonts/Asap/Asap-Regular.ttf and /dev/null differ diff --git a/examples/fonts/Asap/Asap-SemiBold.ttf b/examples/fonts/Asap/Asap-SemiBold.ttf deleted file mode 100644 index 5328f3f..0000000 Binary files a/examples/fonts/Asap/Asap-SemiBold.ttf and /dev/null differ diff --git a/examples/fonts/Asap/Asap-SemiBoldItalic.ttf b/examples/fonts/Asap/Asap-SemiBoldItalic.ttf deleted file mode 100644 index 6415ef2..0000000 Binary files a/examples/fonts/Asap/Asap-SemiBoldItalic.ttf and /dev/null differ diff --git a/examples/fonts/Asap/OFL.txt b/examples/fonts/Asap/OFL.txt deleted file mode 100644 index ad56d30..0000000 --- a/examples/fonts/Asap/OFL.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2016 The Asap Project Authors (omnibus.type@gmail.com) - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/examples/gas.py b/examples/gas.py index 2f84944..5d72cb9 100755 --- a/examples/gas.py +++ b/examples/gas.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import time from enviroplus import gas diff --git a/examples/lcd.py b/examples/lcd.py index 7e50c94..10413b9 100755 --- a/examples/lcd.py +++ b/examples/lcd.py @@ -1,7 +1,8 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import ST7735 from PIL import Image, ImageDraw, ImageFont +from fonts.ttf import RobotoMedium as UserFont import logging logging.basicConfig( @@ -38,7 +39,7 @@ draw = ImageDraw.Draw(img) # Text settings. font_size = 25 -font = ImageFont.truetype("fonts/Asap/Asap-Bold.ttf", font_size) +font = ImageFont.truetype(UserFont, font_size) text_colour = (255, 255, 255) back_colour = (0, 170, 170) diff --git a/examples/light.py b/examples/light.py index b18a78b..db61e6a 100755 --- a/examples/light.py +++ b/examples/light.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import time import logging diff --git a/examples/luftdaten.py b/examples/luftdaten.py index 9995914..d2d6562 100755 --- a/examples/luftdaten.py +++ b/examples/luftdaten.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import requests import ST7735 @@ -7,6 +7,7 @@ from bme280 import BME280 from pms5003 import PMS5003, ReadTimeoutError from subprocess import PIPE, Popen, check_output from PIL import Image, ImageDraw, ImageFont +from fonts.ttf import RobotoMedium as UserFont try: from smbus2 import SMBus @@ -74,7 +75,6 @@ def read_values(): def get_cpu_temperature(): process = Popen(['vcgencmd', 'measure_temp'], stdout=PIPE, universal_newlines=True) output, _error = process.communicate() - output = output.decode() return float(output[output.index('=') + 1:output.rindex("'")]) @@ -150,7 +150,7 @@ def send_to_luftdaten(values, id): # Compensation factor for temperature -comp_factor = 1.2 +comp_factor = 2.25 # Raspberry Pi ID to send to Luftdaten id = "raspi-" + get_serial_number() @@ -161,7 +161,7 @@ HEIGHT = disp.height # Text settings font_size = 16 -font = ImageFont.truetype("fonts/Asap/Asap-Bold.ttf", font_size) +font = ImageFont.truetype(UserFont, font_size) # Display Raspberry Pi serial and Wi-Fi status print("Raspberry Pi serial: {}".format(get_serial_number())) diff --git a/examples/particulates.py b/examples/particulates.py index 9aa9c37..28bb88e 100755 --- a/examples/particulates.py +++ b/examples/particulates.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import time from pms5003 import PMS5003, ReadTimeoutError diff --git a/examples/weather-and-light.py b/examples/weather-and-light.py old mode 100644 new mode 100755 index c741764..fde1d96 --- a/examples/weather-and-light.py +++ b/examples/weather-and-light.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +import os import time import numpy import colorsys @@ -11,7 +12,8 @@ from bme280 import BME280 from ltr559 import LTR559 import pytz -from astral import Astral +from astral.geocoder import database, lookup +from astral.sun import sun from datetime import datetime, timedelta try: @@ -81,8 +83,7 @@ def sun_moon_time(dt, city_name, time_zone): """Calculate the progress through the current sun/moon period (i.e day or night) from the last sunrise or sunset, given a datetime object 't'.""" - a = Astral() - city = a[city_name] + city = lookup(city_name, database()) # Datetime objects for yesterday, today, tomorrow today = dt.date() @@ -91,14 +92,14 @@ def sun_moon_time(dt, city_name, time_zone): tomorrow = today + timedelta(1) # Sun objects for yesterfay, today, tomorrow - sun_yesterday = city.sun(date=yesterday, local=True) - sun = city.sun(date=today, local=True) - sun_tomorrow = city.sun(date=tomorrow, local=True) + sun_yesterday = sun(city.observer, date=yesterday) + sun_today = sun(city.observer, date=today) + sun_tomorrow = sun(city.observer, date=tomorrow) # Work out sunset yesterday, sunrise/sunset today, and sunrise tomorrow sunset_yesterday = sun_yesterday["sunset"] - sunrise_today = sun["sunrise"] - sunset_today = sun["sunset"] + sunrise_today = sun_today["sunrise"] + sunset_today = sun_today["sunset"] sunrise_tomorrow = sun_tomorrow["sunrise"] # Work out lengths of day or night period and progress through period @@ -324,8 +325,8 @@ dt = datetime.now() bus = SMBus(1) bme280 = BME280(i2c_dev=bus) -min_temp = bme280.get_temperature() -max_temp = bme280.get_temperature() +min_temp = None +max_temp = None factor = 2.25 cpu_temps = [get_cpu_temperature()] * 5 @@ -340,13 +341,17 @@ num_vals = 1000 interval = 1 trend = "-" +# Keep track of time elapsed +start_time = time.time() + while True: + path = os.path.dirname(os.path.realpath(__file__)) dt = datetime.now() -# dt += timedelta(minutes=5) progress, period, day = sun_moon_time(dt, city_name, time_zone) background = draw_background(progress, period, day) # Time. + time_elapsed = time.time() - start_time date_string = dt.strftime("%d %b %y").lstrip('0') time_string = dt.strftime("%H:%M") img = overlay_text(background, (0 + margin, 0 + margin), time_string, font_lg) @@ -361,17 +366,25 @@ while True: avg_cpu_temp = sum(cpu_temps) / float(len(cpu_temps)) corr_temperature = temperature - ((avg_cpu_temp - temperature) / factor) - if corr_temperature < min_temp: - min_temp = corr_temperature - elif corr_temperature > max_temp: - max_temp = corr_temperature + if time_elapsed > 30: + if min_temp is not None and max_temp is not None: + if corr_temperature < min_temp: + min_temp = corr_temperature + elif corr_temperature > max_temp: + max_temp = corr_temperature + else: + min_temp = corr_temperature + max_temp = corr_temperature temp_string = f"{corr_temperature:.0f}°C" img = overlay_text(img, (68, 18), temp_string, font_lg, align_right=True) spacing = font_lg.getsize(temp_string)[1] + 1 - range_string = f"{min_temp:.0f}-{max_temp:.0f}" + if min_temp is not None and max_temp is not None: + range_string = f"{min_temp:.0f}-{max_temp:.0f}" + else: + range_string = "------" img = overlay_text(img, (68, 18 + spacing), range_string, font_sm, align_right=True, rectangle=True) - temp_icon = Image.open("icons/temperature.png") + temp_icon = Image.open(path + "/icons/temperature.png") img.paste(temp_icon, (margin, 18), mask=temp_icon) # Humidity @@ -382,7 +395,7 @@ while True: spacing = font_lg.getsize(humidity_string)[1] + 1 humidity_desc = describe_humidity(corr_humidity).upper() img = overlay_text(img, (68, 48 + spacing), humidity_desc, font_sm, align_right=True, rectangle=True) - humidity_icon = Image.open("icons/humidity-" + humidity_desc.lower() + ".png") + humidity_icon = Image.open(path + "/icons/humidity-" + humidity_desc.lower() + ".png") img.paste(humidity_icon, (margin, 48), mask=humidity_icon) # Light @@ -392,7 +405,7 @@ while True: spacing = font_lg.getsize(light_string.replace(",", ""))[1] + 1 light_desc = describe_light(light).upper() img = overlay_text(img, (WIDTH - margin - 1, 18 + spacing), light_desc, font_sm, align_right=True, rectangle=True) - light_icon = Image.open("icons/bulb-" + light_desc.lower() + ".png") + light_icon = Image.open(path + "/icons/bulb-" + light_desc.lower() + ".png") img.paste(humidity_icon, (80, 18), mask=light_icon) # Pressure @@ -404,7 +417,7 @@ while True: pressure_desc = describe_pressure(mean_pressure).upper() spacing = font_lg.getsize(pressure_string.replace(",", ""))[1] + 1 img = overlay_text(img, (WIDTH - margin - 1, 48 + spacing), pressure_desc, font_sm, align_right=True, rectangle=True) - pressure_icon = Image.open("icons/weather-" + pressure_desc.lower() + ".png") + pressure_icon = Image.open(path + "/icons/weather-" + pressure_desc.lower() + ".png") img.paste(pressure_icon, (80, 48), mask=pressure_icon) # Display image diff --git a/examples/weather.py b/examples/weather.py index 5036021..66f18e0 100755 --- a/examples/weather.py +++ b/examples/weather.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import time from bme280 import BME280 diff --git a/library/setup.cfg b/library/setup.cfg index ed7cef7..9375d3c 100644 --- a/library/setup.cfg +++ b/library/setup.cfg @@ -33,6 +33,10 @@ install_requires = ltr559 st7735 ads1015 + fonts + font-roboto + astral + pytz [flake8] exclude = diff --git a/library/setup.py b/library/setup.py index 08ebdc5..784db51 100755 --- a/library/setup.py +++ b/library/setup.py @@ -32,5 +32,5 @@ if parse_version(__version__) < minimum_version: setup( packages=['enviroplus'], - install_requires=['setuptools>={}'.format(minimum_version), 'pimoroni-bme280', 'pms5003', 'ltr559', 'st7735', 'ads1015'] + install_requires=['setuptools>={}'.format(minimum_version), 'pimoroni-bme280', 'pms5003', 'ltr559', 'st7735', 'ads1015', 'fonts', 'font-roboto', 'astral', 'pytz'] )