81 lines
3.1 KiB
Python
81 lines
3.1 KiB
Python
import threading
|
|
import time
|
|
import requests
|
|
import re
|
|
from database import execute_query
|
|
from config import Config
|
|
from tenancy import school_singleton, met_school
|
|
|
|
|
|
def lokaal_id(naam):
|
|
"""Lokaal_ID voor een lokaalnaam; maakt het lokaal aan (zonder campus) als het nog niet bestaat."""
|
|
from database import execute_insert
|
|
rows = execute_query("SELECT Lokaal_ID FROM Lokalen WHERE Naam = %s ORDER BY Lokaal_ID LIMIT 1", (naam,))
|
|
if rows:
|
|
return rows[0]['Lokaal_ID']
|
|
return execute_insert("INSERT INTO Lokalen (Naam) VALUES (%s)", (naam,))
|
|
|
|
|
|
class CO2Scanner:
|
|
def __new__(cls):
|
|
# één scanner per school (elke school heeft een eigen netwerkbereik)
|
|
def init(inst):
|
|
inst.active = False
|
|
inst.thread = None
|
|
inst.auto_delete = False
|
|
inst.conf = Config()
|
|
return school_singleton(cls, init)
|
|
#start service
|
|
def start(self):
|
|
if not self.active:
|
|
self.active = True
|
|
self.thread = threading.Thread(target=met_school(self._run_scan_loop), daemon=True)
|
|
self.thread.start()
|
|
print("CO2 Scanner Service gestart.")
|
|
|
|
#killswitch
|
|
def stop(self):
|
|
self.active = False
|
|
print("CO2 Scanner Service gestopt.")
|
|
#houd service in actie
|
|
def _run_scan_loop(self):
|
|
while self.active:
|
|
self.perform_scan()
|
|
# Wacht het aantal minuten uit je config.ini (bijv. 5)
|
|
time.sleep(self.conf.CO2_INTERVAL * 60)
|
|
#functie die effectieve taak uitvoerd
|
|
def perform_scan(self):
|
|
"""De logica uit je originele script om IP's af te gaan."""
|
|
start_ip = self.conf.CO2_START_ADDR
|
|
end_ip = self.conf.CO2_END_ADDR
|
|
network = self.conf.CO2_NETWORK
|
|
if not network:
|
|
return
|
|
|
|
for i in range(start_ip, end_ip + 1):
|
|
if not self.active and threading.current_thread() == self.thread:
|
|
break
|
|
|
|
ip = f"{network}{i}"
|
|
url = f"http://{ip}/v1/constellation"
|
|
|
|
try:
|
|
# Time-out kort houden zodat de scan niet uren duurt
|
|
response = requests.get(url, timeout=1.5)
|
|
if response.status_code == 200:
|
|
data = response.text
|
|
# Regex uit je originele script
|
|
conc_match = re.search(r'"concentration":\s*{\s*"unit":\s*"ppm",\s*"value":\s*(\d+)', data)
|
|
name_match = re.search(r'"device_name":\s*{\s*"value":\s*"(.*?)"', data)
|
|
|
|
if conc_match:
|
|
ppm = int(conc_match.group(1))
|
|
lokaal = name_match.group(1) if name_match else ip
|
|
|
|
# Opslaan in DB (lokaal wordt aangemaakt als het nog niet bestaat)
|
|
execute_query(
|
|
"INSERT INTO CO2_Metingen (Lokaal_ID, ppm, Timestamp) VALUES (%s, %s, NOW())",
|
|
(lokaal_id(lokaal), ppm), commit=True
|
|
)
|
|
except:
|
|
continue |