ti-powerbar/app/views.py

240 lines
8.8 KiB
Python
Raw Normal View History

2023-11-22 09:09:11 +00:00
from flask import render_template, Blueprint
from app.settings import powerbars, groups
2023-11-19 00:43:36 +00:00
from flask import jsonify
2023-11-19 00:07:25 +00:00
import telnetlib
2023-11-19 01:08:55 +00:00
import time
2023-12-02 17:17:42 +00:00
import app
2023-11-19 00:07:25 +00:00
routes = Blueprint('routes', __name__)
2023-11-24 11:48:00 +00:00
# Create a dictionary to store the active telnet connections
active_telnet_connections = {}
def get_telnet_connection(powerbar):
"""
Get the active telnet connection for the given powerbar.
If the connection does not exist, create a new one.
Args:
powerbar (str): The name of the powerbar.
Returns:
telnetlib.Telnet: The telnet connection object.
"""
2023-11-24 12:01:07 +00:00
2023-11-24 11:48:00 +00:00
if powerbar in active_telnet_connections:
return active_telnet_connections[powerbar]
else:
tn = telnetlib.Telnet(powerbars[powerbar]['host'], powerbars[powerbar]['port'])
active_telnet_connections[powerbar] = tn
return tn
2023-11-24 12:11:36 +00:00
def run_telnet_command(powerbar, command):
try:
2023-12-02 15:55:51 +00:00
tn = get_telnet_connection(powerbar)
2023-11-24 12:11:36 +00:00
tn.write(f"{command}\r\n".encode('ascii'))
2023-12-03 00:56:17 +00:00
time.sleep(0.2)
tn.write(f"{command}\r\n".encode('ascii'))
2023-11-24 12:11:36 +00:00
return
except Exception as e:
print(f"Telnet error: {e}")
2023-12-03 00:56:17 +00:00
if powerbar in active_telnet_connections:
active_telnet_connections.pop(powerbar)
2023-11-24 12:11:36 +00:00
tn = get_telnet_connection(powerbar)
tn.write(f"{command}\r\n".encode('ascii'))
2023-12-03 00:56:17 +00:00
time.sleep(0.2)
tn.write(f"{command}\r\n".encode('ascii'))
2023-11-24 12:11:36 +00:00
return
2023-11-24 11:48:00 +00:00
2023-11-22 09:09:11 +00:00
def find_group_by_name(name):
2023-11-19 12:26:12 +00:00
for group in groups:
if group["name"] == name:
return group
return None
2023-11-19 00:07:25 +00:00
def vaild_power_bar(powerbar):
if powerbar in powerbars:
return True
else:
return False
def vaild_outlet (powerbar, outlet):
if outlet in powerbars[powerbar]['outlets']:
return True
else:
return False
@routes.route('/')
def home():
2023-11-19 16:06:40 +00:00
for powerbar in powerbars:
for outlet in powerbars[powerbar]['outlets']:
powerbars[powerbar]['outlets'][outlet]['state'] = powerbars[powerbar]['outlets'][outlet].get('state', 'unknown')
2023-11-22 09:09:11 +00:00
return render_template('index.html', powerbars=powerbars, all_groups=groups)
2023-11-19 01:30:54 +00:00
2023-11-19 00:07:25 +00:00
2023-11-19 00:38:44 +00:00
@routes.route('/<string:powerbar>/<int:outlet>/<string:action>')
2023-11-19 01:00:53 +00:00
def powerbar_control(powerbar, outlet, action):
"""
Controls the powerbar outlet based on the given parameters.
2023-11-19 00:07:25 +00:00
2023-11-19 01:00:53 +00:00
Args:
powerbar (str): The name of the powerbar.
outlet (int): The outlet number.
action (str): The action to perform on the outlet ('on', 'off', 'cycle').
2023-11-19 00:43:36 +00:00
2023-11-19 01:00:53 +00:00
Returns:
dict: A JSON response containing the state of the action or an error message.
Raises:
ValueError: If the action is not valid.
ValueError: If the powerbar is not valid.
ValueError: If the outlet is not valid.
Exception: If there is a telnet error.
"""
2023-11-19 00:10:51 +00:00
print(f"powerbar: {powerbar}")
print(f"outlet: {outlet}")
print(f"action: {action}")
2023-11-19 00:07:25 +00:00
2023-11-20 11:01:18 +00:00
if not action in ['on', 'off', 'cycle', 'toggle']:
2023-11-19 00:10:51 +00:00
print("Invalid action")
2023-11-19 00:43:36 +00:00
return jsonify({'error': 'Invalid action'}), 400
2023-11-19 00:07:25 +00:00
if not vaild_power_bar(powerbar):
2023-11-19 00:10:51 +00:00
print("Invalid powerbar")
2023-11-19 00:43:36 +00:00
return jsonify({'error': 'Invalid powerbar'}), 400
2023-11-19 00:07:25 +00:00
if not vaild_outlet(powerbar, outlet):
2023-11-19 00:10:51 +00:00
print("Invalid outlet")
2023-11-19 00:43:36 +00:00
return jsonify({'error': 'Invalid outlet'}), 400
2023-11-19 00:07:25 +00:00
2023-11-19 00:35:52 +00:00
if action in ['on', 'off']:
2023-11-19 00:07:25 +00:00
try:
2023-11-19 00:35:52 +00:00
print(f"Turning {action} powerbar {powerbar} outlet {outlet}")
2023-11-24 11:48:00 +00:00
tn = get_telnet_connection(powerbar)
2023-11-24 12:11:36 +00:00
run_telnet_command(powerbar,f"{action} {outlet}")
2023-11-19 00:35:52 +00:00
powerbars[powerbar]['outlets'][outlet]['state'] = action
2023-12-02 18:00:33 +00:00
app.socketio.emit('power-event',{'powerbar': powerbar, 'outlet' : outlet, 'action' : action}, namespace='/powerupdates')
2023-11-19 00:35:52 +00:00
print(f"Turned {action} powerbar {powerbar} outlet {outlet}")
2023-11-19 12:26:12 +00:00
except Exception as E:
print(f"Telnet error: {E}")
2023-11-19 00:43:36 +00:00
return jsonify({'error': 'Telnet error'}), 500
2023-11-19 01:08:55 +00:00
if action == 'cycle':
2023-11-24 11:48:00 +00:00
tn = get_telnet_connection(powerbar)
2023-11-19 01:08:55 +00:00
print(f"Turning Off powerbar {powerbar} outlet {outlet}")
2023-11-24 12:11:36 +00:00
run_telnet_command(powerbar,f"off {outlet}")
2023-12-02 17:17:42 +00:00
powerbars[powerbar]['outlets'][outlet]['state'] = "off"
2023-12-02 18:00:33 +00:00
app.socketio.emit('power-event',{'powerbar': powerbar, 'outlet' : outlet, 'action' : action}, namespace='/powerupdates')
2023-11-19 01:08:55 +00:00
time.sleep(5)
print(f"Turning On powerbar {powerbar} outlet {outlet}")
2023-11-24 12:11:36 +00:00
run_telnet_command(powerbar,f"on {outlet}")
2023-11-20 11:01:18 +00:00
powerbars[powerbar]['outlets'][outlet]['state'] = "on"
2023-12-02 18:00:33 +00:00
app.socketio.emit('power-event',{'powerbar': powerbar, 'outlet' : outlet, 'action' : action}, namespace='/powerupdates')
2023-11-20 11:01:18 +00:00
if action == 'toggle':
print(powerbars[powerbar]['outlets'][outlet]['state'])
if powerbars[powerbar]['outlets'][outlet]['state'] == "on":
2023-11-24 11:48:00 +00:00
tn = get_telnet_connection(powerbar)
2023-11-20 11:01:18 +00:00
print(f"Turning Off powerbar {powerbar} outlet {outlet}")
2023-11-24 12:11:36 +00:00
run_telnet_command(powerbar,f"off {outlet}")
2023-11-20 11:01:18 +00:00
powerbars[powerbar]['outlets'][outlet]['state'] = "off"
2023-12-02 18:00:33 +00:00
app.socketio.emit('power-event',{'powerbar': powerbar, 'outlet' : outlet, 'action' : action}, namespace='/powerupdates')
2023-11-20 11:01:18 +00:00
elif powerbars[powerbar]['outlets'][outlet]['state'] == "off":
2023-11-24 11:48:00 +00:00
tn = get_telnet_connection(powerbar)
2023-11-20 11:01:18 +00:00
print(f"Turning On powerbar {powerbar} outlet {outlet}")
2023-11-24 12:11:36 +00:00
run_telnet_command(powerbar,f"on {outlet}")
2023-11-20 11:01:18 +00:00
powerbars[powerbar]['outlets'][outlet]['state'] = "on"
2023-12-02 18:00:33 +00:00
app.socketio.emit('power-event',{'powerbar': powerbar, 'outlet' : outlet, 'action' : action}, namespace='/powerupdates')
2023-11-20 11:01:18 +00:00
return jsonify({'state': powerbars[powerbar]['outlets'][outlet].get('state', 'unknown')})
2023-11-19 00:16:41 +00:00
2023-11-19 01:08:55 +00:00
return jsonify({'state': powerbars[powerbar]['outlets'][outlet].get('state', 'unknown')})
2023-11-19 00:07:25 +00:00
2023-11-19 00:33:11 +00:00
2023-11-19 00:38:44 +00:00
@routes.route('/<string:powerbar>/<int:outlet>/state')
2023-11-19 00:33:11 +00:00
def powerbar_state(powerbar, outlet):
print(f"powerbar: {powerbar}")
print(f"outlet: {outlet}")
if not vaild_power_bar(powerbar):
print("Invalid powerbar")
2023-11-19 00:43:36 +00:00
return jsonify({'error': 'Invalid powerbar'}), 400
2023-11-19 00:33:11 +00:00
if not vaild_outlet(powerbar, outlet):
print("Invalid outlet")
2023-11-19 00:43:36 +00:00
return jsonify({'error': 'Invalid outlet'}), 400
2023-11-19 00:33:11 +00:00
state = powerbars[powerbar]['outlets'][outlet].get('state', 'unknown')
2023-11-19 00:43:36 +00:00
return jsonify({'state': state})
2023-11-19 00:55:54 +00:00
@routes.route('/powerbars')
def powerbars_list():
2023-11-19 01:00:53 +00:00
for powerbar in powerbars:
for outlet in powerbars[powerbar]['outlets']:
state = powerbars[powerbar]['outlets'][outlet].get('state', 'unknown')
powerbars[powerbar]['outlets'][outlet]['state'] = state
powerbars[powerbar]['outlets'][outlet]['on_url'] = f"/{powerbar}/{outlet}/on"
powerbars[powerbar]['outlets'][outlet]['off_url'] = f"/{powerbar}/{outlet}/off"
2023-11-19 01:08:55 +00:00
powerbars[powerbar]['outlets'][outlet]['state_url'] = f"/{powerbar}/{outlet}/state"
powerbars[powerbar]['outlets'][outlet]['cycle_url'] = f"/{powerbar}/{outlet}/cycle"
2023-11-20 11:01:18 +00:00
powerbars[powerbar]['outlets'][outlet]['toggle_url'] = f"/{powerbar}/{outlet}/toggle"
2023-11-19 01:00:53 +00:00
return jsonify(powerbars)
2023-11-19 00:55:54 +00:00
2023-11-19 12:26:12 +00:00
2023-11-22 09:09:11 +00:00
@routes.route('/groups/<string:group>/<string:action>')
def powebar_group_action(group, action):
2023-11-19 12:26:12 +00:00
if not action in ['on', 'off', 'cycle']:
print("Invalid action")
return jsonify({'error': 'Invalid action'}), 400
2023-11-22 09:09:11 +00:00
group = find_group_by_name(group)
2023-11-19 12:26:12 +00:00
if not group:
print("Invalid group")
return jsonify({'error': 'Invalid group'}), 400
if action in ['on', 'off']:
try:
2023-11-22 09:09:11 +00:00
for device in group["devices"]:
powerbar = device["powerbar"]
2023-11-24 11:48:00 +00:00
tn = get_telnet_connection(powerbar)
2023-11-22 09:09:11 +00:00
print(f"Powerbar: {powerbar}")
outlets = ",".join([str(x) for x in device['outlets']])
print(f"Turning {action} powerbar {powerbar} outlet {outlets}")
2023-11-24 12:11:36 +00:00
run_telnet_command(powerbar,f"{action} {outlets}")
2023-11-22 09:53:45 +00:00
for outlet in device['outlets']:
if outlet in powerbars[powerbar]['outlets']:
powerbars[powerbar]['outlets'][outlet]['state'] = action
2023-12-02 18:59:38 +00:00
app.socketio.emit('power-event',{'powerbar': powerbar, 'outlet' : outlet, 'action' : action}, namespace='/powerupdates')
2023-11-22 09:53:45 +00:00
print(f"Turned {action} powerbar {powerbar} outlet {outlet}")
2023-11-19 17:13:49 +00:00
2023-11-19 12:26:12 +00:00
return jsonify({'status': "200"})
except Exception as E:
print(f"Telnet error: {E}")
return jsonify({'error': 'Telnet error'}), 500
2023-11-22 09:09:11 +00:00
@routes.route('/groups')
def powebar_groups():
2023-11-19 12:26:12 +00:00
try:
for group in groups:
2023-11-22 09:09:11 +00:00
group['on_url'] = f"/groups/{group['name']}/on"
group['off_url'] = f"/groups/{group['name']}/off"
2023-11-19 12:26:12 +00:00
return jsonify(groups)
except Exception as E:
print(f"Telnet error: {E}")
2023-11-24 11:48:00 +00:00
return jsonify({'error': 'no groups defined for powerbar'}), 404