Author Topic: open-EE-workbench, a cross-compatible interface for equipment & testing  (Read 402 times)

mbno and 4 Guests are viewing this topic.

Offline ObinTopic starter

  • Contributor
  • Posts: 49
  • Country: be
  • Hi
I've been building something that got a bit out of hand... as it goes  :) Its a VISA-based automation framework for lab instruments and wanted to share it with the community for some feedback/requests to improve it.

The problem: I have several desks with different brands of equipment. VISA/SCPI is supposed to be cross-compatible but in reality that's hardly the case aside from *IDN and the basics. On top of that, I teach a class and it's often a hassle to tell students "No you FIRST have to install NI-VISA BEFORE installing IOsuite!" So this is my attempt at a cross-compatible abstraction layer that allows you to control your equipment from the same place without making any adjustments. No bulky downloads, no bloatware, no bickering about licenses, ... just Python :). Also, it contains a set of pre-made tests you can run using any equipment you might have connected. Works from CLI for the basics, but the GUI is overall a nicer experience. (I kept the CLI because its fairly quick in spotting which devices are connected)

A short AI generated description:

  What it is

 open-EE-workbench is a free, open-source GUI and scripting framework for automating electronic test
  equipment — oscilloscopes, power supplies, AWGs, DMMs, SMUs, and electronic loads. It runs on Windows,
  Linux, and macOS. No vendor software required.

  It's built on PyVISA/PyVISA-py, so it works with USB, Ethernet, and serial instruments without needing
  proprietary drivers.

  What it can do

  The GUI has four main areas:

  - Workbench — live instrument control in one view. Connect your bench, and you get cards for each
  instrument with real-time controls and readback. Save/load/reset instrument state snapshots.
  - Automation — ready-made parametric tests: DC sweep (single, simultaneous, nested), PSU interrupt
  transient capture, AC frequency sweep (Bode magnitude), DMM logger, and waveform analysis.
  - Plot Specific — tests that produce standard datasheet-style curves directly: Static Characteristic (IV
  curves) and Transfer Characteristic for BJT/FET devices, with a live canvas during the sweep.
  - Sandbox — a no-code pipeline editor where you define sweep loops and actions (Set, Measure, Wait, Wait
  for State) across any combination of instruments. Build custom parametric tests without writing Python.

  There are also standalone CLI scripts for screenshots, sweeps, and waveform analysis that work without the
  GUI.

  Instrument coverage

  The SCPI command database (eewBackbone) currently covers 69 families across 15 vendors, including Keysight,
   Rigol, Rohde & Schwarz, Tektronix, Siglent, Agilent, GW Instek, Korad, BK Precision, AIM-TTI, Fluke,
  Hantek, OWON, and Keithley.

  Adding a new instrument is a single JSON entry — no code changes needed.

  Where to get it

  https://github.com/kerstensrobin/open-EE-workbench

  The wiki has setup instructions, parameter references, and screenshots:
  https://github.com/kerstensrobin/open-EE-workbench/wiki

  Why I'm posting

  Two reasons:

  1. If you try it and something doesn't work — wrong measurements, instrument not recognised, a command that
   fails — I'd like to hear about it. Right now it works fairly well across the devices I have access to, but it will be a community effort to make it REALLY compatible with many devices.
  2. If your instrument isn't in the database, feel free to open an issue or reply here with the make/model
  (and *IDN? response if you have it). Adding support is straightforward and I'm happy to do it. There is a dedicated button that opens a Github issue and fills in some stuff already.

  It's very much a work in progress, but it's been stable enough to use daily and I wanted to get it in front of people who might find it useful.

Devices I have already been able to confirm:
Rigol DS1054Z DHO804
Keysight DSOX1204, EDU36311A, EDU33212A, EDUX1052, EDU34450A
Agilent 33220A
Keithley 2231A
Korad KA3005P
Tektronix TBS1000C TDS2012B TDS2012C

And I've scraped many more programming manuals for commands, but experience taught me mileage may vary on the commands acquired by scraping.

Don't really know what to expect when other start using this. But I like it, so I thaught I'd share it and potentially help some others :)
« Last Edit: Yesterday at 08:06:42 am by Obin »
 
The following users thanked this post: RoGeorge

Offline Microcheap

  • Frequent Contributor
  • **
  • Posts: 286
  • Country: 00
