Git Product home page Git Product logo

pyscada's Introduction

PyScada a open source SCADA system

A Open Source SCADA System with HTML5 HMI, build using the Django framework. If you like to setup your own SCADA system head over to http://pyscada.rtfd.io.

Features

  • HTML5 based HMI
  • Supports the following
  • industrial Protocols
  • devices
  • scripts
  • system tools
  • event management, data export, mail notification
  • very low Hardware requirements for the server

Structure

image

Dependencies

  • core/HMI
    • python>=3.8
    • django==4.2
    • numpy>=1.6.0
    • pillow
    • python-daemon

What is Working

  • Modbus TCP/RTU/BIN
  • Visa (at least for the devices in the visa/devices folder)
  • Systemstat
  • OneWire (only DS18B20)
  • phant (no known issues)
  • smbus (at least for the devices in the smbus/devices folder)
  • gpio (at least for the raspberry pi)
  • webservice (json and xml parsing)
  • systemstat
  • scripting
  • event (no known issues)
  • export (no known issues)
  • hmi (no known issues)

What is not Working/Missing

  • Documentation
  • SysV init daemon handling
  • BACNet (due to the lack of hardware to test)
  • OPC-UA (need more tests)
  • MeterBus (need more tests)

Installation

Detailed installation instruction can be found at: http://pyscada.rtfd.io .

Contribute

License

The project is licensed under the _GNU Affero General Public License v3 (AGPLv3).

pyscada's People

Contributors

clavay avatar es-m-se avatar gkend avatar hizaak avatar madianeg avatar nawendu avatar trombastic avatar vincent-inviseo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pyscada's Issues

Custom HTML Panel

When I added {{sys_variable}} in text box of CUSTOM HTML PANEL, it returns syntax {{sys_variable}} as it is, instead of value of sys_variable.
Please guide

Unable to re login from login screen

I am able to log out from PyScada successfully, and am presented with the login screen, where I would expect to be able to re-login after entering username and password.
This is not the case. It simply presents the same login screen again.

I have tried this in Opera ver 57.x as well as Firefox 60.6.1esr, with both doing the same thing, and I am fairly sure this is not a browser related issue.

The only way to re-login is to click on the PyScada menu item at the top left corner.
But this opens another tab.

Recorded Data init : not looking for value class UINT64

from pyscada/PyScada-Modbus#2 :

