Program your sensors as a flow

Wire sensors, actuators and logic on a visual canvas, run it on the real board through a driver on your machine, and step through it action by action — with every value on screen.

Get early access and news — take a 2-minute survey
Water alarmDebugging

Packages you wire together

18 packages, ready to install — sensors, motors, displays, the network.

Browse them all
Examples

Real workflows, running

Each one is built from the real packages — the nodes, settings and bindings the studio makes. Watch it step through, drag the nodes around.

Climate controlDebugging

A DHT22 read in a loop, the temperature on an OLED, and a fan at full speed past 30 °C. Pass Context carries the reading past the display to the If.

DHTDisplayIfPWM
What you get

Everything between the idea and the blinking LED

One place to design, run and inspect what your microcontroller does.

A visual studio

Actions are nodes, outputs are wires. Branch with If and Switch (as many cases as you need), loop with Repeat, keep notes on every node.

Triggers

Start, a pin changing, a timer, a web request, an IR code, a leak — each trigger runs its own branch, side by side with the others.

Many boards

A board is a package — its pins, its firmware, what it offers (Wi-Fi, Bluetooth). ESP32 out of the box; move a workflow to another board in its settings.

A step-through debugger

Run the flow one action at a time, or Listen on a trigger until it fires. Read every output, edit configs and values on the fly, then Continue.

Components from npm

Sensors, displays, Wi-Fi, HTTP, IR, servos… each an npm package. Install them from a registry, or publish your own in a few lines of MicroPython.

Bindings and variables

Feed one action's output into another's config — or further down the flow with Pass Context — and keep values in workflow variables across loops.

Yours to host

Run the whole platform on your own machine or server, and move workflows around as portable .hio files.

Triggers

Every trigger runs its own branch

Start joins the Wi-Fi once. Then a request on /led and a timer each start a branch of their own — side by side, each with its own values.

  • Start, a pin, a timer, a web request, an IR code, a leak — each one a node with no input.
  • A branch that fires runs right away, even while another waits in a Delay.
  • Listen on a trigger in the debugger, and step through its branch when it fires.
TriggersDebugging
The debugger

Step through it, value by value

Debug pauses before each action. See what the last one published, where the flow goes next, and go on when you're ready.

  • Every output on screen — a reading, a list, an object as a table.
  • Edit a config or a value mid-session, then Continue.
  • Run a single action with ▶ to try it out on the board.
Button → LEDDebugging
How it works

From a fresh board to a running flow

  1. 1

    Host it and pair a driver

    Start Henglos IO on your machine, then pair the driver on the computer your board is plugged into.

    $ 
  2. 2

    Compose a workflow

    Pick a board, add components from the library, and wire their actions and triggers on the canvas.

  3. 3

    Upload, run and debug

    Compile and upload in one click, run a single action with ▶, or step through the whole flow.

Build your own

A component is a manifest and a script

Describe its actions and triggers in YAML — configs, outputs, an icon, what it needs of the board — write each one in MicroPython, publish it to npm. The studio builds the nodes, the forms and the bindings from the manifest.

manifest.yaml
1kind: component
2name: Water Sensor
3dependences:
4 platform: ^3.0.0
5
6schema:
7 displayName: Water Sensor
8 actions:
9 - displayName: Read
10 icon: droplets
11 script: src/read.py
12 configurations:
13 - displayName: Signal Pin
14 type: pin
15 from: board
16 filterBy: [analog_in]
17 outputSchema:
18 - name: wet
19 type: bool
20
21 triggers:
22 - displayName: Water Trigger
23 icon: siren
24 script: src/water_trigger.py
src/read.py
1from machine import ADC, Pin
2from hio.sdk import HIOAction, action, SUCCESS, FALLBACK
3
4
5@action("water sensor/read")
6class ReadAction(HIOAction):
7
8 async def execute(self, context):
9 pin = context.get("read/signal pin")
10 if pin is None:
11 return FALLBACK
12
13 level = ADC(Pin(pin)).read_u16()
14 context.set("wet", level > 8000)
15 return SUCCESS

Plug in a board. Draw the flow. Watch it run.

Set up Henglos IO on your machine in a few minutes and run your first workflow on an ESP32.

A 2-minute survey — tell us what you build, and get news and early access by email.