Re: open-EE-workbench, a cross-compatible interface for your equipment
« Reply #1 on: June 16, 2026, 04:50:10 am »
Thanks for sharing, that looks promising.

Are you aware of TestConstroller? I think it tried to solve most of the same problems but yours open-EE-workbench seems to have a nicer interface and it has USB support.

I will give it a try. I have a bunch of devices from Hantek, Owon, Rigol, Micsig, Korad and others that I can test with it.
 

Offline JimKnopf

  • Frequent Contributor
  • **
  • Posts: 345
  • Country: 00
Re: open-EE-workbench, a cross-compatible interface for your equipment
« Reply #2 on: June 16, 2026, 07:04:19 am »
I also use TestController sometimes. For repairs, i had the need to display several Cameras and Instruments at the same time for documentation. Microscope and IR-Camera at the same time. Until last month, i used OBS Studio for that. But it was a bit tricky and not all devices can be connected in OBS Studio. I let Claude code an UI that fit all my needs. Now i have a Instrument Bar on top, Microscope view and i can add Scope , IR-Cam or DMM directly on screen.

To me, it seems that the need to use specific software has disappeared since Claude Code came along. The trick is to have an application written exactly the way you want it—without any compromises.

On my (Linux) PC i use this now for repairs
https://github.com/JimKnopfIoT/labcam-pc

and on my SailfishOS phone i use a simliar setup like this
https://github.com/JimKnopfIoT/labcam-phone
 

Offline ObinTopic starter

  • Contributor
  • Posts: 49
  • Country: be
  • Hi
Thanks for sharing, that looks promising.

Are you aware of TestConstroller? I think it tried to solve most of the same problems but yours open-EE-workbench seems to have a nicer interface and it has USB support.

I will give it a try. I have a bunch of devices from Hantek, Owon, Rigol, Micsig, Korad and others that I can test with it.

I've read about it yes, but I haven't personally used it. While I hope to have an equally long list of compatible devices some day, I think there is some difference to the tools. My idea behind open-eew is to make it a good companion for specific tests, hence the PSU interrupts, IV curvers, etc. I hope to expand this part in the future with more tests and some automated calculations. Which, in combination with the SCPI-dialect coverage, would be very interesting for characterization/validation people!

The brands you mentioned I have had not much personal access to, so be sure to let me know the bugs! :)


To me, it seems that the need to use specific software has disappeared since Claude Code came along. The trick is to have an application written exactly the way you want it—without any compromises.

Claude code helped out a lot with this, and I agree that it should be leveraged to just make hyper-personalized tools. By open-sourceing tools like the one I shared, I hope to really speed up the development of other people should they want to make something similar. Because how genius these coding agents might be, it takes a lot of back and forth to make tools like these :D
 

Offline RoGeorge

  • Super Contributor
  • ***
  • Posts: 8208
  • Country: ro
Nice projects, thanks!  :-+

Gave it a try this morning on an Kubuntu 22.04 LTS, with three LXI instruments connected over LAN:
- oscilloscope Rigol DS1054Z
- generator Rigol DG4102
- power supply Rigol DP832

Followed the github instructions, it installed OK, nachoVisa sees and all my 3 instruments (each instrument was listed twice, once as TCPIP0::myInstrumentIP::inst0::INSTR, once as TCPIP::myInstrumentIP::INSTR), the open-eew GUI opened, got some open-eew launching errors, too.  ;D

- 1.  open-eew complains for not finding KWallet (which is indeed intentionally disabled on this PC) - why is Kwallet needed/used for in open-eew?

- 2.  [1019177:1019177:0619/075739.586913:ERROR:chrome_browser_cloud_management_controller.cc(163)] Cloud management controller initialization aborted as CBCM is not enabled. - same question, why is this needed (I don't use Chrome browser, and don't have it installed, AFAIK)

