Commit 6d7d192c6dfb4801756eed1e194bf3931c2d7e7e

Authored by Alexis Koralewski
1 parent f958e3f4
Exists in dev

Add agentdeviceplc

  1 +15-02-2023 (AKo): v0.6.18.0
  2 + - Add new version of weather config view
  3 + - Add agentdeviceplc
  4 +
1 06-02-2023 (AKo): v0.6.17.O 5 06-02-2023 (AKo): v0.6.17.O
2 - Add components file (RoofControler, PLC) 6 - Add components file (RoofControler, PLC)
3 7
privatedev/plugin/agent_devices/AgentDevicePLC.py 0 → 100644
@@ -0,0 +1,117 @@ @@ -0,0 +1,117 @@
  1 +#!/usr/bin/env python3
  2 +
  3 +import sys,os
  4 +
  5 +pwd = os.environ['PROJECT_ROOT_PATH']
  6 +if pwd not in sys.path:
  7 + sys.path.append(pwd)
  8 +from src.core.pyros_django.agent.Agent import Agent, build_agent, log, parse_args
  9 +
  10 +from src.core.pyros_django.devices.PLC import PLCController
  11 +from src.core.pyros_django.monitoring.plc_checker import PlcChecker
  12 +from common.models import *
  13 +from config.pyros.config_pyros import ConfigPyros
  14 +
  15 +
  16 +class AgentDevicePLC(Agent):
  17 +
  18 +
  19 + # FOR TEST ONLY
  20 + # Run this agent in simulator mode
  21 + TEST_MODE = False
  22 + # Run the assertion tests at the end
  23 + TEST_WITH_FINAL_TEST = True
  24 + TEST_MAX_DURATION_SEC = None
  25 + #TEST_MAX_DURATION_SEC = 120
  26 +
  27 + plcController = PLCController()
  28 + print ("AGENT ENV: config PLC is (ip={}, port={})".format(plcController.ip, plcController.port))
  29 + plc_checker = PlcChecker()
  30 +
  31 + log.debug("PLC instanciated")
  32 + time_history_minutes = 4
  33 +
  34 + # new config (obsconfig)
  35 + def __init__(self, name:str=None, simulated_computer=None):
  36 + if name is None:
  37 + name = self.__class__.__name__
  38 + super().__init__(simulated_computer=simulated_computer)
  39 + self.device_name = self.get_config().get_device_for_agent(self.get_config().unit_name, self.name).get("name")
  40 + self.serial_number = self.get_config().get_device_for_agent(self.get_config().unit_name, self.name).get("device_config").get("sn")
  41 + self.output_data = self.get_config().get_output_data_device(self.device_name)
  42 + # @override
  43 + def _init(self):
  44 + super()._init()
  45 +
  46 + log.debug("end init()")
  47 + # --- Set the mode according the startmode value
  48 + ##agent_alias = self.__class__.__name__
  49 + ##self.set_mode_from_config(agent_alias)
  50 +
  51 + # @override
  52 + def do_log(self):
  53 + super().do_log()
  54 +
  55 +
  56 + # @override
  57 + # previous name of function : routine_process
  58 + # Note : in Agent.py, routine_process_body seems to be the main function of routine of the agent
  59 + # We need to override routine_process_body and not routine_process
  60 + def _routine_process_iter_end_body(self):
  61 + log.debug("in routine_process_body()")
  62 + print("TODO: we recycle code")
  63 + status_plc = self.plcController.getStatus()
  64 + if self.parseNewStatus(status_plc):
  65 + self.saveSensors()
  66 + #self.saveInternalMonitoring()
  67 +
  68 + def parseNewStatus(self,status_plc):
  69 + # """ PM 20181009 parse new status for config
  70 + # Find return string "plc_status" positin within status_plc
  71 + if status_plc.find('PLC_STATUS') >= 0:
  72 + self.plc_checker.chk_config(status_plc)
  73 + return True
  74 +
  75 + return False
  76 +
  77 + def saveSensors(self):
  78 + for sensor in self.output_data:
  79 + for entity in self.output_data[sensor]:
  80 + sensor_monitoring_name = self.output_data[sensor].get(entity).get("monitoring_name")
  81 + if sensor_monitoring_name in self.plc_checker.monitoring_names.keys() and self.plc_checker.monitoring_names[sensor_monitoring_name] is not None:
  82 + value = self.plc_checker.get_sensor(sensor_monitoring_name)
  83 + try:
  84 + sensor_db = Sensors_data_last_value.objects.get(key=entity,serial_number=self.serial_number)
  85 + except Sensors_data_last_value.DoesNotExist:
  86 + sensor_db = Sensors_data_last_value.objects.create(
  87 + value=value,
  88 + key=entity,
  89 + model=self.device_name,
  90 + serial_number=self.serial_number
  91 + )
  92 + sensor_db.value=value
  93 + sensor_db.key=entity
  94 + sensor_db.model=self.device_name
  95 + sensor_db.serial_number=self.serial_number
  96 + sensor_db.save()
  97 +
  98 + # We don't have an history for weatherwatch
  99 + log.debug("saved weather")
  100 +
  101 +
  102 +
  103 +if __name__ == "__main__":
  104 +
  105 + # with thread
  106 + RUN_IN_THREAD=True
  107 + # with process
  108 + #RUN_IN_THREAD=False
  109 + args = parse_args(sys.argv[1:])
  110 + agent = build_agent(AgentDevicePLC,param_constr=args)
  111 + '''
  112 + TEST_MODE, configfile = extract_parameters()
  113 + agent = AgentM("AgentM", configfile, RUN_IN_THREAD)
  114 + agent.setSimulatorMode(TEST_MODE)
  115 + '''
  116 + print(agent)
  117 + agent.run()
