def setUp(self): super().setUp() base.SetInitialGPIOState() with GPIO.write_context(): GPIO.output(REED_LOWER, REED_CLOSED) # Kontakt oben offen GPIO.output(REED_UPPER, REED_OPENED) # Kontakt unten geschlossen self.controller = controlserver.Controller(start_jobs=False)
def test_OutdoorLight(self): # --- Aussenbeleuchtung --- self.assertFalse(self.board.IsOutdoorLightOn(), "Outdoor light should be initially off.") with GPIO.write_context(): self.assertEqual(GPIO.input(LIGHT_OUTDOOR), RELAIS_OFF, "Outdoor light pin is not off.") self.board.SwitchOutdoorLight(False) self.assertFalse(self.board.IsOutdoorLightOn(), "Outdoor light should be off.") with GPIO.write_context(): self.assertEqual(GPIO.input(LIGHT_OUTDOOR), RELAIS_OFF, "Outdoor light pin is not off.") self.board.SwitchOutdoorLight(True) self.assertTrue(self.board.IsOutdoorLightOn(), "Outdoor light should be on.") with GPIO.write_context(): self.assertEqual(GPIO.input(LIGHT_OUTDOOR), RELAIS_ON, "Outdoor light pin is not on.") self.board.SwitchOutdoorLight(False) self.assertFalse(self.board.IsOutdoorLightOn(), "Outdoor light should be off.") with GPIO.write_context(): self.assertEqual(GPIO.input(LIGHT_OUTDOOR), RELAIS_OFF, "Outdoor light pin is not off.")
def test_DoorClose(self): # Tür auf "Offen" setzen: self.board.door_state = DOOR_OPEN with GPIO.write_context(): GPIO.output(REED_UPPER, REED_CLOSED) GPIO.output(REED_LOWER, REED_OPENED) ftr = base.Future(self.board.CloseDoor) self.assertTrue(ftr.WaitForExectionStart(1.0), "Future starts within time.") self.assertFalse( ftr.HasResult(), "Calling CloseDoor() when door is open should be possible" ) self.assertFalse( self.board.CloseDoor(), "Calling CloseDoor() while door is moving should not be possible" ) with GPIO.write_context(): GPIO.output(REED_UPPER, REED_OPENED) # oben kein Signal mehr self.assertFalse( self.board.IsDoorOpen(), "Door should not be opened when upper reed is HIGH" ) with GPIO.write_context(): GPIO.output(REED_LOWER, REED_CLOSED) # unten auf LOW ftr.WaitForResult(0.5 + LOWER_REED_OFFSET) # anderen Thread ranlassen self.assertTrue(ftr.HasResult(), "CloseDoor() is finished.") self.assertTrue(_GetSaveState(), "Board state has been saved.") self.assertTrue(self.board.IsDoorClosed(), "Door should be closed when lower reed is LOW") self.assertFalse(self.board.IsDoorOpen(), "Door should not be open when upper reed is HIGH") self.assertTrue(ftr.WaitForResult(), "CloseDoor() succeeded.") self.assertFalse( self.board.CloseDoor(), "Calling CloseDoor() while door is open shouldn't be possible." ) self.assertFalse(_GetSaveState(), "Board state not saved when operation fails.")
def test_CloseDoorByContact(self): ftr = self.CloseDoorTest() with GPIO.write_context(): GPIO.output(REED_LOWER, REED_CLOSED) # Kontakt oben offen GPIO.output(REED_UPPER, REED_OPENED) # Kontakt unten geschlossen self.assertTrue(ftr.WaitForResult(), "Door is closed.") self.assertLess( ftr.GetRuntime(), DOOR_MOVE_UP_TIME, "Door close duration has not been reached due to contact.")
def SetInitialGPIOState(): """ Setzt den initialen GPIO-Status für die Tests. """ if not hasattr(GPIO, 'allow_write'): raise RuntimeError("Need GPIO dummy for setting initial board state!") with GPIO.write_context(): GPIO.setmode(GPIO.BOARD) GPIO.output(REED_UPPER, REED_OPENED) GPIO.output(REED_LOWER, REED_CLOSED) # Tür geschlossen GPIO.output(SHUTDOWN_BUTTON, 1)
def test_DoorOpen(self): ftr = base.Future(self.board.OpenDoor) self.assertTrue(ftr.WaitForExectionStart(1.0), "Future starts within time.") self.assertFalse( self.board.OpenDoor(), "Calling OpenDoor() while door is moving should not be possible!" ) self.assertFalse(ftr.HasResult(), "OpenDoor() is running.") with GPIO.write_context(): GPIO.output(REED_LOWER, REED_OPENED) # unten kein Signal mehr self.assertFalse( self.board.IsDoorClosed(), "Door should not be closed when lower reed is HIGH" ) with GPIO.write_context(): GPIO.output(REED_UPPER, REED_CLOSED) # oben auf LOW ftr.WaitForResult(0.5 + UPPER_REED_OFFSET) self.assertTrue(ftr.HasResult(), "OpenDoor() is finished.") self.assertTrue(_GetSaveState(), "Board state has been saved.") self.assertTrue(self.board.IsDoorOpen(), "Door should be opened when upper reed is LOW") self.assertFalse( self.board.IsDoorClosed(), "Door should not be closed when lower reed is HIGH" ) self.assertTrue(ftr.WaitForResult(), "OpenDoor() succeeded.") self.assertFalse( self.board.OpenDoor(), "Calling OpenDoor() while door is opened shouldn't be possible" ) self.assertFalse(_GetSaveState(), "Board state not saved when operation fails.")
def CloseDoorTest(self): ctrl = self.controller ctrl.board.door_state = DOOR_OPEN with GPIO.write_context(): GPIO.output(REED_UPPER, REED_CLOSED) # Kontakt oben geschlossen GPIO.output(REED_LOWER, REED_OPENED) # Kontakt unten offen ftr = base.Future(ctrl.CloseDoor) self.assertTrue(ftr.WaitForExectionStart(0.5), "Door close command is running.") with self.assertRaises(TimeoutError): ftr.WaitForResult(2) with GPIO.write_context(): motor_on = GPIO.input(MOTOR_ON) move_dir = GPIO.input(MOVE_DIR) self.assertEqual(ctrl.automatic, DOOR_AUTO_OFF, "Door automatic is temporary disabled.") self.assertEqual(motor_on, RELAIS_ON, "Motor is running.") self.assertEqual(move_dir, MOVE_DOWN, "Door is moving down.") self.assertTrue(ctrl.board.IsDoorMoving(), "Door state is 'moving'.") return ftr
def test_OpenDoorByContact(self): #ctrl.board.door_state = DOOR_CLOSED #with GPIO.write_context(): # GPIO.output(REED_LOWER, REED_CLOSED) ftr = self.OpenDoorTest() with GPIO.write_context(): GPIO.output(REED_LOWER, REED_OPENED) # Kontakt unten offen GPIO.output(REED_UPPER, REED_CLOSED) # Kontakt oben geschlossen self.assertTrue(ftr.WaitForResult(), "Door is open.") self.assertLess( ftr.GetRuntime(), DOOR_MOVE_UP_TIME, "Door open duration has not been reached due to contact.")
def OpenDoorTest(self): ctrl = self.controller ftr = base.Future(ctrl.OpenDoor) self.assertTrue(ftr.WaitForExectionStart(0.5), "Door open command is running.") with self.assertRaises(TimeoutError): ftr.WaitForResult(0.5) with GPIO.write_context(): motor_on = GPIO.input(MOTOR_ON) move_dir = GPIO.input(MOVE_DIR) self.assertEqual(ctrl.automatic, DOOR_AUTO_OFF, "Door automatic is temporary disabled.") self.assertEqual(motor_on, RELAIS_ON, "Motor is running.") self.assertEqual(move_dir, MOVE_UP, "Door is moving up.") self.assertTrue(ctrl.board.IsDoorMoving(), "Door state is 'moving'.") return ftr