Skip to content

Bloc8 power outputs (function 1) ​

8-channel power output module with current sensing.

  • Output state enum (outN strings): power-off, power-on, short-circuit, not-connected.

Published ​

device/1/<i>/life ​

metadata adds counter; expireAfterSec: 30.

data fieldTypeUnitDescription
VirtualSig0..VirtualSig3bool—Virtual signals 0-3
out0..out7string—Output state (enum)
out0Code..out7Codeint—Raw output state 0-3
currentTotalnumber (1 dec)ATotal output current
json
{
  "data": {
    "VirtualSig0": false,
    "VirtualSig1": false,
    "VirtualSig2": false,
    "VirtualSig3": false,
    "out0": "power-on",
    "out0Code": 1,
    "out1": "power-off",
    "out1Code": 0,
    "out2": "power-off",
    "out2Code": 0,
    "out3": "power-off",
    "out3Code": 0,
    "out4": "power-off",
    "out4Code": 0,
    "out5": "power-off",
    "out5Code": 0,
    "out6": "power-off",
    "out6Code": 0,
    "out7": "power-on",
    "out7Code": 1,
    "currentTotal": 12.3
  },
  "metadata": {
    "rxdate": "2026-06-17T14:30:45.123Z",
    "rxTimestamp": 1781793045,
    "expireAfterSec": 30,
    "counter": 7
  }
}

device/1/<i>/io ​

expireAfterSec: 30.

data fieldTypeUnitDescription
digitalInput0..digitalInput5bool—Digital inputs 0-5
analogInput0..analogInput2number (3 dec)VAnalog inputs 0-2
json
{
  "data": {
    "digitalInput0": true,
    "digitalInput1": false,
    "digitalInput2": false,
    "digitalInput3": false,
    "digitalInput4": false,
    "digitalInput5": true,
    "analogInput0": 3.301,
    "analogInput1": 0.012,
    "analogInput2": 1.65
  },
  "metadata": {
    "rxdate": "2026-06-17T14:30:45.123Z",
    "rxTimestamp": 1781793045,
    "expireAfterSec": 30
  }
}

device/1/<i>/current1 and device/1/<i>/current2 ​

expireAfterSec: 30. Per-channel current, signed.

Topicdata fieldsTypeUnit
current1current0..current3number (1 dec)A
current2current4..current7number (1 dec)A
json
{
  "data": {
    "current0": 2.5,
    "current1": -0.3,
    "current2": 0.0,
    "current3": 5.1
  },
  "metadata": {
    "rxdate": "2026-06-17T14:30:45.123Z",
    "rxTimestamp": 1781793045,
    "expireAfterSec": 30
  }
}

device/1/<i>/voltage ​

expireAfterSec: 30.

data fieldTypeUnitDescription
voltagenumber (1 dec)VBattery voltage
json
{
  "data": {
    "voltage": 13.2
  },
  "metadata": {
    "rxdate": "2026-06-17T14:30:45.123Z",
    "rxTimestamp": 1781793045,
    "expireAfterSec": 30
  }
}

device/1/<i>/level ​

CAN frame id 10, DLC 8. No expireAfterSec: the frame is sent only on change, so its age says nothing about whether it is still true.

data fieldTypeUnitDescription
level0..level7int 0-100, or 255%Actual level of each output: the live PWM level, mid-ramp included. A non-dimmable output reads 0 or 100. 255 means not available (short circuit, open load or parked output)

The Bloc8 sends it at boot, then on change at most once every 500 ms (a change inside the window goes out when the window ends, so the end of a ramp is always sent), and when asked with an RTR. There is no periodic send, and muxen-boat never polls, so a consumer that starts after the Bloc8 asks for it through the generic rtr topic:

bash
mosquitto_pub -h 127.0.0.1 -t 'device/1/0/rtr/10' -n

A Bloc8 firmware older than the frame never sends it and ignores the RTR, so nothing is published for it.

The topic is retained, like every published topic, and the retained copy can be stale: with no expireAfterSec, nothing marks it as old when the Bloc8 goes silent or is removed, and a new subscriber still gets its last levels. Treat the retained copy as a hint only, and publish device/1/<i>/rtr/10 at startup and after every broker reconnection to get a fresh one. No answer after the RTR means the Bloc8 is offline or its firmware predates the frame.

json
{
  "data": {
    "level0": 100,
    "level1": 0,
    "level2": 40,
    "level3": 0,
    "level4": 100,
    "level5": 0,
    "level6": 255,
    "level7": 0
  },
  "metadata": {
    "rxdate": "2026-06-17T14:30:45.123Z",
    "rxTimestamp": 1781793045
  }
}
bash
mosquitto_sub -h 127.0.0.1 -t 'device/1/+/#' -v

Command — device/1/<i>/command ​

Regex ^device/1/([[:digit:]]+)/command$.

Fields are either per-channel — they act on the one output named by channel — or product-global, applying to the bloc8 as a whole.

FieldTypeScopeDescription
channelint 0-7—Target output. Required by every per-channel field
requestOnboolper channelTurn the channel on
requestOffboolper channelTurn the channel off
dimmingint 0-100per channelDimming level in %, clamped into range
requestOnPublishCurrentboolglobalStart periodic current publishing
requestOffPublishCurrentboolglobalStop periodic current publishing
publishPeriodintglobalPublish period in ms

Rules: if requestOn and requestOff both true → requestOn cleared. If both publish flags true → requestOnPublishCurrent cleared. requestOnPublishCurrent with no/zero publishPeriod defaults to 10 ms.

A payload carrying any per-channel field is dropped unless channel is present and in 0-7 — including a dimming on its own. A payload with only global fields needs no channel, but one that carries a channel that is not a JSON integer 0-7 is dropped all the same.

A payload that asks for nothing is dropped rather than put on the bus: the frame carries either an output command (requestOn / requestOff / dimming) or a publish-current command (requestOnPublishCurrent / requestOffPublishCurrent), so {} — and a publishPeriod with neither publish flag — sends nothing.

bash
# per channel — channel is required
mosquitto_pub -h 127.0.0.1 -t 'device/1/0/command' -m '{"channel":5,"requestOn":true}'
mosquitto_pub -h 127.0.0.1 -t 'device/1/0/command' -m '{"channel":5,"requestOff":true}'
mosquitto_pub -h 127.0.0.1 -t 'device/1/0/command' -m '{"channel":5,"dimming":40}'

# product-global — no channel
mosquitto_pub -h 127.0.0.1 -t 'device/1/0/command' -m '{"requestOnPublishCurrent":true,"publishPeriod":50}'

Integration of multiplexed solutions
MUXEN and the MUXEN logo are trademarks of MUXEN SAS.