177 lines
7.5 KiB
Python
177 lines
7.5 KiB
Python
import datetime
|
|
import time
|
|
import sys
|
|
import echo_serial.serial_controller as EchoSerial
|
|
import echo_db.database as EchoDB
|
|
import _thread
|
|
|
|
class AirConditioner:
|
|
|
|
@staticmethod
|
|
def handle_action(device, action, data):
|
|
actionData = device['actions'][action]
|
|
collection = EchoDB.EchoDB.database['Devices']
|
|
|
|
# Check if a thread is using the blinds, if so return.
|
|
if device['status'] == "busy":
|
|
return {'status': 'failed', 'message': 'Air Conditioner is being controlled by Echo, Please wait till finished.'}, 200
|
|
|
|
if action == "on":
|
|
|
|
if device['status'] == "on":
|
|
return {'status': 'failed', 'message': 'Air conditioning is already on!'}, 200
|
|
|
|
# Update Database
|
|
collection.update_one({'uuid': device['uuid']}, {"$set": { 'last_used': datetime.datetime.now(), 'status': 'on' }})
|
|
|
|
EchoSerial.EchoSerial.send_commmand(device, "power")
|
|
return {'status': 'success', 'message': actionData['message']}, 200
|
|
|
|
if action == "off":
|
|
|
|
if device['status'] == "off":
|
|
return {'status': 'failed', 'message': 'Air conditioning is already off!'}, 200
|
|
|
|
EchoSerial.EchoSerial.send_commmand(device, "power")
|
|
|
|
# Update Database
|
|
collection.update_one({'uuid': device['uuid']}, {"$set": { 'last_used': datetime.datetime.now(), 'status': 'off' }})
|
|
return {'status': 'success', 'message': actionData['message']}, 200
|
|
|
|
if action == "set_fan_speed":
|
|
selected_speed = data
|
|
|
|
if selected_speed == {}:
|
|
return {'status': 'failed', 'message': 'Please select a speed!'}, 200
|
|
|
|
if selected_speed == device['fan_speed']:
|
|
return {'status': 'failed', 'message': 'Fan speed already set to requested speed!'}, 200
|
|
|
|
if device['status'] == "off":
|
|
return {'status': 'failed', 'message': 'Air Conditioner must be on to change fan speeds!'}, 200
|
|
|
|
EchoSerial.EchoSerial.send_commmand(device, "fanspeed")
|
|
|
|
if device['fan_speed'] == "low":
|
|
# We just put the speed to high
|
|
collection.update_one({'uuid': device['uuid']}, {"$set": { 'last_used': datetime.datetime.now(), 'fan_speed': 'high' }})
|
|
|
|
if device['fan_speed'] == "high":
|
|
# We just put the speed to high
|
|
collection.update_one({'uuid': device['uuid']}, {"$set": { 'last_used': datetime.datetime.now(), 'fan_speed': 'low' }})
|
|
|
|
return {'status': 'success', 'message': actionData['message']}, 200
|
|
|
|
if action == "set_mode":
|
|
selected_mode = data
|
|
|
|
if selected_mode == {}:
|
|
return {'status': 'failed', 'message': 'Please select a mode!'}, 200
|
|
|
|
if device['status'] == "off":
|
|
return {'status': 'failed', 'message': 'Air Conditioniner must be on to change modes!'}, 200
|
|
|
|
# Update Database
|
|
collection = EchoDB.EchoDB.database['Devices']
|
|
collection.update_one({'uuid': device['uuid']}, {"$set": { 'last_used': datetime.datetime.now(), 'status': 'busy' }})
|
|
|
|
# Start thread because this action has waiting functions
|
|
_thread.start_new_thread(AirConditioner.handleSetMode, ("Main Handle Set Mode Thread", 2, device, selected_mode))
|
|
return {'status': 'success', 'message': actionData['message']}, 200
|
|
|
|
if action == "set_temperature":
|
|
selected_temperature = data
|
|
|
|
if selected_temperature == {}:
|
|
return {'status': 'failed', 'message': 'Please select a temperature!'}, 200
|
|
|
|
if device['status'] == "off":
|
|
return {'status': 'failed', 'message': 'Air Conditioning must be on to change target temperatures!'}, 200
|
|
|
|
new_selected_temperature = int(selected_temperature)
|
|
|
|
# Update Database
|
|
collection = EchoDB.EchoDB.database['Devices']
|
|
collection.update_one({'uuid': device['uuid']}, {"$set": { 'last_used': datetime.datetime.now(), 'status': 'busy' }})
|
|
|
|
# Start thread because this action has waiting functions
|
|
_thread.start_new_thread(AirConditioner.handleSetTemperature, ("Main Handle Set Temperature Thread", 2, device, new_selected_temperature))
|
|
return {'status': 'success', 'message': actionData['message']}, 200
|
|
|
|
@staticmethod
|
|
def handleSetTemperature(threadName, delay, device, temperature):
|
|
print('Started Air Conditioner Set Termperature Thread!')
|
|
|
|
if device['target_temperature'] == temperature:
|
|
# Update Database
|
|
collection = EchoDB.EchoDB.database['Devices']
|
|
collection.update_one({'uuid': device['uuid']}, {"$set": { 'last_used': datetime.datetime.now(), 'status': 'on' }})
|
|
print('Exiting Air Conditioner Set Termperature Thread!')
|
|
sys.exit()
|
|
|
|
if temperature > device['target_temperature']:
|
|
temperature_direction = "up"
|
|
new_temperature_degrees = temperature - device['target_temperature']
|
|
|
|
if temperature < device['target_temperature']:
|
|
temperature_direction = "down"
|
|
new_temperature_degrees = device['target_temperature'] - temperature
|
|
|
|
# Plus one to init temp change on ac
|
|
for x in range(new_temperature_degrees + 1):
|
|
EchoSerial.EchoSerial.send_commmand(device, temperature_direction)
|
|
time.sleep(.3)
|
|
|
|
# Update Database
|
|
collection = EchoDB.EchoDB.database['Devices']
|
|
collection.update_one({'uuid': device['uuid']}, {"$set": { 'last_used': datetime.datetime.now(), 'status': 'on', 'target_temperature': temperature }})
|
|
print('Exiting Air Conditioner Set Termperature Thread!')
|
|
|
|
@staticmethod
|
|
def handleSetMode(threadName, delay, device, mode):
|
|
print('Started Air Conditioner Set Mode Thread!')
|
|
|
|
if device['mode'] == mode:
|
|
# Update Database
|
|
collection = EchoDB.EchoDB.database['Devices']
|
|
collection.update_one({'uuid': device['uuid']}, {"$set": { 'last_used': datetime.datetime.now(), 'status': 'on' }})
|
|
print('Exiting Air Conditioner Set Mode Thread!')
|
|
sys.exit()
|
|
|
|
# Goto base Pos (cooling)
|
|
if device['mode'] == "cooling":
|
|
#Do nothing, already in cooling mode (base pos)
|
|
pass
|
|
|
|
if device['mode'] == "dehumidifying":
|
|
# switch 2 times
|
|
EchoSerial.EchoSerial.send_commmand(device, "mode")
|
|
time.sleep(.3)
|
|
EchoSerial.EchoSerial.send_commmand(device, "mode")
|
|
time.sleep(.3)
|
|
|
|
if device['mode'] == "blowing":
|
|
# switch 1 time
|
|
EchoSerial.EchoSerial.send_commmand(device, "mode")
|
|
time.sleep(.3)
|
|
|
|
# Do nothing, base pos is cooling
|
|
if mode == "cooling":
|
|
pass
|
|
|
|
if mode == "dehumidifying":
|
|
# switch 1 time
|
|
EchoSerial.EchoSerial.send_commmand(device, "mode")
|
|
time.sleep(.3)
|
|
|
|
if mode == "blowing":
|
|
# switch 2 times
|
|
EchoSerial.EchoSerial.send_commmand(device, "mode")
|
|
time.sleep(.3)
|
|
EchoSerial.EchoSerial.send_commmand(device, "mode")
|
|
time.sleep(.3)
|
|
|
|
# Update Database
|
|
collection = EchoDB.EchoDB.database['Devices']
|
|
collection.update_one({'uuid': device['uuid']}, {"$set": { 'last_used': datetime.datetime.now(), 'status': 'on', 'mode': mode }})
|
|
print('Exiting Air Conditioner Set Mode Thread!') |