Skip to content

API Reference

Here you will find the methods that you can use to interact with the JSD device.

usbVendorId usbProductId are the filters that you can use to connect to the device

machine.serialFilters = [
{
usbVendorId: 0x04d8,
usbProductId: 0x0053,
},
];

Warning

This is better don’t use once constructor was called

machine.serialConfigPort = {
baudRate: 9600,
dataBits: 8,
stopBits: 1,
parity: "none",
bufferSize: 32768,
flowControl: "none",
};

Address of the machine

console.log(machine.listenOnPort)

get the filters that apply when require a serial device

console.log(machine.serialFilters)

get the configuration of the serial port

console.log(machine.serialConfigPort)

Check if the machine is connected

console.log(machine.isConnected)

Check if the machine is disconnected

console.log(machine.isDisconnected)

Get the number of device, isn’t the same of the address.

Warning

Number of device is util if you have more than one jsd in the same pc

console.log(machine.deviceNumber)

Get the uuid of the connection

When you create a new instance of the class, the uuid is generated

console.log(machine.uuid)

Get the type of the device each class has a different type, in this case is jsd

console.log(machine.typeDevice)

Get the queue of commands that are waiting to be executed

console.log(machine.queue)

Check if a machine is available to dispense based on its status.

const isAvailable = machine.vision.isAvailableToDispense({ machine: 1 });
console.log(isAvailable); // true or false

Request the current status of a machine.

await machine.vision.requestMachineStatus({ machine: 1 });
machine.on('vision:machine-status', (data) => {
console.log('Machine status:', data);
});

Request status of a specific channel.

await machine.vision.requestStatusChannel({ machine: 1, selection: 15 });
machine.on('vision:channel-status', (data) => {
console.log('Channel status:', data);
});

Get status of all channels in a machine.

Warning

This method triggers a sequence of requests for all selections in the configured range

const channels = await machine.vision.assignChannels({ machine: 1 });
console.log('All channels:', channels);
// Or listen to the events
machine.on('vision:channels', (data) => {
console.log('Channels data:', data);
});
machine.on("vision:channels-progress", (event) => {
console.log(event.detail);
});

Request status of a specific selection.

await machine.vision.requestStatusSelection({ selection: 25 });
machine.on('vision:status-selection', (data) => {
console.log('Selection status:', data);
});

Configure dispense parameters for a selection.

await machine.vision.configureSelectionDispense({
selection: 10,
speed: 5,
timePostRun: 2
});
machine.on('vision:selection-dispense-config', (data) => {
console.log('Configuration saved:', data);
});

Get current dispense configuration for a selection.

await machine.vision.requestSelectionDispenseConfig({ machine: 1 });
machine.on('vision:selection-dispense-config', (data) => {
console.log('Dispense configuration:', data);
});

Add a channel to a selection.

await machine.vision.configureAddChannelToSelection({
selection: 10,
machine: 1,
tray: 2,
channel: 5
});
machine.on('vision:channels-linked-to-selection', (data) => {
console.log('Channel added:', data);
});

Get all channels linked to a specific selection.

await machine.vision.requestChannelsLinkedToSelection({ selection: 10 });
machine.on('vision:channels-linked-to-selection', (data) => {
console.log('Linked channels:', data);
});

Request machine identification information.

await machine.vision.requestMachineIdentification({ machine: 1 });
machine.on('vision:machine-id', (data) => {
console.log('Machine ID:', data);
});

Program the working temperature for a machine.

await machine.vision.configureWorkingTemperature({
machine: 1,
temperature: 4, // degrees Celsius
enable: true
});
machine.on('vision:current-temperature', (data) => {
console.log('Temperature configured:', data);
});

Get the current working temperature configuration.

await machine.vision.requestWorkingTemperature({ machine: 1 });
machine.on('vision:current-temperature', (data) => {
console.log('Current temperature:', data);
});

Program waiting timings for different operations.

await machine.vision.configureWaitingTimings({
collectPosition: 3,
dispenseManoeuvres: 5,
afterPickup: 2
});
machine.on('vision:time-waiting-for-product-collection', (data) => {
console.log('Timings configured:', data);
});

Get the current waiting timings configuration.

