API Reference
Here you will find the methods that you can use to interact with the JSD device.
Setters
Section titled “Setters”serialFilters
Section titled “serialFilters”usbVendorId usbProductId are the filters that you can use to connect to the device
machine.serialFilters = [ { usbVendorId: 0x04d8, usbProductId: 0x0053, },];serialConfigPort
Section titled “serialConfigPort”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",};Getters
Section titled “Getters”listenOnPort
Section titled “listenOnPort”Address of the machine
console.log(machine.listenOnPort)serialFilters
Section titled “serialFilters”get the filters that apply when require a serial device
console.log(machine.serialFilters)serialConfigPort
Section titled “serialConfigPort”get the configuration of the serial port
console.log(machine.serialConfigPort)isConnected
Section titled “isConnected”Check if the machine is connected
console.log(machine.isConnected)isDisconnected
Section titled “isDisconnected”Check if the machine is disconnected
console.log(machine.isDisconnected)deviceNumber
Section titled “deviceNumber”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)typeDevice
Section titled “typeDevice”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)Methods for vision
Section titled “Methods for vision”isAvailableToDispense
Section titled “isAvailableToDispense”Check if a machine is available to dispense based on its status.
const isAvailable = machine.vision.isAvailableToDispense({ machine: 1 });console.log(isAvailable); // true or falserequestMachineStatus
Section titled “requestMachineStatus”Request the current status of a machine.
await machine.vision.requestMachineStatus({ machine: 1 });
machine.on('vision:machine-status', (data) => { console.log('Machine status:', data);});requestStatusChannel
Section titled “requestStatusChannel”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);});assignChannels
Section titled “assignChannels”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 eventsmachine.on('vision:channels', (data) => { console.log('Channels data:', data);});machine.on("vision:channels-progress", (event) => { console.log(event.detail);});requestStatusSelection
Section titled “requestStatusSelection”Request status of a specific selection.
await machine.vision.requestStatusSelection({ selection: 25 });
machine.on('vision:status-selection', (data) => { console.log('Selection status:', data);});configureSelectionDispense
Section titled “configureSelectionDispense”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);});requestSelectionDispenseConfig
Section titled “requestSelectionDispenseConfig”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);});configureAddChannelToSelection
Section titled “configureAddChannelToSelection”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);});requestChannelsLinkedToSelection
Section titled “requestChannelsLinkedToSelection”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);});requestMachineIdentification
Section titled “requestMachineIdentification”Request machine identification information.
await machine.vision.requestMachineIdentification({ machine: 1 });
machine.on('vision:machine-id', (data) => { console.log('Machine ID:', data);});configureWorkingTemperature
Section titled “configureWorkingTemperature”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);});requestWorkingTemperature
Section titled “requestWorkingTemperature”Get the current working temperature configuration.
await machine.vision.requestWorkingTemperature({ machine: 1 });
machine.on('vision:current-temperature', (data) => { console.log('Current temperature:', data);});configureWaitingTimings
Section titled “configureWaitingTimings”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);});requestWaitingTimings
Section titled “requestWaitingTimings”Get the current waiting timings configuration.
await machine.vision.requestWaitingTimings();
machine.on('vision:time-waiting-for-product-collection', (data) => { console.log('Waiting timings:', data);});resetSoldOutChannels
Section titled “resetSoldOutChannels”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);});resetAllErrors
Section titled “resetAllErrors”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);});configureTimeWaitingAfterPickup
Section titled “configureTimeWaitingAfterPickup”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);});requestTimeWaitingAfterPickup
Section titled “requestTimeWaitingAfterPickup”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);});requestJSDVersion
Section titled “requestJSDVersion”Request the JSD firmware version.
await machine.vision.requestJSDVersion();
machine.on('vision:jsd-version', (data) => { console.log('JSD version:', data);});requestReportActiveFaults
Section titled “requestReportActiveFaults”Request a report of currently active faults.
await machine.vision.requestReportActiveFaults({ machine: 1 });
machine.on('vision:active-faults', (data) => { console.log('Active faults:', data);});requestReportInactiveFaults
Section titled “requestReportInactiveFaults”Request a report of inactive faults (historical).
await machine.vision.requestReportInactiveFaults({ machine: 1 });
machine.on('vision:active-faults', (data) => { console.log('Inactive faults:', data);});clearInactiveFaults
Section titled “clearInactiveFaults”Clear the inactive faults log.
await machine.vision.clearInactiveFaults({ machine: 1 });
machine.on('vision:active-faults', (data) => { console.log('Inactive faults cleared:', data);});requestJSDDispensingQueueStatus
Section titled “requestJSDDispensingQueueStatus”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);});clearJSDDispensingQueue
Section titled “clearJSDDispensingQueue”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);});configureSpecialCharacteristicsSelection
Section titled “configureSpecialCharacteristicsSelection”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);});requestSpecialCharacteristicsSelection
Section titled “requestSpecialCharacteristicsSelection”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);});configurePerishableProducts
Section titled “configurePerishableProducts”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);});requestActiveFaults
Section titled “requestActiveFaults”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);});configureExtendedDispenseStatusData
Section titled “configureExtendedDispenseStatusData”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);});requestExtendedDispenseStatusDataConfig
Section titled “requestExtendedDispenseStatusDataConfig”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);});dispenseFromChannel
Section titled “dispenseFromChannel”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
Section titled “dispense”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);});dispenseCart
Section titled “dispenseCart”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 }, ...]requestDispenseStatusFromChannel
Section titled “requestDispenseStatusFromChannel”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);});dispenseFromSelection
Section titled “dispenseFromSelection”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);});requestDispenseStatusFromSelection
Section titled “requestDispenseStatusFromSelection”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);});lightsOn
Section titled “lightsOn”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);});lightsOff
Section titled “lightsOff”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);});resetFaultsAndSelfTest
Section titled “resetFaultsAndSelfTest”Reset faults and perform self-test.
await machine.vision.resetFaultsAndSelfTest({ machine: 1 });
// machine.on('vision:machine-status', (data) => {// console.log('Self-test completed:', data);// });collect
Section titled “collect”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);// });dispenseFromChannelExtended
Section titled “dispenseFromChannelExtended”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);});requestDispenseStatusFromChannelExtended
Section titled “requestDispenseStatusFromChannelExtended”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);});restartJSD
Section titled “restartJSD”Request a complete JSD reset.
await machine.vision.restartJSD();
machine.on('vision:jsd-status-reset', (data) => { console.log('JSD restarted:', data);});Methods for manifest
Section titled “Methods for manifest”requestLogsEvent
Section titled “requestLogsEvent”Request logs events from the machine.
await machine.requestLogsEvent({ previous: false });
machine.on('manifest:log', (data) => { console.log('Logs event:', data);});
// Request previous logsawait machine.requestLogsEvent({ previous: true });requestLogs
Section titled “requestLogs”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);}requestLogsByDate
Section titled “requestLogsByDate”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);});requestForSendingManifest
Section titled “requestForSendingManifest”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);});sendManifestDataBlock
Section titled “sendManifestDataBlock”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...});Methods for licensing
Section titled “Methods for licensing”requestFeatureStatus
Section titled “requestFeatureStatus”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 }});requestTemporaryLicenseStatus
Section titled “requestTemporaryLicenseStatus”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 }});requestSeedData
Section titled “requestSeedData”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});requestLicenseActivation
Section titled “requestLicenseActivation”Request activation of a license using a license string.
await machine.requestLicenseActivation({ license: 'XXXX-YYYY-ZZZZ-AAAA-BBBB'});Methods for MDB Card Holder
Section titled “Methods for MDB Card Holder”requestStatus
Section titled “requestStatus”Request for status of the MDB Card Holder device.
await machine.requestStatus({ numberDevice: 1});requestIdentification
Section titled “requestIdentification”Request for identification of the MDB Card Holder device.
await machine.requestIdentification({ deviceNumber: 1,});requestConfiguration
Section titled “requestConfiguration”Request for configuration of the MDB Card Holder device.
await machine.requestConfiguration({ deviceNumber: 1,});requestSetFunctionalitiesConfiguration
Section titled “requestSetFunctionalitiesConfiguration”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,});requestGetFunctionalitiesConfiguration
Section titled “requestGetFunctionalitiesConfiguration”Request for functionalities configuration of the MDB Card Holder device.
await machine.requestGetFunctionalitiesConfiguration({ deviceNumber: 1,});requestEnable
Section titled “requestEnable”Request to enable or disable the MDB Card Holder device.
await machine.requestEnable({ deviceNumber: 1, enable: true});requestBalanceData
Section titled “requestBalanceData”Request for balance data of the MDB Card Holder device.
await machine.requestBalanceData({ deviceNumber: 1,
});requestSaleApproval
Section titled “requestSaleApproval”Request for sale approval of the MDB Card Holder device.
await machine.requestSaleApproval({ deviceNumber: 1, amount: 100, productId: null, // null|number});requestSaleCancellation
Section titled “requestSaleCancellation”Request for sale cancellation of the MDB Card Holder device.
await machine.requestSaleCancellation({ deviceNumber: 1,});requestSaleSuccessConfirmation
Section titled “requestSaleSuccessConfirmation”Request for sale success confirmation of the MDB Card Holder device.
await machine.requestSaleSuccessConfirmation({ deviceNumber: 1,});requestSaleFailureConfirmation
Section titled “requestSaleFailureConfirmation”Request for sale failure confirmation of the MDB Card Holder device.
await machine.requestSaleFailureConfirmation({ deviceNumber: 1,});requestEndSession
Section titled “requestEndSession”Request to end session of the MDB Card Holder device.
await machine.requestEndSession({ deviceNumber: 1,});requestCashRecord
Section titled “requestCashRecord”Request for cash record of the MDB Card Holder device.
await machine.requestCashRecord({ deviceNumber: 1, amount: 100, productId: null, // null|number});requestSelectionRequestDenied
Section titled “requestSelectionRequestDenied”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'"});requestRevalue
Section titled “requestRevalue”Request for revalue of the MDB Card Holder device.
await machine.requestRevalue({ deviceNumber: 1, amount: 100});