Forecasting

It’s a DER World, We’re Just Living in It

November 06, 2019

If you’re reading this and you’re a load forecaster like myself (or know a thing or two about load forecasting), then you are well aware of the challenges associated with load forecasting as penetration levels of distributed energy resources (DER) – especially photovoltaics (PV) – increase across electrical grids. This has been a hot topic for the better part of this decade, and I don’t see it fading away anytime soon. However, if you’re not privy to how DER is creating ripples in the world of load forecasting, allow me to explain.

Just a few years ago, the California Public Utility Commission (CPUC) issued a ruling and established a working group to investigate what sort of refinements should be made to the interconnection process for DER to ensure that we understand the location of generation capacity connected to the utility grid. The working group determined that:

“Without the use of telemetry”… “the lack of [PV] generation output visibility prevents system operators and engineers from determining the real system load conditions which can inhibit the ability to plan and operate the distribution system.”

And there you go – the term “load masking” was born. Load masking describes this exact situation, and it is this issue of load masking that’s causing so much agita in the world of grid operations and planning.

If you’re sitting there thinking, “But what about smart meters? Can’t they help mitigate this issue?” The short answer is, well, it’s complicated. Smart meters generally have two channels for recording information about electricity flow – a delivered channel, which measures power pulled from the grid, and a received channel, which measures power pushed to the grid. The kicker is that only one of these channels can be nonzero at any given time. So, if the solar panels on your roof are generating 9 kWh, but you’re only using 6 kWh, then the received channel is going to read 3 kWh and the delivered is going to read 0 kWh. Similarly, if your neighbors’ panels are generating 3 kWh but they’re not home to use them, then their smart meter will also read 3 kWh received and 0 kWh delivered.

These are two scenarios in which you and your neighbor have pretty different levels of generation and consumption, but as far as the smart meter is concerned, you’re the same. And unless the solar output is directly metered, the true consumption is masked by what’s generated behind the meter, painting a very incomplete picture of what is actually happening at a delivery point. This throws a massive wrench in our load forecast models because they have been constructed based on a fundamental understanding of how people use electricity!

Earlier this month, I attended the 6th Annual Demand Response & DER World Forum 2019 in San Diego, California, where I gave a short presentation on this topic. During my presentation, I polled the audience to find out how many of them had heard of load masking. The response was overwhelmingly sparse. So if you didn’t know about load masking before reading this awesome blog, you’re in good company.

For me, this was a solid reminder of the importance of forums like this one that give professionals the opportunity to offer perspectives from different sides of the industry. DER technologies are quickly becoming the way of the future, and it’s exciting to understand the ways in which they are helping us to use electricity more efficiently and reduce our carbon footprint. At the same time, it’s important to keep in mind how they are impacting the way the grid is planned and operated. After all, it’s a DER world, we’re just living in it. And I’m just trying to forecast in it.

Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing:
==> authorContent.contentFields  [in template "44616#44647#114455" at line 9, column 17]

----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: contentFields = authorContent.content...  [in template "44616#44647#114455" at line 9, column 1]
----
1<#assign 
2	webContentData = jsonFactoryUtil.createJSONObject(author.getData()) 
3	classPK = webContentData.classPK 
4/> 
5 
6<#assign 
7authorContent = restClient.get("/headless-delivery/v1.0/structured-contents/" + classPK + "?fields=contentFields%2CfriendlyUrlPath%2CtaxonomyCategoryBriefs") 
8contentFields = authorContent.contentFields 
9categories=authorContent.taxonomyCategoryBriefs 
10authorContentData = jsonFactoryUtil.createJSONObject(authorContent) 
11friendlyURL = authorContentData.friendlyUrlPath 
12authorCategoryId = "0" 
13/> 
14 
15<#list contentFields as contentField > 
16   <#assign  
17	 contentFieldData = jsonFactoryUtil.createJSONObject(contentField)  
18	 name = contentField.name 
19	 /> 
20	 <#if name == 'authorImage'> 
21	    <#if (contentField.contentFieldValue.image)??> 
22	        <#assign authorImageURL = contentField.contentFieldValue.image.contentUrl />	 
23			</#if> 
24	 </#if> 
25	 <#if name == 'authorName'> 
26	    <#assign authorName = contentField.contentFieldValue.data /> 
27			<#list categories as category > 
28         <#if authorName == category.taxonomyCategoryName> 
29				     <#assign authorCategoryId = category.taxonomyCategoryId /> 
30				 </#if> 
31      </#list> 
32	 </#if> 
33	 <#if name == 'authorDescription'> 
34	    <#assign authorDescription = contentField.contentFieldValue.data /> 
35			 
36	 </#if> 
37	  
38	 <#if name == 'authorJobTitle'> 
39	    <#assign authorJobTitle = contentField.contentFieldValue.data /> 
40			 
41	 </#if> 
42 
43</#list> 
44 
45<div class="blog-author-info"> 
46	<#if authorImageURL??> 
47		<img class="blog-author-img" id="author-image" src="${authorImageURL}" alt="" /> 
48	</#if> 
49	<#if authorName??> 
50		<#if authorName != ""> 
51			<p class="blog-author-name">By <a id="author-detail-page" href="/w/${friendlyURL}?filter_category_552298=${authorCategoryId}"><span id="author-full-name">${authorName}</span></a></p> 
52			<hr /> 
53		</#if> 
54	</#if> 
55	<#if authorJobTitle??> 
56		<#if authorJobTitle != ""> 
57			<p class="blog-author-title" id="author-job-title" >${authorJobTitle}</p> 
58			<hr /> 
59		</#if> 
60	</#if> 
61	<#if authorDescription??> 
62		<#if authorDescription != "" && authorDescription != "null" > 
63			<p class="blog-author-desc" id="author-job-desc">${authorDescription}</p> 
64			<hr /> 
65		</#if> 
66	</#if> 
67</div>