From OutputReportTabular.cc, totalWater = totalOnsiteWater + gatherMains + StorageChange;
where gatherMains = Water Supplied by Utility &
totalWater = Total On Site, Change in Storage, and Utility Water Sources
Meters Water:Facility and MainsWater:Facility can be used to understand above results. Report variables on these meters can be found in meter details file (*.mtd) and can be included in idf. Running the annual simulation gave the following Water Source Summary summary

Reporting output variables from .mtd files for eters Water:Facility and MainsWater:Facility for runperiod gives the following results

So the difference between end use and mains water is entirely due to Rainwater and Graywater tanks. Both these tanks use Mains to respond to fill requests made by float valve. If Type of Supply Controlled by Float Valve is set to None, then Total Water End Uses will be identical to Water Supplied by Utility.
Irrigation Water, though supplied by Rainwater Tank is showing identical Water Use Equipment Total Volume and Water Use Equipment Mains Water Volume. From WaterUse.cc
SetupOutputVariable( "Water Use Equipment Total Volume [m3]", WaterEquipment( WaterEquipNum ).TotalVolume, "System", "Sum", WaterEquipment( WaterEquipNum ).Name, _, "Water", "WATERSYSTEMS", WaterEquipment( WaterEquipNum ).EndUseSubcatName, "Plant" );
SetupOutputVariable( "Water Use Equipment Mains Water Volume [m3]", WaterEquipment( WaterEquipNum ).TotalVolume, "System", "Sum", WaterEquipment( WaterEquipNum ).Name, _, "MainsWater", "WATERSYSTEMS", WaterEquipment( WaterEquipNum ).EndUseSubcatName, "Plant" );
As can be seen from above, same output variable WaterEquipment( WaterEquipNum ).TotalVolume is used for both the meters.
Looking further into WaterUse.cc, the current code is
if ( WaterConnections( WaterConnNum ).SupplyTankNum > 0 ) {
// Set the demand request for supply water from water storage tank
WaterConnections( WaterConnNum ).ColdVolFlowRate = WaterConnections( WaterConnNum ).ColdMassFlowRate / RhoH2O( DataGlobals::InitConvTemp );
WaterStorage( WaterConnections( WaterConnNum ).SupplyTankNum ).VdotRequestDemand( WaterConnections( WaterConnNum ).TankDemandID ) = WaterConnections( WaterConnNum ).ColdVolFlowRate;
// Check if cold flow rate should be starved by restricted flow from tank
// Currently, the tank flow is not really starved--water continues to flow at the tank water temperature
// But the user can see the error by comparing report variables for TankVolFlowRate < ColdVolFlowRate
WaterConnections( WaterConnNum ).TankVolFlowRate = WaterStorage( WaterConnections( WaterConnNum ).SupplyTankNum ).VdotAvailDemand( WaterConnections( WaterConnNum ).TankDemandID );
WaterConnections( WaterConnNum ).TankMassFlowRate = WaterConnections( WaterConnNum ).TankVolFlowRate * RhoH2O( DataGlobals::InitConvTemp );
}
Perhaps a proposed solution could be to calculate starved flow rate and use that for mains water flow rate as shown below.
RequestDemandVdot = 0.0;
StarvedVdot = 0.0;
TankSupplyVdot = 0.0;
AvailTankVdot = 0.0;
if ( WaterConnections( WaterConnNum ).SupplyTankNum > 0 ) {
// Set the demand request for supply water from water storage tank
WaterConnections( WaterConnNum ).ColdVolFlowRate = WaterConnections( WaterConnNum ).ColdMassFlowRate / RhoH2O( DataGlobals::InitConvTemp );
WaterStorage( WaterConnections( WaterConnNum ).SupplyTankNum ).VdotRequestDemand( WaterConnections( WaterConnNum ).TankDemandID ) = WaterConnections( WaterConnNum ).ColdVolFlowRate;
RequestDemandVdot = WaterConnections( WaterConnNum ).ColdVolFlowRate;
// Check if cold flow rate should be starved by restricted flow from tank
AvailTankVdot = WaterStorage( WaterConnections( WaterConnNum ).SupplyTankNum ).VdotAvailDemand( WaterConnections( WaterConnNum ).TankDemandID );
TankSupplyVdot = RequestDemandVdot; // init
if ( AvailTankVdot < RequestDemandVdot ) { // calculate starved flow
StarvedVdot = RequestDemandVdot - AvailTankVdot;
TankSupplyVdot = AvailTankVdot;
}
}
WaterConnections( WaterConnNum ).TankVolFlowRate = TankSupplyVdot;
WaterConnections( WaterConnNum ).TankMassFlowRate = TankSupplyVdot * RhoH2O( DataGlobals::InitConvTemp );
And then StarvedVdot should be reported for MainsWater meter.
If someone could direct me to the code lines where it is calculated (I suppose it is E+ code) it would be a great help.