Skip to content

Status and Updates

Sanshiro Enomoto edited this page Jun 8, 2026 · 93 revisions

Status

Data visualization is almost completed

  • Layout is a big to-do item for the future.
  • Maybe a graphical design tool for the Canvas (schematic view) will be added.

Controls partly working

  • Basic structure has been made. More will be added.

Analysis parts are experimental

  • The analysis part of the SlowPy library will be largely restructured.
  • Data transform (data functors) is at a design stage.

To-do Items

Big items

  • Data transform, including resampling with bin-stats (min/max/std) and table-to-graph
  • Log messages, Alarms
  • Table row/cell attributes (colors, links, etc.)
  • User management & user roles
  • Flexible layout
  • Settings in a side-panel (replace the dialogs)
  • Graphical display widgets
  • Dashboard Canvas design tool, built-in SVG editor

Minor items (selected)

  • Second vertical axis
  • Color-coded graph points
  • Sortable tables
  • Preference settings, custom styles, home layout
  • Directory-less project (DB entry, on-memory, .db file, etc.), project configuration from config
  • WebDAV blob storage
  • time-range table (run table, phase table, ...)

Known Bugs

  • Be careful how resampling affects the visualization:
    • The time-series projection histograms accumulate the data points after resampling. This can be avoided by setting the resampling threshold to a very large value (i.e., disabling resampling).
    • The time-series scatter plots become incorrect if two time-series data points are not aligned. If data points are not aligned, set the resampling threshold to zero (always apply resampling).

Updates

2026-05-06: "2605 Stawamus" Release

