108 lines
3.0 KiB
Markdown

# IndustrialTracker
## Databse model
### Device
Main device object used as base for dependency injection
- id - number
- name - string
- type - (Relation)->DeviceType
- enabled - boolean
### DeviceType
Device type definition
- id - number
- name - string
### Reading
Reading object used to store data from Device
- id - number
- device - (Relation)->Device
- reading_time - date
- energy - number
- air - number
- running - boolean
- ... place for more data eventually
### PLC
PLC object used to store configuration of PLC
- id - number
- ip - string
- port - number
- db_number - number
- energy_offset - number
- air_offset - number
- running_offset - number
- ... place for more offsets definition
### PAC
PAC object used to store configuration of PAC
- id - number
- ip - string
- port - number
... something I missed
### Scheduler
- id - number
- name - string
- interval_seconds - number
- next_run - date
... something I missed
## Workflow
Entire application should be configurable via databse.
Main config of dbs connections, seq connection should be in `config.ini` file.
Maintain support to multiple dbs providers (mssql, postgresql)
> WARNING: `config.ini` contains sensitive data, so it should be excluded from git repository.
### Main process
`main.py`
Place where:
- logger is initialized
- database service is initialized
- read service is initialized
- scheduler service is initialized
### Scheduler process/service
`scheduler.py`
Module that is responsible for scheduled operations.
Scheduler should be able to:
- have name - set on object creation, it will be used as identifier of scheduler
- run multiple instances of itself
- Raw class of `Scheduler` should have methods for controlling other schedulers.
- `Scheduler` object should have methods for controlling scheduler itself.
- Function that it will be calling should be somehow passed to scheduler.
When scheduler is run, it:
- gets all devices from database (Device)
- for each device that is enable, at first, check if it is accessible (by pinging)
- if yes, then it gets data from device (via read_service) and saves it to database (Reading)
### Read process/service
`read_service.py`
> Read process should be unified for all devices and handled by dependency injection.
Abstract class for dependency injection is declared in `readers/device_reader.py`.
Each device type has it's own reader class that implements pinging function and reading function.
* PLC reader is implemented in `readers/plc_reader.py`
* PAC reader is implemented in `readers/pac_reader.py`
#### PLC reader
Utilizes `python-snap7` library to communicate with PLC.
#### PAC reader
> TODO: PAC reader is not implemented yet.
Utilizes `---` library to communicate with PAC.
### Database process/service
`database_service.py`
Singleton class that implements all database operations.
> Most use cases should be in scheduler process where readed data are going to be saved to database.