Meter Register Content Codes - what's "stuffing up" billing?

  • Last post 2 weeks ago
msouness posted this 4 weeks ago

My interest in meter register content codes started with the configuration of register content for billing and reconciliation of network charges for an electricity retailer.  It soon became apparent that incorrect regsister content codes in the electricity Registry can stop a retailer from quoting, let alone switching and billing a customer.

At the back-end, retailers are charged for use of electricity network based on the volume reported against network tariff codes. Simplification of register content code mapping to network tariffs is another area of interest - as this can have a siginifcant impact on electricity retailer margin.

In order to place greater transparency on this issue, it is suggested that a MEP dataset be produced to indicate the party responsible for correcting incorrect register content codes and period of availability.

To this end, I have pulled apart a report from the "ICP and metering details" page on the EA's EMI website.  Data are originally split out into combinations of meter registers, with respect to individual price category codes.  For this analysis R statistical analysis software is employed to re-shape the data to facilitate counting of discrete register content code combinations.  

Some charts are presented for review.  I will attach the R code to enable other users to take a look throught the reshaped dataset.

NHH meter register content codes per network

Reshaped to indicate the portion of register content codes per network.

Portion of NHH meter register content codes

"I" flow register content codes with load codes instead of generation.  Should the customer be charged or credited for generation of energy injected into the network?

Where the correct "EG" register content code is applied to embedded generation, but the period of availaibilty is not 24 hours, this is also considered to be illegitimate.  In some cases this may be due to meter configuration of load periods to match generation periods.

generation register content code without 24 hours availability.

Where an embedded generation (EG) register is presented with load flow, should the customer be charged or credited for generation volume?

Load flow embedded generation EG registers

Uncontrolled registers with less than 24 hours availabiltiy.  Should the customer pay full price, or do they get a discount for lower availability of supply?

Uncontrolled meter registers without 24 hour availabilty

Inclusive registers with 24 hours of availability appears to be a contradiction - that being downstream controlled supply is available 24 hours per day - i.e. uncontrolled.

24 Hour All Inclusive meter registers

The presence of 24 hours of availability on registers with definitions other than 24 hours of availabilty is noted.

time constrained register codes with 24 hours of availability

Order by: Standard | Newest | Votes
msouness posted this 4 weeks ago

R code for transformation and analysis of Meter Register Content Codes using Electricity Authority data.

#Metering Configuration Review

#Load libraries





setwd("~/Documents/r-data/MeterDetails") #OSX path

meter_configuration <- NULL

