# OpenEMS

# New Page



# Getting Started

# ZeroTier Remote Access Guide

This guide explains how to connect to the NFE Raspberry Pi from anywhere in the world using ZeroTier. It covers both SSH access and troubleshooting common issues.

---

## Table of Contents
1. [Prerequisites](#prerequisites)
2. [Network Information](#network-information)
3. [Installing ZeroTier on Your Computer](#installing-zerotier-on-your-computer)
4. [Joining the Network](#joining-the-network)
5. [SSH Access to Raspberry Pi](#ssh-access-to-raspberry-pi)
6. [Troubleshooting](#troubleshooting)
7. [Setting Up ZeroTier on a New Raspberry Pi](#setting-up-zerotier-on-a-new-raspberry-pi)

---

## Prerequisites

Before starting, you need:
- A Mac or Windows laptop
- A ZeroTier account (free at https://my.zerotier.com)
- ZeroTier One installed on your computer
- Network authorization from the network administrator

---

## Network Information

**Network ID:** `2873fd00f2d70904`
**Network Name:** `my-first-network`
**Raspberry Pi ZeroTier IP:** `10.135.127.86`
**Raspberry Pi Username:** `nfetestpi2`

---

## Installing ZeroTier on Your Computer

### Mac:
1. Download ZeroTier One: https://www.zerotier.com/download/
2. Install it normally
3. After installation, the ZeroTier icon will appear in the top-right menu bar

### Windows:
1. Download ZeroTier from https://www.zerotier.com/download/
2. Install and launch it
3. ZeroTier icon will appear in the system tray

---

## Joining the Network

### Method 1: Using the ZeroTier Menu (Mac - Recommended)

1. Click the ZeroTier icon in your menu bar
2. You'll see "My Address:" with your device ID
3. Click on the network ID `2873fd00f2d70904` if it's already listed
4. Or select "Join New Network..." and enter: `2873fd00f2d70904`
5. The status will show "REQUESTING_CONFIGURATION"

### Method 2: Using Command Line

Mac/Linux:
```bash
sudo zerotier-cli join 2873fd00f2d70904
```

Windows (run as Administrator):
```cmd
zerotier-cli join 2873fd00f2d70904
```

### Authorization

After joining, you need to be authorized:

1. Contact the network administrator
2. Provide them with your device's MAC address or Device ID
3. They will authorize your device at https://my.zerotier.com
4. Once authorized, your device will receive an IP address like `10.135.127.xxx`

### Verify Connection

Mac/Linux:
```bash
sudo zerotier-cli listnetworks
```

You should see:
```
200 listnetworks 2873fd00f2d70904 my-first-network ... OK PRIVATE ... 10.135.127.xxx/24
```

The status should show **OK** and you should have an IP address assigned.

---

## SSH Access to Raspberry Pi

Once connected to the ZeroTier network, you can SSH to the Raspberry Pi:

```bash
ssh nfetestpi2@10.135.127.86
```

Enter the password when prompted.

**Note:** If you get a password prompt but it keeps failing, try using the `-v` flag for verbose output:
```bash
ssh -v nfetestpi2@10.135.127.86
```

### Optional: Set Up SSH Keys (Recommended)

To avoid entering passwords every time:

1. Generate SSH key on your computer (if you don't have one):
```bash
ssh-keygen -t ed25519 -C "your-email@example.com"
```

2. Copy your public key:
```bash
cat ~/.ssh/id_ed25519.pub
```

3. Add it to the Pi's authorized keys (via SSH or Raspberry Pi Connect):
```bash
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
# Paste your public key, save and exit

# Set correct permissions
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```

4. Now you can SSH without a password:
```bash
ssh nfetestpi2@10.135.127.86
```

---

## Troubleshooting

### Issue: ZeroTier shows "REQUESTING_CONFIGURATION"

**Cause:** Your device hasn't been authorized on the network yet.

**Solution:**
1. Go to https://my.zerotier.com
2. Log in and navigate to network `2873fd00f2d70904`
3. Click "Member Devices" tab
4. Find your device and check the "Auth" checkbox

### Issue: ZeroTier shows "OFFLINE"

**Cause:** ZeroTier service isn't running properly.

**Solution for Mac:**
```bash
# Restart ZeroTier service
sudo launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist
sudo launchctl load /Library/LaunchDaemons/com.zerotier.one.plist

# Verify it's online
sudo zerotier-cli info
```

You should see:
```
200 info <device-id> 1.16.0 ONLINE
```

**Solution for Windows:**
- Restart the ZeroTier service from Services (services.msc)
- Or restart the ZeroTier One application

### Issue: Can't ping or SSH to Raspberry Pi

**Symptoms:**
```bash
ping 10.135.127.86
# Shows: "No route to host" or "Request timeout"
```

**Solutions:**

1. **Check if ZeroTier is running on both devices:**
```bash
sudo zerotier-cli info
# Should show: ONLINE
```

2. **Verify both devices are on the same network:**
```bash
sudo zerotier-cli listnetworks
# Both should show network 2873fd00f2d70904 with status OK
```

3. **Try changing WiFi networks:**
Sometimes the initial WiFi network blocks ZeroTier's peer-to-peer connections. Try connecting to a different WiFi network or mobile hotspot.

4. **Check for RELAY connection:**
```bash
sudo zerotier-cli peers
```
If the Pi shows as "RELAY" instead of "DIRECT", there's a NAT traversal issue. Try:
- Restarting ZeroTier on both devices
- Leaving and rejoining the network
- Changing WiFi networks

5. **Restart ZeroTier on both devices:**

Mac:
```bash
sudo launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist
sudo launchctl load /Library/LaunchDaemons/com.zerotier.one.plist
```

Raspberry Pi (via Raspberry Pi Connect):
```bash
sudo systemctl restart zerotier-one
```

6. **Leave old networks:**
If you have multiple networks joined, leave unused ones:
```bash
# List networks
sudo zerotier-cli listnetworks

# Leave old network
sudo zerotier-cli leave <old-network-id>
```

### Issue: SSH password keeps failing

**Solutions:**

1. Try verbose SSH to see what's happening:
```bash
ssh -v nfetestpi2@10.135.127.86
```

2. Make sure you're using the correct username (`nfetestpi2`, not `pi`)

3. Set up SSH keys instead (see SSH Keys section above)

---

## Setting Up ZeroTier on a New Raspberry Pi

If you need to set up ZeroTier on a new Raspberry Pi, follow these steps:

### Prerequisites
- Raspberry Pi with Raspberry Pi OS installed
- Internet connection
- Access to the Pi (via Raspberry Pi Connect, monitor/keyboard, or local SSH)

### Installation Steps

1. **Install ZeroTier on the Raspberry Pi:**
```bash
curl -s https://install.zerotier.com | sudo bash
```

2. **Join the network:**
```bash
sudo zerotier-cli join 2873fd00f2d70904
```

3. **Verify the Pi joined:**
```bash
sudo zerotier-cli listnetworks
```

You'll see status as "ACCESS_DENIED" initially.

4. **Authorize the Pi:**
- Go to https://my.zerotier.com
- Log in and navigate to network `2873fd00f2d70904`
- Click "Member Devices" tab
- Find the new Pi device (you can identify it by the MAC address or hostname)
- Check the "Auth" checkbox
- Note the "Managed IP" assigned to the Pi (e.g., `10.135.127.xxx`)

5. **Verify connection:**
```bash
sudo zerotier-cli listnetworks
```

Should now show:
```
200 listnetworks 2873fd00f2d70904 my-first-network ... OK PRIVATE ztxxxxxx 10.135.127.xxx/24
```

6. **Enable SSH (if not already enabled):**
```bash
sudo systemctl enable ssh
sudo systemctl start ssh
```

7. **Make ZeroTier start on boot:**
```bash
sudo systemctl enable zerotier-one
```

8. **Test connection from another device:**
```bash
# From your computer (already on ZeroTier network)
ping <new-pi-ip>
ssh <username>@<new-pi-ip>
```

9. **Update this documentation** with the new Pi's IP address!

---

## Advanced: VNC Access (Remote Desktop)

If you need graphical access to the Raspberry Pi:

1. **Enable VNC on the Pi:**
```bash
sudo raspi-config
# Navigate to: Interface Options → VNC → Enable
```

2. **Install VNC Viewer on your computer:**
https://www.realvnc.com/en/connect/download/viewer/

3. **Connect using the ZeroTier IP:**
- Open VNC Viewer
- Enter: `10.135.127.86`
- Enter Pi username and password
---

## Quick Reference

### Useful Commands

```bash
# Check ZeroTier status
sudo zerotier-cli info

# List joined networks
sudo zerotier-cli listnetworks

# Join a network
sudo zerotier-cli join <network-id>

# Leave a network
sudo zerotier-cli leave <network-id>

# Check peer connections
sudo zerotier-cli peers

# SSH to Raspberry Pi
ssh nfetestpi2@10.135.127.86
```

### Network Details
- **Network ID:** `2873fd00f2d70904`
- **Network Name:** `my-first-network`
- **Pi IP:** `10.135.127.86`
- **Pi Username:** `nfetestpi2`

---

*Last updated: 2026-03-28*

# DDSU666 (Direct chint meter ) + mbpoll Command Reference

**Version**: 1.0  
**Prepared For**: Field &amp; Deployment Teams  
**Platform**: Raspberry Pi / Linux  
**Tool**: mbpoll

1. #### Purpose

This document explains how to communicate with the CHINT DDSU666 Direct Smart Meter using Modbus RTU and the mbpoll tool.

It covers:  
• Reading electrical parameters  
• Setting meter addresses  
• Verifying communication  
• Preparing for OpenEMS integration

#### 2. Hardware &amp; Software Requirements

**Hardware**  
• DDSU666 (Direct Version)  
• RS485 → USB Converter  
• Raspberry Pi / Linux PC  
• Correct RS485 wiring (A(converter)↔24(meter com-port terminal), B(converter)↔25(meter com-port terminal), GND recommended)

**Software**  
Install mbpoll:

> sudo apt update  
> sudo apt install mbpoll

Check serial port:

> ls /dev/ttyUSB\*

Example output:

> /dev/ttyUSB0

#### 3. Communication Parameters (Confirmed)

<table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" id="bkmrk-parameter-value-prot" style="border-collapse: collapse; width: 68.6905%; height: 160.172px;"><tbody><tr style="height: 17.7969px;"><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">**Parameter**

</td><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">**Value**

</td></tr><tr style="height: 17.7969px;"><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">Protocol

</td><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">Modbus RTU

</td></tr><tr style="height: 17.7969px;"><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">Baud Rate

</td><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">9600

</td></tr><tr style="height: 17.7969px;"><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">Data Bits

</td><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">8

</td></tr><tr style="height: 17.7969px;"><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">Parity

</td><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">None

</td></tr><tr style="height: 17.7969px;"><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">Stop Bits

</td><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">2

</td></tr><tr style="height: 17.7969px;"><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">Format

</td><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">8N2

</td></tr><tr style="height: 17.7969px;"><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">Float Order

</td><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">Big Endian

</td></tr><tr style="height: 17.7969px;"><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">Addressing

</td><td style="width: 0%; padding: 0in 5.4pt; height: 17.7969px;" valign="top" width="288">0-Based

</td></tr></tbody></table>

These parameters must always be used.

#### 4. Standard mbpoll Format

All commands follow this format:

> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 -r &lt;register&gt; -c &lt;count&gt; /dev/ttyUSB0 -a &lt;id&gt; -1

Where:  
• &lt;register&gt; = Modbus register  
• &lt;count&gt; = Number of values  
• &lt;id&gt; = Meter address (NO.)

#### 5. Electrical Parameters

**Summary:**

> Voltage: 0x2000  
> Current: 0x2002  
> Active Power: 0x2004  
> Power Factor: 0x200A  
> Frequency: 0x200E  
> Energy: 0x4000

##### 5.1 Voltage (V) — Register 0x2000

> **Meter ID = 1**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x2000 -c 1 /dev/ttyUSB0 -a 1 -1  
> **Meter ID = 2**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x2000 -c 1 /dev/ttyUSB0 -a 2 -1

#####   
5.2 Current (A) — Register 0x2002

> **Meter ID = 1**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x2002 -c 1 /dev/ttyUSB0 -a 1 -1  
> **Meter ID = 2**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x2002 -c 1 /dev/ttyUSB0 -a 2 -1

#####   
5.3 Active Power — Register 0x2004

> **Meter ID = 1**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x2004 -c 1 /dev/ttyUSB0 -a 1 -1
> 
> **Meter ID = 2**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x2004 -c 1 /dev/ttyUSB0 -a 2 -1

#####   
5.4 Power Factor — Register 0x200A

> **Meter ID = 1**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x200A -c 1 /dev/ttyUSB0 -a 1 -1  
> **Meter ID = 2**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x200A -c 1 /dev/ttyUSB0 -a 2 -1

#####   
5.5 Frequency (Hz) — Register 0x200E

> **Meter ID = 1**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x200E -c 1 /dev/ttyUSB0 -a 1 -1  
> **Meter ID = 2**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x200E -c 1 /dev/ttyUSB0 -a 2 -1

#####   
5.6 Energy (kWh) — Register 0x4000

> **Meter ID = 1**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x4000 -c 1 /dev/ttyUSB0 -a 1 -1  
> **Meter ID = 2**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x4000 -c 1 /dev/ttyUSB0 -a 2 -1

#### 6. Reading Multiple Values

  
Use **-c** option to read multiple registers.

**Example ( Voltage + Current Together)**

> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x2000 -c 2 /dev/ttyUSB0 -a 1 -1

#### 7. Meter Address

> **Register: 0x0006**
> 
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:int16 -0 \\  
> -r 0x0006 -c 1 /dev/ttyUSB0 -a 2 -1
> 
> **Example Output:**  
> \[6\]: 2

#### 8. Changing Address

- Only one meter connected.
- Power cycle after change.

> **Change Address (2 → 1)**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:int16 -0 \\  
> -r 0x0006 /dev/ttyUSB0 -a 2 -W -- 1  
> **Power Cycle**  
> Turn OFF → ON the meter.  
> **Verify**  
> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:int16 -0 \\  
> -r 0x0006 -c 1 /dev/ttyUSB0 -a 1 -1

#### 9. Health Check

  
Voltage should be 220–240V.

> mbpoll -m rtu -b 9600 -P none -s 2 -t 4:float -B -0 \\  
> -r 0x2000 -c 1 /dev/ttyUSB0 -a 1 -1

#### 10. Common Issues

  
**Timeout Errors**  
• Duplicate IDs  
• Wrong wiring  
• Wrong stop bits  
• Multiple meters during setup

  
**Incorrect Float Values**  
Use -B option.

  
**Current / Power = 0**

Normal when:  
• No load  
• Bench testing

#### 11. Deployment Workflow

For large installations:  
• Connect one meter  
• Convert to Modbus  
• Set address  
• Test voltage  
• Install  
• Repeat  
• Never deploy duplicate addresses.

> Connect → Configure → Test → Install

#### 12. System Status

  
✔ Modbus Enabled  
✔ 9600 8N2 Confirmed  
✔ Big-Endian Floats  
✔ Multi-meter Bus Working  
✔ Ready for OpenEMS

# Running OpenEMS Edge on a Raspberry PI

This guide explains how to:

1. Install and run **OpenEMS Edge on a Raspberry Pi**
2. Configure WebSocket + simulation
3. Run **OpenEMS UI on a macOS machine (not on the Pi)**
4. Connect the UI to the Edge over the internet

The structure is intentionally split into two clear parts:

- **PART A — Raspberry Pi (Edge)**
- **PART B — macOS Machine (OpenEMS UI)**

---

# ============================

# PART A — Raspberry Pi (Edge)

# ============================

## 1. Raspberry Pi OS Setup (Headless)

Use Raspberry Pi Imager:

- Device: Raspberry Pi 4
- OS: Raspberry Pi OS Lite (64‑bit)
- Configure:
    
    
    - Hostname
    - Username &amp; password
    - Enable SSH
    - Configure Wi‑Fi
    - Enable Raspberry Pi Connect

Boot the Pi and connect via:

- SSH
- OR Raspberry Pi Connect

---

## 2. Install Java 21 (Temurin ARM64)

On the Pi:

```bash
sudo apt update
sudo apt install -y wget apt-transport-https gpg

wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public \
 | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/adoptium.gpg > /dev/null

echo "deb https://packages.adoptium.net/artifactory/deb \
$(awk -F= '/^VERSION_CODENAME/{print $2}' /etc/os-release) main" \
 | sudo tee /etc/apt/sources.list.d/adoptium.list

sudo apt update
sudo apt install -y temurin-21-jdk

```

Verify:

```bash
java -version

```

---

## 3. Install OpenEMS Edge

```bash
mkdir -p ~/downloads
cd ~/downloads
wget https://github.com/OpenEMS/openems/releases/download/2025.11.0/openems-edge.jar
sudo chmod +x openems-edge.jar

sudo mkdir -p /usr/lib/openems
sudo mv openems-edge.jar /usr/lib/openems/
sudo mkdir -p /etc/openems.d

```

---

## 4. Configure systemd Service

Create:

```bash
sudo nano /etc/systemd/system/openems.service

```

Paste:

```ini
[Unit]
Description=OpenEMS Edge
After=network.target

[Service]
User=root
Group=root
Type=notify
WorkingDirectory=/usr/lib/openems
ExecStart=/usr/bin/java -Dfelix.cm.dir=/etc/openems.d/ \
  -jar /usr/lib/openems/openems-edge.jar
SuccessExitStatus=143
Restart=always
RestartSec=10
WatchdogSec=60

[Install]
WantedBy=multi-user.target

```

Enable &amp; start:

```bash
sudo systemctl daemon-reload
sudo systemctl enable openems
sudo systemctl start openems

```

Check:

```bash
systemctl status openems

```

---

## 5. Access OpenEMS Config Manager

On the Pi, open:

```
http://localhost:8080/system/console/configMgr

```

---

## 6. Add Required Components

In Config Manager:

1. Add a **Scheduler** (any default scheduler)
2. Add **Controller.Api.Websocket**
    
    
    - Port: 8085
    - Enabled: true

Restart Edge:

```bash
sudo systemctl restart openems

```

Verify WebSocket is listening:

```bash
sudo ss -lntp | grep 8085

```

You should see Java listening on port 8085.

---

## 7. (Optional) Add Simulation Components

In Config Manager, add:

- Simulator ESS
- Simulator Grid Meter
- Simulator PV

Save and restart OpenEMS.

---

# =====================================

# PART B — macOS Machine (OpenEMS UI)

# =====================================

## 1. Install Docker Desktop

```bash
brew install --cask docker
open -a Docker

```

Wait until Docker reports "Docker is running".

Verify:

```bash
docker version

```

You must see both Client and Server.

---

## 2. Clone OpenEMS Source

```bash
git clone -b 2025.11.0 https://github.com/OpenEMS/openems
cd openems

```

---

## 3. Build OpenEMS UI Image

```bash
docker build . \
  -t openems_ui \
  -f tools/docker/ui/Dockerfile.edge

```

---

## 4. Run OpenEMS UI

Replace YOUR\_PI\_IP with:

- Public IP
- OR VPN IP
- OR Public DNS

Example:

```bash
docker container run \
  -e WEBSOCKET_HOST=YOUR_PI_IP \
  -p 80:80 \
  -p 443:443 \
  --restart unless-stopped \
  --name openems_ui_container \
  openems_ui

```

---

## 5. Open the UI

On your Mac:

```
http://localhost/login

```

Default login:

- Username: admin
- Password: admin

If UI shows "disconnected":

- Confirm port 8085 is listening on the Pi
- Confirm WebSocket controller exists
- Confirm WEBSOCKET\_HOST is correct

---

# Why UI Runs on macOS and Edge Runs on Pi

- Edge interacts with hardware and benefits from native systemd management
- UI behaves like a stateless web application and is ideal for containerization
- Separating them improves stability and flexibility

---

# Troubleshooting

- UI loads but no connection → check port 8085
- Nothing listening on 8085 → WebSocket not configured
- Docker errors on Mac → ensure Docker Desktop is running

---

# Security Notes

- Prefer VPN/tunnel (Tailscale/WireGuard) over port forwarding
- Use SSH key-based authentication
- Do not expose ConfigMgr (8080) publicly

---

You now have:

- OpenEMS Edge running on Raspberry Pi
- WebSocket enabled
- Optional simulation components
- OpenEMS UI running on macOS
- UI connected over internet

<div drawio-diagram="79"><img src="https://bookstack.nearlyfreeenergy.com/uploads/images/drawio/2026-02/drawing-4-1770875762.png" alt=""/></div>

# DTSU666 3‑Phase + mbpoll Command Reference

---

# 🔌 Standard Communication Settings (DTSU666)

Most DTSU666 meters use:

<div class="relative w-full my-4" id="bkmrk-protocol-%3A-modbus-rt"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-protocol-%3A-modbus-rt-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">Protocol : Modbus RTU  
Baud Rate : 9600  
Data Bits : 8  
Parity : None  
Stop Bits : 2  
Mode : Big‑endian  
Table : Input Registers (FC04)</div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Base communication block used in all commands:

<div class="relative w-full my-4" id="bkmrk--m-rtu--b-9600--p-no"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk--m-rtu--b-9600--p-no-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼu">-m</span> rtu <span class="ͼu">-b</span> <span class="ͼq">9600</span> <span class="ͼu">-P</span> none <span class="ͼu">-s</span> <span class="ͼq">2</span></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

# 🧠 Critical Flags (Important)

<div class="TyagGW_tableContainer" id="bkmrk-flag-meaning-require"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="979" data-start="620"><thead data-end="650" data-start="620"><tr data-end="650" data-start="620"><th class="" data-col-size="sm" data-end="627" data-start="620">Flag</th><th class="" data-col-size="sm" data-end="637" data-start="627">Meaning</th><th class="" data-col-size="sm" data-end="650" data-start="637">Required?</th></tr></thead><tbody data-end="979" data-start="684"><tr data-end="734" data-start="684"><td data-col-size="sm" data-end="693" data-start="684">`-t 3`</td><td data-col-size="sm" data-end="725" data-start="693">Input Registers (Function 04)</td><td data-col-size="sm" data-end="734" data-start="725">✅ Yes</td></tr><tr data-end="779" data-start="735"><td data-col-size="sm" data-end="746" data-start="735">`:float`</td><td data-col-size="sm" data-end="770" data-start="746">32‑bit floating point</td><td data-col-size="sm" data-end="779" data-start="770">✅ Yes</td></tr><tr data-end="820" data-start="780"><td data-col-size="sm" data-end="787" data-start="780">`-B`</td><td data-col-size="sm" data-end="811" data-start="787">Big‑endian word order</td><td data-col-size="sm" data-end="820" data-start="811">✅ Yes</td></tr><tr data-end="861" data-start="821"><td data-col-size="sm" data-end="828" data-start="821">`-0`</td><td data-col-size="sm" data-end="852" data-start="828">Zero‑based addressing</td><td data-col-size="sm" data-end="861" data-start="852">✅ Yes</td></tr><tr data-end="899" data-start="862"><td data-col-size="sm" data-end="874" data-start="862">`-a <id>`</td><td data-col-size="sm" data-end="890" data-start="874">Slave address</td><td data-col-size="sm" data-end="899" data-start="890">✅ Yes</td></tr><tr data-end="931" data-start="900"><td data-col-size="sm" data-end="907" data-start="900">`-1`</td><td data-col-size="sm" data-end="919" data-start="907">Poll once</td><td data-col-size="sm" data-end="931" data-start="919">Optional</td></tr><tr data-end="979" data-start="932"><td data-col-size="sm" data-end="944" data-start="932">`-l 5000`</td><td data-col-size="sm" data-end="967" data-start="944">Poll every 5 seconds</td><td data-col-size="sm" data-end="979" data-start="967">Optional</td></tr></tbody></table>

</div></div>---

---

## 🔹 Phase‑to‑Neutral Voltages (L1‑N, L2‑N, L3‑N)

Register: `0x2006`

<div class="relative w-full my-4" id="bkmrk-mbpoll--m-rtu--b-960"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-mbpoll--m-rtu--b-960-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">mbpoll <span class="ͼu">-m</span> rtu <span class="ͼu">-b</span> <span class="ͼq">9600</span> <span class="ͼu">-P</span> none <span class="ͼu">-s</span> <span class="ͼq">2</span> \  
<span class="ͼu">-t</span> <span class="ͼq">3</span>:float <span class="ͼu">-B</span> <span class="ͼu">-0</span> \  
<span class="ͼu">-r</span> 0x2006 <span class="ͼu">-c</span> <span class="ͼq">3</span> \  
/dev/ttyUSB0 <span class="ͼu">-a</span> <span class="ͼq">1</span> <span class="ͼu">-1</span></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

## 🔹 Line‑to‑Line Voltages (L1‑L2, L2‑L3, L3‑L1)

Register: `0x2000`

<div class="relative w-full my-4" id="bkmrk-mbpoll--m-rtu--b-960-2"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-mbpoll--m-rtu--b-960-3"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">mbpoll <span class="ͼu">-m</span> rtu <span class="ͼu">-b</span> <span class="ͼq">9600</span> <span class="ͼu">-P</span> none <span class="ͼu">-s</span> <span class="ͼq">2</span> \  
<span class="ͼu">-t</span> <span class="ͼq">3</span>:float <span class="ͼu">-B</span> <span class="ͼu">-0</span> \  
<span class="ͼu">-r</span> 0x2000 <span class="ͼu">-c</span> <span class="ͼq">3</span> \  
/dev/ttyUSB0 <span class="ͼu">-a</span> <span class="ͼq">1</span> <span class="ͼu">-1</span></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

## 🔹 Phase Currents (L1, L2, L3)

Register: `0x200C`

<div class="relative w-full my-4" id="bkmrk-mbpoll--m-rtu--b-960-4"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-mbpoll--m-rtu--b-960-5"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">mbpoll <span class="ͼu">-m</span> rtu <span class="ͼu">-b</span> <span class="ͼq">9600</span> <span class="ͼu">-P</span> none <span class="ͼu">-s</span> <span class="ͼq">2</span> \  
<span class="ͼu">-t</span> <span class="ͼq">3</span>:float <span class="ͼu">-B</span> <span class="ͼu">-0</span> \  
<span class="ͼu">-r</span> 0x200C <span class="ͼu">-c</span> <span class="ͼq">3</span> \  
/dev/ttyUSB0 <span class="ͼu">-a</span> <span class="ͼq">1</span> <span class="ͼu">-1</span></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

## 🔹 Total Active Power (kW)

Register: `0x2012`

<div class="relative w-full my-4" id="bkmrk-mbpoll--m-rtu--b-960-6"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-mbpoll--m-rtu--b-960-7"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">mbpoll <span class="ͼu">-m</span> rtu <span class="ͼu">-b</span> <span class="ͼq">9600</span> <span class="ͼu">-P</span> none <span class="ͼu">-s</span> <span class="ͼq">2</span> \  
<span class="ͼu">-t</span> <span class="ͼq">3</span>:float <span class="ͼu">-B</span> <span class="ͼu">-0</span> \  
<span class="ͼu">-r</span> 0x2012 <span class="ͼu">-c</span> <span class="ͼq">1</span> \  
/dev/ttyUSB0 <span class="ͼu">-a</span> <span class="ͼq">1</span> <span class="ͼu">-1</span></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

## 🔹 Frequency (Hz)

Register: `0x2044`

<div class="relative w-full my-4" id="bkmrk-mbpoll--m-rtu--b-960-8"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-mbpoll--m-rtu--b-960-9"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">mbpoll <span class="ͼu">-m</span> rtu <span class="ͼu">-b</span> <span class="ͼq">9600</span> <span class="ͼu">-P</span> none <span class="ͼu">-s</span> <span class="ͼq">2</span> \  
<span class="ͼu">-t</span> <span class="ͼq">3</span>:float <span class="ͼu">-B</span> <span class="ͼu">-0</span> \  
<span class="ͼu">-r</span> 0x2044 <span class="ͼu">-c</span> <span class="ͼq">1</span> \  
/dev/ttyUSB0 <span class="ͼu">-a</span> <span class="ͼq">1</span> <span class="ͼu">-1</span></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

## 🔹 Total Active Energy (kWh)

Register: `0x4000`

<div class="relative w-full my-4" id="bkmrk-mbpoll--m-rtu--b-960-10"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-mbpoll--m-rtu--b-960-11"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">mbpoll <span class="ͼu">-m</span> rtu <span class="ͼu">-b</span> <span class="ͼq">9600</span> <span class="ͼu">-P</span> none <span class="ͼu">-s</span> <span class="ͼq">2</span> \  
<span class="ͼu">-t</span> <span class="ͼq">3</span>:float <span class="ͼu">-B</span> <span class="ͼu">-0</span> \  
<span class="ͼu">-r</span> 0x4000 <span class="ͼu">-c</span> <span class="ͼq">1</span> \  
/dev/ttyUSB0 <span class="ͼu">-a</span> <span class="ͼq">1</span> <span class="ͼu">-1</span></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

# 🔁 Continuous Polling Example (Every 5 Seconds)

<div class="relative w-full my-4" id="bkmrk-mbpoll--m-rtu--b-960-12"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-mbpoll--m-rtu--b-960-13"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">mbpoll <span class="ͼu">-m</span> rtu <span class="ͼu">-b</span> <span class="ͼq">9600</span> <span class="ͼu">-P</span> none <span class="ͼu">-s</span> <span class="ͼq">2</span> \  
<span class="ͼu">-t</span> <span class="ͼq">3</span>:float <span class="ͼu">-B</span> <span class="ͼu">-0</span> \  
<span class="ͼu">-r</span> 0x2006 <span class="ͼu">-c</span> <span class="ͼq">1</span> \  
<span class="ͼu">-l</span> <span class="ͼq">5000</span> \  
/dev/ttyUSB0 <span class="ͼu">-a</span> <span class="ͼq">1</span></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

# 🔢 Change Slave Address (Only One Meter Connected)

⚠ Use Holding Registers (Function 03) for configuration.

Register: `0x002E`

<div class="relative w-full my-4" id="bkmrk-mbpoll--m-rtu--b-960-14"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-mbpoll--m-rtu--b-960-15"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">mbpoll <span class="ͼu">-m</span> rtu <span class="ͼu">-b</span> <span class="ͼq">9600</span> <span class="ͼu">-P</span> none <span class="ͼu">-s</span> <span class="ͼq">2</span> \  
<span class="ͼu">-t</span> <span class="ͼq">4</span>:int16 <span class="ͼu">-0</span> \  
<span class="ͼu">-r</span> 0x002E \  
/dev/ttyUSB0 <span class="ͼu">-a</span> <span class="ͼq">1</span> <span class="ͼu">-W</span> <span class="ͼu">--</span> <span class="ͼq">5</span></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Changes slave ID from 1 → 5.

---

# 🧪 Quick Communication Test

Fastest health check:

<div class="relative w-full my-4" id="bkmrk-mbpoll--m-rtu--b-960-16"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border corner-superellipse/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl"><div class="corner-superellipse/1.1 rounded-3xl bg-token-bg-elevated-secondary"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-mbpoll--m-rtu--b-960-17"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">mbpoll <span class="ͼu">-m</span> rtu <span class="ͼu">-b</span> <span class="ͼq">9600</span> <span class="ͼu">-P</span> none <span class="ͼu">-s</span> <span class="ͼq">2</span> \  
<span class="ͼu">-t</span> <span class="ͼq">3</span>:float <span class="ͼu">-B</span> <span class="ͼu">-0</span> \  
<span class="ͼu">-r</span> 0x2006 <span class="ͼu">-c</span> <span class="ͼq">1</span> \  
/dev/ttyUSB0 <span class="ͼu">-a</span> <span class="ͼq">1</span> <span class="ͼu">-1</span></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>If you see ~230V → communication confirmed.

---

# 🚨 Troubleshooting Quick Guide

<div class="TyagGW_tableContainer" id="bkmrk-symptom-likely-cause"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="2994" data-start="2743"><thead data-end="2769" data-start="2743"><tr data-end="2769" data-start="2743"><th class="" data-col-size="sm" data-end="2753" data-start="2743">Symptom</th><th class="" data-col-size="sm" data-end="2769" data-start="2753">Likely Cause</th></tr></thead><tbody data-end="2994" data-start="2798"><tr data-end="2835" data-start="2798"><td data-col-size="sm" data-end="2808" data-start="2798">Timeout</td><td data-col-size="sm" data-end="2835" data-start="2808">Wrong address or wiring</td></tr><tr data-end="2876" data-start="2836"><td data-col-size="sm" data-end="2850" data-start="2836">4200+ volts</td><td data-col-size="sm" data-end="2876" data-start="2850">Reading wrong register</td></tr><tr data-end="2911" data-start="2877"><td data-col-size="sm" data-end="2892" data-start="2877">-8192 values</td><td data-col-size="sm" data-end="2911" data-start="2892">Wrong data type</td></tr><tr data-end="2947" data-start="2912"><td data-col-size="sm" data-end="2931" data-start="2912">Nonsense numbers</td><td data-col-size="sm" data-end="2947" data-start="2931">Missing `-B`</td></tr><tr data-end="2994" data-start="2948"><td data-col-size="sm" data-end="2968" data-start="2948">No `/dev/ttyUSB0`</td><td data-col-size="sm" data-end="2994" data-start="2968">USB‑RS485 not detected</td></tr></tbody></table>

</div></div>