TapHome

Orno OR-WE-515

Modbus RTU
Submitted by
Last updated: 03. 2026
Orno OR-WE-515

The Orno OR-WE-515 is a DIN-rail mounted single-phase multitariff energy meter that communicates via Modbus RTU over RS-485. At only 18 mm wide (1 DIN module), it measures active energy, reactive energy, voltage, current, power, power factor, and frequency. The key differentiator from the simpler OR-WE-514 is support for 4 independent tariffs (sharp, peak, valley, flat) with configurable time-of-use scheduling and a built-in lithium battery for the real-time clock.

The TapHome template provides 6 devices: a total energy meter with instantaneous power demand, 4 individual tariff energy counters (T1–T4), and an electric current sensor. Module-level service actions allow configuring tariff schedules, setting the RTC clock, changing the Modbus slave address, adjusting the baud rate, and controlling the LCD cycle time – all remotely via TapHome.

Hardware connection

RS-485 wiring

The OR-WE-515 has a 3-terminal RS-485 interface on the right side of the meter. Connect using a daisy-chain topology:

  • Terminal 23 (A) to A+/D+ on TapHome RS-485
  • Terminal 24 (G) to GND on TapHome RS-485
  • Terminal 25 (B) to B-/D- on TapHome RS-485

The remaining terminals handle the power line: Terminal 1 is L-IN (line input), Terminal 3 is L-OUT (line output), and the two N terminals are for the neutral conductor.

If the RS-485 converter does not have a G (ground) terminal, the ground connection on terminal 24 can be omitted. However, for reliable communication on longer cable runs, connecting GND is recommended.

Always disconnect the power supply before installation. The meter handles up to 100 A through its terminals. Ensure proper wire sizing (up to 25 mm2 screw terminals) and seal the terminal cover after wiring.

Configuration

Communication parameters

The default Modbus settings match the TapHome template:

ParameterDefaultOptions
Baud rate96001200, 2400, 4800, 9600
Data bits8Fixed
ParityEvenFixed (8E1)
Stop bits1Fixed
Slave ID11–255

The register description PDF header states “N81” (no parity), but the installation manual and community implementations (Arduino library, AGG Software) consistently confirm 8E1 (Even parity) as the correct setting. Use Even parity in TapHome.

Slave ID

When connecting multiple meters on the same RS-485 bus, each meter must have a unique Slave ID. The default Slave ID is 1, configurable in the range 1–255. The TapHome template includes a Set Slave ID service action that writes to holding register H:272, allowing remote address changes without physical access to the meter.

Baud rate

The baud rate can be changed remotely via the Set Baud Rate service action. Available options are 1200, 2400, 4800, and 9600 bps. The value is stored in holding register H:273 as an encoded integer (1=1200, 2=2400, 3=4800, 4=9600). After changing the baud rate, update the TapHome module connection settings to match.

Device capabilities

The template creates 6 devices organized into two groups: energy metering and current measurement. All registers use Modbus function code 03H (holding registers).

Energy metering

Five ModbusElectricityMeter devices track energy consumption:

  • Total Energy – total active energy (H:40960, UInt32 / 100 to kWh) and instantaneous active power demand (H:320, Int32 / 1000 to kW). This device includes 4 service attributes: grid frequency (Hz), reactive power (kVAr), apparent power (kVA), and power factor (0.000–1.000).
  • Tariff T1 – active energy accumulated during tariff 1 time periods (H:40962, UInt32 / 100 to kWh). Includes a reactive energy service attribute for T1 (kVArh).
  • Tariff T2 – active energy accumulated during tariff 2 time periods (H:40964, UInt32 / 100 to kWh). Includes a reactive energy service attribute for T2 (kVArh).
  • Tariff T3 – active energy accumulated during tariff 3 time periods (H:40966, UInt32 / 100 to kWh). Includes a reactive energy service attribute for T3 (kVArh).
  • Tariff T4 – active energy accumulated during tariff 4 time periods (H:40968, UInt32 / 100 to kWh). Includes a reactive energy service attribute for T4 (kVArh).

The 4 tariff rates correspond to time-of-use pricing: 1 = sharp (highest rate), 2 = peak, 3 = valley (off-peak), 4 = flat. Up to 8 time intervals per day define when each tariff applies.

