0.7.0b2
 - fixed modbus daemon
 - fixed modbus device
 - updated Docs
 - readded log notifications in HMI
 - added loading animation for data prefetch in HMI
 - changed id in Log model to timestame + id schema

0.7.0b3
 - removed separate handler files for daq
 - removed seperate HMIVariable model
 - added restart of daq when Variable or Device model are changed
 - added support for different byte order of aquired data
 - fixed support for U/INT64 and U/INT32 datatypes
 - removed chart_set from hmi
 - updated docs
 - removed unused code

0.7.0b4
 - fixed reinit loop in daq daemon
 - added restart of daq when Scaling model has changed
 - fixed hmi.widget save without a title
 - fixed export.handler (wrong start and end date)
 - fixed export to file, check of array index, import of numpy
 - added backend table (VariableState) for current values in the database
 - fixed crash of hmi admin when widget has no title
 - added unixtime value in web hmi (experimental)
 - fixed custom html panel variable not uptading in hmi
 - added restart_daemon field in background task model
 - added check of write permissions for pid and log file in DaemonHandler

0.7.0b5
 - added color chooser to VariableAdmin
 - fixed display bool values in charts
 - added servertime to footer of hmi
 - new register handling structure in modbus device

0.7.0b6
 - updated javascript libs
    - jquery --> 1.12.4
    - flot --> 0.8.3
    - tablesorter --> 2.0.5b
    - bootstrap --> 3.3.6
 - changed Title in HMI views
 - added pollinginterval field in device model
 - fixed chart legend template

 0.7.0b7
 - fixed data export (record starts with 0)
 - fixed RecordedData manager
 - added APC UPS status info's to systemstat device

0.7.0b8
 - added ability to add fake data to RecordedData manager
 - fixed add fake data in hmi
 - fixed query_first_value in RecordedData manager

0.7.0b9
 - updated to Django 1.10
 - changed filter in Chart Model Admin

0.7.0b10
 - added Visa and Phant Device support
 - minor fixes in the Export of Data

0.7.0b11
 - fixed Export without mean values
 - fixed managementcommand for Data Export
 - added lock for Exports to prevent running of more than one export at a time

0.7.0b12
  - fixed export
  - added datetime fields to Export
  - added pytz to the requirements

0.7.0b13
  - fixed modbus write task
  - fixed Event handling

0.7.0b14
  - fixed handling of int16 values in RecordedData Model
  - added custom admin interface
  - added filter to variable state admin view
  - added unit column to variable admin

0.7.0b15
  - added 1-Wire support (experimental)

0.7.0b16
  - fixed handling of dead tasks in data export

0.7.0b17
  - added support for custom daq devices
  - updated docs
  - some hmi changes

0.7.0b18
  - added OWFS support to onewire device
  - updated to django 1.11
  - added download link for export files to export job
  - fixed daemon handler

0.7.0b19, 0.7.0b20, 0.7.0b21
  - changed daemon handling to support multitasking
  - rearranged admin for Device and Variables
  - updated the Docs

0.7.0b22, 0.7.0b23, 0.7.0b24, 0.7.0b25
  - added BackgroundProcess restart on model change
  - fixed problem with id of ControlItems in HMI
  - updated Docker files (not working yet)
  - updated SysV-init service examples
  - updated systemd service examples

0.7.0b26
  - fixed Jofra350 Admin
  - fixed OperationalError in scheduler

0.7.0b27, 0.7.0b28, 0.7.0b29, 0.7.0b30, 0.7.0b31
  - major update to the javascript part of the HMI Client
  - added time selection bar in HMI

0.7.0rc1
  - updated Docs
  - updated systemd unit file
  - improved HMI

0.7.0rc2
  - fixed "-" bug in view link_title
  - fixed visa daq restart handler
  - fixed hmi "AutoUpdateButton" not working
  - updated docs, updated readme
  - added utils.blow_up function to convert database data from change of value to constant timestep data

0.7.0rc3
  - fixed double connect in visa device
  - moved loading animation in hmi
  - added 100 ms and 500 ms polling interval (experimental)
  - added extension compatibility
  - fixed onewire and smbus reinit handler
  - added protocol id for the new GPIO Extension

0.7.0rc4
  - added missing migration file

0.7.0rc5
  - changed the method for namespace packages to the pkg_resources-style
  - moved the version info to pyscada.core

0.7.0rc6
  - corrected typos
  - fixes of AppConfig for setup.py develop
  - added protocol id for scripting extension

0.7.0rc7
  - added admin for VariableProperty
  - added capability of reading and writing VariableProperties from the HMI and devices
  - altered arguments for device.write_data!

0.7.0rc8
  - changed VariableProperty handling in DeviceWriteTask
  - changed VariableProperty handling in HMI

0.7.0rc9
  - fixed variable and variable_property attributes in hmi.ControlItem
  - added traceback to Device.get_device_instance method
  - updated Keithley DMM2000 device in visa.devices