- 3.  it seems to open Brave browser, because I get a "please update Brave" popup (which, again, is kept intentionally not updated (Brave is not the default browser, default is LibreWolf).  Also, it tries to open a "Greaselion.json" file from a .config directory for Brave, though I've checked and there is no Greaselion.json at home .config/BraveSoftware/Brave-Browser/blablabla...../1/

- 4.  in the Workbench tab of the GUI, no buttons seems to be working.  For example, if I set 5V and turn on CH1 of the power supply, the .OFF red button representing the channel output turns into a green .ON button, but the power supply doesn't seem to receive any command.  :-\

Same for the other 2 instruments, it looks like they don't receive any commands.  Any suggestions?

Code: [Select]
./open-eew                         
 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5173
Press CTRL+C to quit
[app] opened in Chrome app-mode (pid 1019171)
[1019177:1019177:0619/075739.459398:ERROR:object_proxy.cc(590)] Failed to call method: org.kde.KWallet.isEnabled: object_path= /modules/kwalletd5: org.freedesktop.DBus.Error.NoReply: Message recipient disconnected from message bus without replying
[1019177:1019177:0619/075739.459724:ERROR:kwallet_dbus.cc(107)] Error contacting kwalletd5 (isEnabled)
[1019177:1019177:0619/075739.460891:ERROR:object_proxy.cc(590)] Failed to call method: org.kde.KLauncher.start_service_by_desktop_name: object_path= /KLauncher: org.freedesktop.DBus.Error.ServiceUnknown: The name org.kde.klauncher was not provided by any .service files
[1019177:1019177:0619/075739.460908:ERROR:kwallet_dbus.cc(79)] Error contacting klauncher to start kwalletd5
[1019177:1019177:0619/075739.582068:ERROR:object_proxy.cc(590)] Failed to call method: org.kde.KWallet.close: object_path= /modules/kwalletd5: org.freedesktop.DBus.Error.NoReply: Message recipient disconnected from message bus without replying
[1019177:1019177:0619/075739.582131:ERROR:kwallet_dbus.cc(459)] Error contacting kwalletd5 (close)
[1019177:1019177:0619/075739.586913:ERROR:chrome_browser_cloud_management_controller.cc(163)] Cloud management controller initialization aborted as CBCM is not enabled.
[1019177:1019218:0619/075740.564960:ERROR:dat_file_util.cc(52)] GetDATFileAsString: cannot read dat file ~/.config/BraveSoftware/Brave-Browser/afalakplffnnnlkncjhbmahjfjhmlkal/1.0.1435/1/Greaselion.json
[1019177:1019177:0619/075740.565116:ERROR:greaselion_download_service.cc(280)] Could not obtain Greaselion configuration
127.0.0.1 - - [19/Jun/2026 07:57:40] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /assets/nacho_white.svg HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /ui/socket.io.min.js HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /api/workbenches HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /api/workbench/autodetected_workbench_1 HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /api/automation/tests HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /api/automation/tests HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:42] "GET /manifest.json HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:42] "GET /assets/favicon-32.png HTTP/1.1" 200 -
[1019177:1019276:0619/075743.275536:ERROR:dat_file_util.cc(52)] GetDATFileAsString: cannot read dat file ~/.config/BraveSoftware/Brave-Browser/blablalongblaremovedmanually...../1.0.1465/1/Greaselion.json
[1019177:1019177:0619/075743.306283:ERROR:greaselion_download_service.cc(280)] Could not obtain Greaselion configuration
127.0.0.1 - - [19/Jun/2026 08:37:48] "POST /api/scan HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:38:17] "POST /api/scan/save HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:38:17] "GET /api/workbenches HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:38:17] "GET /api/workbench/autodetected_workbench_1 HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:38:17] "GET /api/workbench/bench_20260619 HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:38:45] "GET /api/families HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:39:59] "POST /api/awg/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:23] "POST /api/awg/apply HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:43] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:45] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:45] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:45] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:46] "POST /api/scope/run HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:47] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:48] "POST /api/scope/single HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:49] "POST /api/scope/autoscale HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:50] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:13] "POST /api/psu/set HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:15] "POST /api/psu/set HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:15] "POST /api/psu/set HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:16] "POST /api/psu/set HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:33] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:35] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:36] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:42] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:43] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:44] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:45] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:47] "POST /api/psu/output HTTP/1.1" 200 -
« Last Edit: Today at 05:57:29 am by RoGeorge »
 

Offline RoGeorge

  • Super Contributor
  • ***
  • Posts: 8208
  • Country: ro
Doh, never mind, I didn't press "Connect"!  ;D

Now it works, though I get beeps from the power supply, and the DP832 LCD displays "Remote command is incorrect!".  Is there any place where I can see what SCPI commands are sent to the instruments?


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf