2024-12-04 23:20:09 +04:00
|
|
|
import os
|
2024-10-28 14:47:20 +04:00
|
|
|
from kafka import KafkaProducer, KafkaConsumer
|
|
|
|
import kafka
|
|
|
|
import socket
|
2024-10-28 19:43:13 +04:00
|
|
|
from json import dumps, loads
|
2024-11-12 16:18:14 +04:00
|
|
|
from flask import Flask, request
|
2024-10-28 19:43:13 +04:00
|
|
|
import time
|
2024-10-29 17:31:47 +04:00
|
|
|
from enum import Enum
|
2024-11-12 16:18:14 +04:00
|
|
|
import threading
|
2024-10-28 14:47:20 +04:00
|
|
|
|
2024-12-04 23:20:09 +04:00
|
|
|
|
2024-11-12 16:18:14 +04:00
|
|
|
app = Flask(__name__)
|
2024-10-29 17:31:47 +04:00
|
|
|
|
2024-11-12 16:18:14 +04:00
|
|
|
def start_manager():
|
|
|
|
return
|
2024-10-30 11:10:39 +04:00
|
|
|
|
2024-10-29 17:31:47 +04:00
|
|
|
class Manager:
|
2024-12-22 19:46:36 +04:00
|
|
|
def __init__(self, _id: int, moisture: float = 0, target_moisture: float = 30, temp: float = 20, target_temp: float = 30,
|
|
|
|
isAutoOn: bool = False, valve_state: str = "closed", heater_state: str = "off"):
|
2024-12-04 23:20:09 +04:00
|
|
|
KAFKA_URL = os.environ.get('KAFKA_URL')
|
|
|
|
print("KAFKA_URL=", KAFKA_URL)
|
2024-11-12 17:04:24 +04:00
|
|
|
self._id = _id
|
2024-10-29 17:31:47 +04:00
|
|
|
self.moisture = moisture
|
2024-12-22 19:46:36 +04:00
|
|
|
self.target_moisture = target_moisture
|
2024-10-29 17:31:47 +04:00
|
|
|
self.temp = temp
|
2024-12-22 19:46:36 +04:00
|
|
|
self.temp = target_temp
|
2024-10-29 17:31:47 +04:00
|
|
|
self.isAutoOn = isAutoOn
|
2024-10-30 11:10:39 +04:00
|
|
|
self.valve_state = valve_state
|
|
|
|
self.heater_state = heater_state
|
2024-10-29 17:31:47 +04:00
|
|
|
|
2024-10-30 11:10:39 +04:00
|
|
|
self.controllerConsumer = KafkaConsumer(
|
|
|
|
'commands',
|
2024-12-04 23:20:09 +04:00
|
|
|
bootstrap_servers=[KAFKA_URL],
|
2024-10-29 17:31:47 +04:00
|
|
|
auto_offset_reset='earliest',
|
|
|
|
enable_auto_commit=True,
|
2024-10-30 11:10:39 +04:00
|
|
|
consumer_timeout_ms=2000,
|
2024-11-12 17:04:24 +04:00
|
|
|
group_id=f'manager{self._id}',
|
2024-10-29 17:31:47 +04:00
|
|
|
value_deserializer=lambda x: loads(x.decode('utf-8'))
|
|
|
|
)
|
2024-10-30 11:10:39 +04:00
|
|
|
self.controllerConsumerResponse = KafkaProducer(
|
2024-12-04 23:20:09 +04:00
|
|
|
bootstrap_servers=[KAFKA_URL],
|
2024-11-12 17:04:24 +04:00
|
|
|
client_id=f'manager{self._id}_producer',
|
2024-10-30 11:10:39 +04:00
|
|
|
value_serializer=lambda v: dumps(v).encode('utf-8')
|
|
|
|
)
|
2024-10-29 17:31:47 +04:00
|
|
|
|
2024-10-30 11:10:39 +04:00
|
|
|
def toggle_device(self, device, request_id, greenhouse_id):
|
|
|
|
|
|
|
|
if device == 'valve':
|
|
|
|
|
|
|
|
if self.valve_state == 'closed':
|
|
|
|
self.valve_state = 'open'
|
|
|
|
print("Valve opened")
|
|
|
|
else:
|
|
|
|
self.valve_state = 'closed'
|
|
|
|
print("Valve closed")
|
|
|
|
|
|
|
|
elif device == 'heater':
|
|
|
|
|
|
|
|
if self.heater_state == 'off':
|
|
|
|
self.heater_state = 'on'
|
|
|
|
print("Heater turned on")
|
|
|
|
else:
|
|
|
|
self.heater_state = 'off'
|
|
|
|
print("Heater turned off")
|
|
|
|
|
|
|
|
self.send_status(request_id, greenhouse_id)
|
|
|
|
|
|
|
|
def send_status(self, request_id, greenhouse_id):
|
|
|
|
|
2024-12-22 19:46:36 +04:00
|
|
|
data = {
|
2024-10-30 11:10:39 +04:00
|
|
|
'request_id': request_id,
|
|
|
|
'greenhouse_id': greenhouse_id,
|
2024-12-22 19:46:36 +04:00
|
|
|
'moisture': self.moisture,
|
|
|
|
'target_moisture': self.target_moisture,
|
|
|
|
'valveStatus': self.valve_state,
|
|
|
|
'temp': self.temp,
|
|
|
|
'target_temp': self.target_temp,
|
|
|
|
'heaterStatus': self.heater_state,
|
|
|
|
'isAutoOn': self.isAutoOn
|
2024-10-30 11:10:39 +04:00
|
|
|
}
|
|
|
|
self.sendDataCommand(status)
|
|
|
|
print("Updating info...\n")
|
|
|
|
|
|
|
|
def sendDataCommand(self, message):
|
|
|
|
print("sending data...")
|
|
|
|
|
2024-12-22 19:46:36 +04:00
|
|
|
url = "https://localhost:7113/api/webhook"
|
|
|
|
headers = {
|
|
|
|
"Content-Type": "application/json"
|
|
|
|
}
|
|
|
|
|
|
|
|
response = requests.post(url, json=message, headers=headers)
|
|
|
|
|
|
|
|
# Check status code and content
|
2024-12-23 22:00:27 +04:00
|
|
|
print("Status Code", response.status_code)
|
|
|
|
print("Response Body", response.json())
|
2024-10-30 11:10:39 +04:00
|
|
|
|
|
|
|
def getCommand(self):
|
|
|
|
messages = self.controllerConsumer.poll(timeout_ms=1000)
|
|
|
|
|
|
|
|
# Проверяем, есть ли сообщения
|
|
|
|
|
|
|
|
for tp, msgs in messages.items():
|
|
|
|
for message in msgs:
|
2024-11-12 17:04:24 +04:00
|
|
|
print(f"Manager {self._id} received message: ")
|
2024-10-30 11:10:39 +04:00
|
|
|
print(message.value)
|
|
|
|
self.request_id = message.value['request_id']
|
|
|
|
self.greenhouse_id = message.value['greenhouse_id']
|
|
|
|
self.command = message.value['command']
|
2024-12-22 19:46:36 +04:00
|
|
|
if message.value.get('target_moisture'):
|
|
|
|
self.target_moisture = message.value['target_moisture']
|
|
|
|
if message.value.get('target_temp'):
|
|
|
|
self.target_temp = message.value['target_temp']
|
2024-10-30 11:10:39 +04:00
|
|
|
self.toggle_device(self.command, self.request_id, self.greenhouse_id)
|
|
|
|
|
2024-11-13 00:53:31 +04:00
|
|
|
t1 = threading.Thread(target=start_manager)
|
2024-11-12 17:04:24 +04:00
|
|
|
manager1 = Manager(_id=1)
|
2024-10-29 17:31:47 +04:00
|
|
|
managers = [manager1]
|
2024-10-28 14:47:20 +04:00
|
|
|
|
2024-11-12 16:18:14 +04:00
|
|
|
if __name__ == "__main__":
|
2024-11-13 00:53:31 +04:00
|
|
|
threading.Thread(target=lambda: app.run(host="0.0.0.0", port=20002, debug=True, use_reloader=False)).start()
|