Current measurement
  • Electric Current – instantaneous line current (H:313, UInt32 / 1000 to A). Includes a voltage service attribute (H:305, V).
Tariff and clock management

The module exposes 5 service actions for remote configuration:

  • Set Date/Time – sets the built-in RTC clock (year, month, day, hour, minutes, seconds). The OR-WE-515 has a lithium battery that maintains the clock during power outages.
  • Set Tariffs – configures up to 8 weekday time-of-use intervals. Each interval defines a start time (hour, minute) and a tariff rate (0=disabled, 1=sharp, 2=peak, 3=valley, 4=flat). The default schedule starts tariff 2 (peak) at 07:00 and tariff 3 (valley) at 22:00.
  • Set Slave ID – changes the Modbus address (1–255).
  • Set Baud Rate – changes the RS-485 communication speed (1200/2400/4800/9600 bps).
  • Set LCD Cycle Time – adjusts the automatic display scroll interval (1–120 seconds).

Module-level service attributes show the current slave ID, baud rate, date/time, and the 8 configured time period schedules with their tariff assignments.

The tariff schedule configured via TapHome applies to weekday time periods only (registers 0x8100–0x810F). The OR-WE-515 also supports separate weekend (0x8110) and holiday (0x8130) schedules, but these are not exposed in the current template. They can be configured using the Orno software or added as custom Modbus devices in TapHome.

Additional capabilities

The OR-WE-515 also provides a high-precision voltage register (UInt32, 0.001 V resolution) as an alternative to the UInt16 register used by the template. The meter supports bidirectional measurement (forward and reverse active power), per-tariff export energy counters, combined bidirectional energy totals, total reactive energy across all tariffs, and total harmonic distortion (THD) for both voltage and current. These can be added in a future template update.

Troubleshooting

No communication
  1. Verify the RS-485 wiring: terminal 23 = A, terminal 25 = B – swap A and B if communication fails
  2. Confirm the parity setting in TapHome is Even (8E1), not None
  3. Check that the baud rate in TapHome matches the meter (default 9600)
  4. Verify the Slave ID in TapHome matches the meter (default 1)
  5. For long cable runs, ensure GND (terminal 24) is connected
Incorrect energy readings
  1. Verify the meter’s measurement mode – Option 1 (default) measures active and reactive energy; Option 2 measures forward and backward (bidirectional) energy
  2. Tariff counters (T1–T4) only accumulate energy during their assigned time periods – if all tariff schedules are disabled (set to 0), the tariff counters remain at zero while Total Energy continues to increment
  3. The meter constant is configurable (100, 1000, or 2000 imp/kWh) – the default 1000 imp/kWh matches the template’s register scaling
Reactive energy scaling note

The official register documentation specifies 0.01 kVArh scaling for reactive energy registers, while the TapHome template uses a /1000 divisor for per-tariff reactive energy service attributes. This difference may result in a 10x scaling offset for reactive energy readings. If reactive energy values appear incorrect, verify against the LCD display on the physical meter.

Available devices

Orno OR-WE-515 Module
Service Attributes
Slave ID
Baud Rate
Date/TimeBuilt-in real-time clock reading — date and time maintained by lithium battery
Time Period 1Tariff schedule slot 1 — start time (HH:MM) and rate (sharp, peak, valley, or flat)
Time Period 2Tariff schedule slot 2 — start time and rate assignment
Time Period 3Tariff schedule slot 3 — start time and rate assignment
Time Period 4Tariff schedule slot 4 — start time and rate assignment
Time Period 5Tariff schedule slot 5 — start time and rate assignment
Time Period 6Tariff schedule slot 6 — start time and rate assignment
Time Period 7Tariff schedule slot 7 — start time and rate assignment
Time Period 8Tariff schedule slot 8 — start time and rate assignment
Frequency
Voltage
Split Phase Reactive Power
Service Actions
Set Date/TimeSet the built-in real-time clock — year, month, day, hour, minutes, seconds
Set TariffsConfigure up to 8 weekday time-of-use intervals — each with start time and tariff rate (sharp, peak, valley, flat)
Set Slave ID
Set LCD Cycle TimeAdjust the automatic LCD display scroll interval (1--120 seconds)
Set Baud Rate