Major changes since 2507 Nooksack are:

  • Plotting improvements:
    • Single value panels
    • Table view of time-series data
    • Customized resampling, min/max envelopes
    • Optional previous point fetching
  • SlowPy data features:
    • streaming of various data types, including Python dataclass, dict, immutables, etc., in addition to histograms and graphs
    • streaming of Matplotlib figures, with extraction of data points and plot layouts
    • writing to HDF5 files
  • PubSub modules in SlowPy
    • Supports NATS, MQTT, RabbitMQ, Redis Pubsub, and SlowMQ (SlowDash's built-in MQ)
    • All in async, implement reconnecting
  • DB reconnect and rescan
  • More devices: Modbus, LabJack, Nanotech Motors, Audio Input (PC mic), etc.

2026-03-24 PubSub in SlowPy

  • In slowpy/control, the following PubSub modules are now available:
    • [Async]: AsyncNATS, AsyncMQTT, AsyncRabbitMQ, AsyncRedis pubsub, and AsyncSlowMQ
    • [Non Async]: MQTT, RabbitMQ, Redis pubsub
  • All PubSub modules implement reconnecting
  • SlowMQ: SlowDash's Pubsub fabric using the SlowDash server as a broker and JSON on WebSockets for message exchange
  • See lib/slowpy/test/test-control-async-PUBSUB.py for examples

2026-03-12 DB reconnect and rescan

  • With the "update" button in the Channel List panel, reconnecting to DB and updating the channel list is attempted.
  • The DB contents can be updated without restarting SlowDash.

2026-03-03 Options to fetch "prior" data point

  • With a prior point, the last value will always be shown (if exists) with the "last" line type.
  • This feature is particularly useful if data recording intervals are large, e.g., for set points.

2025-12-23 Options to control resampling behavior

  • Time-series plots now have options to set various parameters:
    • Resampling buckets: the number of data points after resampling
    • Reducer: last, mean, median, etc.: the value that represents each resampling bucket
    • Envelope checkbox: controls whether the min-max envelope is calculated or not
    • Threshold: the length of the display time range above which resampling is applied
  • Note:
    • Calculating the envelope can be slow depending on the setup (resampling in DB query will be disabled).
    • Using too many resampling buckets (or setting the threshold too high) can slow down or crash the web browsers.

2025-12-16 Option to place the legend box at the left-top corner

2025-11-24 Examples/SlowTask/WebPost

  • A simple example to post data values from external programs through HTTP-POST
  • [May 1, 2025] Moved to ExampleProjects/Advanced/WebPost

2025-11-22 Table element to display a list of data values

  • The Table element on the Layout can show the raw time-series values. Select Value Table for the Data Type and then choose the channel.

2025-10-15 RabbitMQ

  • Pub/Sub to RabbitMQ, and RPC are implemented
  • Both async and no-async versions
  • publish example: p=rabbitmq().topic_exchange(name).publish(routing_key); await p.aio_set(value)
  • subscribe example: q=rabbitmq().topic_exchange(name).queue(qname, routing_key); value = await q.aio_get()

2025-09-23 HDF5 data storage (SlowPy)

  • Writes time-series data to an HDF5 file in a wide, row-append format
  • Using NumPy compound dtypes (timestamp : channels)

2025-08-10 SlowPy publishing Matplotlib Figure

  • A figure object of Matplotlib can be directly publish()-ed in SlowPy
  • A layout configuration (slowplot-XXX.json) will be dynamically created based on the figure layout (Axes)
  • Data objects (histograms, plots, etc.) are extracted from the figure and publish()-ed.
  • See example in ExampleProjects/Streaming/Matplotlib

2025-08-09 Envelope drawing

  • On plot panels, an envelope showing graph's min and max values can be drawn
  • Currently available only for SlowPy Trend
  • See example in ExampleProjects/Streaming/Trend

2025-08-02 Single Value Panel

  • New slowplot panel to display one scalar value
  • To display the last value of a time-series of scalers, or to display a publish()-ed scalar value

2025-07-27 SlowPy exporting / publishing various Python types

  • export(value, name="...") can take not only a slowpy control node, but also a slowpy graph/histogram, Python dataclass, dict, and class instance
  • publish(value, name="...") can take, in addition to the values export-table, Python immutables such as str and float
  • ControlSystem.export() will replace the _export() callback
  • ControlSystem.publish() will replace the Node.deliver() method

2025-07-20 Timeseries Scatter last point highlighting

  • The last point can be highlighted using a different marker type, size, or color.

2025-07-18: "2507 Nooksack" Release

Major changes since 2411 Skykomish are:

  • Drastic performance improvements
    • ASGI interface with new Web server engine (Slowlette)
    • HTTP/2 with a Nginx reverse proxy tested and recommended
    • Async I/O for PostgreSQL, MySQL, and Redis
  • Data Streaming using WebSockets
  • Dynamic generation (by user scripting) of plot layouts and HTML contents
  • Fully-featured user HTML pages with embedded SlowDash JS objects

2025-07-10 Dynamic generation of HTML and Plot-Panel Layout by UserModule/TaskModule

  • Define _get_html() in UserModule to generate config/html-XXX.html file equivalent
  • Define _get_layout() in UserModule to generate config/slowplot-XXX.json file equivalent
  • Multiple generations of HTML and Layouts are possible.
  • More in the documentation, UserModule/AdvancedTopics

2025-04-23 External Blob Storage

  • Blob data block can be stored outside a database (database stores a link (id) to blob)
  • To write (SlowPy)
    blob_storage = BlobStorage_File(basedir='data/blob', names=['photos', '%y-%m', '%y%m%d-%H%M%S-%Z', ext='.jpg')
    ...
    while in_run_loop:
        blob_id = blob_storage.write(photo_image)
        datastore.append(blob_id, tag='photo')

This will create a directory photos/YY-MM/ and store files named YYMMDD-HHMMSS-TZ.jpg. Other parameter substitutions include ${timestamp}, ${md5}, $md5[N:M], and ${uuid}.

  • To read (SlowdashProject.yaml)
  data_source:
    obj_time_series:
      ...
    blob_storage:
      type: file
      base_directory: data/blob

2025-04-14 InfluxDB tag-scan control

  • Channel names (tag values and fields) are obtained through InfluxDB queries; however, InfluxDB defaults do not extend back to a long range.
  • Parameters to specify data time range are added to the time_series configuration:
data_source:
  url:influxdb://ORG:TOKEN@HOST:PORT/BUCKET
  time_series:
    schema: MEASUREMENT
    tags:
      scan_date: 2025-01-01
      scan_length: 100d

The tag values and fields are scanned for the time range scan_date - scan_length to scan_date. Default scan_date is now() and default scan_length is 10d.

2025-04-01 Reverse Proxy examples

2025-03-18 Async access to PostgreSQL and MySQL

  • Async access is used by default for PostgreSQL (by asyncpg) and MySQL (by aiomysql)
  • To use non-async access, use type: PostgreSQL_NoAsync (PostgreSQL by psycopg2) or type: MySQL_NoAsync (MySQL by mysql-connector).

2025-02-28 User HTML

  • Files under the project's userhtml will be available to browsers at api/userhtml/{filename}
  • The HTML files under that can use all the HTML features, such as CSS and JavaScript (embedded and external).
  • SlowDash's Web API and JavaScript library are accessible using a relative URL.
  • See User HTML section for details

2025-02-21 Web API overriding by user modules

  • Now user module is a "Slowlette" (SlowDash Web API server) module
  • Slowlett Apps defined in user modules will be automatically integrated using the Slowlette aggregation mechanism
  • See Slowlette documentation for details

2025-02-18 Config file generation by user Python script (for JSON/YAML/HTML files in config)

  • By placing slowplot-XXX.py under config, it will be executed instead of reading slowplot-XXX.json.
  • In the Python code, define a function async def _setup(app) and return a Python dict.

2025-02-15 Data streaming using WebSocket

  • In SlowTask, ControlNode variables can now deliver() the values (sending the values to browsers via WebSocket)

2025-02-08 Redis Async access

  • The old (non async) version was renamed to datasource_Redis_NoAsync, being a fallback when the server is not ASGI.

2025-02-05 Python venv for SlowDash

  • Now the setup process creates a dedicated venv for SlowDash, with installing ASGI server etc.

2025-02-01 Built-in HTTPS server (ASGI only)

2025-01-31 ASGI Interface

  • Made SlowAPI micro web framework (under slowdash/app/server/slowapi) to be the basis of all the SlowDash web services.
  • ASGI should provide faster responses. Also, the "real-time display" in to-do will be built on that.
  • To use ASGI, install the uvicorn python package (pip install uvicorn). Otherwise SlowDash will fall back to WSGI.

2024-12-31 Re-organized the API/Config structure

  • ❗ The Jupyter config path in the SlowdashProject.yaml is changed:
    • from extension/name=jupyter to export/type=jupyter

2024-12-14 WSGI Interface

  • main/web/slowdash_wsgi.py implements the WSGI interface
  • Run SLOwDASH/utils/slowdash-setup-apache.py --interface=WSGI to do the setup for Apache
  • See Project Setup section for details.

2024-11-14 "2411 Skykomish" Release

Major changes since 2407 Snoqualmie are:

  • More SlowPy Control components:
    • HTTP, Telnet, VISA
    • SlowDash as a control variable
    • DataStore as a control variable
    • LabJack
  • SlowPy-HDL: HDL-like control logic in Python
  • SlowTask auto-loading
  • Jupyter integration
  • MySQL support
  • Watchdog (SlowDash "freeze" detection and auto-restarting)

2024-11-14 Jupyter plugin

  • Add the following block in SlowdashProject.yaml:
  extension:
    - name: jupyter
      parameters:
        url: JUPYTER_URL
        token: JUPYTER_TOKEN
  • To use in Docker Compose, see ExampleProjects/Jupyter.

2024-11-08 VISA interface in SlowPy Control

  • ControlSystem.visa(visa_address). ...
  • scpi() can be appended

2024-11-07 API Extension plugin

  • New type of plugin, to extend SlowDash API

2024-11-04 Layout panel dynamic loading

2024-10-03 SlowPy DataStore as a control variable

  • implemented in slowpy/control/control_DataStore.py

2024-09-18 SlowDash Watchdog (SlowDog)

  • SlowDog sends HTTP requests to the SlowDash server periodically, and if it does not receive a reply before timeout, the dog kills the server and restarts another one.
  • Use --slowdog option to slowdash to enable this. This is already enabled for the Docker container.

2024-09-10 SlowPy LabJack plugin

  • currently supports U12 Analog In/Out and Digital In/Out

2024-09-09 SlowPy-HDL (experimental)

2024-09-04 Slowdash node in SlowPy controls

  • For controlling Slowdash servers from SlowPy scripts
  • ControlSystem.http(url).slowdash() to create a node
  • Implements ping(), config(), channels(), data(channels,length=3600), and config_file(name) subnodes

2024-08-30 HTTP and Telnet protocols in SlowPy/Control, SCPI interface modified

  • HTTP: ControlSystem.http(url).path(path).get(), or ControlSystem.http(url).path(path).json().get()
  • Telnet: ControlSystem.ethernet(host, port).telnet(prompt, line_terminator).command(cmd).get()
  • ❗ SCPI: previous ControlSystem.ethernet(host, port).scpi(cmd).get() is now ControlSystem.ethernet(host, port).scpi().command(cmd).get()

2024-08-28 SlowTask dynamic loading

  • Files under config with a name like slowtask-*.py will be automatically listed (without loading). Scanning is triggered by browser reloading of the SlowHome page.
  • Clicking start will load the file. For auto-loading, the task must be listed in the SlowdashProject.yaml config file.

2024-07-18 "2407 Snoqualmie" Release

Major changes since 2402 Nisqually are:

  • Controls script: Controls section
  • User module threading
  • Container support
    • Dockerfile and docker images on DockerHub and GHCR
    • File manager on browser
    • Parameter substitutions in SlowdashProject.yaml
    • Configuration by environmental variables
    • Dash-Start

2024-06-30 Controls Scripting with SlowPy

2024-05-31 User module callback function names are changed to have a prefix of _

  • ❗ for example, previous initialize() is now _initialize()
  • this is to avoid possible conflicts with user-defined functions

2024-05-30 Options to allow Python file uploading, program argument to select Slowdash configuration file

  • Program option --project-file=FILENAME specifies the Slowdash configuration file (default SlowdashProject.yaml).
  • In the configuration file, setting system/our_security_is_perfect to true will allow file uploading of any type, including Python.

2024-05-06 Project configuration by environment variables (instead of SlowdashProject.yaml)

  • Environmental variables used when SlowdashProject.yaml does not exist:
    • SLOWDASH_INIT_DATASOURCE_URL: data source URL
    • SLOWDASH_INIT_TIMESERIES_SCHEMA: time-series schema for the data source given above
  • This will allow a docker-only quick start if a data source already exists. An example of docker-compose.yaml:
version: '3'
services:
  slowdash:
    image: slowdash
    ports:
      - "18881:18881"
    environment:
      - SLOWDASH_INIT_DATASOURCE_URL=postgresql://postgres:postgres@POSTGRESQL_HOST:5432/SlowTestData
      - SLOWDASH_INIT_TIMESERIES_SCHEMA=slowpy_ts[channel]@timestamp(unix)=value

2024-05-05 Improved docker-compose.yaml in ExampleProjects

  • SlowdashProject.yaml can handle different DB host settings between docker-compose and bare-metal
  • Example docker-compose includes test data generation with generate-testdata.py, using SlowPy in the SlowDash image
  • for PostgreSQL, SQLite, InfluxDB2, and Redis, just running docker-compose up will do everything

2024-04-17 Auto-Cruise Planner (SlowPlan)

2024-04-11 Config File Manager (SlowFile)

  • creating, uploading, deleting, and editing files under the user project configuration directory

2024-03-02 Substitutions in SlowdashProject.yaml

The syntax is basically the same as docker-compose:

  • ${VARIABLE} for substitution with environmental variable
    • ${VARIABLE:-DEFAULT} with default when the variable is undefined or the value is empty
    • ${VARIABLE-DEFAULT} with default when the variable is undefined
  • $(COMMAND) for substitution with shell command execution result
  • $$ for literal $
  • environment entry to define variables, either as a dict or an array

Example:

  environment:
    - BASE=${HOME:-/home/slow}/project
    - DB=sqlite:///${BASE}/SlowStore.db
  data_source:
    url: ${DB}

2024-02-24 SlowEdit: options to set key bindings (VSCode/Vim/Emacs)

2024-02-13 "2402 Nisqually" Release

2402-02-13 Bugfix on DateTime handling in SQL (Tag: 240213)

  • If DateTime type was used for timestamps (instead of UNIX time), the query failed, and no data was returned, fixed
  • Also: Implemented "retries" on connecting to SQL-DB and CouchDB, necessary for use on docker-compose etc.

2024-01-29 Bugfix on screenshot (Tag: 240129)

  • Screenshot did not include legend, fixed

2024-01-22 Dockerfile

To build a docker image,

git clone github.com/slowproj/slowdash.git --recurse-submodules
cd slowdash
docker build -t slowdash .

The container launches slowdash --port=18881 at the /project directory. To run this, bind the port and volume:

cd PATH/TO/SLOWDASH/PROJECT
docker run -p 18881:18881 -v $(pwd):/project slowdash 

2024-01-20 User module threading

Two call-back functions in the user module are added:

  • loop() function: if this function is defined, a thread is created, and this function is called repeatedly.
  • run() and halt(): if both are defined, a thread is created, and run() is called after initialize(). When halt() is called, the run() function must exit as soon as possible. finalize() will be called afterward.

These two cannot be used simultaneously. For more details, see the Pages document.

2024-01-14 "2401 Nisqually" Release

  • Data visualization is mostly working (except for custom layout)
  • Tested back-end bindings including: PostgreSQL, SQLite, InfluxDB, Redis, CouchDB
  • Controls are primitive, subject to large changes in the future releases
  • All the analysis-related functions are experimental (SlowPy and Data Functors)

Clone this wiki locally