await machine.vision.requestWaitingTimings();
machine.on('vision:time-waiting-for-product-collection', (data) => {
console.log('Waiting timings:', data);
});

Reset sold-out status for all channels in a machine.

await machine.vision.resetSoldOutChannels({ machine: 1 });
machine.on('vision:reset-sold-out-channels', (data) => {
console.log('Sold-out status reset:', data);
});

Reset all faults and perform self-test for a machine.

Warning

This will reset all error states

await machine.vision.resetAllErrors({ machine: 1 });
machine.on('vision:reset-sold-out-channels', (data) => {
console.log('Sold out channels reset:', data);
});
machine.on('vision:active-faults', (data) => {
console.log('Active errors:', data);
});

Program the time to wait after product pickup.

await machine.vision.configureTimeWaitingAfterPickup({ time: 5 }); // 5 seconds
machine.on('vision:time-waiting-after-product-collection', (data) => {
console.log('Time configured:', data);
});

Get the current time waiting after pickup configuration.

await machine.vision.requestTimeWaitingAfterPickup();
machine.on('vision:time-waiting-after-product-collection', (data) => {
console.log('Time after pickup:', data);
});

Request the JSD firmware version.

await machine.vision.requestJSDVersion();
machine.on('vision:jsd-version', (data) => {
console.log('JSD version:', data);
});

Request a report of currently active faults.

await machine.vision.requestReportActiveFaults({ machine: 1 });
machine.on('vision:active-faults', (data) => {
console.log('Active faults:', data);
});

Request a report of inactive faults (historical).

await machine.vision.requestReportInactiveFaults({ machine: 1 });
machine.on('vision:active-faults', (data) => {
console.log('Inactive faults:', data);
});

Clear the inactive faults log.

await machine.vision.clearInactiveFaults({ machine: 1 });
machine.on('vision:active-faults', (data) => {
console.log('Inactive faults cleared:', data);
});

Request the current status of the JSD dispensing queue.

await machine.vision.requestJSDDispensingQueueStatus();
machine.on('vision:jsd-dispensing-queue', (data) => {
console.log('Queue status:', data);
});

Clear the JSD dispensing queue.

Warning

This will cancel all pending dispense operations

await machine.vision.clearJSDDispensingQueue();
machine.on('vision:jsd-dispensing-queue', (data) => {
console.log('Queue cleared:', data);
});

Define special characteristics for a selection (perishable, fragile, elevator adjustments).

await machine.vision.configureSpecialCharacteristicsSelection({
selection: 15,
perishable: true,
fragileOrHeavy: false,
typeAdjustElevator: 1,
timeAdjustElevator: 3
});
machine.on('vision:special-characteristics-selection', (data) => {
console.log('Special characteristics configured:', data);
});

Get special characteristics configured for a selection.

await machine.vision.requestSpecialCharacteristicsSelection({ selection: 15 });
machine.on('vision:special-characteristics-selection', (data) => {
console.log('Special characteristics:', data);
});

Configure perishable products settings for a machine.

await machine.vision.configurePerishableProducts({
machine: 1,
enable: true,
temperatureLimit: 8, // degrees Celsius
minutesToExpiry: 120 // 2 hours
});
machine.on('vision:perishable-products-config', (data) => {
console.log('Perishable products configured:', data);
});

Request currently active faults for a machine.

await machine.vision.requestActiveFaults({ machine: 1 });
machine.on('vision:active-faults-list', (data) => {
console.log('Active faults:', data);
});

Configure whether to receive extended dispense status data.

await machine.vision.configureExtendedDispenseStatusData({ enable: true });
machine.on('vision:extended-dispense-status-data', (data) => {
console.log('Extended status configured:', data);
});

Get the current extended dispense status data configuration.

await machine.vision.requestExtendedDispenseStatusDataConfig();
machine.on('vision:extended-dispense-status-data', (data) => {
console.log('Extended status config:', data);
});

requestStatusTrayPositioningPhototransistors

Section titled “requestStatusTrayPositioningPhototransistors”

Request the status of tray positioning phototransistors.

await machine.vision.requestStatusTrayPositioningPhototransistors({ machine: 1 });
machine.on('vision:trays-positioning-phototransistors-status', (data) => {
console.log('Phototransistors status:', data);
});

