def first_event_time() -> datetime.datetime: try: events = get_events() except googleapiclient.errors.HttpError: log("Error getting calendar events") return None for event in events: if 'dateTime' in event['start'].keys(): event['start']['dateTime'] = parse(event['start']['dateTime']) else: event['start']['dateTime'] = parse(event['start']['date'] + "T00:00:00Z") events.sort(key=lambda event: event['start']['dateTime']) firstTime = None if datetime.datetime.now().hour <= 5: day = datetime.datetime.now().date() else: day = datetime.datetime.now().date() + datetime.timedelta(days=1) for event in events: time = event['start']['dateTime'] if day == time.date(): firstTime = time break return firstTime
def go(name): """Redirects to a link.""" url = data.get_url(name) if not url: return redirect('/.edit?name=' + urlquote(name)) qs = (request.query_string or '').encode('utf-8') if qs: url += ('&' if '?' in url else '?') + qs data.log('redirect', name, url) data.update_count(name) return redirect(url)
def test_funcs_multi(self): pi = math.pi # sin family self.assertQuantity(data.sin(Quantity( (0,pi/2), (2,2))), (0,1), (2,0)) self.assertQuantity(data.sinh(Quantity((0,1), (2,2))), (0, math.sinh(1)), (2, math.cosh(1)*2)) self.assertQuantity(data.asin(Quantity((0,0.5), (2,2))), (0,math.asin(0.5)), (2,2/math.sqrt(1-0.5**2))) self.assertQuantity(data.asinh(Quantity((0,1), (2,2))), (0,math.asinh(1)), (2,2/math.sqrt(1+1**2))) # cos family self.assertQuantity(data.cos(Quantity((0,pi/2), (2,2))), (1,0), (0,-2)) self.assertQuantity(data.cosh(Quantity((0,1), (2,2))), (1,math.cosh(1)), (0,math.sinh(1)*2)) self.assertQuantity(data.acos(Quantity((0,0.5), (2,2))), (math.acos(0),math.acos(0.5)), (-2,-2/math.sqrt(1-0.5**2))) self.assertQuantity(data.acosh(Quantity((2,3), (2,2))), (math.acosh(2), math.acosh(3)), (2/math.sqrt(2**2-1),2/math.sqrt(3**2-1))) # tan family self.assertQuantity(data.tan(Quantity((0,1), (2,2))), (0,math.tan(1)), (2,2/math.cos(1)**2)) self.assertQuantity(data.tanh(Quantity((0,1), (2,2))), (0,math.tanh(1)), (2,2/math.cosh(1)**2)) self.assertQuantity(data.atan(Quantity((0,1), (2,2))), (0, math.atan(1)), (2,2/(1+1**2))) self.assertQuantity(data.atan2(Quantity((0,1), (2,2)), Quantity((1,1), (0,0))), (0,math.atan(1)), (2,2/(1+1**2))) self.assertQuantity(data.atanh(Quantity((0,0.5), (2,2))), (0,math.atanh(0.5)), (2,2/(1-0.5**2))) #misc self.assertQuantity(data.sqrt(Quantity((1,4), (2,2))), (1,2), (1,1/2)) self.assertQuantity(data.exp(Quantity((1,4), (2,2))), (math.e, math.e**4), (2 * math.e,2*math.e**4)) self.assertQuantity(data.log(Quantity((1,4), (2,2))), (0, math.log(4)), (2,1/2))
def _set(command): main_light, led_light = connect_lights() command = command.split('/') if len(command) == 2: if command[1] == 'get': if command[0] == 'mode': return data_file.get('mode') if command[0] == 'on': return get_on() if len(command) == 3: if command[2] == 'get': colours = get_palette()[command[1]] return colours if command[0] == 'mode': mode = command[1] data_file.set('mode', mode) if len(command) < 3: command = ['auto'] else: command = command[2:] if command[0] == 'toggle': if get_on() == 2: command[0] = 'off' if get_on() < 2: command[0] = 'on' if command[0] == 'on': main_light.turn_on() led_light.turn_on() if command[0] == 'off': main_light.turn_off() led_light.turn_off() if command[0] == 'auto': main_light.set_colour() led_light.set_colour() if command[0] == 'silent': pass # Don't update if command[0] == 'reconnect': connect_lights() else: log("Lights: ", command) return "Done"
def save(): """Creates or edits a link in the database.""" original_name = request.form.get('original_name', '').lstrip('.') name = request.form.get('name', '').lstrip('.') url = request.form.get('url', '') if not name: return make_error_response('The shortcut must be made of letters.') if not (url.startswith('http://') or url.startswith('https://')): return make_error_response('URLs must start with http:// or https://.') try: if original_name: if not data.update_link(original_name, name, url): return make_error_response( 'Someone else renamed go/{}.'.format(original_name)) data.log('update', name, url) else: data.add_link(name, url) data.log('create', name, url) except data.IntegrityError: return make_error_response('go/{} already exists.'.format(name)) return redirect('/.edit?name=' + urlquote(name))
def save(): """Creates or edits a link in the database.""" original_name = request.form.get('original_name', '').lstrip('.') name = request.form.get('name', '').lstrip('.') url = request.form.get('url', '') if not name: return make_error_response('The shortcut must be made of letters.') if not re.match(r'^(http|https)://', url): return make_error_response('URLs must start with http:// or https://.') if request.form.get('delete'): data.delete_link(original_name) data.log('delete', original_name, url) return redirect('/') try: if original_name: if not data.update_link(original_name, name, url): return make_error_response( 'Someone else renamed go.wave.com/%s.' % original_name) data.log('update', name, url) else: data.add_link(name, url) data.log('create', name, url) except data.IntegrityError: return make_error_response('go.wave.com/%s already exists.' % name) return redirect('/.edit?name=' + urlquote(name))
def go(name): """Redirects to a link.""" url = data.get_url(name) or data.get_url(normalize(name)) # If "foo/bar/baz" is not found, try "foo/bar" and append "/baz"; # if that's not found, try "foo" and append "/bar/baz". suffix = '' while not url and '/' in name: name, part = name.rsplit('/', 1) suffix = '/' + part + suffix url = data.get_url(name) or data.get_url(normalize(name)) if not url: return redirect('/.edit?name=' + urlquote(name + suffix)) if '%s' in url: url = url.replace('%s', urlquote(suffix.lstrip('/'))) else: url += suffix qs = (request.query_string or '').encode('utf-8') if qs: url += ('&' if '?' in url else '?') + qs data.log('redirect', name, url) data.update_count(name) return redirect(url)
def _schedule(): log("Scheduler Started") while True: with open('scheduler_test', 'w') as f: f.write(str(datetime.now())) doLog = True if data_file.get('suspend_schedule'): continue cur_time = datetime.now() for trigger in get_schedules(): # type: dict days = trigger["day"] if "all" in days or cur_time.strftime("%a") in days: if trigger["time"] == "sunset": t = sun.get_sunset_time().astimezone(tz=tzlocal()).replace( tzinfo=None) #print("sunset", t) elif trigger["time"][0] == "M": doLog = False interval = int(trigger["time"][1:]) t = cur_time while t.minute % interval != 0: t += timedelta(seconds=5) elif trigger["time"][0] == "H": interval = int(trigger["time"][1:]) t = cur_time while t.hour % interval != 0: t += timedelta(seconds=5) else: t = parse(trigger["time"]) t += timedelta(seconds=int(trigger.get('offset', 0))) #print(trigger, t) #print("{} triggers at {} in {} seconds".format(trigger["command"], t, (t - cur_time).seconds)) if abs((t - cur_time).seconds) < 10: if doLog: log(trigger, 'triggered at', t) try: get("http://localhost/api/" + trigger["command"]) except: log("Failed to send command") time.sleep(5)
def test_funcs(self): pi = math.pi # sin family self.assertQuantity(data.sin(Quantity(0, 2)), 0, 2) self.assertQuantity(data.sin(Quantity(pi/2, 2)), 1, 0) self.assertAlmostEqual(data.sin( pi/2 ), 1) self.assertQuantity(data.sinh(Quantity(0, 2)), 0, 2) self.assertQuantity(data.sinh(Quantity(1, 2)), math.sinh(1), math.cosh(1)*2) self.assertAlmostEqual( data.sinh( 1 ), math.sinh(1)) self.assertQuantity(data.asin(Quantity(0, 2)), 0, 2) self.assertQuantity(data.asin(Quantity(0.5, 2)), math.asin(0.5), 2/math.sqrt(1-0.5**2)) self.assertAlmostEqual( data.asin( 0.5 ), math.asin(0.5)) self.assertQuantity(data.asinh(Quantity(0, 2)), 0, 2) self.assertQuantity(data.asinh(Quantity(1, 2)), math.asinh(1), 2/math.sqrt(1+1**2)) self.assertAlmostEqual( data.asinh( 1 ), math.asinh(1)) # cos family self.assertQuantity(data.cos(Quantity(0, 2)), 1, 0) self.assertQuantity(data.cos(Quantity(pi/2, 2)), 0, -2) self.assertAlmostEqual( data.cos( pi/2 ), 0) self.assertQuantity(data.cosh(Quantity(0, 2)), 1, 0) self.assertQuantity(data.cosh(Quantity(1, 2)), math.cosh(1), math.sinh(1)*2) self.assertAlmostEqual( data.cosh( 1 ), math.cosh(1)) self.assertQuantity(data.acos(Quantity(0, 2)), math.acos(0), -2) self.assertQuantity(data.acos(Quantity(0.5, 2)), math.acos(0.5), -2/math.sqrt(1-0.5**2)) self.assertAlmostEqual( data.acos( 0.5 ), math.acos(0.5)) self.assertQuantity(data.acosh(Quantity(2, 2)), math.acosh(2), 2/math.sqrt(2**2-1)) self.assertQuantity(data.acosh(Quantity(3, 2)), math.acosh(3), 2/math.sqrt(3**2-1)) self.assertAlmostEqual( data.acosh( 3 ), math.acosh(3)) # tan family self.assertQuantity(data.tan(Quantity(0, 2)), 0, 2) self.assertQuantity(data.tan(Quantity(1, 2)), math.tan(1), 2/math.cos(1)**2) self.assertAlmostEqual( data.tan( 1 ), math.tan(1)) self.assertQuantity(data.tanh(Quantity(0, 2)), 0, 2) self.assertQuantity(data.tanh(Quantity(1, 2)), math.tanh(1), 2/math.cosh(1)**2) self.assertAlmostEqual( data.tanh( 1 ), math.tanh(1)) self.assertQuantity(data.atan(Quantity(0, 2)), 0, 2) self.assertQuantity(data.atan(Quantity(1, 2)), math.atan(1), 2/(1+1**2)) self.assertAlmostEqual( data.atan( 1 ), math.atan(1)) self.assertQuantity(data.atan2(Quantity(0, 2), Quantity(1, 0)), 0, 2) self.assertQuantity(data.atan2(Quantity(1, 2), Quantity(1, 0)), math.atan(1), 2/(1+1**2)) self.assertAlmostEqual( data.atan2( 1, 1 ), math.atan(1)) self.assertQuantity(data.atan2(Quantity(2, 2), Quantity(-1, 1)), math.atan2(2, -1), math.sqrt(8) / (1+2**2)) self.assertQuantity(data.atanh(Quantity(0, 2)), 0, 2) self.assertQuantity(data.atanh(Quantity(0.5, 2)), math.atanh(0.5), 2/(1-0.5**2)) self.assertAlmostEqual( data.atanh( 0.5 ), math.atanh(0.5)) #misc self.assertQuantity(data.sqrt(Quantity(1, 2)), 1, 1) self.assertQuantity(data.sqrt(Quantity(4, 2)), 2, 1/2) self.assertAlmostEqual(data.sqrt( 4 ), 2) self.assertQuantity(data.sqrt(Quantity(1, 2, 'm^2')), 1, 1, self.METER) self.assertQuantity(data.exp(Quantity(1, 2)), math.e, 2 * math.e) self.assertQuantity(data.exp(Quantity(4, 2)), math.e**4, 2*math.e**4) self.assertAlmostEqual(data.exp( 4 ), math.e**4) self.assertQuantity(data.log(Quantity(1, 2)), 0, 2) self.assertQuantity(data.log(Quantity(4, 2)), math.log(4), 1/2) self.assertAlmostEqual(data.log( 4 ), math.log(4)) self.assertQuantity(data.log2(Quantity(1, 2)), 0, 2/math.log(2)) self.assertQuantity(data.log2(Quantity(4, 2)), 2, 2/(math.log(2) * 4)) self.assertAlmostEqual(data.log2( 4 ), 2) self.assertQuantity(data.log10(Quantity(1, 2)), 0, 2/math.log(10)) self.assertQuantity(data.log10(Quantity(100, 2)), 2, 2/(math.log(10) * 100)) self.assertAlmostEqual(data.log10( 100 ), 2)
def evolution(): '''A star is initialised in the form of proton number, neutron number, and mass number matrices. Every iteration utilises weighted probabilities in randomising the movement of elements under gravity, as well as in determining the nuclear fusion reactions that occur. The matrix dimensions may be modified under the variable 'dim'. ''' # ignores runtime warning for handled ZeroDivisionError np.seterr(divide='ignore') # square matrix dimensions; minimum = 10 dim = 20 # proton number, neutron number, mass number matrices z, n, a = matrix.generate(dim) # energy matrix en = np.zeros((len(a), len(a))) # data handling arrays elm = np.array([1, 2, 6, 7, 8]) stack = np.zeros(len(elm)) # fusion rate array rate = [0] # total atomic mass print('\nMass: %d' % a.sum()) # output images directory if not os.path.exists('images'): os.mkdir('images') # initial system pos = matrix.positions(a) cm = matrix.centre_of_mass(a, pos) dens = density.matrix(a) density.plot(dens, 'initial') # data handling comp = data.composition(z, pos) for i in range(len(stack)): for j in range(len(comp)): if elm[i] == comp[j, 0]: stack[i] = comp[j, 1] break else: stack[i] = 0 elm = np.vstack((elm, stack)) data.log(comp, 'w', 0) # control variables flag1 = True flag2 = False iter = 0 print('\nIterations:\n') while flag1: iter += 1 print(iter, end='. ') # gravitation pos = matrix.positions(a) grav = gravity.force(a, pos) grav *= 1 - 0.99 * en.sum() for i in range(len(grav)): r = np.random.rand(1) j, k = pos[i] if r <= abs(grav[i, 0]): dir = int(grav[i, 0] / abs(grav[i, 0])) if a[j + dir, k] < a[j, k]: z[j, k], z[j + dir, k] = z[j + dir, k], z[j, k] n[j, k], n[j + dir, k] = n[j + dir, k], n[j, k] elif r <= np.abs(grav[i]).sum(): dir = int(grav[i, 1] / abs(grav[i, 1])) if a[j, k + dir] < a[j, k]: z[j, k], z[j, k + dir] = z[j, k + dir], z[j, k] n[j, k], n[j, k + dir] = n[j, k + dir], n[j, k] a = z + n # nuclear fusion ctr = 0 pos = matrix.positions(a) cm = matrix.centre_of_mass(a, pos) c_pos, c_temp = matrix.core(a, pos, cm) if not flag2: if c_temp > 7: flag2 = True else: for i in c_pos: j = i.copy() r = np.random.randint(2, size=2) # r[0] determines the axis (horizontal: 0, vertical: 1) # r[1] determines the direction along the axis dir = (-1)**r[1] if r[0]: j[0] += dir else: j[1] += dir p1 = [z[i[0], i[1]], n[i[0], i[1]]] p2 = [z[j[0], j[1]], n[j[0], j[1]]] try: f = c_temp / (p1[0] * p2[0]) if f > 1: f = 1 except ZeroDivisionError: f = 1 e = en[i[0], i[1]] nr = nuclear.reaction(p1, p2, f, e) z[i[0], i[1]] = nr[0] n[i[0], i[1]] = nr[1] z[j[0], j[1]] = nr[2] n[j[0], j[1]] = nr[3] a = z + n en[i[0], i[1]] = nr[4] if [p1, p2] != [[nr[0], nr[1]], [nr[2], nr[3]]]: ctr += 1 rate.append(ctr) # data handling comp = data.composition(z, pos) for i in range(len(stack)): for j in range(len(comp)): if elm[0, i] == comp[j, 0]: stack[i] = comp[j, 1] break else: stack[i] = 0 elm = np.vstack((elm, stack)) data.log(comp, 'a', iter) # iterates till H + He (stellar fuel) drops below 5.00% fuel = stack[0] + stack[1] print('Fuel: %.2f%%\n' % fuel) if fuel < 5: flag1 = False # final system pos = matrix.positions(a) cm = matrix.centre_of_mass(a, pos) dens = density.matrix(a) density.plot(dens, 'final') density.profile(dens, cm) data.plot(elm[1:], iter + 1) nuclear.plot_rate(rate, iter + 1)
@app.route('/api/scheduler/<status>') def scheduler_status(status): if status in ['suspend', 'off' 'false']: status = True if status in ['run', 'on', 'true']: status = False data_file.set('suspend_schedule', status) return "Done" @app.route('/camera') def camera_stream(): req = requests.get('http://192.168.1.10/?action=stream', stream=True) return flask.Response(req.iter_content(chunk_size=1024), content_type=req.headers['content-type']) @app.route('/api/say/<message>') def broadcast(message): message = message.replace("_", " ") return message #@app.route('/api/phone/battery/<percentage>') log("========= STARTED =========") start_scheduler() if __name__ == "__main__": app.run(host='192.168.1.4', debug=True, port=4000) #Popen(['npm', 'run', 'start'], cwd=path.dirname(path.realpath(__file__)) + '/assistant-relay') #input()
def hold_press_action(): global timer timer = None log("flic hold") get("http://localhost/api/" + get_commands()['hold'])
def double_click_action(): global timer timer = None log("flic double") get("http://localhost/api/" + get_commands()['double'])
def _schedule_handler(): try: _schedule() except Exception as e: log("General scheduler error:\n", traceback.format_exc()) _schedule_handler()
def set(command): try: return _set(command) except Exception as e: log("General light set error:\n", traceback.format_exc()) return "Failed"
def connect(self): try: self.controller = flux_led.WifiLedBulb(self.__ipaddr) except socket.timeout as e: log("Magic Light error: Connection")
def run(cmd): log('Running', cmd) res = os.system(cmd) if res != 0: sys.exit(res)