def test_Sensor(monkeypatch, setup_test): with freeze_time(parse("2000-01-01 00:00:00")) as fdt: global FDT FDT = fdt monkeypatch.setattr(time, 'sleep', sleepless) c = Camera(sw_cam=True) c.save_images = True c.light_sensor.freq = timedelta(minutes=20) c.light_sensor.max_age = timedelta(hours=1) c.configs(""" [location] city = "Brisbane" [camera] interval = 300 # test ON at first light, then off when dark (i.e. all day) on = 'light' off = 'dim' camera_inactive_action = 'WAIT' """) c.mode_button.value = AUTO reset_camera = deepcopy(c) # a copy of the camera after it starts run_until(c, fdt, tomorrow_at(12), reset_camera) run_until(c, fdt, today_at(18, 00), reset_camera) run_until(c, fdt, today_at(23, 59), reset_camera) run_until(c, fdt, tomorrow_at(9, 00), reset_camera) reset_camera.run(1) assert reset_camera.active_timer.light_sensor.level == LightLevel.LIGHT
def test_low_light_sense(monkeypatch, setup_test): with freeze_time(parse("2000-01-01 00:00:00")) as fdt: global FDT FDT = fdt monkeypatch.setattr(time, 'sleep', sleepless) c = Camera(sw_cam=True) c.file_by_date = False c._interval = timedelta(hours=1) c.light_sensor.light = 0.6 c.light_sensor.dark = 0.1 c.light_sensor.freq = timedelta(minutes=10) c.light_sensor.max_age = timedelta(minutes=60) assert c.light_sensor.level == LightLevel.LIGHT # starts LIGHT by default run_until(c, fdt, today_at(3)) assert c.light_sensor.level == LightLevel.DARK run_until(c, fdt, today_at(10)) assert c.light_sensor.level == LightLevel.DIM run_until(c, fdt, today_at(12)) assert c.light_sensor.level == LightLevel.LIGHT run_until(c, fdt, today_at(16, 30)) assert c.light_sensor.level == LightLevel.DIM run_until(c, fdt, today_at(23)) assert c.light_sensor.level == LightLevel.DARK images = glob(os.path.join(c.tmv_root, "2000-01-01T*")) assert len(images) == 24
def test_SunCalc(monkeypatch, setup_test): # dawn: datetime.time(4, 28, 38, 892410) # sunrise:datetime.time(4, 55, 38, 480930) # noon: datetime.time(11, 50, 59) # sunset datetime.time(18, 46, 18, 926896) # dusk datetime.time(19, 13, 17, 159158) with freeze_time(parse("2000-01-01 00:00:00")) as fdt: global FDT FDT = fdt monkeypatch.setattr(time, 'sleep', sleepless) c = Camera(sw_cam=True) c.save_images = False c.configs(""" [camera] city = 'Brisbane' interval = 600 on = 'dawn' off = 'sunset' # (2000, 1, 1, 18, 46, 18, 926896, tzinfo=tzlocal()) camera_inactive_action = 'WAIT' """) c._camera = FakePiCamera() assert c.active_timer.active() is False run_until(c, fdt, today_at(4, 30)) assert c.active_timer.active() is True run_until(c, fdt, today_at(12, 30)) assert c.active_timer.active() is True run_until(c, fdt, today_at(18, 30)) assert c.active_timer.active() is True run_until(c, fdt, today_at(18, 40)) run_until(c, fdt, today_at(18, 50)) assert c.active_timer.active() is False run_until(c, fdt, tomorrow_at(8)) assert c.active_timer.active() is True
def test_fake(monkeypatch, setup_test): with freeze_time(parse("2000-01-01 12:00:00")) as fdt: global FDT FDT = fdt monkeypatch.setattr(time, 'sleep', sleepless) c = Camera(sw_cam=True) c.file_by_date = False c._interval = timedelta(minutes=10) run_until(c, fdt, today_at(13)) assert len(c.recent_images) == 6 + 1 # fencepost images = sorted(glob(os.path.join(c.tmv_root, "2000-01-01T*"))) assert len(images) == 6 + 1 # fencepost # run 13:00 - 14:00 with switch AUTO c.mode_button.value = AUTO run_until(c, fdt, today_at(14)) assert c.active_timer.active() # active images = sorted(glob(os.path.join(c.tmv_root, "2000-01-01T*"))) assert len(images) == 6 + 1 + 6 # one hour more of 6 photos per hour # run 14:00 - 15:00 with switch ON c.active_timer = Timed(datetime.time(6, 0, 0), datetime.time(7, 0, 0)) c.mode_button.value = ON run_until(c, fdt, today_at(15)) assert not c.active_timer.active() # not active - but overridden by switch images = sorted(glob(os.path.join(c.tmv_root, "2000-01-01T*"))) # one hour more of 6 photos per hour assert len(images) == 6 + 1 + 6 + 6 assert Path("./latest-image.jpg").is_file()
def test_camera_inactive_action(monkeypatch, setup_test): with freeze_time(parse("2000-01-01 12:00:00")) as fdt: global FDT FDT = fdt monkeypatch.setattr(time, 'sleep', sleepless) c = Camera(sw_cam=True) c.mode_button.value = AUTO c.save_images = False c.configs(""" [camera] interval = 900 # 15 minutes on = 09:00:00 off = 13:00:00 camera_inactive_action = 'EXCEPTION' """) c._camera = FakePiCamera() c.mode_button.value = AUTO with pytest.raises(PowerOff): run_until(c, fdt, today_at(18)) c.configs(""" [camera] on = 09:00:00 off = 13:00:00 camera_inactive_action = 'WAIT' """) run_until(c, fdt, tomorrow_at(18)) # no raise
def test_video(monkeypatch, setup_test): c = Camera(sw_cam=True) c.file_by_date = False with freeze_time(parse("2000-01-01 12:00:00")) as fdt: global FDT FDT = fdt real_sleep = time.sleep monkeypatch.setattr(time, 'sleep', sleepless) # start normally c.mode_button.value = ON c._interval = timedelta(seconds=60) while dt.now() < today_at(13): c.run(1) fdt.tick(timedelta(seconds=1)) # switch to video mode c.mode_button.value = VIDEO vtd = threading.Thread(target=video_server, args=(c, fdt), daemon=True) vtd.start() real_sleep(3) c.mode_button.value = OFF vtd.join() real_sleep(1) # switch to video mode agina : ok c.mode_button.value = VIDEO vtd = threading.Thread(target=video_server, args=(c, fdt), daemon=True) vtd.start() real_sleep(3) c.mode_button.value = OFF vtd.join()
def test_Timed_capture(monkeypatch, setup_test): with freeze_time(parse("2000-01-01 06:00:00")) as fdt: global FDT FDT = fdt monkeypatch.setattr(time, 'sleep', sleepless) c = Camera(sw_cam=True) c.mode_button.value = AUTO c.mode_button.button_path = Path("./camera-switch") c.file_by_date = False #c._camera = FakePiCamera() c._interval = timedelta(minutes=60) c.active_timer = Timed(datetime.time(12), datetime.time(18)) run_until(c, fdt, today_at(23)) images = glob(os.path.join(c.tmv_root, "2000-01-01T*")) assert len(images) == 18 - 12 + 1 # +1 for a fencepost
def test_overlays(monkeypatch, setup_test): cf = """ [camera] overlays = [ "spinny", "image_name","simple_settings", "bottom_band"] """ with freeze_time(parse("2000-01-01 12:00:00")) as fdt: global FDT FDT = fdt monkeypatch.setattr(time, 'sleep', sleepless) c = Camera(sw_cam=True) #c._camera.width = 1200 #c._camera.height = 900 c.configs(cf) c.file_by_date = False run_until(c, fdt, today_at(13))
def test_camera_inactive_action_2(monkeypatch, setup_test): with freeze_time(parse("2000-01-01 12:00:00")) as fdt: global FDT FDT = fdt monkeypatch.setattr(time, 'sleep', sleepless) c = Camera(sw_cam=True) c.save_images = False c.configs(""" [camera] interval = 900 # 15 minutes on = 'dim' off = 'dark' camera_inactive_action = 'EXCEPTION' """) # with pytest.raises(PowerOff): run_until(c, fdt, today_at(14)) assert c.light_sensor.level == LightLevel.LIGHT assert c.active_timer.active() assert c.active_timer.camera_active()
def test_Fixed(): t = tmv.camera.Fixed(on=True, off=False) with freeze_time(today_at(1)): assert t.active() is True with freeze_time(today_at(8)): assert t.active() is True with freeze_time(today_at(2)): assert t.next_active() == today_at(2) t = tmv.camera.Fixed(on=False, off=True) with freeze_time(today_at(1)): assert t.active() is False with freeze_time(today_at(2)): assert t.active_in() > timedelta(days=1000) with pytest.raises(Exception): t = tmv.camera.Timed(on=True, off=True)
def test_Timed(): """ 00 04 08 12 16 20 24 on off on(01:00) = false on(08:00) = True on(20:00) = false[summary] """ t = tmv.camera.Timed(on=datetime.time(4), off=datetime.time(16)) with freeze_time(today_at(1)): assert t.active() is False with freeze_time(today_at(8)): assert t.active() is True with freeze_time(today_at(20)): assert t.active() is False with freeze_time(today_at(2)): assert t.next_active() == today_at(4) with freeze_time(today_at(5)): assert t.next_active() == today_at(5) with freeze_time(today_at(20)): assert t.next_active() == tomorrow_at(4) t = tmv.camera.Timed(on=datetime.time(16), off=datetime.time(4)) with freeze_time(today_at(1)): assert t.active() is True with freeze_time(today_at(8)): assert t.active() is False with freeze_time(today_at(20)): assert t.active() is True