0.7.0rc10
  - updated docs
  - fixed no data download in pyscada.js
  - fixed default polling interval in pyscada.device

0.7.0rc11
  - changed widget model to support content from plugins
  - changed visable to visible in pyscada.hmi.models.Chart, SlidingPanelMenu, Widget
  - some changes for python 3 compatibility in pyscada.export

0.7.0rc12
  - fixed issue #13, Mismatch between event limit elif cases and the displayed limit types.
  - merged pull request #12, changing from source_format to target_format to match preceding setting of '2H' value

0.7.0rc13
  - updated docs, switching from python 2.7 to python 3
  - added redirect to https to the nginx sample config
  - fixed server error for BackgroundProcess View in Admin with python3
  - fixed HDF5 export for python 3
  - fixed ProcessFlowDiagram in HMI
  - added support for multiple SlidingSidePanels on one Side
  - added date_saved field to the RecordedData Model, renamed the RecordedData model without the field to RecordedDataOld,
    migration #48 will copy some data to the new model, the rest can be copied by using the move_data.py script

0.7.0rc14
  - update to flot 2.1.6
  - fixed process flow diagram value not displayed
  - moved x y zoom selection in HMI to each Chart
  - add option of redirecting to a custom login page
  - add framer option for modbus communication
  - add data courser in chart
  - add XYChart
  - add new form widget in HMI
  - add new drop down control element in HMI
  - fixed WidgetContent not being deleted
  - moved signal related methods to dedicated signals.py
  - added pyserial to dependency list
  - improved hmi <--> db communication to avoid data loss on slow connections

0.7.0rc15
  - fixed zombi process problem
  - fixed migrations with python3
  - changed datetime_now to now from django timezone

