Skip to content
Snippets Groups Projects
weatherclock.py 5.57 KiB
#!/usr/bin/env python

import pyowm
import time
from itertools import izip_longest as zip_longest
from datetime import datetime
from pytz import timezone
import unicornhathd as u

# WEATHER
owm = pyowm.OWM('API HERE HERE')
observation = owm.weather_at_place('Europe/Berlin')
w = observation.get_weather()

# TIME
england = timezone('Europe/Berlin')

# CREATING BINARY CLOCK MATRIX (Code for binary clock by Peter Simyoni: gist.github.com/psimonyi/2856099)
def main():
    return(vertical_strings(bcd(Now)))

# bcd :: iterable(characters '0'-'9') -> [str]
def bcd(digits):
    'Convert a string of decimal digits to binary-coded-decimal.'
    def bcdigit(d):
        'Convert a decimal digit to BCD (4 bits wide).'
        # [2:] strips the '0b' prefix added by bin().
        return bin(d)[2:].rjust(4, '0')
    return (bcdigit(int(d)) for d in digits)

# vertical_strings :: iterable(str) -> str
def vertical_strings(strings):
    'Orient an iterable of strings vertically: one string per column.'
    iters = [iter(s) for s in strings]
    concat = ''.join
    return '\n'.join(map(concat,
                         zip_longest(*iters, fillvalue=' ')))

# UNICORN
u.rotation(270)
u.brightness(0.3)

# clock
def set_hours():
    for i in range(4,12,2):
        if int(list(reversed(Time.split()))[i/2 - 2][0]) == 1:
            u.set_pixel(2,i,240,40,100)
            u.set_pixel(3,i,240,40,100)
            u.set_pixel(2,i+1,240,40,100)
            u.set_pixel(3,i+1,240,40,100)
        else:
            u.set_pixel(2,i,0,0,0)
            u.set_pixel(3,i,0,0,0)
            u.set_pixel(2,i+1,0,0,0)
            u.set_pixel(3,i+1,0,0,0)

    for i in range(4,12,2):
        if int(list(reversed(Time.split()))[i/2 - 2][1]) == 1:
            u.set_pixel(4,i,240,40,100)
            u.set_pixel(5,i,240,40,100)
            u.set_pixel(4,i+1,240,40,100)
            u.set_pixel(5,i+1,240,40,100)
        else:
            u.set_pixel(4,i,0,0,0)
            u.set_pixel(5,i,0,0,0)
            u.set_pixel(4,i+1,0,0,0)
            u.set_pixel(5,i+1,0,0,0)

def set_mins():
    for i in range(4,12,2):
        if int(list(reversed(Time.split()))[i/2 - 2][2]) == 1:
            u.set_pixel(6,i,40,240,130)
            u.set_pixel(7,i,40,240,130)
            u.set_pixel(6,i+1,40,240,130)
            u.set_pixel(7,i+1,40,240,130)
        else:
            u.set_pixel(6,i,0,0,0)
            u.set_pixel(7,i,0,0,0)
            u.set_pixel(6,i+1,0,0,0)
            u.set_pixel(7,i+1,0,0,0)

    for i in range(4,12,2):
        if int(list(reversed(Time.split()))[i/2 - 2][3]) == 1:
            u.set_pixel(8,i,40,240,130)
            u.set_pixel(9,i,40,240,130)
            u.set_pixel(8,i+1,40,240,130)
            u.set_pixel(9,i+1,40,240,130)
        else:
            u.set_pixel(8,i,0,0,0)
            u.set_pixel(9,i,0,0,0)
            u.set_pixel(8,i+1,0,0,0)
            u.set_pixel(9,i+1,0,0,0)

def set_secs():
    for i in range(4,12,2):
        if int(list(reversed(Time.split()))[i/2 - 2][4]) == 1:
            u.set_pixel(10,i,40,90,255)
            u.set_pixel(11,i,40,90,255)
            u.set_pixel(10,i+1,40,90,255)
            u.set_pixel(11,i+1,40,90,255)
        else:
            u.set_pixel(10,i,0,0,0)
            u.set_pixel(11,i,0,0,0)
            u.set_pixel(10,i+1,0,0,0)
            u.set_pixel(11,i+1,0,0,0)

    for i in range(4,12,2):
        if int(list(reversed(Time.split()))[i/2 - 2][5]) == 1:
            u.set_pixel(12,i,40,90,255)
            u.set_pixel(13,i,40,90,255)
            u.set_pixel(12,i+1,40,90,255)
            u.set_pixel(13,i+1,40,90,255)
        else:
            u.set_pixel(12,i,0,0,0)
            u.set_pixel(13,i,0,0,0)
            u.set_pixel(12,i+1,0,0,0)
            u.set_pixel(13,i+1,0,0,0)

def set_time():
    set_hours()
    set_mins()
    set_secs()

# border
status = w.get_status().lower()
for i in range(0,16):
    if status == 'snow':
        u.set_pixel(i,0,70,130,200)
        u.set_pixel(0,i,70,130,200)
        u.set_pixel(i,15,70,130,200)
        u.set_pixel(15,i,70,130,200)
    elif status == 'rain':
         u.set_pixel(i,0,70,130,255)
         u.set_pixel(0,i,70,130,255)
         u.set_pixel(i,15,70,130,255)
         u.set_pixel(15,i,70,130,255)   
    elif status == 'clouds':
         u.set_pixel(i,0,160,160,170)
         u.set_pixel(0,i,160,160,170)
         u.set_pixel(i,15,160,160,170)
         u.set_pixel(15,i,160,160,170)
    elif status == 'sunny':
         u.set_pixel(i,0,255,230,40)
         u.set_pixel(0,i,255,230,40)
         u.set_pixel(i,15,255,230,40)
    else:
        u.set_pixel(i,0,255,255,255)
        u.set_pixel(0,i,255,255,255)
        u.set_pixel(i,15,255,255,255)
        u.set_pixel(15,i,255,255,255)

#top and bottom bars
for i in range(3,13):
    u.set_pixel(i,2,255,255,255)
    u.set_pixel(i,13,255,255,255)

#temperature bar
def roundTo(x, base):
    return int(base * round(float(x)/base))

tempDots = roundTo(w.get_temperature('celsius')['temp'],5)/5

for i in range(0,tempDots):
    u.set_pixel(i+3,2,255,185,20)

#humidity bar
humidityDots = roundTo(w.get_humidity(),10)/10

for i in range(0,humidityDots):
    u.set_pixel(i+3,13,110,130,255)

count = 0

#do the things
while True:
    Now = datetime.now(england).strftime('%H%M%S')
    Time = main()
    set_time()

    count+=1

    if count == 4:
        w = observation.get_weather()

        tempDots = roundTo(w.get_temperature('celsius')['temp'],5)/5
        humidityDots = roundTo(w.get_humidity(),10)/10

        for i in range(0,tempDots):
            u.set_pixel(i+3,2,255,185,20)

        for i in range(0,humidityDots):
            u.set_pixel(i+3,13,110,130,255)

        count = 0

    u.show()
    time.sleep(1)