meter_configuration <- read_csv("Data/20190831_MeteringConfigurationsInclDistributionPriceCatCode.csv", 

                       col_types = cols(`ICP count` = col_number(), 

                                        Residential = col_logical()



#Rename Columns to be more friendly

meter_configuration <- meter_configuration %>% 

                       rename(region_id = `Region ID`,

                       network_region = `Network reporting region`,

                       nsp = NSP,

                       icp = `ICP count`,

                       residential = Residential,

                       price_code = `Distributor price category code`,

                       flow_content_poa = `Register(s) (Energy flow direction - register content code - period of availability)`


#Factorise the data as factors to simplify reporting

meter_configuration$price_code <- as.factor(meter_configuration$price_code)

#Separate meter register items into separate rows

meter_configuration <- meter_configuration %>% 

                       separate_rows(flow_content_poa, sep = ' ')

#Split into Flow, Content and POA

meter_configuration <- meter_configuration %>% 


                                c("flow", "content", "poa"), 

                                sep = '-'


#Set period of availability as integer

meter_configuration$poa <- as.factor(meter_configuration$poa)

sorted_poa <- paste(sort(as.integer(levels(meter_configuration$poa))))

meter_configuration$poa <- factor(meter_configuration$poa, levels = sorted_poa)

#Aggregate results

meter_configuration <- meter_configuration %>% 

                       group_by(region_id, network_region, flow, content, poa) %>% 

                       summarise(register_count = sum(icp)) %>%

                       mutate(register_detail = paste(flow, content, poa, sep = "-"))

meter_configuration %>% ungroup() %>%

mutate(network_region = fct_reorder(network_region, region_id)) 

#Split out the registers into groups for detailed review

#Summarise NHH registers

nhh_registers <- NULL

nhh_registers <- meter_configuration %>% 

                     select(region_id, network_region, flow, content, poa, register_count) %>%

                     group_by(region_id, network_region, content, flow) %>%

                     filter(!content %in% c("7302", "7304", "7306", "7056")) %>%

                     summarise(register_count = sum(register_count))

#Generation with incorrect register content codes

generation_issues <- NULL

generation_issues <- meter_configuration %>% 

                     select(region_id, network_region, flow, content,register_count) %>%

                     group_by(region_id, network_region, content) %>%

                     filter(!content %in% c("7302", "7304", "7306", "7056","RH", "AH", "EG"), 

                     flow == "I") %>%

                     summarise(register_count = sum(register_count))

#Uncontrolled with incorrect period of availabilty

uncontrolled_issues <- NULL

uncontrolled_issues <- meter_configuration %>% 

                       ungroup() %>%

                       select(region_id, network_region, flow, content, poa, register_count) %>% 

                       group_by(region_id, network_region, content, poa, flow) %>%

                       filter(content == "UN", 

                       flow == "X",

                       !poa == "24") %>%

                       summarise(register_count = sum(register_count))

#Chart Coding

#Plot the NHH Register Count per Network


ggplot(nhh_registers, aes(fct_reorder(network_region, desc(region_id)), register_count, fill = content)) +

  geom_col(colour = "white", width = 1) +

  scale_y_continuous(label = comma) +

  coord_flip() +

  theme(plot.title = element_text(hjust = 0.5),

        plot.caption = element_text(hjust = 0),

        legend.position = "right"

        ) +

  labs(title = "NHH Registers per Content Code", 

       subtitle = "20190831_MeteringConfigurationsInclDistributionPriceCatCode.csv",

       fill = "Register Content Code", 

       caption = "Data source: provided by the Electricity Authority (New Zealand)") +

  xlab("Network Reporting Region") + 

  ylab("Count of NHH Registers") 

#Incorrect Period of Availabilty for Uncontrolled Register

ggplot(uncontrolled_issues, aes(fct_reorder(network_region, desc(region_id)), register_count, fill = poa)) +

  geom_col(position = "stack") +

  coord_flip() +

  labs(title = "Uncontrolled Registers Excluding 24 Hours",

       subtitle = "20190831_MeteringConfigurationsInclDistributionPriceCatCode.csv",

       caption = "Data source: provided by the Electricity Authority (New Zealand)") +

  xlab("Network Region") + 

  ylab("Number of Registers per Network") +

  labs(fill = "Hours")

#Incorrect Register Content Codes for Generation (I Flow)

ggplot(generation_issues, aes(fct_reorder(network_region, desc(region_id)), register_count, fill = content)) +

  geom_col(position = "stack") +

  coord_flip() +

  labs(title = "Generation non 'EG' Register Content Codes",

       subtitle = "20190831_MeteringConfigurationsInclDistributionPriceCatCode.csv",

       caption = "Data source: provided by the Electricity Authority (New Zealand)") +

  xlab("Network Region") + 

  ylab("Number of Registers per Network") +

  labs(fill = "Content Code")



Jonathon posted this 4 weeks ago

The accuracy of register content codes is monitored through MEP audits.  Copies of the audit reports can be found on the Authority website at:

The registry has also recently been upgraded to include a suite of audit compliance reports for reconciliation participants, distributors and MEPs. (userguide is available from

The MEP reports includes checks for some register content code combinations that are unlikely to be accurate. This includes looking at ICPs with:

  • only controlled (CN) reigster content codes
  • controlled load profile, but no control device
  • day and night registers, but period of availabilty is not 24 hours
  • day register with no night register
  • night register with no day register
  • inclusive regiser content code with inaccurate period of availability (IN24 or IN0)
  • uncontrolled register content code with period of avaialbility less than 24
  • uncontrolled regsiters, but a load control device onsite

Also I am not familiar with the data source you are using, but when developing the registry reports false we found false positives could be created when we looked at the metering installation level, so reporting had to be at the ICP level..  

  • Liked by
  • msouness
msouness posted this 3 weeks ago

Hi Jonathon,

Good to hear back - I have used the EMI's published meter register combination per ICP and distributor price category to pull this information together.  One of the issues I had to deal with as a trader was the inability to quote customers on sites where illegitimate register content codes are in place.  This requires the quoting trader to add illegitimate register content codes (flow, content, poa combinations) to the billing engine.  Only after manual interaction can the sales team quote and initiate a switch.  This propagates further "bad data" within the system (now that a bad content code is "allowed".

In addiiton to your above checks, could you add flow direction?  The presence of X-EG-24 can cause nothing but grief - particularly for reconciliation where a process uses the flow direction for submission to NZX.

msouness posted this 2 weeks ago

On another note, I'd be interested in the number of meters still in Registry with a serial number including the text string "10E+".

I've seen this previously in Registry - which I can only assume being due to the use of MS-Excel for reviewing meter details before upload to registry.