| from typing import Literal, TypedDict | |
| ApplianceAction = Literal["turn_on", "turn_off", "increase", "decrease", "keep"] | |
| class ApplianceDecision(TypedDict): | |
| suggested_action: ApplianceAction | |
| reason: str | |
| def decide_appliance_action(appliance: str, temp_c: float, humidity_pct: float, time_hour: int) -> ApplianceDecision: | |
| """Very simple rules for basic appliances in a home environment.""" | |
| a = appliance.lower() | |
| if a == "fan": | |
| if temp_c >= 29: | |
| return {"suggested_action": "turn_on", "reason": "Temperature is high; use fan."} | |
| if temp_c <= 24 and time_hour >= 22: | |
| return {"suggested_action": "turn_off", "reason": "Cool enough at night; fan can be off."} | |
| return {"suggested_action": "keep", "reason": "No strong reason to change fan state."} | |
| if a == "ac": | |
| if temp_c >= 28 and humidity_pct >= 60: | |
| return {"suggested_action": "turn_on", "reason": "Hot and humid; AC recommended."} | |
| if temp_c <= 25: | |
| return {"suggested_action": "turn_off", "reason": "Temperature is comfortable; AC can be off."} | |
| return {"suggested_action": "keep", "reason": "Borderline conditions; keep current AC state."} | |
| if a == "light": | |
| if time_hour >= 19 or time_hour <= 6: | |
| return {"suggested_action": "turn_on", "reason": "Likely dark outside; turn on light."} | |
| return {"suggested_action": "turn_off", "reason": "Daytime; light may not be needed."} | |
| if a == "dehumidifier": | |
| if humidity_pct >= 70: | |
| return {"suggested_action": "turn_on", "reason": "High humidity detected."} | |
| if humidity_pct <= 50: | |
| return {"suggested_action": "turn_off", "reason": "Humidity already low enough."} | |
| return {"suggested_action": "keep", "reason": "Humidity in acceptable range."} | |
| return {"suggested_action": "keep", "reason": "Unknown appliance; no change suggested."} | |
| if __name__ == "__main__": | |
| tests = [ | |
| ("fan", 30, 60, 14), | |
| ("ac", 29, 70, 22), | |
| ("light", 10, 50, 20), | |
| ("dehumidifier", 25, 80, 9), | |
| ] | |
| for a, t, h, hour in tests: | |
| print(a, t, h, hour, "->", decide_appliance_action(a, t, h, hour)) | |