-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.py
120 lines (110 loc) · 3.27 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import argparse
import concurrent.futures
import logging
import internal.adapters.actuators.electrovalve as actuator_electrovalve
import internal.adapters.actuators.fan as actuator_fan
import internal.adapters.host.cpu as host_cpu
import internal.adapters.host.disk as host_disk
import internal.adapters.host.ram as host_ram
import internal.adapters.host.temperature as host_temperature
import internal.adapters.sensors.co2 as sensor_co2
import internal.adapters.sensors.humidity as sensor_humidity
import internal.adapters.sensors.nh3 as sensor_nh3
import internal.adapters.sensors.temperature as sensor_temperature
import internal.services.api as service_api
import internal.services.api_client as service_api_client
import internal.services.configurations as service_configs
import internal.services.discovery as service_discovery
import internal.services.actuators_controller as service_actuators_controller
import internal.services.frontend as service_frontend
import internal.services.poller as service_poller
# cli
cli = argparse.ArgumentParser(description="cricket environmental control")
cli.add_argument(
"-l",
"--logger",
choices=["DEBUG", "INFO", "WARNING", "ERROR", "FATAL"],
default="INFO",
help="log level (defaults to info)",
)
cli = cli.parse_args()
log_level: int = getattr(logging, cli.logger)
# logging
logging.basicConfig(
level=log_level,
handlers=(logging.StreamHandler(), logging.FileHandler(".log", "a")),
format="%(asctime)s:%(levelname)s:%(name)s:%(message)s",
datefmt="%Y-%m-%d %H-%M-%S",
)
logger = logging.getLogger("main")
logger.info(f"logging with level {cli.logger}")
# configs
configs = service_configs.Configurations()
# host statistics
logger.info("init host statistics...")
cpu = host_cpu.CPU()
disk = host_disk.Disk()
ram = host_ram.RAM()
temperature_host = host_temperature.Temperature()
# actuators/sensors
logger.info("init actuators and sensors...")
electrovalves = actuator_electrovalve.Electrovalve(configs)
fans = actuator_fan.Fan(configs)
co2 = sensor_co2.CO2()
humidity = sensor_humidity.Humidity()
nh3 = sensor_nh3.NH3()
temperature_sensor = sensor_temperature.Temperature()
# services
logger.info("init services...")
actuators_controller = service_actuators_controller.ActuatorsController(
configs,
electrovalves,
fans,
co2,
humidity,
nh3,
temperature_sensor,
)
discovery = service_discovery.Discovery(configs)
api = service_api.API(
configs,
discovery,
electrovalves,
fans,
cpu,
disk,
ram,
temperature_host,
co2,
humidity,
nh3,
temperature_sensor,
)
api_client = service_api_client.APIClient(configs)
poller_manager = service_poller.PollerManager(configs, api_client)
frontend = service_frontend.Frontend(
configs,
actuators_controller,
api_client,
discovery,
poller_manager,
electrovalves,
fans,
cpu,
disk,
ram,
temperature_host,
co2,
humidity,
nh3,
temperature_sensor,
)
discovery.subscribe(frontend)
# run
with concurrent.futures.ThreadPoolExecutor() as executor:
executor.submit(discovery.broadcast_listen)
executor.submit(discovery.broadcast)
executor.submit(discovery.ping_listen)
executor.submit(discovery.ping)
executor.submit(actuators_controller.start)
executor.submit(frontend.run)