# EHP Net-Scale
Polls **EHP crane scales** connected through a **Net-Scale V13** receiver unit. The
box bridges up to 16 radio scales to Ethernet and answers short ASCII records over
**UDP** (factory default) or **TCP**. Every poll cycle sends one measurement request
per addressed scale; record checksums are verified.
| | |
|---|---|
| Connection string | `netscale://HOST[:PORT]` (default port 187, address the box — not the scale) |
| Reads | ✔ (poll) |
| Writes | ✔ (control/registration commands) |
| Subscriptions | — |
| Browsing | ✔ (static value list) |
:::info
Per the manual, the **first request per scale is always answered with error `E4`**
while the scale joins the polling pool of the Net-Scale — the first poll cycle after
startup delivers no values for that scale; from the second cycle on, data flows. A
scale drops out of the pool when switched off or out of radio range. Alternatively
scales can be pinned via the `ACT` entries of the `NSC.INI` on the SD card
(firmware ≥ 2.12).
:::
## Device options
| Key | Type | Default | Meaning |
|---|---|---|---|
| `protocol` | string | `udp` | `udp` (factory default) or `tcp` (DIP switch 4 = 1). |
| `decimals` | int | `0` | NKOM setting of the Net-Scale: raw 5-digit weights are divided by 10^decimals. |
| `timeout` | int | `3000` | Response timeout in ms per attempt. |
| `retries` | int | `2` | Request attempts (UDP packets can get lost). |
| `verifyChecksum` | boolean | `true` | Verify the block check character of measurement records. |
## Address format
```
[WAAGE::]FELD
```
`WAAGE` is the scale number 1–16 (omitted = currently selected scale); items sharing
a scale share one request per cycle.
- `gewicht` (Number, scaled by `decimals`), `tara` (Number), `dimension` (String,
e.g. `kg`)
- Booleans from the status/error bytes: `stillstand`, `tariert`, `fixtara`,
`ueberlast`, `akkuleer`, `test`
- `messbereich` (Number, 1/2)
## Example configuration
```json
{
"devices": [
{
"objectId": "crane1",
"name": "Crane scale hall 1",
"connectionString": "netscale://10.0.0.60:187",
"interval": 2000,
"enabled": true,
"options": { "protocol": "udp", "decimals": 1 },
"extraOptions": { "host": "broker:1883", "clientId": "openconnect" }
}
],
"items": [
{
"objectId": "weight",
"DeviceID": { "objectId": "crane1" },
"address": "2::gewicht",
"label": "Weight scale 2",
"type": "Number",
"unit": "kg",
"source": { "tag": "hall1/crane" },
"enabled": true,
"onChange": true,
"extraOptions": {}
}
]
}
```
## Writes
The write topic is the record to send, the payload an optional value: `01` zero,
`02`/`03` tare set/clear, `04` fixed tare (value in the payload), `10` register
weight at standstill (returns the alibi record), `12` fetch hand registration.
Commands are chainable per protocol, e.g. `0509;10` (select scale 9, then register).
```bash
# HTTP — set a fixed tare of 100
curl -X POST "http://openconnect:8080/write/crane1/04" \
-H "Authorization: Bearer $TOKEN" -d '+00100'
# MQTT (capability mqttwrite)
mosquitto_pub -t 'write/crane1/04' -m '+00100'
```
See the [write API](../write-api.md) for authentication and the MQTT setup.