OR-WE-515

Service Attributes
${device_SlaveId}
modbusr(H, 0x110, Int16)
${baud_rate} [bps]
switch(getbyte(modbusr(H, 0x111, Int16),0),0,0,1,1200,2,2400,3,4800,4,9600,"Invalid")
${time}
var Y := getbyte( modbusr(H,0x8120,uint16),1);
var M := getbyte( modbusr(H,0x8120,uint16),0);
var D := getbyte( modbusr(H,0x8121,uint16),1);
var H := getbyte( modbusr(H,0x8121,uint16),0);
var min := getbyte( modbusr(H,0x8122,uint16),1);
var sec := getbyte( modbusr(H,0x8122,uint16), 0);

tostring(tostring(H,"D2") + ":" + tostring(min,"D2") + ":" + tostring(sec, "D2") + " " + tostring(D,"D2") + "." + tostring(M,"D2") + ".20" + Y)


{1. time period starting time}, {rate}
var date := modbusr(H, 0x8100, INT16);
var belong := modbusr(H,0x8101,INT16);
tostring(tostring(getbyte(date,1),"D2") + ":" + tostring(getbyte(date,0),"D2") + ", " + belong + " (" + switch(belong,1,"sharp",2,"peak",3,"Valley",4,"flat","NaN")+")")
{2. time period starting time}, {rate}
var date := modbusr(H, 0x8100+2, INT16);
var belong := modbusr(H,0x8101+2,INT16);
tostring(tostring(getbyte(date,1),"D2") + ":" + tostring(getbyte(date,0),"D2") + ", " + belong + " (" + switch(belong,1,"sharp",2,"peak",3,"Valley",4,"flat","NaN")+")")
{3. time period starting time}, {rate}
var date := modbusr(H, 0x8100+4, INT16);
var belong := modbusr(H,0x8101+4,INT16);
tostring(tostring(getbyte(date,1),"D2") + ":" + tostring(getbyte(date,0),"D2") + ", " + belong + " (" + switch(belong,1,"sharp",2,"peak",3,"Valley",4,"flat","NaN")+")")
{4. time period starting time}, {rate}
var date := modbusr(H, 0x8100+6, INT16);
var belong := modbusr(H,0x8101+6,INT16);
tostring(tostring(getbyte(date,1),"D2") + ":" + tostring(getbyte(date,0),"D2") + ", " + belong + " (" + switch(belong,1,"sharp",2,"peak",3,"Valley",4,"flat","NaN")+")")
{5. time period starting time}, {rate}
var date := modbusr(H, 0x8100+8, INT16);
var belong := modbusr(H,0x8101+8,INT16);
tostring(tostring(getbyte(date,1),"D2") + ":" + tostring(getbyte(date,0),"D2") + ", " + belong + " (" + switch(belong,1,"sharp",2,"peak",3,"Valley",4,"flat","NaN")+")")
{6. time period starting time}, {rate}
var date := modbusr(H, 0x8100+10, INT16);
var belong := modbusr(H,0x8101+10,INT16);
tostring(tostring(getbyte(date,1),"D2") + ":" + tostring(getbyte(date,0),"D2") + ", " + belong + " (" + switch(belong,1,"sharp",2,"peak",3,"Valley",4,"flat","NaN")+")")
{7. time period starting time}, {rate}
var date := modbusr(H, 0x8100+12, INT16);
var belong := modbusr(H,0x8101+12,INT16);
tostring(tostring(getbyte(date,1),"D2") + ":" + tostring(getbyte(date,0),"D2") + ", " + belong + " (" + switch(belong,1,"sharp",2,"peak",3,"Valley",4,"flat","NaN")+")")
{8. time period starting time}, {rate}
var date := modbusr(H, 0x8100+14, INT16);
var belong := modbusr(H,0x8101+14,INT16);
tostring(tostring(getbyte(date,1),"D2") + ":" + tostring(getbyte(date,0),"D2") + ", " + belong + " (" + switch(belong,1,"sharp",2,"peak",3,"Valley",4,"flat","NaN")+")")
Frequency [Hz]
round(modbusr(h,0x130,uint16)*0.01)
Voltage [V]
round(modbusr(h,0x131,int16)*0.01)
Split phase reactive power [kwar]
round(modbusr(h, 0x148,uint32)*0.001*10)/10
Service Actions
Date/Time
Parameters: Year (22–99 YY), Month (1–12 MM), Day (1–31 DD), Hour (1–24 HH), Minutes (0–59 MI), Seconds (0–59 SS)
var out1 := (YY<<8) + MM;
var out2 := (DD<<8) + HH;
var out3 := (MI<<8) + SS;

