Master-Project/server/server.py
2021-06-15 21:44:09 +02:00

134 lines
3.6 KiB
Python

import socket
import struct
import numpy as np
from controllers import *
clients = ['measure', 'control', 'weather']
N_horizon = 8
print(f"[*] Controller Horizon {N_horizon}")
HOST = '127.0.0.1'
PORT = {
'measure': 10000,
'control': 10001,
'weather': 10002
}
print(f"[*] Server IP {HOST}")
print(f"[*] Measuring on port {PORT['measure']}")
print(f"[*] Controlling on port {PORT['control']}")
print(f"[*] Weather on port {PORT['weather']}")
sock = {}
# Create a socket for each of the clients and start listening
for client in clients:
sock[client] = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock[client].bind((HOST, PORT[client]))
sock[client].listen()
temps_list = []
conn = {}
# Initialize controller
t_cols = []
w_cols = ['SolRad', 'OutsideTemp']
u_cols = ['SimulatedHeat']
y_cols = ['SimulatedTemp']
t_lags = 0
w_lags = 1
u_lags = 2
y_lags = 3
print(f"[*] t_lags: {t_lags}")
print(f"[*] w_lags: {w_lags}")
print(f"[*] u_lags: {u_lags}")
print(f"[*] y_lags: {y_lags}")
dict_cols = {
't': (t_lags, t_cols),
'w': (w_lags, w_cols),
'u': (u_lags, u_cols),
'y': (y_lags, y_cols)
}
controller = SVGP_MPCcontroller(
dict_cols = dict_cols,
N_horizon = N_horizon,
recover_from_crash = False
)
# Enter TCP server loop
while True:
# Connect to the clients
for client in clients:
print(f"[+] Waiting for a {client} connection...", end = ' ')
iter_conn,_ = sock[client].accept()
conn[client] = iter_conn
print("Done")
# Sending first control signal (initialization)
print("[*] Entering the control loop")
try:
while True:
###
# Begin timestep
###
print("---")
# Send control signal
print("[*] Sending control signal...", end = ' ')
u = controller.get_control_input()
print(f"Applying control signal {u}")
data = struct.pack(">d", u)
conn['control'].sendall(data)
print("Done")
# Read the inputs and update controller measures
# Read weather prediction
weather = []
print("[*] Reading weather measurement/prediction...", end = ' ')
for idx in range((N_horizon + 1) * 2):
weather_item = conn['weather'].recv(8)
if weather_item:
weather_item = struct.unpack(">d", weather_item)
weather.append(weather_item)
else:
break
if len(weather) == ((N_horizon + 1) *2):
weather = np.array(weather).reshape((2, N_horizon + 1)).T
else:
print("\nDid not get a complete weather prediction. Simulation ended?")
break
controller.add_disturbance_measurement(weather[0,:])
controller.set_weather_forecast(weather[1:, :])
print("Done")
# Read temperature measurement
print("Reading temperature measurement")
data = conn['measure'].recv(8)
if data:
t_iter = struct.unpack(">d", data)[0]
temps_list.append(t_iter)
else:
break
print(f"Read temperature measurement {t_iter}")
controller.add_output_measurement(t_iter)
# Update the model since all data has been read
controller.update_model()
finally:
print("[-] Closing connection to simulink")
for client in clients:
conn[client].close()
print("[i] Dumping controller data")
controller.save_data()