Dispense a product from a specific channel.

const result = await machine.vision.dispenseFromChannel({
machine: 1,
tray: 2,
channel: 5,
speed: 5,
timePostRun: 2,
cart: false
});
console.log('Dispense initiated:', result);
machine.on('vision:dispense-status', (data) => {
console.log('Dispense completed:', data);
});

Dispense from a selection using the channel assignment logic.

const result = await machine.vision.dispense({
machine: 1,
selection: 15,
speed: 5,
timePostRun: 2,
cart: false
});
console.log('Dispense initiated:', result);
machine.on('vision:dispense-status', (data) => {
console.log('Dispense completed:', data);
});

Dispense multiple selections in a cart operation.

Warning

This method sends dispense commands in batches of 10 and waits for machines to be available before sending the next batch

const cartItems = [
{ machine: 1, selection: 10 },
{ machine: 1, selection: 15 },
{ machine: 2, selection: 20 }
];
const results = await machine.vision.dispenseCart(cartItems);
console.log('Cart dispense results:', results);
// Example output: [{ selection: 10, dispensed: true }, { selection: 15, dispensed: true }, ...]

Get the dispense status from a channel using a token.

await machine.vision.requestDispenseStatusFromChannel({ token: 'abc123' });
machine.on('vision:dispense-status', (data) => {
console.log('Dispense status:', data);
});

Dispense from a selection directly.

const result = await machine.vision.dispenseFromSelection({
selection: 25,
cart: false
});
console.log('Dispense initiated:', result);
machine.on('vision:dispense-status', (data) => {
console.log('Dispense completed:', data);
});

Get the dispense status from a selection using a token.

await machine.vision.requestDispenseStatusFromSelection({ token: 'xyz789' });
machine.on('vision:dispense-status', (data) => {
console.log('Dispense status:', data);
});

Turn on the lights for a machine.

await machine.vision.lightsOn({ machine: 1 });
machine.on('vision:machine-status', (data) => {
console.log('Lights turned on:', data);
});

Turn off the lights for a machine.

await machine.vision.lightsOff({ machine: 1 });
machine.on('vision:machine-status', (data) => {
console.log('Lights turned off:', data);
});

Reset faults and perform self-test.

await machine.vision.resetFaultsAndSelfTest({ machine: 1 });
// machine.on('vision:machine-status', (data) => {
// console.log('Self-test completed:', data);
// });

Perform a collect cycle to move the elevator to the collection position.

await machine.vision.collect({ machine: 1 });
// machine.on('vision:machine-status', (data) => {
// console.log('Collect cycle completed:', data);
// });

Dispense from a channel with extended options for fragile/heavy products and elevator adjustments.

const result = await machine.vision.dispenseFromChannelExtended({
machine: 1,
tray: 2,
channel: 5,
speed: 3,
timePostRun: 3,
fragileOrHeavy: true,
typeAdjustElevator: 2,
timeAdjustElevator: 4,
cart: false
});
console.log('Extended dispense initiated:', result);
machine.on('vision:dispense-status', (data) => {
console.log('Dispense completed:', data);
});

Get the dispense status from a channel with extended data using a token.

await machine.vision.requestDispenseStatusFromChannelExtended({ token: 'ext456' });
machine.on('vision:dispense-status', (data) => {
console.log('Extended dispense status:', data);
});

Request a complete JSD reset.

await machine.vision.restartJSD();
machine.on('vision:jsd-status-reset', (data) => {
console.log('JSD restarted:', data);
});

Request logs events from the machine.

await machine.requestLogsEvent({ previous: false });
machine.on('manifest:log', (data) => {
console.log('Logs event:', data);
});
// Request previous logs
await machine.requestLogsEvent({ previous: true });

Request logs and return them as an array of strings. This method handles fetching logs in batches if necessary.

Warning

This method throws an error if logs are already being fetched

try {
const logs = await machine.requestLogs();
console.log('All logs:', logs);
// Example output: ['Log entry 1', 'Log entry 2', ...]
} catch (error) {
console.error('Error fetching logs:', error);
}

Request logs filtered by a specific date range.