modbusw(H, 0x8120, uint16, out1);
modbusw(H, 0x8121, uint16, out2);
modbusw(H, 0x8122, uint16, out3);



#var out1 := (tobcd(MI) << 8) + tobcd(SS);
#var out2 := (tobcd(DW) << 8) + tobcd(HH);
#var out3 := (tobcd(MM) << 8) + tobcd(DD);

#modbusw(H, 0x3c, LittleEndianUint16, out1, out2, out3, YY);
${set_tarriffs}
Parameters: Interval 1 - ${hour} (0–23 HH1), Interval 1 - ${minutes} (0–59 MI1), Interval 1 - ${tariff} (0–4 T1), Interval 2 - Hour (0–23 HH2), Interval 2 - Minutes (0–59 MI2), Interval 2 - ${tariff} (0–4 T2), Interval 3 - Hour (0–23 HH3), Interval 3 - Minutes (0–59 MI3), Interval 3 - ${tariff} (0–4 T3), Interval 4 - Hour (0–23 HH4), Interval 4 - Minutes (0–59 MI4), Interval 4 - ${tariff} (0–4 T4), Interval 5 - Hour (0–23 HH5), Interval 5 - Minutes (0–59 MI5), Interval 5 - ${tariff} (0–4 T5), Interval 6 - Hour (0–23 HH6), Interval 6 - Minutes (0–59 MI6), Interval 6 - ${tariff} (0–4 T6), Interval 7 - Hour (0–23 HH7), Interval 7 - Minutes (0–59 MI7), Interval 7 - ${tariff} (0–4 T7), Interval 8 - Hour (0–23 HH8), Interval 8 - Minutes (0–59 MI8), Interval 8 - ${tariff} (0–4 T8)
modbusw(H, 0x8100, uint16, (HH1<<8) + MI1);
modbusw(H, 0x8101, uint16, T1);

modbusw(H, 0x8100+2, uint16, (HH2<<8) + MI2);
modbusw(H, 0x8101+2, uint16, T2);

modbusw(H, 0x8100+4, uint16, (HH3<<8) + MI3);
modbusw(H, 0x8101+4, uint16, T3);

modbusw(H, 0x8100+6, uint16, (HH4<<8) + MI4);
modbusw(H, 0x8101+6, uint16, T4);

modbusw(H, 0x8100+8, uint16, (HH5<<8) + MI5);
modbusw(H, 0x8101+8, uint16, T5);

modbusw(H, 0x8100+10, uint16, (HH6<<8) + MI6);
modbusw(H, 0x8101+10, uint16, T6);

modbusw(H, 0x8100+12, uint16, (HH7<<8) + MI7);
modbusw(H, 0x8101+12, uint16, T7);

modbusw(H, 0x8100+14, uint16, (HH8<<8) + MI8);
modbusw(H, 0x8101+14, uint16, T8);
Slave ID
Parameters: Parameter1 (1–255 ID)
modbusw(H, 0x110, Uint16, ID)
LCD Cycle time
Parameters: Time [s] (1–120 t)
modbusw(H, 0x0d, Uint16, t)
Baud rate
Parameters: Baud rate
modbusw(H,0x111,int16,Br)
Electric Current Variable Read-only

Instantaneous single-phase line current (A) with voltage service attribute

Register: H:313 UInt32 Unit: A numeric
Service Attributes
Voltage

Electric Current

Read
MODBUSR(H, 0x139, UInt32)/1000
Service Attributes
Voltage [V]
round(modbusr(H, 0x131, uint16)*0.01)
Total Energy Electricity Meter Read-only

Total active energy consumption (kWh) and instantaneous power demand (kW) with grid frequency, reactive power, apparent power, and power factor