src/core/pyros_django/monitoring/AgentDevicePLC.py 0 → 100644
@@ -0,0 +1,117 @@ @@ -0,0 +1,117 @@
  1 +#!/usr/bin/env python3
  2 +
  3 +import sys,os
  4 +
  5 +pwd = os.environ['PROJECT_ROOT_PATH']
  6 +if pwd not in sys.path:
  7 + sys.path.append(pwd)
  8 +from src.core.pyros_django.agent.Agent import Agent, build_agent, log, parse_args
  9 +
  10 +from src.core.pyros_django.devices.PLC import PLCController
  11 +from src.core.pyros_django.monitoring.plc_checker import PlcChecker
  12 +from common.models import *
  13 +from config.pyros.config_pyros import ConfigPyros
  14 +
  15 +
  16 +class AgentDevicePLC(Agent):
  17 +
  18 +
  19 + # FOR TEST ONLY
  20 + # Run this agent in simulator mode
  21 + TEST_MODE = False
  22 + # Run the assertion tests at the end
  23 + TEST_WITH_FINAL_TEST = True
  24 + TEST_MAX_DURATION_SEC = None
  25 + #TEST_MAX_DURATION_SEC = 120
  26 +
  27 + plcController = PLCController()
  28 + print ("AGENT ENV: config PLC is (ip={}, port={})".format(plcController.ip, plcController.port))
  29 + plc_checker = PlcChecker()
  30 +
  31 + log.debug("PLC instanciated")
  32 + time_history_minutes = 4
  33 +
  34 + # new config (obsconfig)
  35 + def __init__(self, name:str=None, simulated_computer=None):
  36 + if name is None:
  37 + name = self.__class__.__name__
  38 + super().__init__(simulated_computer=simulated_computer)
  39 + self.device_name = self.get_config().get_device_for_agent(self.get_config().unit_name, self.name).get("name")
  40 + self.serial_number = self.get_config().get_device_for_agent(self.get_config().unit_name, self.name).get("device_config").get("sn")
  41 + self.output_data = self.get_config().get_output_data_device(self.device_name)
  42 + # @override
  43 + def _init(self):
  44 + super()._init()
  45 +
  46 + log.debug("end init()")
  47 + # --- Set the mode according the startmode value
  48 + ##agent_alias = self.__class__.__name__
  49 + ##self.set_mode_from_config(agent_alias)
  50 +
  51 + # @override
  52 + def do_log(self):
  53 + super().do_log()
  54 +
  55 +
  56 + # @override
  57 + # previous name of function : routine_process
  58 + # Note : in Agent.py, routine_process_body seems to be the main function of routine of the agent
  59 + # We need to override routine_process_body and not routine_process
  60 + def _routine_process_iter_end_body(self):
  61 + log.debug("in routine_process_body()")
  62 + print("TODO: we recycle code")
  63 + status_plc = self.plcController.getStatus()
  64 + if self.parseNewStatus(status_plc):
  65 + self.saveSensors()
  66 + #self.saveInternalMonitoring()
  67 +
  68 + def parseNewStatus(self,status_plc):
  69 + # """ PM 20181009 parse new status for config
  70 + # Find return string "plc_status" positin within status_plc
  71 + if status_plc.find('PLC_STATUS') >= 0:
  72 + self.plc_checker.chk_config(status_plc)
  73 + return True
  74 +
  75 + return False
  76 +
  77 + def saveSensors(self):
  78 + for sensor in self.output_data:
  79 + for entity in self.output_data[sensor]:
  80 + sensor_monitoring_name = self.output_data[sensor].get(entity).get("monitoring_name")
  81 + if sensor_monitoring_name in self.plc_checker.monitoring_names.keys() and self.plc_checker.monitoring_names[sensor_monitoring_name] is not None:
  82 + value = self.plc_checker.get_sensor(sensor_monitoring_name)
  83 + try:
  84 + sensor_db = Sensors_data_last_value.objects.get(key=entity,serial_number=self.serial_number)
  85 + except Sensors_data_last_value.DoesNotExist:
  86 + sensor_db = Sensors_data_last_value.objects.create(
  87 + value=value,
  88 + key=entity,
  89 + model=self.device_name,
  90 + serial_number=self.serial_number
  91 + )
  92 + sensor_db.value=value
  93 + sensor_db.key=entity
  94 + sensor_db.model=self.device_name
  95 + sensor_db.serial_number=self.serial_number
  96 + sensor_db.save()
  97 +
  98 + # We don't have an history for weatherwatch
  99 + log.debug("saved weather")
  100 +
  101 +
  102 +
  103 +if __name__ == "__main__":
  104 +
  105 + # with thread
  106 + RUN_IN_THREAD=True
  107 + # with process
  108 + #RUN_IN_THREAD=False
  109 + args = parse_args(sys.argv[1:])
  110 + agent = build_agent(AgentDevicePLC,param_constr=args)
  111 + '''
  112 + TEST_MODE, configfile = extract_parameters()
  113 + agent = AgentM("AgentM", configfile, RUN_IN_THREAD)
  114 + agent.setSimulatorMode(TEST_MODE)
  115 + '''
  116 + print(agent)
  117 + agent.run()