[17/Dec/2023 09:46:29] ERROR [pyscada.utils.scheduler:927] pyscada.modbus-1-192.168.1.59:502-1, unhandled exception
Traceback (most recent call last):
  File "/home/pyscada/.venv/lib/python3.10/site-packages/pyscada/utils/scheduler.py", line 818, in run
    status, data = self.loop()
  File "/home/pyscada/.venv/lib/python3.10/site-packages/pyscada/utils/scheduler.py", line 1764, in loop
    tmp_data = device.request_data()
  File "/home/pyscada/.venv/lib/python3.10/site-packages/pyscada/modbus/device.py", line 330, in request_data
    recorded_data_element = self.variables[variable_id].create_recorded_data_element()
  File "/home/pyscada/.venv/lib/python3.10/site-packages/pyscada/models.py", line 1731, in create_recorded_data_element
    return RecordedData(
  File "/home/pyscada/.venv/lib/python3.10/site-packages/pyscada/models.py", line 2802, in __init__
    super(RecordedData, self).__init__(*args, **kwargs)
  File "/home/pyscada/.venv/lib/python3.10/site-packages/django/db/models/base.py", line 567, in __init__
    raise TypeError(
TypeError: RecordedData() got unexpected keyword arguments: 'value'

Mysql issue

Hi,

i have managed to install the softawre on a raspberry pi3 b+ by mixing the official installation document and cwraig notice. modbus tcp-ip is working fine so thanks a lot
i have a problem if i want to add mysql database i have the following message :
django.db.utils.ProgrammingError: (1146, "Table 'PyScada_db.pyscada_backgroundprocess' doesn't exist")
is someone have the same issue, or if someone have managed to install it ?

thanks

michael

Read the Docs appears not to be linked to the Github repository

Hi @trombastic ,

Hopefully this only affects the links at the top of the Read the Docs PyScada page. However, I suspect it might be more than this, as the GitHub docs appear to be out of sync with the Read the Docs page.

Going to https://pyscada.readthedocs.io/en/dev-0.7.x/ and clicking on the "Edit on GitHub" link tries to load https://github.com/trombastic/PyScada/blob/dev-0.7.x/docs/index.rst which does not exist. It should be https://github.com/trombastic/PyScada/blob/dev/0.7.x/docs/index.rst .
Similarly going to https://pyscada.readthedocs.io/en/latest/ and clicking on the "Edit on GitHub" link tries to load https://github.com/trombastic/PyScada/blob/master/docs/index.rst . I'm not sure what this is supposed to load because the project does not contain a single master or equivalent branch.

Thank you for your help. 😊
Tim

Is is possible to talk using IEC62056 or dlms?

Hi!

Disclaimer: I am novice to SCADA systems.

I would like to use PyScada to talk to energy meters using TCP. They communicate via IEC62056 and dlms protocols - I have heard that I should be able to use MODBUS to talk to them.

Can you point me in right direction how I can do that?

Move to a new recorded data table

The idea is to create a new recorded data table that is more simple to store numbers and boolean (one field) and allows to store strings.

I made some test about the difference using one field for boolean, integer and floats or separated fields as currently, and a field for strings.

Here is the django app used to test :
dbTest.zip

in dbTest/models.py you have :

  • RecordedData is the same as currently used in PyScada
  • RecordedData2 that store everything in a FloatField
  • RecordedData3 is as RecordedData2 with a CharField column
  • RecordedData4 is the same as RecordedData3
  • RecordedData5 is the same as RecordedData4 but the CharField is a TextField

in dbTest/a.py you have the result :

  • RecordedData2 is quite the same as RecordedData : slightly faster and smaller
  • RecordedData3 is quite the same as RecordedData2 : slightly slower and larger
  • RecordedData4 store a text and is larger than RecordedData3
  • RecordedData5 is quite the same as RecordedData4

My proposition is to use the RecordedData4 or RecordedData5 as the new table.

@trombastic, what do you think ?

Installation error "Couldn't import Django"

Hi @trombastic ,

Thank you for your work on this excellent project. I am looking to use PyScada as part of a range of educational equipment which my company is developing (https://www.tecquipment.com/).

I have followed the Installation Guide (https://pyscada.readthedocs.io/en/dev-0.7.x/installation.html). Unfortunately when I get to the the last step (sudo systemctl start pyscada) I get the following error (output from "journalctl -xe").

-- Unit pyscada.service has begun starting up.
May 09 15:19:43 debian python3[10951]: Traceback (most recent call last):
May 09 15:19:43 debian python3[10951]:   File "/var/www/pyscada/PyScadaServer/manage.py", line 8, in <module>
May 09 15:19:43 debian python3[10951]:     from django.core.management import execute_from_command_line
May 09 15:19:43 debian python3[10951]: ImportError: No module named 'django'
May 09 15:19:43 debian python3[10951]: During handling of the above exception, another exception occurred:
May 09 15:19:43 debian python3[10951]: Traceback (most recent call last):
May 09 15:19:43 debian python3[10951]:   File "/var/www/pyscada/PyScadaServer/manage.py", line 14, in <module>
May 09 15:19:43 debian python3[10951]:     import django
May 09 15:19:43 debian python3[10951]: ImportError: No module named 'django'
May 09 15:19:43 debian python3[10951]: During handling of the above exception, another exception occurred:
May 09 15:19:43 debian python3[10951]: Traceback (most recent call last):
May 09 15:19:43 debian python3[10951]:   File "/var/www/pyscada/PyScadaServer/manage.py", line 17, in <module>
May 09 15:19:43 debian python3[10951]:     "Couldn't import Django. Are you sure it's installed and "
May 09 15:19:43 debian python3[10951]: ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forg
May 09 15:19:43 debian systemd[1]: pyscada.service: Control process exited, code=exited status=1

However, when I quiry the django version from the Python command line it imports and shows a version...

python
Python 2.7.13 (default, Sep 26 2018, 18:42:22) 
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.VERSION
(1, 11, 20, u'final', 0)
>>> 

I have also tried to follow this tutorial and @cwraig's tutorial on a Raspberry Pi 3 B+ on "Raspbian Stretch with desktop" (Release: 2019-04-08) and come to the same error.

I am new to django. Is there something obvious I've missed? What can I do to further diagnose the issue?

Thank you.
Tim

Could not receive modbus data.

i have setup the PyScada on Raspberry pi. and i want to communicate it with modbus over tcp. I can loginmto PyScada admin page, but dont know how to send and receive data over modbus

Pyscada Django Issue

I couldn't seem to complete the installation process, could someone help me? I haven't got a clue what's wrong. I could still get the django server up and running, but the issue is I only get text on the screen (see picture below). Any help will be greatly appreciated, I need to set this up for my course in University. Many thanks!

Currently using python 3.7.5

D:\Aqiel\Python Project\WindTurbineScada>python manage.py pyscada_daemon --init
Traceback (most recent call last):
File "manage.py", line 22, in
execute_from_command_line(sys.argv)
File "C:\Users\mirza\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\management_init_.py", line 364, in execute_from_command_line
utility.execute()
File "C:\Users\mirza\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\management_init_.py", line 356, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Users\mirza\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\management_init_.py", line 206, in fetch_command
klass = load_command_class(app_name, subcommand)
File "C:\Users\mirza\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\management_init_.py", line 40, in load_command_class
module = import_module('%s.management.commands.%s' % (app_name, name))
File "C:\Users\mirza\AppData\Local\Programs\Python\Python37\lib\importlib_init_.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1006, in _gcd_import
File "", line 983, in _find_and_load
File "", line 967, in _find_and_load_unlocked
File "", line 677, in _load_unlocked
File "", line 728, in exec_module
File "", line 219, in _call_with_frames_removed
File "C:\Users\mirza\AppData\Local\Programs\Python\Python37\lib\site-packages\pyscada\management\commands\pyscada_daemon.py", line 6, in
from pyscada.utils.scheduler import Scheduler
File "C:\Users\mirza\AppData\Local\Programs\Python\Python37\lib\site-packages\pyscada\utils\scheduler.py", line 30, in
from os import linesep, umask, access, W_OK, kill, remove, setsid, path, fork, F_OK, WNOHANG, getpid, waitpid
ImportError: cannot import name 'setsid' from 'os' (C:\Users\mirza\AppData\Local\Programs\Python\Python37\lib\os.py)

image

Confusion regarding Core:Events and Mail

In PySCADA core events we have the ability to act on a specific event by logging the event and or sending an email. That is great, but, there is an option to select the action where there are four available selections. The option 'record and send main only when event occurs' and 'record and send mail', what is the difference between these options ?

Also, how is it possible to specify the particular email to be sent out ?
In the Mails section, I can add different mails, each with their own subject and text body, but again, how is it possible to make these meaningful by placing variables in the main body ?

For example, If I have two mails, one for a low alarm and one for a high alarm condition, yes, I can say this in the subject, but how can I place actual variable data in the mail body ?

Then, how is it possible to then have the event select the appropriate mail based on the event that occurred ? For example, how can PySCADA send out the mail for low alarm when the event for low alarm condition is triggered, there is nowhere to specify this ?

I have configured setting.py for correct mail settings and this functions fine with a test email.

Error 500 while creating visa device

Hi !
I'm new with Github and using PyScada. (with pyvisa(-py) and pyusb)
I don't know if it's the place to show what I found and how I resolved it.

I'm using 0.7.0rc1.
I change in visa/model.py :
if type(instance) is VISADevice: post_save.send_robust(sender=Device, instance=instance.modbus_device)
elif type(instance) is VISAVariable: post_save.send_robust(sender=Variable, instance=instance.modbus_variable)

to :
if type(instance) is VISADevice: post_save.send_robust(sender=Device, instance=instance.visa_device)
elif type(instance) is VISAVariable: post_save.send_robust(sender=Variable, instance=instance.visa_variable)

I restarted gunicorn and pyscada and I could create a visa device.

Thanks for the great job.
C.

Modbus write into a Force Single Coil (FC5)

Hello everybody,
hello @trombastic,

is there a possibility to write into a Single Coil?
I want to use Pyscada to turn on a digitaloutput of a Wago module.

If this isnt currently implemented, could you tell me where I can create my own Modbus Functions?

regards
Jan

Can pyscada act as modbus tcp server

@trombastic Hi, PyScada is of great use for us. But can I use pyscada to setup a modbus tcp server ( the modbus device act as modbus client, while pyscada act as server) ?
Look forward to receiving your reply.

No log file

I am using ubuntu 22.4 and python 3.10. I am installing using quick installation. After installation program works and i can access it and add devices etc. However I have some problems.
1 - No log file is created at /var/www/pyscada/pyscadaserver/pyscada_debug.log. This file doesn't exist

2 - When i run migrations it gives error that there is no file pyscada.core.urls. When i manually copy the pyscada folder which is inside the github repo into the project folder where manage.py is located, that error is gone but i am not sure if it is the correct solution

3 -(venv) ubuntu@ubuntu:/var/www/pyscada/PyScadaServer$ sudo python3 manage.py makemigrations
Traceback (most recent call last):
File "/var/www/pyscada/PyScadaServer/manage.py", line 22, in
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.10/dist-packages/django/core/management/init.py", line 442, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.10/dist-packages/django/core/management/init.py", line 416, in execute
django.setup()
File "/usr/local/lib/python3.10/dist-packages/django/init.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python3.10/dist-packages/django/apps/registry.py", line 91, in populate
app_config = AppConfig.create(entry)
File "/usr/local/lib/python3.10/dist-packages/django/apps/config.py", line 193, in create
import_module(entry)
File "/usr/lib/python3.10/importlib/init.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1050, in _gcd_import
File "", line 1027, in _find_and_load
File "", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'pyscada'

Errot while installing the PyScada library 0.7.x.zip

hi @trombastic when i try to run this
pip install https://github.com/trombastic/PyScada/archive/dev/0.7.x.zip
command , it will give long list of errors also it is not able to install the numpy also

ERROR: Command errored out with exit status 1:
command: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-fxvoqwoj/numpy/setup.py'"'"'; file='"'"'/tmp/pip-install-fxvoqwoj/numpy/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-9v25olfd/install-record.txt --single-version-externally-managed --compile
cwd: /tmp/pip-install-fxvoqwoj/numpy/
Complete output (352 lines):
Running from numpy source directory.

Note: if you need reliable uninstall behavior, then install
with pip instead of using `setup.py install`:

  - `pip install .`       (from a git repo or downloaded source
                           release)
  - `pip install numpy`   (last NumPy release on PyPi)


/usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'project_urls'
  warnings.warn(msg)
/usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'python_requires'
  warnings.warn(msg)
blas_opt_info:
blas_mkl_info:
customize UnixCCompiler
  libraries mkl_rt not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

blis_info:
customize UnixCCompiler
  libraries blis not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

openblas_info:
customize UnixCCompiler
customize UnixCCompiler
  libraries openblas not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

atlas_3_10_blas_threads_info:
Setting PTATLAS=ATLAS
customize UnixCCompiler
  libraries tatlas not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

atlas_3_10_blas_info:
customize UnixCCompiler
  libraries satlas not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

atlas_blas_threads_info:
Setting PTATLAS=ATLAS
customize UnixCCompiler
  libraries ptf77blas,ptcblas,atlas not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

atlas_blas_info:
customize UnixCCompiler
  libraries f77blas,cblas,atlas not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

accelerate_info:
  NOT AVAILABLE

/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/system_info.py:639: UserWarning:
    Atlas (http://math-atlas.sourceforge.net/) libraries not found.
    Directories to search for the libraries can be specified in the
    numpy/distutils/site.cfg file (section [atlas]) or by setting
    the ATLAS environment variable.
  self.calc_info()
blas_info:
customize UnixCCompiler
  libraries blas not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/system_info.py:639: UserWarning:
    Blas (http://www.netlib.org/blas/) libraries not found.
    Directories to search for the libraries can be specified in the
    numpy/distutils/site.cfg file (section [blas]) or by setting
    the BLAS environment variable.
  self.calc_info()
blas_src_info:
  NOT AVAILABLE

/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/system_info.py:639: UserWarning:
    Blas (http://www.netlib.org/blas/) sources not found.
    Directories to search for the sources can be specified in the
    numpy/distutils/site.cfg file (section [blas_src]) or by setting
    the BLAS_SRC environment variable.
  self.calc_info()
  NOT AVAILABLE

non-existing path in 'numpy/distutils': 'site.cfg'
lapack_opt_info:
lapack_mkl_info:
customize UnixCCompiler
  libraries mkl_rt not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

openblas_lapack_info:
customize UnixCCompiler
customize UnixCCompiler
  libraries openblas not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

openblas_clapack_info:
customize UnixCCompiler
customize UnixCCompiler
  libraries openblas,lapack not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

atlas_3_10_threads_info:
Setting PTATLAS=ATLAS
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/local/lib
customize UnixCCompiler
  libraries tatlas,tatlas not found in /usr/local/lib
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/lib
customize UnixCCompiler
  libraries tatlas,tatlas not found in /usr/lib
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/lib/x86_64-linux-gnu
customize UnixCCompiler
  libraries tatlas,tatlas not found in /usr/lib/x86_64-linux-gnu
<class 'numpy.distutils.system_info.atlas_3_10_threads_info'>
  NOT AVAILABLE

atlas_3_10_info:
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/local/lib
customize UnixCCompiler
  libraries satlas,satlas not found in /usr/local/lib
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/lib
customize UnixCCompiler
  libraries satlas,satlas not found in /usr/lib
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/lib/x86_64-linux-gnu
customize UnixCCompiler
  libraries satlas,satlas not found in /usr/lib/x86_64-linux-gnu
<class 'numpy.distutils.system_info.atlas_3_10_info'>
  NOT AVAILABLE

atlas_threads_info:
Setting PTATLAS=ATLAS
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/local/lib
customize UnixCCompiler
  libraries ptf77blas,ptcblas,atlas not found in /usr/local/lib
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/lib
customize UnixCCompiler
  libraries ptf77blas,ptcblas,atlas not found in /usr/lib
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/lib/x86_64-linux-gnu
customize UnixCCompiler
  libraries ptf77blas,ptcblas,atlas not found in /usr/lib/x86_64-linux-gnu
<class 'numpy.distutils.system_info.atlas_threads_info'>
  NOT AVAILABLE

atlas_info:
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/local/lib
customize UnixCCompiler
  libraries f77blas,cblas,atlas not found in /usr/local/lib
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/lib
customize UnixCCompiler
  libraries f77blas,cblas,atlas not found in /usr/lib
customize UnixCCompiler
  libraries lapack_atlas not found in /usr/lib/x86_64-linux-gnu
customize UnixCCompiler
  libraries f77blas,cblas,atlas not found in /usr/lib/x86_64-linux-gnu
<class 'numpy.distutils.system_info.atlas_info'>
  NOT AVAILABLE

lapack_info:
customize UnixCCompiler
  libraries lapack not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
  NOT AVAILABLE

/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/system_info.py:639: UserWarning:
    Lapack (http://www.netlib.org/lapack/) libraries not found.
    Directories to search for the libraries can be specified in the
    numpy/distutils/site.cfg file (section [lapack]) or by setting
    the LAPACK environment variable.
  self.calc_info()
lapack_src_info:
  NOT AVAILABLE

/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/system_info.py:639: UserWarning:
    Lapack (http://www.netlib.org/lapack/) sources not found.
    Directories to search for the sources can be specified in the
    numpy/distutils/site.cfg file (section [lapack_src]) or by setting
    the LAPACK_SRC environment variable.
  self.calc_info()
  NOT AVAILABLE

/usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'project_urls'
  warnings.warn(msg)
/usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'python_requires'
  warnings.warn(msg)
/usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'define_macros'
  warnings.warn(msg)
running install
running build
running config_cc
unifing config_cc, config, build_clib, build_ext, build commands --compiler options
running config_fc
unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options
running build_src
build_src
building py_modules sources
creating build
creating build/src.linux-x86_64-3.4
creating build/src.linux-x86_64-3.4/numpy
creating build/src.linux-x86_64-3.4/numpy/distutils
building library "npymath" sources
get_default_fcompiler: matching types: '['gnu95', 'intel', 'lahey', 'pg', 'absoft', 'nag', 'vast', 'compaq', 'intele', 'intelem', 'gnu', 'g95', 'pathf95', 'nagfor']'
customize Gnu95FCompiler
Could not locate executable gfortran
Could not locate executable f95
customize IntelFCompiler
Could not locate executable ifort
Could not locate executable ifc
customize LaheyFCompiler
Could not locate executable lf95
customize PGroupFCompiler
Could not locate executable pgfortran
customize AbsoftFCompiler
Could not locate executable f90
Could not locate executable f77
customize NAGFCompiler
customize VastFCompiler
customize CompaqFCompiler
Could not locate executable fort
customize IntelItaniumFCompiler
Could not locate executable efort
Could not locate executable efc
customize IntelEM64TFCompiler
customize GnuFCompiler
Could not locate executable g77
customize G95FCompiler
Could not locate executable g95
customize PathScaleFCompiler
Could not locate executable pathf95
customize NAGFORCompiler
Could not locate executable nagfor
don't know how to compile Fortran code on platform 'posix'
C compiler: x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fPIC

compile options: '-Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.4m -c'
x86_64-linux-gnu-gcc: _configtest.c
x86_64-linux-gnu-gcc -pthread _configtest.o -o _configtest
success!
removing: _configtest.c _configtest.o _configtest.o.d _configtest
C compiler: x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fPIC

compile options: '-Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.4m -c'
x86_64-linux-gnu-gcc: _configtest.c
_configtest.c:1:5: warning: conflicting types for built-in function ‘exp’ [enabled by default]
 int exp (void);
     ^
x86_64-linux-gnu-gcc -pthread _configtest.o -o _configtest
_configtest.o: In function `main':
/tmp/pip-install-fxvoqwoj/numpy/_configtest.c:6: undefined reference to `exp'
collect2: error: ld returned 1 exit status
failure.
removing: _configtest.c _configtest.o _configtest.o.d
C compiler: x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fPIC

compile options: '-Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.4m -c'
x86_64-linux-gnu-gcc: _configtest.c
_configtest.c:1:5: warning: conflicting types for built-in function ‘exp’ [enabled by default]
 int exp (void);
     ^
x86_64-linux-gnu-gcc -pthread _configtest.o -lm -o _configtest
success!
removing: _configtest.c _configtest.o _configtest.o.d _configtest
creating build/src.linux-x86_64-3.4/numpy/core
creating build/src.linux-x86_64-3.4/numpy/core/src
creating build/src.linux-x86_64-3.4/numpy/core/src/npymath
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/npymath/npy_math_internal.h
  adding 'build/src.linux-x86_64-3.4/numpy/core/src/npymath' to include_dirs.
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/npymath/ieee754.c
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/npymath/npy_math_complex.c
None - nothing done with h_files = ['build/src.linux-x86_64-3.4/numpy/core/src/npymath/npy_math_internal.h']
building library "npysort" sources
creating build/src.linux-x86_64-3.4/numpy/core/src/common
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/common/npy_sort.h
  adding 'build/src.linux-x86_64-3.4/numpy/core/src/common' to include_dirs.
creating build/src.linux-x86_64-3.4/numpy/core/src/npysort
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/npysort/quicksort.c
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/npysort/mergesort.c
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/npysort/heapsort.c
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/common/npy_partition.h
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/npysort/selection.c
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/common/npy_binsearch.h
conv_template:> build/src.linux-x86_64-3.4/numpy/core/src/npysort/binsearch.c
None - nothing done with h_files = ['build/src.linux-x86_64-3.4/numpy/core/src/common/npy_sort.h', 'build/src.linux-x86_64-3.4/numpy/core/src/common/npy_partition.h', 'build/src.linux-x86_64-3.4/numpy/core/src/common/npy_binsearch.h']
building extension "numpy.core._dummy" sources
Generating build/src.linux-x86_64-3.4/numpy/core/include/numpy/config.h
C compiler: x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fPIC

compile options: '-Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.4m -c'
x86_64-linux-gnu-gcc: _configtest.c
_configtest.c:1:20: fatal error: Python.h: No such file or directory
 #include <Python.h>
                    ^
compilation terminated.
failure.
removing: _configtest.c _configtest.o
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/tmp/pip-install-fxvoqwoj/numpy/setup.py", line 419, in <module>
    setup_package()
  File "/tmp/pip-install-fxvoqwoj/numpy/setup.py", line 411, in setup_package
    setup(**metadata)
  File "/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/core.py", line 171, in setup
    return old_setup(**new_attr)
  File "/usr/lib/python3.4/distutils/core.py", line 148, in setup
    dist.run_commands()
  File "/usr/lib/python3.4/distutils/dist.py", line 955, in run_commands
    self.run_command(cmd)
  File "/usr/lib/python3.4/distutils/dist.py", line 974, in run_command
    cmd_obj.run()
  File "/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/command/install.py", line 62, in run
    r = self.setuptools_run()
  File "/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/command/install.py", line 36, in setuptools_run
    return distutils_install.run(self)
  File "/usr/lib/python3.4/distutils/command/install.py", line 583, in run
    self.run_command('build')
  File "/usr/lib/python3.4/distutils/cmd.py", line 313, in run_command
    self.distribution.run_command(command)
  File "/usr/lib/python3.4/distutils/dist.py", line 974, in run_command
    cmd_obj.run()
  File "/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/command/build.py", line 47, in run
    old_build.run(self)
  File "/usr/lib/python3.4/distutils/command/build.py", line 126, in run
    self.run_command(cmd_name)
  File "/usr/lib/python3.4/distutils/cmd.py", line 313, in run_command
    self.distribution.run_command(command)
  File "/usr/lib/python3.4/distutils/dist.py", line 974, in run_command
    cmd_obj.run()
  File "/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/command/build_src.py", line 148, in run
    self.build_sources()
  File "/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/command/build_src.py", line 165, in build_sources
    self.build_extension_sources(ext)
  File "/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/command/build_src.py", line 322, in build_extension_sources
    sources = self.generate_sources(sources, ext)
  File "/tmp/pip-install-fxvoqwoj/numpy/numpy/distutils/command/build_src.py", line 375, in generate_sources
    source = func(extension, build_dir)
  File "numpy/core/setup.py", line 423, in generate_config_h
    moredefs, ignored = cocache.check_types(config_cmd, ext, build_dir)
  File "numpy/core/setup.py", line 47, in check_types
    out = check_types(*a, **kw)
  File "numpy/core/setup.py", line 281, in check_types
    "install {0}-dev|{0}-devel.".format(python))
SystemError: Cannot compile 'Python.h'. Perhaps you need to install python-dev|python-devel.
----------------------------------------

ERROR: Command errored out with exit status 1: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-fxvoqwoj/numpy/setup.py'"'"'; file='"'"'/tmp/pip-install-fxvoqwoj/numpy/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-9v25olfd/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.

let me know is any solution is there

Problems using PyScada for modbus device

Hi there,

I wanted to ask about some problems I have while I'm trying to use PyScada as an HMI for a modbus device. Let me explain the scenario to let you know what I'm trying to do. I have one Conpot honeypot (https://github.com/mushorg/conpot) running to simulate a PLC device that uses Modbus protocol. It's working fine as I can connect to it with some clients (for example mbtget) and also reading values (coils, discrete, holding... all of them). So I wanted to set an HMI just to get like a GUI where I can show some charts, tables and values that I read from that simulated PLC with Conpot. So, I took a look and I think PyScada is perfect for it.

So, I've installed it following your official documentation (the host version and also the docker version, in different machines, just to try if there was any difference). And once I've installed it and launched it, I can perfectly connect to admin GUI where I can set the scenario for the HMI. Just as a try, I've followed these steps (https://cwraig.id.au/2017/09/24/pyscada-on-raspberry-pi-for-temperature-monitoring-with-ds18b20-on-1-wire-part-4-pyscada-hmi-configuration/) where they explain how to set an easy HMI in a simple way, you know, creating charts, panels, items, view... I've also defined a Modbus TCP device and some variables, and that's not the problem as I've set the right IP address, port, registers addresses and type (coils...).

The problem is that, whatever I define, more or less variables, more or less elements, charts... they never give me a variable value, it's like it's never reading. I can see the tables and charts on the view, that's not the problem, but they're empty. And it's not just a problem of not being reading. The thing is that I don't see any kind of interaction in my Conpot log, like, if it never got an IP connection try.

So I'd like to ask if, besides launching the PyScada, defining the Modbus device, defining the view and HMI elements... I'd need to do something else to make it work, as I feel like it never sends a connection try.

Just to help to understand it, I'm leaving some pictures of what I've configured. I just defined 2 variables to read holding registers as an example. About variable addresses, I used one with address 1 and another with 40001 because I'm not sure if it starts in 1 mapping to 40001, or if I have to set the 40001 number.

Thank you so much!!

pyscada1

pyscada2

pyscada3

Custom Html Variable Not Showing

image
According to a previous question, I addded this custom html. However on the page I am seeing 0.0 when my variable is not 0.0. I tested this with other variables too. Is there another way to add variables to custom html.

XY Chart: unable to have X axis set to time

Setting up the chart option I can set the variables for the Y axis, but there is no option for setting the X axis to the timestamp of recorded data.
How is this possible when only my variables are available for selection ?

20190527_xy_chart_problem_01

Pyscada upgrade process within the 0.7.x

Can you provide a command list for version upgrades within the version 0.7x stream
I am currently on PyScada Version: 0.7.0b18 and would like to move to the latest.

I would be happy to write these up if you could provide a brief command list.

Thanks again for the project.

Remove staic image from main page for Admin selection

On the main page where one can select the application views as well as Admin functions, there is a static image loaded under the Admin title that should be removed.
It shows details for Martin.

I went into the directory and renamed this file so it no longer loads, but this is not the best solution, as it still tries to load the image and fails with broken link reference, but does look better.

I don't see any reason for an image to be shown for Admin menu selection.

Can't start pyscada

I've been working on trying to set up pyscada. Every time I try the command "sudo systemctl start pyscada" it never works. I've gone through the documentation looking to find if I can figure out why the command isn't working and I just can't seem to figure out why. I'm using a raspberry pi 3 B+, the os is Raspbian jessie 8. I added a screenshot of what comes up when I run the following commands "sudo systemctl start pyscada", "sudo journalctl -xn", and "sudo systemctl status pyscada.service".
2020-10-15-085553_1824x984_scrot

Mismatch between event limit elif cases and the displayed limit types.

https://github.com/trombastic/PyScada/blob/c6d7f333f056998f3ab02bf06f692059af1856cd/pyscada/models.py#L1221

displayed order in the web selection drop down.
limit_type_choices = (
(0, 'value is less than limit',),
(1, 'value is less than or equal to the limit',),
(2, 'value is greater than the limit'),
(3, 'value is greater than or equal to the limit'),
(4, 'value equals the limit'),
)

The implemented cases seem to be:
0 = less than
1 = less than or equals to
2 = equals to
3 = greater than or equals to
4 = greater than

Add FINS/UDP functionality for Omron PLCs?

I already have Python code that allows me to communicate with NX series (and probably others) PLCs over Ethernet/IP (but really FINS/UDP if I understand correctly).

With that code, how much work do you think it would be to add that functionality here? I started looking around your Modbus integration, but I'm not sure how much of it would be required for FINS because the protocol seems to be simpler.

I can provide more detail obviously just not sure what you need. If you can give me a direction to start in, I might be able to take a stab at implementing it myself and making a PR.

Thanks!

Modbus RTU - not reading from RTU device via virtual serial over USB

I was able to setup PyScada on a small Cubieboard 2 operating Armbian which is Debian for ARM, which I have used now for many years.

Normally this Cubieboard is running my own C code application that is my own form of SCADA, having Modbus TCP/RTU and built in HTTP server. It normally communicates Modbus RTU to my microcontroller, an Arduino DUE via USB serial on port /dev/ttyACM0. The line settings are 115200 baud at 8 data bits no parity and one stop bit. I use libmodbus in my code and it works fine.

Now, coming to PyScada, I have installed it on the same Cubieboard and have configured what I guess is correct, by looking at the method of this person https://cwraig.id.au/2017/09/24/pyscada-on-raspberry-pi-for-temperature-monitoring-with-ds18b20-on-1-wire-part-4-pyscada-hmi-configuration/

I have set up the Modbus device for protocol being Serial RTU, the framer again RTU and unit ID of 1, which I guess is slave ID.

I next added a variable that links back to this device and using FC3 for holding registers, as this is what I do in my own application.

I have tried various addresses for the data variable as I don't know if PyScada for FC3 would use 0 or 1 or 4000 or 40000 as the first address in the holding register map ?
I have tried all of the above and I get no displayed data in a simple label with value or custom HTML.

I ssh to the cubieboard and can see that /dev/ttyACM0 is there and is not being used by my own application while I test with PyScada.

Do you have any method to see what the Modbus (PyModbus) module is doing or some other backend way to see data or errors ?

On my controller, I would normally see an LED flash each time it is being polled by my application, but not so with PyScada, it appears to simply not be polling this device at all.

Martin, have you tested and proved the Modbus RTU as working and can you suggest anything for me to check or try please.
Many thanks, Paul

Command-line ERRORs

After installing all dependencies , When head towards Command-line and then ,

ISSUE 1 :
When i run the Command : service gunicorn_pyscada start
I am getting the following Error:
gunicorn_pyscada: unrecognized service

ISSUE 2:
when i run : ** systemctl start "pyscada_* **
i get **Failed to get D-Bus connection: Failed to connect to socket /run/systemd/private: No such file or directory
**
Kindly Respond for the above Queries , Eagerly waiting for the answers because company project has been halted for the same

Documentation

Based on:
https://pyscada.readthedocs.io/en/dev-0.7.x/django_settings.html
When running command:
sudo -u pyscada python manage.py pyscada_daemon init

Gives the following:
Warning: please change 'pyscada' to 'pyscada.core' in the INSTALLED_APPS section of the settings.py!

Please update the documentation to reflect the change.
I have tested this on a new installation on rasbian.

API

Hi all, that's me again with a new topic now :)

Is there a way through to get the variable data from an API rather than a device, if yes what is the practical one to achieve it?

Thank you.

Updated documentation

I am unsure if this is the correct place to post this but I have written a series of blog posts for documenting my installation of pyscada on raspberrypi. I would be happy to have this incorporated into the documentation associated with the project. Let me know if you are interested and I could have a look at moving the relevant components over.

Thanks for all the work that has gone into the project, i hope to have a look into the modbus RTU side in the next week or so.

https://cwraig.id.au/2017/09/17/pyscada-on-raspberry-pi-for-temperature-monitoring-with-ds18b20-on-1-wire-part-1-software-installation/

https://cwraig.id.au/2017/09/17/pyscada-on-raspberry-pi-for-temperature-monitoring-with-ds18b20-on-1-wire-part-2-ds18b20-hardware-and-software/

https://cwraig.id.au/2017/09/21/pyscada-on-raspberry-pi-for-temperature-monitoring-with-ds18b20-on-1-wire-part-3-pyscada-basic-configuration/

https://cwraig.id.au/2017/09/24/pyscada-on-raspberry-pi-for-temperature-monitoring-with-ds18b20-on-1-wire-part-4-pyscada-hmi-configuration/

I Want use it on Django>=4

Hello, I Want to use this on Django 4, my question is this project is dead? or it`s live?
I can contribute to this project because I need it
right now if we change the Django requirement in the setup file it is work it or we must change some code in repository?

How to retrieve variable value

I can see the variable value on the hmi by using variable_status page. I want to add a restframework to pyscada and I set it up. I want to retrieve the value of a variable in the code. In the database, value is not stored in variable table. I can find the value from pyscada_recordeddata but this way doesn't seem reasonable. I must order it and filter it and select the first record. That table will have maybe millions of records. How else can i access the value of a variable. In my api I want to say for example:

var = variable.objects.get(id=1)
return var.value

this is pseudo code of course but I am not sure how to access the value.

Various variable value class with the same key

The value class key should be unique.
Keep only one value for :

  • float 32, 48, 64
  • int 8, 16, 32, 48, 64
  • uint 8, 16, 32, 48 (missing), 64
  • boolean

Should we add other value classes ?

@trombastic : what is unixtime[i or f][32 or 64] value class for ?

PyScada/pyscada/models.py

Lines 1233 to 1260 in 79b98d0

value_class_choices = (
("FLOAT32", "REAL (FLOAT32)"),
("FLOAT32", "SINGLE (FLOAT32)"),
("FLOAT32", "FLOAT32"),
("UNIXTIMEF32", "UNIXTIMEF32"),
("FLOAT64", "LREAL (FLOAT64)"),
("FLOAT64", "FLOAT (FLOAT64)"),
("FLOAT64", "DOUBLE (FLOAT64)"),
("FLOAT64", "FLOAT64"),
("UNIXTIMEF64", "UNIXTIMEF64"),
("FLOAT48", "FLOAT48"),
("INT64", "INT64"),
("UINT64", "UINT64"),
("UNIXTIMEI64", "UNIXTIMEI64"),
("INT48", "INT48"),
("UNIXTIMEI32", "UNIXTIMEI32"),
("INT32", "INT32"),
("UINT32", "DWORD (UINT32)"),
("UINT32", "UINT32"),
("INT16", "INT (INT16)"),
("INT16", "INT16"),
("UINT16", "WORD (UINT16)"),
("UINT16", "UINT (UINT16)"),
("UINT16", "UINT16"),
("INT8", "INT8"),
("UINT8", "UINT8"),
("BOOLEAN", "BOOL (BOOLEAN)"),
("BOOLEAN", "BOOLEAN"),

Modbus communication

Hello, I want to create a HMI for Siemens PLC thanks to PyScada with windows. I wonder how the modbus connection is set and how the variables are changed. I change the values on HMI with the command "$(".type-numeric.var-key").html(Value);" but it doesn't send on modbus. Can you help me ?
Thank you !

Table pyscada_db.pyscada_deviceprotocol doesnt exist

When I install pycada according to the instructions or via Docker, I get the error django.db.utils.programmingerror: (1146, "table pyscada_db.pyscada_deviceprotocol doesnt exist"). How to get rid of it?
Installing on debian11

Using Custom HTML Panel

I have tried various methods to get variable data to be displayed in a custom HTML panel, mostly without success. What are the exact options for using this component as there is nothing in the documentation and there must have been some changes since 'cwraig's blog on it' ?

For example, if I want to use four variable which are selected from the variable list, what are the options for use in the custom HTML section, as I have tried using the variable names that I have selected, all without success ?

Also, if I need to use javascript library, say for some for of gauge or dial, can I place the included javascript here or does it need to live at some other location that will be loaded up on application load ?

Many questions :)

20190528_custom_html

New browser tabs created

When at the main site where one can select either the View pages or the Admin section, a new browser tab is created for either selection.

Also, if i click the PyScada menu item at top left corner, it also creates and moves to a new browser tab.

This should not be the case, all operation should remain within the one browser tab unless the user selects otherwise.

Very quickly, one can have a bunch of open tabs created by PyScada, which annoying as one needs to close them and just work with the one or maybe two, say one for PyScada View and one for PyScada Admin.

Stopping Polling of Modbus Device

In the Modbus Device a check box to set the device to active or not is available.
Saving a device with the 'Active' set false does not stop polling of the device as the background task that does the actual polling remains to exist and continues to operate.

The only way to stop PyScada Modbus Device from polling a slave unit is to set the device 'active' to false and save and then in 'Background Process' either delete or disable the task associated to the Modbus Device.

This task should be ended when the user set the Modbus Device 'Active' flag to false, and restarted when set to true.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.