Be quiet at night
[saartuer.git] / statemachine.py
index b647ac95bcfa7e183b8a68f60f29273bf1a2deb3..62f523a346305c39f125bcfeb08a3b8a7897300c 100644 (file)
@@ -1,6 +1,6 @@
 from libtuer import ThreadFunction, logger, fire_and_forget, fire_and_forget_cmd
 from actor import Actor
-import os, random, time, threading
+import os, random, time, threading, datetime
 
 # logger.{debug,info,warning,error,critical}
 
@@ -11,7 +11,9 @@ def play_sound (what):
                logger.error("StateMachine: Unable to list sound files in %s" % (SOUNDS_DIRECTORY+what))
                return
        soundfile = SOUNDS_DIRECTORY + what + '/' + random.choice(soundfiles)
-       fire_and_forget_cmd ([SOUNDS_PLAYER,soundfile], logger.error, "StateMachine: ")
+       hour = datetime.datetime.time(datetime.datetime.now()).hour
+       volume = 60 if hour >= 22 or hour <= 6 else 95
+       fire_and_forget_cmd ([SOUNDS_PLAYER, "-volume", str(volume), soundfile], "StateMachine: ")
 
 # convert an absolute nervlist to a relative one
 def nervlist_abs2rel(nervlist_abs):
@@ -20,8 +22,11 @@ def nervlist_abs2rel(nervlist_abs):
        for (t, f) in nervlist_abs:
                assert t >= last_t
                nervlist_rel.append((t-last_t, f))
+               last_t = t
        return nervlist_rel
 
+# StateAuf constants
+HELLO_PROBABILITY = 0.2
 
 # StateUnlocking constants
 OPEN_REPEAT_TIMEOUT = 7
@@ -35,10 +40,11 @@ CLOSE_REPEAT_NUMBER = 3
 FALLBACK_LEAVE_DELAY_LOCK = 5 # seconds
 
 # StateAboutToOpen constants
-ABOUTOPEN_NERVLIST = nervlist_abs2rel([(5, lambda : play_sound("flipswitch")), (10, lambda:play_sound("flipswitch")),\
+SWITCH_PRAISE_PROBABILITY = 0.5
+ABOUTOPEN_NERVLIST = nervlist_abs2rel([(10, lambda:play_sound("flipswitch")),\
        (20, lambda:play_sound("flipswitch")), (30, lambda:play_sound("flipswitch")), (30, lambda:logger.error("Space open but switch not flipped for 30 seconds")),\
-       (40, lambda:play_sound("flipswitch")), (50, lambda:play_sound("flipswitch")), (60, lambda:play_sound("flipswitch")),
-       (60, lambda:logger.critical("Space open but switch not flipped for 60 seconds")), (120, lambda:play_sound("flipswitch")),
+       (40, lambda:play_sound("flipswitch")), (50, lambda:play_sound("flipswitch")), (60, lambda:play_sound("mail_sent")),
+       (60, lambda:logger.critical("Space open but switch not flipped for 60 seconds")), (120, lambda:play_sound("mail_sent")),
        (10*60, lambda:logger.critical("Space open but switch not flipped for 10 minutes")),
        (60*60, lambda:logger.critical("Space open but switch not flipped for one hour"))])
 
@@ -247,6 +253,8 @@ class StateMachine():
                        pins = self.pins()
                        if pins.space_active:
                                logger.info("Space activated, opening procedure completed")
+                               if not self.old_pins().space_active and random.random() <= SWITCH_PRAISE_PROBABILITY:
+                                       play_sound("success")
                                return StateMachine.StateAuf(self.state_machine)
                        return super().handle_pins_event()
        
@@ -265,6 +273,8 @@ class StateMachine():
                        if not pins.space_active:
                                logger.info("StateMachine: space switch turned off - starting leaving procedure")
                                return StateMachine.StateAboutToLeave(self.state_machine)
+                       if not pins.door_closed and self.old_pins().door_closed and random.random() <= HELLO_PROBABILITY:
+                               play_sound("hello")
                        return super().handle_pins_event()
                def on_leave(self):
                        self.api().set_state(False)