feat(sono): madrugada silenciosa e N sons para acordar

Antes um único som acima do limiar, um quadro de movimento ou um pulso
do PIR acordavam o rosto; deitado na cama, ele acordava toda hora.

- Som: precisa de `somAcordar` barulhos (padrão 3) em 1 minuto; o mesmo
  barulho comprido conta uma vez.
- Madrugada silenciosa (padrão 23h às 7h, configurável): movimento,
  rastreamento, PIR e modo presença não acordam; só barulho ALTO
  repetido, toque ou conversa.
- Vida: de madrugada não acorda sozinho e volta a dormir mesmo com gente
  se mexendo, a não ser que alguém tenha interagido nos últimos 10 min.
- Painel: grupo "Sono e madrugada" nos Ajustes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
julio
2026-10-06 04:48:11 -03:00
co-authored by Claude Opus 5.5
parent 5fcd038861
commit dd40c730be
8 changed files with 135 additions and 22 deletions
+16 -4
View File
@@ -69,12 +69,24 @@ class VidaTest(unittest.TestCase):
self.v.necessidades['energia'] = 100
self.assertEqual(self.v.agir(DIA + 120), 'acordar')
def test_noite_dorme_sem_ninguem(self):
def test_madrugada_dorme_mesmo_com_gente_se_mexendo(self):
noite = time.mktime((2026, 10, 6, 23, 30, 0, 0, 0, -1))
self.v.alguem_perto = lambda: True # deitado na cama, o PIR vê
self.assertEqual(self.v.agir(noite), 'dormir')
self.v.dormindo_proprio = False
self.v.alguem_perto = lambda: True
self.assertNotEqual(self.v.agir(noite), 'dormir')
self.v.necessidades['energia'] = 100
self.assertIsNone(self.v.agir(noite + 60)) # descansado, mas é madrugada: não acorda
self.v.estimulo('carinho', noite + 120) # carinho acorda e segura acordado um tempo
self.assertFalse(self.v.dormindo())
self.assertNotEqual(self.v.agir(noite + 180), 'dormir')
self.assertEqual(self.v.agir(noite + 180 + 11 * 60), 'dormir')
def test_horario_da_madrugada(self):
from controle_pc import madrugada
h = lambda hora: time.mktime((2026, 10, 6, hora, 10, 0, 0, 0, -1))
cfg = dict(noiteSilenciosa=True, noiteInicio=23, noiteFim=7)
self.assertEqual([madrugada(cfg, h(x)) for x in (22, 23, 3, 6, 7, 12)], [False, True, True, True, False, False])
self.assertTrue(madrugada(dict(cfg, noiteInicio=1, noiteFim=5), h(2)))
self.assertFalse(madrugada(dict(cfg, noiteSilenciosa=False), h(3)))
def test_humor_e_gestos_de_carente_com_gente_perto(self):
self.v.necessidades.update(energia=80, social=10)