134 lines
3.6 KiB
Python
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()
|