---
orphan: true
myst:
html_meta:
description: "Using instro with some more detail"
---
# Using instro
{.lead}
Using instro with some more detail
This page discusses details about using `instro`.
## Instruments
### Two ways to get data
You can acquire measurements from an instrument in two ways. The difference is who triggers the reads and how often.
| | Background acquisition | On-demand acquisition |
| ------------ | ---------------------- | --------------------- |
| **How** | Call `start()`. A background daemon reads from the instrument at a fixed, configurable rate. Pull the latest N values with `get_channel()` when you need them. | Call read methods (`read_analog()`, `get_voltage()`, …) only when you want a measurement. |
| **Best for** | Apps where data should always be available and publishing. | Apps that need measurements only at specific times; lower system and bus load. DMMs are a good example. |
## open()/close() or `with` block
Instruments can also be open/closed automatically using a `with` block.
::::{tab-set}
:::{tab-item} Explicit open() / close()
Best when the instrument's lifetime spans many functions, or when you want to interleave setup and teardown across event handlers, fixtures, or REPL sessions.
```python
from instro.psu import InstroPSU
from instro.psu.drivers import SimulatedPSU
psu = InstroPSU(
name="bench_psu",
driver=SimulatedPSU("TCPIP0::127.0.0.1::5025::SOCKET"),
num_channels=2,
)
psu.open()
psu.set_voltage(5.0, channel=1)
psu.set_current_limit(1.0, channel=1)
psu.output_enable(True, channel=1)
voltage = psu.get_voltage(channel=1)
print(f"V: {voltage.latest:.3f} V")
psu.output_enable(False, channel=1)
psu.close()
```
:::
:::{tab-item} with block
Best for scripts and tests where the instrument is used inside a single scope. `close()` runs automatically on the way out, even if an exception is raised.
```python
from instro.psu import InstroPSU
from instro.psu.drivers import SimulatedPSU
with InstroPSU(
name="bench_psu",
driver=SimulatedPSU("TCPIP0::127.0.0.1::5025::SOCKET"),
num_channels=2,
) as psu:
psu.set_voltage(5.0, channel=1)
psu.set_current_limit(1.0, channel=1)
psu.output_enable(True, channel=1)
voltage = psu.get_voltage(channel=1)
print(f"V: {voltage.latest:.3f} V")
```
:::
::::