Browsers don't have the ability to access devices connected via serial port, which is unfortunate for people who wish to use postal scales or other old hardware from a website. A somewhat-convoluted but actually rather simple solution is to spin up a quick flask webserver on the local device that creates an http interface between the COM port and the browser.
First, make sure you have Python 3 installed. Then, just download the code, run pip install -r requirements.txt
to get the necessary libraries (using a virtualenv is suggested but not necessary), and call python -m app
from the package directory, at which point the scale server methods should be accessible at localhost's port 5000. You can optionally pass a command line argument of the COM port to use by default, for example python -m app COM2
.
The SerialScaleReader object is essentially a wrapper around the pySerial library, applied specifically to interact with a scale. It has a few useful methods:
- read_weight: Writes the command to the COM port to get the weight from the scale (command configurable via init kwarg), waits a moment for a response (length of wait also configurable via init kwarg), and then returns whatever the scale sends back.
- get_settings: Gets the settings of the pyserial object that is used to communicate with the scale.
- update_settings: Changes the settings of the pyserial object that is used to communicate with the scale. Includes:
Setting | Accepted Values |
---|---|
port | Device names on your computer, for example 'COM1', 'COM2' |
baud_rate | Integer |
parity | 'none', 'even', 'odd', 'mark', 'space' |
stop_bits | 1, 1.5, 2 |
byte_size | 5, 6, 7, 8 |
- update_and_get_settings: Calls update_settings and get_settings, returning both the current settings and any errors encountered when updating them. Mostly for convenience.
The server is incredibly simple, essentially just a one-to-one link between an endpoint and the SerialScaleReader object's methods. The endpoints are as follows:
- /: The root. It just encourages you to do something useful.
- /get_settings: Returns the serial port settings as json.
- /update_settings: Updates the serial port settings, returning them (and any errors) as json. Values can be sent as parameters in a GET request (
e.g. localhost:5000/update_settings?port=COM3&baud_rate=9600&stop_bits=1.5
) in order to make it easier to bookmark and share presets, or via form data in a POST request. The values which can be sent match the SerialScaleReader's update_settings kwargs. - /read: Returns whatever is read from the scale (or the error received if it failed)