const since = new Date('2026-01-01');
const until = new Date('2026-02-12');
await machine.requestLogsByDate({ since, until });
machine.on('manifest:log', (data) => {
console.log('Logs in date range:', data);
});

Request to start sending a manifest file to the machine.

await machine.requestForSendingManifest({
fileSizeBytes: 2048,
crc: 'A3F5C8'
});
machine.on('manifest:completed', (data) => {
console.log('Manifest upload completed:', data);
});

Send a block of manifest data to the machine.

const dataBlock = new Uint8Array([0x01, 0x02, 0x03, 0x04, /* ... */]);
await machine.sendManifestDataBlock({
prevBlockId: 0,
dataBlock: dataBlock
});
machine.on('manifest:block', (data) => {
console.log('Block received:', data);
// Send next block...
});

Request the status of a specific feature by its ID.

await machine.requestFeatureStatus({ feature: 101 });
machine.on('licensing:feature-status', (data) => {
console.log('Feature status:', data);
// Example: { feature: 101, active: true }
});

Request the status of the temporary license.

await machine.requestTemporaryLicenseStatus();
machine.on('licensing:temporary-license-status', (data) => {
console.log('Temporary license status:', data);
// Example: { status: 'active', remainingDays: 30, daysSinceExpiration: 0 }
});

Request seed data for license generation.

await machine.requestSeedData();
machine.on('licensing:seed', (data) => {
console.log('Seed data:', data);
// Example: { seed: '...', hex: '...' }
// Use this seed data to generate a license
});

Request activation of a license using a license string.

await machine.requestLicenseActivation({
license: 'XXXX-YYYY-ZZZZ-AAAA-BBBB'
});

Request for status of the MDB Card Holder device.

await machine.requestStatus({
numberDevice: 1
});

Request for identification of the MDB Card Holder device.

await machine.requestIdentification({
deviceNumber: 1,
});

Request for configuration of the MDB Card Holder device.

await machine.requestConfiguration({
deviceNumber: 1,
});

Request for functionalities configuration of the MDB Card Holder device.

  • @param options.deviceNumber The device number to request functionalities configuration for. Defaults to 1.
  • @param options.alwaysIdle Whether the device should always be idle (true) or not (false).
  • @param options.remoteVend Whether remote vend is enabled (true) or not (false).
await machine.requestSetFunctionalitiesConfiguration({
deviceNumber: 1,
alwaysIdle: true,
remoteVend: false,
});

Request for functionalities configuration of the MDB Card Holder device.

await machine.requestGetFunctionalitiesConfiguration({
deviceNumber: 1,
});

Request to enable or disable the MDB Card Holder device.

await machine.requestEnable({
deviceNumber: 1,
enable: true
});

Request for balance data of the MDB Card Holder device.

await machine.requestBalanceData({
deviceNumber: 1,
});

Request for sale approval of the MDB Card Holder device.

await machine.requestSaleApproval({
deviceNumber: 1,
amount: 100,
productId: null, // null|number
});

Request for sale cancellation of the MDB Card Holder device.

await machine.requestSaleCancellation({
deviceNumber: 1,
});

Request for sale success confirmation of the MDB Card Holder device.

await machine.requestSaleSuccessConfirmation({
deviceNumber: 1,
});

Request for sale failure confirmation of the MDB Card Holder device.

await machine.requestSaleFailureConfirmation({
deviceNumber: 1,
});

Request to end session of the MDB Card Holder device.

await machine.requestEndSession({
deviceNumber: 1,
});

Request for cash record of the MDB Card Holder device.

await machine.requestCashRecord({
deviceNumber: 1,
amount: 100,
productId: null, // null|number
});

Request for selection request denied of the MDB Card Holder device.

await machine.requestSelectionRequestDenied({
deviceNumber: 1,
reasonCode: "unknown", // "'unknown' | 'product-not-available' | 'out-of-stock' | 'faulty-selection' | 'no-ingredients' | 'selection-locked' | 'inhibited-selection' | 'expired-product' | 'temperature' | 'occupied-machine' | 'insufficient-credit' | 'temporarily-occupied-machine'"
});

Request for revalue of the MDB Card Holder device.

await machine.requestRevalue({
deviceNumber: 1,
amount: 100
});