Register: H:40960 (readtotalconsumption), H:320 (readdemand) UInt32 / Int32 Unit: kWh / kW numeric
Service Attributes
Grid Frequency
Reactive Power
Apparent Power
Power Factor

Total Energy

Read total consumption
MODBUSR(H, 0xA000, UInt32)/100
Read demand
MODBUSR(H, 0x140, Int32)/1000
Service Attributes
${grid_frequency} [Hz]
tostring(modbusr(H, 0x130,UInt16)/100, "F2")
${reactive_power} [kVAr]
tostring(modbusr(H, 0x148,Int32)/1000, "F2")
${apparent_power} [kVA]
tostring(modbusr(H, 0x150,Int32)/1000, "F2")
${power_factor}
tostring(modbusr(H, 0x158,Int16)/1000, "F2")
Tariff T1 Electricity Meter Read-only

Active energy accumulated during tariff 1 (sharp) time periods with reactive energy counter

Register: H:40962 (readtotalconsumption) UInt32 Unit: kWh numeric
Service Attributes
Total Reactive Energy

Tariff T1

Read total consumption
MODBUSR(H, 0xA002, UInt32)/100
Service Attributes
${total_reactive_energy} [kVArh]
tostring(modbusr(H, 0xA01E + 2,UInt32)/1000, "F2")
Tariff T2 Electricity Meter Read-only

Active energy accumulated during tariff 2 (peak) time periods with reactive energy counter

Register: H:40964 (readtotalconsumption) UInt32 Unit: kWh numeric
Service Attributes
Total Reactive Energy

Tariff T2

Read total consumption
MODBUSR(H, 0xA004, UInt32)/100
Service Attributes
Total Reactive Energy [kwarh]
tostring(modbusr(H, 0xA01E + 4,UInt32)/1000, "F2")
Tariff T3 Electricity Meter Read-only

Active energy accumulated during tariff 3 (valley/off-peak) time periods with reactive energy counter

Register: H:40966 (readtotalconsumption) UInt32 Unit: kWh numeric
Service Attributes
Total Reactive Energy

Tariff T3

Read total consumption
MODBUSR(H, 0xA006, UInt32)/100
Service Attributes
Total Reactive Energy
tostring(modbusr(H, 0xA01E + 6,UInt32)/1000, "F2")
Tariff T4 Electricity Meter Read-only

Active energy accumulated during tariff 4 (flat) time periods with reactive energy counter

Register: H:40968 (readtotalconsumption) UInt32 Unit: kWh numeric
Service Attributes
Total Reactive Energy

Tariff T4

Read total consumption
MODBUSR(H, 0xA008, UInt32)/100
Service Attributes
${total_reactive_energy} [kVArh]
tostring(modbusr(H, 0xA01E + 8,UInt32)/1000, "F2")
Connection: Modbus RTU • 9600 baud• 8E1 • Slave ID: $[SlaveId]
Possible improvements (8)
  • H:312 (0x138) Voltage (high-precision UInt32) — UInt32 voltage register with 0.001V resolution — template uses H:305 (UInt16, 0.01V) instead
  • H:320 (0x140) — export Active Power (export/negative) — Template reads H:320 for total power but does not split into import/export — no bidirectional energy separation
  • H:0xA00A–0xA00E Tariff T1–T4 Export Active Energy — Per-tariff export (reverse) energy counters — template only reads import direction
  • H:0xA010 Total Active Energy (combined import+export) — Combined bidirectional total — template uses H:0xA000 (import only)
  • H:0xA01C Total Reactive Energy (all tariffs) — Grand total reactive energy across all tariffs — template only reads per-tariff reactive counters
  • H:0xA01E (40990) Total Reactive Energy (import) — Total reactive import energy — base address used by per-tariff SA formulas (0xA01E + offset)
  • H:0x160 (352) Current THD — Total harmonic distortion of current, %
  • H:0x168 (360) Voltage THD — Total harmonic distortion of voltage, %

Sources

  • Orno OR-WE-514 & OR-WE-515 Register Description
    2026-03-27
    PDF
  • Orno OR-WE-512/514/515 Installation Manual
    PDF
  • AGG Software — OR-WE-514/515 Modbus Register Map
  • OR_WE_Energy_Meter Arduino Library — Register Definitions
    github.com 2026-03-27