gitextract_2o9djmi1/ ├── .flake8 ├── .gitignore ├── .pre-commit-config.yaml ├── .readthedocs.yaml ├── AUTHORS ├── CHANGELOG.txt ├── LICENSE ├── MANIFEST.in ├── README.rst ├── docker/ │ ├── docker-compose.yml-tmp │ ├── mysql/ │ │ └── Dockerfile-tmp │ ├── nginx/ │ │ ├── Dockerfile │ │ └── nginx.conf │ └── pyscada/ │ ├── Dockerfile │ ├── pyscada │ └── pyscada_init ├── docs/ │ ├── Makefile │ ├── backend.rst │ ├── command-line.rst │ ├── conf.py │ ├── control_item.rst │ ├── develop.rst │ ├── device_protocol.rst │ ├── django_settings.rst │ ├── docker.rst │ ├── frontend.rst │ ├── grafana.rst │ ├── index.rst │ ├── installation.rst │ ├── make.bat │ ├── nginx_setup.rst │ ├── phant.rst │ ├── plugin_install.rst │ ├── quick_install.rst │ ├── raspberryPiOS.rst │ ├── uninstall.rst │ ├── update.rst │ └── visa.rst ├── eslint.config.mjs ├── extras/ │ ├── 0.7to0.8.sh │ ├── Grafana-test-dashboard.json │ ├── nginx_sample.conf │ ├── pyscada-logrotate │ ├── service/ │ │ ├── SysV-init/ │ │ │ ├── gunicorn_django │ │ │ └── pyscada_daemon │ │ ├── systemd/ │ │ │ ├── gunicorn.service │ │ │ ├── gunicorn.socket │ │ │ ├── owfs.service │ │ │ └── pyscada_daemon.service │ │ └── windows/ │ │ └── register_windows_service.py │ ├── settings.py │ └── urls.py ├── install.sh ├── install_docker.sh ├── install_venv.sh ├── move_data.py ├── pyproject.toml ├── pyscada/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── cache_datasource/ │ │ ├── __init__.py │ │ ├── apps.py │ │ ├── migrations/ │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ └── models.py │ ├── core/ │ │ ├── __init__.py │ │ └── urls.py │ ├── device.py │ ├── django_datasource/ │ │ ├── __init__.py │ │ ├── apps.py │ │ ├── migrations/ │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ └── models.py │ ├── event/ │ │ ├── __init__.py │ │ └── worker.py │ ├── export/ │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── csv_file.py │ │ ├── export.py │ │ ├── hdf5_file.py │ │ ├── management/ │ │ │ ├── __init__.py │ │ │ └── commands/ │ │ │ ├── PyScadaExportData.py │ │ │ └── __init__.py │ │ ├── migrations/ │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_auto_20151201_1617.py │ │ │ ├── 0003_auto_20160315_1140.py │ │ │ ├── 0004_exporttask.py │ │ │ ├── 0005_auto_20160403_1454.py │ │ │ ├── 0006_auto_20160404_0949.py │ │ │ ├── 0007_auto_20161124_1002.py │ │ │ ├── 0008_auto_20161124_1003.py │ │ │ ├── 0009_auto_20161128_0948.py │ │ │ ├── 0010_auto_20161128_1049.py │ │ │ ├── 0011_exporttask_filename.py │ │ │ ├── 0012_exporttask_backgroundprocess.py │ │ │ ├── 0013_auto_20170711_0729.py │ │ │ ├── 0014_auto_20170711_1326.py │ │ │ ├── 0015_remove_exporttask_backgroundtask.py │ │ │ ├── 0016_auto_20191004_0912.py │ │ │ └── __init__.py │ │ ├── models.py │ │ └── worker.py │ ├── fixtures/ │ │ ├── color.json │ │ └── units.json │ ├── generic/ │ │ ├── __init__.py │ │ ├── device.py │ │ ├── devices/ │ │ │ ├── __init__.py │ │ │ ├── dummy.py │ │ │ └── waveform.py │ │ └── worker.py │ ├── hmi/ │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── migrations/ │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_auto_20151016_1932.py │ │ │ ├── 0003_auto_20151130_1456.py │ │ │ ├── 0004_auto_20151130_1502.py │ │ │ ├── 0005_auto_20160111_1822.py │ │ │ ├── 0006_auto_20160111_1848.py │ │ │ ├── 0007_auto_20160518_0848.py │ │ │ ├── 0008_auto_20180620_0716.py │ │ │ ├── 0009_controlitem_property_name.py │ │ │ ├── 0010_auto_20180705_1341.py │ │ │ ├── 0011_auto_20180710_1549.py │ │ │ ├── 0012_auto_20180912_1302.py │ │ │ ├── 0013_widget_update_20180912_1315.py │ │ │ ├── 0014_auto_20180912_1340.py │ │ │ ├── 0015_auto_20180913_1608.py │ │ │ ├── 0016_auto_20181004_0831.py │ │ │ ├── 0017_groupdisplaypermission_forms.py │ │ │ ├── 0018_auto_20181205_0937.py │ │ │ ├── 0019_auto_20181205_1058.py │ │ │ ├── 0020_pie.py │ │ │ ├── 0021_auto_20190528_0924.py │ │ │ ├── 0022_auto_20191004_0912.py │ │ │ ├── 0023_dropdownitem_value.py │ │ │ ├── 0024_auto_20191212_1516.py │ │ │ ├── 0025_widgetcontent_content_str.py │ │ │ ├── 0026_auto_20200915_1333.py │ │ │ ├── 0027_auto_20200915_1407.py │ │ │ ├── 0028_auto_20200915_1540.py │ │ │ ├── 0029_auto_20200916_0720.py │ │ │ ├── 0030_auto_20200918_0842.py │ │ │ ├── 0031_auto_20200918_1206.py │ │ │ ├── 0032_auto_20200918_1408.py │ │ │ ├── 0033_auto_20200918_1439.py │ │ │ ├── 0034_auto_20200918_1445.py │ │ │ ├── 0035_auto_20200918_1517.py │ │ │ ├── 0036_auto_20200923_0850.py │ │ │ ├── 0037_auto_20200923_0852.py │ │ │ ├── 0038_auto_20200929_1410.py │ │ │ ├── 0039_auto_20201002_0928.py │ │ │ ├── 0040_dictionary_dictionaryitem.py │ │ │ ├── 0041_auto_20201002_0934.py │ │ │ ├── 0042_auto_20201201_1335.py │ │ │ ├── 0043_auto_20201201_1411.py │ │ │ ├── 0044_auto_20201201_1539.py │ │ │ ├── 0045_auto_20201201_2100.py │ │ │ ├── 0046_auto_20201201_2109.py │ │ │ ├── 0047_auto_20201202_1445.py │ │ │ ├── 0048_chartaxis_fill.py │ │ │ ├── 0049_auto_20201202_2037.py │ │ │ ├── 0050_auto_20201203_2101.py │ │ │ ├── 0051_auto_20201204_0901.py │ │ │ ├── 0052_auto_20201204_0949.py │ │ │ ├── 0053_auto_20211118_1438.py │ │ │ ├── 0054_displayvalueoption_type.py │ │ │ ├── 0055_auto_20211125_1405.py │ │ │ ├── 0056_auto_20211210_1608.py │ │ │ ├── 0057_auto_20211214_1157.py │ │ │ ├── 0058_auto_20220523_1639.py │ │ │ ├── 0059_alter_view_theme.py │ │ │ ├── 0060_chartaxis_show_bars.py │ │ │ ├── 0061_auto_20220610_1459.py │ │ │ ├── 0062_auto_20220616_1523.py │ │ │ ├── 0063_move_group_display_permissions.py │ │ │ ├── 0064_auto_20220617_1333.py │ │ │ ├── 0065_auto_20220620_0854.py │ │ │ ├── 0066_auto_20221205_1435.py │ │ │ ├── 0067_alter_cssclass_options.py │ │ │ ├── 0068_alter_displayvalueoption_timestamp_conversion.py │ │ │ ├── 0069_displayvalueoption_color_and_more.py │ │ │ ├── 0070_move_displayvalueoptions.py │ │ │ ├── 0071_remove_displayvalueoption_color_1_and_more.py │ │ │ ├── 0072_alter_groupdisplaypermission_hmi_group.py │ │ │ ├── 0073_alter_processflowdiagramitem_control_item.py │ │ │ ├── 0074_alter_cssclass_css_class.py │ │ │ ├── 0075_alter_processflowdiagram_url_height_and_more.py │ │ │ ├── 0076_displayvalueoptiontemplate_transformdata_and_more.py │ │ │ ├── 0077_transformdatacountvalue.py │ │ │ ├── 0078_alter_theme_base_filename_alter_theme_view_filename.py │ │ │ ├── 0079_displayvalueoption_from_timestamp_offset.py │ │ │ ├── 0080_view_default_time_delta.py │ │ │ ├── 0081_groupdisplaypermission_unauthenticated_users.py │ │ │ ├── 0082_externalview.py │ │ │ ├── 0083_externalviewgroupdisplaypermission.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── signals.py │ │ ├── static/ │ │ │ └── pyscada/ │ │ │ ├── css/ │ │ │ │ ├── bootstrap/ │ │ │ │ │ ├── bootstrap-theme.css │ │ │ │ │ └── bootstrap.css │ │ │ │ ├── daterangepicker/ │ │ │ │ │ └── daterangepicker.css │ │ │ │ ├── fonts/ │ │ │ │ │ └── roboto/ │ │ │ │ │ └── LICENSE.txt │ │ │ │ ├── jquery-ui/ │ │ │ │ │ ├── AUTHORS.txt │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── jquery-ui.css │ │ │ │ │ ├── jquery-ui.structure.css │ │ │ │ │ ├── jquery-ui.theme.css │ │ │ │ │ └── package.json │ │ │ │ └── pyscada/ │ │ │ │ └── pyscada-theme.css │ │ │ └── js/ │ │ │ ├── MIT-LICENSE.txt │ │ │ ├── admin/ │ │ │ │ ├── display_inline_datasource.js │ │ │ │ ├── display_inline_protocols_device.js │ │ │ │ ├── display_inline_protocols_variable.js │ │ │ │ ├── display_inline_transform_data_display_value_option.js │ │ │ │ ├── handler_content_as_pre.js │ │ │ │ └── hideshow.js │ │ │ ├── bootstrap/ │ │ │ │ ├── affix.js │ │ │ │ ├── alert.js │ │ │ │ ├── bootstrap.js │ │ │ │ ├── button.js │ │ │ │ ├── carousel.js │ │ │ │ ├── collapse.js │ │ │ │ ├── dropdown.js │ │ │ │ ├── modal.js │ │ │ │ ├── npm.js │ │ │ │ ├── popover.js │ │ │ │ ├── scrollspy.js │ │ │ │ ├── tab.js │ │ │ │ ├── tooltip.js │ │ │ │ └── transition.js │ │ │ ├── dexie/ │ │ │ │ └── LICENSE.txt │ │ │ ├── flot/ │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── jquery.event.drag.LICENSE.txt │ │ │ │ ├── jquery.mousewheel.LICENSE.txt │ │ │ │ ├── lib/ │ │ │ │ │ ├── globalize.culture.en-US.js │ │ │ │ │ ├── globalize.js │ │ │ │ │ ├── jquery.event.drag.js │ │ │ │ │ └── jquery.mousewheel.js │ │ │ │ └── source/ │ │ │ │ ├── jquery.canvaswrapper.js │ │ │ │ ├── jquery.colorhelpers.js │ │ │ │ ├── jquery.flot.axislabels.js │ │ │ │ ├── jquery.flot.browser.js │ │ │ │ ├── jquery.flot.categories.js │ │ │ │ ├── jquery.flot.composeImages.js │ │ │ │ ├── jquery.flot.crosshair.js │ │ │ │ ├── jquery.flot.drawSeries.js │ │ │ │ ├── jquery.flot.errorbars.js │ │ │ │ ├── jquery.flot.fillbetween.js │ │ │ │ ├── jquery.flot.flatdata.js │ │ │ │ ├── jquery.flot.gauge.js │ │ │ │ ├── jquery.flot.hover.js │ │ │ │ ├── jquery.flot.image.js │ │ │ │ ├── jquery.flot.js │ │ │ │ ├── jquery.flot.legend.js │ │ │ │ ├── jquery.flot.logaxis.js │ │ │ │ ├── jquery.flot.navigate.js │ │ │ │ ├── jquery.flot.pie.js │ │ │ │ ├── jquery.flot.resize.js │ │ │ │ ├── jquery.flot.saturated.js │ │ │ │ ├── jquery.flot.selection.js │ │ │ │ ├── jquery.flot.stack.js │ │ │ │ ├── jquery.flot.symbol.js │ │ │ │ ├── jquery.flot.threshold.js │ │ │ │ ├── jquery.flot.time.js │ │ │ │ ├── jquery.flot.touch.js │ │ │ │ ├── jquery.flot.touchNavigate.js │ │ │ │ ├── jquery.flot.uiConstants.js │ │ │ │ └── jquery.js │ │ │ ├── jquery/ │ │ │ │ ├── jquery.cookie.js │ │ │ │ └── parser-input-select.js │ │ │ ├── jquery-ui/ │ │ │ │ ├── AUTHORS.txt │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── jquery-ui.js │ │ │ │ └── package.json │ │ │ ├── jquery.flot.axisvalues.js │ │ │ ├── pyscada/ │ │ │ │ ├── TransformDataHmiPlugin.js │ │ │ │ ├── pyscada_tests.js │ │ │ │ └── pyscada_v0-9-0.js │ │ │ └── tempusdominus-bootstrap-3.js │ │ ├── templates/ │ │ │ ├── 403.html │ │ │ ├── _chart_legend.html │ │ │ ├── base.html │ │ │ ├── button.html │ │ │ ├── chart.html │ │ │ ├── chart_legend.html │ │ │ ├── choose_login.html │ │ │ ├── circular_gauge.html │ │ │ ├── content_page.html │ │ │ ├── control_element.html │ │ │ ├── control_panel.html │ │ │ ├── custom_html_panel.html │ │ │ ├── dropdown.html │ │ │ ├── form.html │ │ │ ├── login.html │ │ │ ├── modelProperties.html │ │ │ ├── password_change.html │ │ │ ├── password_change_done.html │ │ │ ├── pie.html │ │ │ ├── process_flow_diagram.html │ │ │ ├── status_element.html │ │ │ ├── svg_loading_icon.html │ │ │ ├── template_not_found.html │ │ │ ├── user_dropdown.html │ │ │ ├── user_profile_change.html │ │ │ ├── value_field.html │ │ │ ├── view.html │ │ │ ├── view_overview.html │ │ │ └── widget_row.html │ │ ├── templatetags/ │ │ │ ├── __init__.py │ │ │ └── views_extras.py │ │ ├── urls.py │ │ └── views.py │ ├── log/ │ │ └── __init__.py │ ├── mail/ │ │ ├── __init__.py │ │ └── worker.py │ ├── management/ │ │ ├── __init__.py │ │ └── commands/ │ │ ├── __init__.py │ │ └── pyscada_daemon.py │ ├── migrations/ │ │ ├── 0001_initial.py │ │ ├── 0002_event_hysteresis.py │ │ ├── 0003_auto_20151026_1826.py │ │ ├── 0004_unit_udunit.py │ │ ├── 0005_merge.py │ │ ├── 0006_auto_20151130_1449.py │ │ ├── 0007_auto_20151201_1613.py │ │ ├── 0008_auto_20151201_1614.py │ │ ├── 0009_auto_20160111_1802.py │ │ ├── 0010_auto_20160115_0918.py │ │ ├── 0011_auto_20160115_0920.py │ │ ├── 0012_auto_20160119_0950.py │ │ ├── 0013_auto_20160204_0840.py │ │ ├── 0014_auto_20160210_1152.py │ │ ├── 0015_auto_20160215_1522.py │ │ ├── 0016_auto_20160215_2002.py │ │ ├── 0017_recordeddata.py │ │ ├── 0018_auto_20160228_1623.py │ │ ├── 0019_datamigration_20160228_1624.py │ │ ├── 0020_auto_20160228_1641.py │ │ ├── 0021_auto_20160228_1643.py │ │ ├── 0022_auto_20160228_2029.py │ │ ├── 0023_auto_20160314_1817.py │ │ ├── 0024_auto_20160517_1047.py │ │ ├── 0025_auto_20160517_1734.py │ │ ├── 0026_auto_20160518_0848.py │ │ ├── 0027_auto_20160530_1436.py │ │ ├── 0028_auto_20160630_0831.py │ │ ├── 0029_scaling_limit_input.py │ │ ├── 0030_device_polling_interval.py │ │ ├── 0031_delete_variableconfigfileimport.py │ │ ├── 0032_auto_20161107_2206.py │ │ ├── 0033_auto_20161107_2241.py │ │ ├── 0034_auto_20170213_0855.py │ │ ├── 0035_auto_20170224_1215.py │ │ ├── 0036_auto_20170224_1245.py │ │ ├── 0037_auto_20170418_0931.py │ │ ├── 0038_auto_20170707_1209.py │ │ ├── 0039_auto_20170711_1326.py │ │ ├── 0040_auto_20170905_0942.py │ │ ├── 0041_update_protocol_id.py │ │ ├── 0042_auto_20180604_1240.py │ │ ├── 0043_devicewritetask_property_name.py │ │ ├── 0044_auto_20180704_1307.py │ │ ├── 0045_auto_20180705_1341.py │ │ ├── 0046_remove_devicewritetask_property_name.py │ │ ├── 0047_recordeddatanew.py │ │ ├── 0047_variableproperty_unit.py │ │ ├── 0048_datamigration_20181025_0918.py │ │ ├── 0049_auto_20181025_1049.py │ │ ├── 0050_merge_20181130_1143.py │ │ ├── 0051_auto_20181206_1107.py │ │ ├── 0052_auto_20181207_1019.py │ │ ├── 0053_auto_20190207_1526.py │ │ ├── 0053_auto_20190307_1423.py │ │ ├── 0054_auto_20190208_0913.py │ │ ├── 0054_auto_20190411_0749.py │ │ ├── 0055_auto_20190625_1752.py │ │ ├── 0056_auto_20190625_1823.py │ │ ├── 0057_auto_20191004_0912.py │ │ ├── 0058_merge_20191206_1328.py │ │ ├── 0059_auto_20200211_1049.py │ │ ├── 0060_auto_20200914_1417.py │ │ ├── 0061_devicereadtask.py │ │ ├── 0062_auto_20201002_0830.py │ │ ├── 0063_complexevent_complexeventitem_complexeventitemvariable.py │ │ ├── 0064_auto_20201005_1443.py │ │ ├── 0065_auto_20201005_1454.py │ │ ├── 0066_auto_20201006_0718.py │ │ ├── 0067_auto_20201006_0719.py │ │ ├── 0068_auto_20201006_0826.py │ │ ├── 0069_complexeventgroup_current_level.py │ │ ├── 0070_auto_20201006_1327.py │ │ ├── 0071_recordedevent_level.py │ │ ├── 0072_auto_20201006_1408.py │ │ ├── 0073_auto_20201007_0858.py │ │ ├── 0074_complexeventitem_active.py │ │ ├── 0075_auto_20201007_1609.py │ │ ├── 0076_mail_html_message.py │ │ ├── 0077_auto_20201104_1656.py │ │ ├── 0078_auto_20201123_1906.py │ │ ├── 0079_devicehandler.py │ │ ├── 0080_variableproperty_last_modified.py │ │ ├── 0081_calculatedvariable_periodfield_variablecalculatedfields.py │ │ ├── 0082_auto_20211112_1043.py │ │ ├── 0083_auto_20211115_0812.py │ │ ├── 0084_auto_20211115_1503.py │ │ ├── 0085_calculatedvariableselector_active.py │ │ ├── 0086_auto_20211115_1612.py │ │ ├── 0087_auto_20211116_1329.py │ │ ├── 0088_auto_20211117_1023.py │ │ ├── 0089_calculatedvariable_state.py │ │ ├── 0090_auto_20211117_1239.py │ │ ├── 0091_auto_20211118_1019.py │ │ ├── 0092_auto_20211125_1054.py │ │ ├── 0093_auto_20211125_1256.py │ │ ├── 0094_move_dictionaries.py │ │ ├── 0095_auto_20211203_1949.py │ │ ├── 0096_auto_20211210_0924.py │ │ ├── 0097_auto_20220118_1046.py │ │ ├── 0098_alter_device_polling_interval.py │ │ ├── 0099_alter_dictionaryitem_label.py │ │ ├── 0100_device_instrument_handler.py │ │ ├── 0101_complexeventchangevariable.py │ │ ├── 0102_move_complex_event_variables.py │ │ ├── 0103_remove_complexevent_new_value_and_more.py │ │ ├── 0104_rename_complexeventitem_complexeventinput_and_more.py │ │ ├── 0105_edit_generic_device_protocol.py │ │ ├── 0106_datasource_datasourcemodel_djangodatabase_and_more.py │ │ ├── 0107_alter_calculatedvariableselector_period_fields.py │ │ ├── 0108_remove_calculatedvariable_period_and_more.py │ │ ├── 0109_alter_variable_value_class.py │ │ ├── 0110_variable_readable.py │ │ ├── 0111_devicehandlerparameter.py │ │ ├── 0112_alter_devicehandlerparameter_value.py │ │ ├── 0113_variablehandlerparameter.py │ │ ├── 0114_alter_devicehandlerparameter_value_and_more.py │ │ ├── 0115_remove_recordeddata_variable_and_more.py │ │ ├── 0116_variable_pause_recording.py │ │ └── __init__.py │ ├── models.py │ ├── signals.py │ ├── single_value_datasource/ │ │ ├── __init__.py │ │ ├── apps.py │ │ ├── migrations/ │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ └── models.py │ ├── tests.py │ ├── utils/ │ │ ├── __init__.py │ │ └── scheduler.py │ └── views.py ├── setup.py ├── tests/ │ ├── project_template/ │ │ ├── manage.py-tpl │ │ └── project_name/ │ │ ├── __init__.py-tpl │ │ ├── asgi.py-tpl │ │ ├── settings.py-tpl │ │ ├── urls.py-tpl │ │ └── wsgi.py-tpl │ ├── test.sh │ ├── test_modbus.sh │ └── test_without_plugins.sh └── tox.ini