#3698·rtl_433

RainPoint HCS012ARF rain gauge: rainfall is 10x too low

Author: zorroarCreated Sep 16, 2026Updated Sep 19, 2026

Decoder: src/devices/rainpoint_hcs012arf.c (protocol 276) Device: RainPoint HCS012ARF High Precision Rain Sensor rtl_433 version: 25.12-356-gf96ab11c Receiver: RTL-SDR Blog V4, 433.92 MHz, 250 kHz sample rate

Summary

The decoder reports rainfall ten times lower than the real value. It applies:

c
float rain_mm = rain_raw * 0.1f;

but each unit of rain_raw corresponds to 1.0 mm, not 0.1 mm. The correct line should be rain_raw * 1.0f.

Evidence

Five independent checks, all agreeing.

1. Each bucket tip increments the counter by exactly 1

Tipping the bucket 25 times by hand (water poured slowly, tips counted):

before   rain_raw = 799
after    rain_raw = 824      (+25, exactly the number of tips)

2. Physical measurement of the gauge

funnel diameter      9.0 cm      ->  collecting area 63.62 cm²
1 mm of rainfall     = 6.36 ml
measured bucket      > 8 ml      ->  > 1.26 mm per tip

For the decoder's 0.1 mm/unit to be correct, the bucket would have to hold 0.64 ml — twelve times less than measured.

3. Vendor app cross-check

The vendor app (HomGar) shows the same counter scaled. Three readings taken two days apart, with the app's total and the decoded rain_raw:

rain_raw    app total     implied "pre-existing total"
   400       1820.8 mm        1356.8
   792       2275.6 mm        1356.9
   799       2283.7 mm        1356.9

The pre-existing total is a fixed number, so it must come out the same every time. It only does at 1.16 mm per unit. The app applies a user-configurable +16 % calibration; removing it gives 1.00 mm per unit exactly.

At 0.1 mm/unit the same figure would have to grow from 1780.8 to 2203.8 with no rain — impossible.

4. Counting tips against the app

10 tips   total 2283.7 -> 2295.3    +11.6 mm    (1.16 mm/tip)
10 tips   total 2295.3 -> 2306.9    +11.6 mm    (1.16 mm/tip)
 5 tips   total 2306.9 -> 2312.7    + 5.8 mm    (1.16 mm/tip)

5. Range declared in the manual

The manual gives Rainfall Range: 0-9999 mm. rain_raw is 16 bits (max 65535). At 0.1 mm/unit, 9999 mm would need 99,990 counts — it would not fit. At 1 mm/unit it fits comfortably.

Sample frames

Device id 67198984, flags1=24, flags2=3, battery_ok=1.

Raw 163-bit frame (Manchester decoded and bit-reflected, header 0xa5):

a5 08 60 01 04 60 03 1f 03 f2
b0 sync | b1-b4 id (LE) | b5 flags1 | b6 flags2 | b7-b8 counter (LE) | b9 ?

b7-b8 = 0x031f = 799, reported by the decoder as 79.9 mm. Real value: 799 mm of accumulated rainfall since the counter started (uncalibrated).

Note b9 is not read by the decoder; its purpose is unknown.

Suggested fix

c
-    float rain_mm = rain_raw * 0.1f;
+    float rain_mm = rain_raw * 1.0f;