Skip to content

em-simulator

Simulates up to 15 extension modules (EM1).

Description

This script can emulate the communication of up to 15 extension modules on the first configured connection.

All extension module simulations start out disabled and must be manually enabled first by calling service.setEnabled(moduleNr, true);. The moduleNr argument ranges from 1 to 15.

After enabling a module its sensor values can be set by calling service.setSensorValue(moduleNr, sensorNr, value);. The sensorNr argument ranges from 1 to 6. The value argument is the resistance value in Ohm to communicate back to the controller. The controller will convert that resistance value into the respective temperature value or switch state on its side.

Every couple of seconds the main controller sends updated relay output values to the configured extension modules. They can be read out using service.getRelayInfo(moduleNr, relayNr). The relayNr argument ranges from 1 to 5.

Service

typescript
setEnabled(moduleNr: number, isEnabled: boolean): void;
setSensorValue(moduleNr: number, sensorNr: number, value: number): void;
getRelayInfo(moduleNr: number, relayNr: number): RelayInfo | null;

Example

Config:

typescript
export default defineConfig({
  connections: [{
    kind: 'serialPort',
    path: '/dev/tty.usbmodem',
  }],
  scripts: [
    import('../scripts/em-simulator'),

    defineScript(async ($) => {
      const emSimulatorScript = await import('../scripts/em-simulator');
      const emSimulatorService = await emSimulatorScript.default.requireService();

      emSimulatorService.setEnabled(1, true);
      emSimulatorService.setSensorValue(1, 1, 1000); // M1-S1 -> 1000 Ohm -> 0 °C Pt1000
      emSimulatorService.setSensorValue(1, 2, 1000); // M1-S2 -> 1100 Ohm -> 26 °C Pt1000
      emSimulatorService.setSensorValue(1, 3, 1000); // M1-S3 -> 1200 Ohm -> 52 °C Pt1000
      emSimulatorService.setSensorValue(1, 4, 1000); // M1-S4 -> 1300 Ohm -> 78 °C Pt1000
      emSimulatorService.setSensorValue(1, 5, 1000); // M1-S5 -> 1400 Ohm -> 104 °C Pt1000
      emSimulatorService.setSensorValue(1, 6, 1000); // M1-S6 -> 1500 Ohm -> 131 °C Pt1000

      await $.connect();

      const ti = new $.core.TimestampInterval({
        interval: 1000,

        onInterval(timestamp) {
          const relayInfo = emSimulatorService.getRelayInfo(1, 1);
          if (relayInfo) {
            console.log(`${timestamp.toISOString()}: M1-R1: ${relayInfo.value}`);
          }
        },
      });

      ti.start();
    }),
  ],
});

Running it in the toolbox:

❯ bin/resol-vbus-core-toolbox.ts --config configs/above-config-saved-to-file.ts
2025-04-13T19:53:23.001Z: M1-R1: 0
2025-04-13T19:53:24.003Z: M1-R1: 100
2025-04-13T19:53:25.001Z: M1-R1: 100
2025-04-13T19:53:26.001Z: M1-R1: 100
2025-04-13T19:53:27.000Z: M1-R1: 0
2025-04-13T19:53:28.001Z: M1-R1: 100
2025-04-13T19:53:29.001Z: M1-R1: 100
2025-04-13T19:53:30.001Z: M1-R1: 100
2025-04-13T19:53:31.002Z: M1-R1: 0
...