0.7.0rc16
  - fixed re-login after logout (#22)
  - added LINK_TARGET option to change the default behaviour of links in view overview (#23)
  - Catching exceptions if DB close while pyscada is running

0.7.0rc17, 0.7.0rc18
  - add pre_delete signals to stop the background process before deleting a device
  - move widget post_save signal to the model to remove the global receiver (not filtering by sender)
  - move device handlers to core
  - add stop in DAQ Process restart
  - move the device and variable protocol specific configuration to core
  - add protocol name in device __str__ for the variable js admin file
  - add complex events

0.7.0rc19
  - add fk_name in admin for bacnet device with 2 ForeignKey to Device model

0.7.0rc20
  - add django channels to send informations between processes

0.7.0rc21
  - Update docker config file
  - Add optional PID_FILE_NAME to settings to allow multiple instances
  - Add custom periodic auto caltulated variable

0.7.0rc22
  - Add choose_login.html to have multiple login ways
  - Add circular gauge to display control items
  - Add silent delete option in admin for VariableState and Device to delete a lot of data
  - Add grafana doc and config file to use Grafana to display data from a PyScada instance
  - Add dictionaries to store string with a key. Allows to store strings for Variables

0.7.0rc23
  - Add svg to render ProcessFlowDiagram. Allows to resize to fit the window size
  - Add OPC-UA protocol
  - close DB connection in scheduler to allow multiple instance on the same DB to run
  - Add INT8 and UINT8 variable value class
  - change the date range picker JS library
  - Add logrotate config file
  - Add a slider to change the refresh rate value of data handling

0.7.1rc1
  - Update to Django 3
  - Update docker config and doc to use pyscada repository

0.7.1rc2
  - Move group display permission items to inline and add exclude type for each item
  - fix adding a new device and activate device in protocol process list
  - fix signals for BP not done nor failed
  - add theme files validator
  - other fixes

0.7.1rc3
  - add bar chart
  - add polling intervals
  - add view theme
  - add -config2 div in html to get all infos of items used in the user interface
  - add calculated variable for aggregation
  - add install script
  - add css class arg to customize widget
  - fixes

0.7.1rc4
  - Add MBus to protocol list
  - add append and remove dictionary functions
  - Fix device write task for VP (no variable defined)
  - HTML: add span for legendLabel text
  - JS: load visible chart variable first
  - fixes

0.7.1rc5
  - add hide/show JS for fields in admin
  - add get_prev_value overwritten by child class for systemstat non logging variable
  - last_value use get_prev_value
  - add systemstat timestamps
  - add file protocol
  - fix DeviceWriteTask for variable to change in complex events
  - add value using get_prev_value in views.py for non logging variables
  - Move handler to Device model.
  - Wait 5 seconds to read the main pid (scheduler)

0.8.0
  - core : fix when no handler selected to use the GenericHandlerDevice of the selected protocol
  - systemstat : Create systemstat device (allow remote over ssh)
  - core : Fix timestamp not integer in RecordedData init
  - systemstat : process pid find in cmdline and not only in processus name
  - systemstat : fix pre_delete signal and information choice name
  - core : fix config2 and add classes
  - systemstat : add write_data to execute command
  - JS : fixes
  - core : fix protocol list for devices
  - hmi : fix color for control items
  - core : add related models to Config2
  - JS : dateTimePicker Event : send pyscadaDateTimeChange event for all objects with the class pyscadaDateTimeChange when the datetime picker value change.
  - various : replace ugettext_lazy by gettext_lazy
  - core : replacing pyscada.core in INSTALLED_APPS by pyscada
  - hmi : replace django.conf.urls.url by django.urls.path
  - all : Moving to AGPL3 License
  - core : Moving to django 4.2
  - docs : fixed urls in the docs
  - added a testscript for the instalation routine
  - core : display value option refactoring. Control items display value option code refactoring. Allows more than 3 color.
  - fix django requirements. It should be a coma separated list.
  - moved to new namespace packet format (PEP420) : this was nessesary to make the use of venv possible
  - Fix django 4.0 login : change the default value for LOGIN_REDIRECT_URL in settings.py
  - Fix django 4.0 CSRF_TRUSTED_ORIGINS : change the nginx config to forward the protocol used (http or https) because : Changed in Django 4.0: The values in older versions must only include the hostname (possibly with a leading dot) and not the scheme or an asterisk.
  - Fix when a plugin is uninstalled but the WidgetContent defined in this plugin remain and is selected in an active widget. Add an information log.
  - modbus : fix migration test
  - update install shell : system and docker options
  - modbus : fix test : remove pyvisa from settings template
  - HMI GroupDisplayPermission no groups :
    - add GroupDisplayPermission for users without any group (blank=True).
    - auto create in the hmi/0072 migration.
    - this GroupDisplayPermission cannot be deleted in the admin interface.
    - this group allow everything by default (exclude is empty for each OneToOne related model).
    - add ValidationError for duplicate GroupDisplayPermission.
    - auto collapse only empty inlines in GroupDisplayPermission admin.
    - update get_group_display_permission_list in utils.
    - use get_group_display_permission_list in read and write task.
  - CompexEvent with multiple output variables and refactoring
    - Change names :
    - * ComplexEventGroup > ComplexEvent
    - * ComplexEvent > ComplexEventLevel
    - * ComplexEventItem > ComplexEventInput
    - add ComplexEventOutput to set multiple output variable values when a ComplexEventLevel is active or when no level in active for a ComplexEvent.
  - Remove unused import
  - add informations to pyscada.mail
  - init_db for event and mail add pyscada.core to installed app in init_db
  - use concurrent_log_handler to rotate logs
  - remove django_cas_ng config from settings
  - send mails to admins and managers
  - force channel layer to be empty
    - since the version 4 of channel redis version, the channel layer is not
    - empty after the first read
    - we read it again to empty it
    - maybe it is related to
    - django/channels_redis#348
    - or to django/channels_redis#366
  - Create background process for generic device
    - use id 16 for the generic process worker as 1 is taken by the scheduler
    - but id 1 is taken for generic protocol id
    - by defaut the generic device don't do nothing
    - use the dummy handler to save
  - Allow millisecond timestamp for recorded data
    - Replace time() by time_ns / 1000000000 in
    - GenericDevice (write)
    - GenericHandlerDevice (time)
    - RecordedData (init)
    - Do not force timestamp in recorded data init to be integer beforce id calculation.
  - add handler for dummy waveforms
    - Create waveforms for a generic device.
    - Type can be sinus, square and triangle.
    - Properties are set using variable properties: type, amplitude, start_timestamp, frequency and duty cycle.
    - Variable Property type should be a string.
    - default is:
    - "type": "sinus",  # sinus, square, triangle
    - "amplitude": 1.0,  # peak to peak value
    - "start_timestamp": 0.0,  # in second from 01/01/1970 00:00:00
    - "frequency": 0.1,  # Hz
    - "duty_cycle": 0.5,  # between 0 and 1, duty cycle for square and for
    - triangle : Width of the rising ramp as a proportion of the total cycle.
    - Default is 1, producing a rising ramp, while 0 produces a falling ramp.
    - width = 0.5 produces a triangle wave. If an array, causes wave shape to
    - change over time, and must be the same length as t.
  - log for device write task : log when DWT for a variable not writeable
  - fix boolean with display option
    - use button.html for boolean with display options and for non boolean with color only display option
  - add span for display button : use this span to display the value next to the control item label
  - fix variable property control item
    - fix dictionary, color for VP
    - merge number and boolean in update data values to simplify the code
    - remove unused boolean classes
  - add offset property to generic waveform handler
  - send mail fail not silently : show the error message in a warning log
  - refactor logs
    - remove some error logs
    - replace error logs by warning logs
    - use f-strings in error logs
    - add exc_info=True to log traceback and send it to ADMINS (see settings.py)
    - log as error when a process failed 3 times (to send a mail to ADMINS) then log as warning
  - set AdminEmailHandler settings
  - update gitignore for docker
  - fix export when a filename is given
