Industry Insights
Building A Smart City - It Takes A Village
Smart city solutions help utilities and cities reimagine how they can deliver services to improve efficiencies, lower carbon emissions, create safer neighborhoods and enhance the quality of life for their citizens. Itron partners with cities and utilities around the world to drive this digital transformation, making this vision a feasible reality.
To address these objectives, CPS Energy, the nation’s largest municipally owned electric and gas provider, looked to SmartSA’s vision – "To be a connected, inclusive, and resilient community supporting a high quality of life." What factors impacted this vision?
- San Antonio is expecting a population growth of 1 million residents by 2040
- San Antonio has prioritized Accessibility, Mobility and Sustainability as the focus areas to prepare for this growth
- A desire to take a data-driven approach to addressing city-wide issues
Contractors from LE Meyers install an Access Point2
Under the SmartSA partnership, the City of San Antonio, CPS Energy and Itron are undertaking a smart streetlight and smart city application pilot. We recently completed the installation of smart streetlights and IoT sensors to support city applications in three Innovation Zones within the City of San Antonio: Brooks City Base, Downtown and Medical Center. Because transparency and community co-creation are priorities for the SmartSA partnership, the Office of Innovation at the City of San Antonio conducted citizen surveys of the Innovation Zones before the pilot to determine what priorities those who live, work and play in the city have for each Innovation Zone. Those priorities were pedestrian safety, parking, lighting, and environmental quality.
Itron was chosen to contribute to this project based on a shared vision and proven leadership in the industrial IoT (IIoT) space. Our intelligently connected multi-application network, diverse partner network and world-class Central Management System (CMS) Streetlight.Vision (SLV) contributed to the decision to work with Itron. Streetlight.Vision, will provide the city with a “single pane of glass” view for management, data acquisition and data export across multiple stakeholder departments.
Contractors install NLCs at Medical Center2
Prior to installation, Itron worked closely with numerous city stakeholders to identify the exact placement of devices within each zone to optimize performance. All zones included Networked Lighting Controls (NLCs), ambient noise, air quality, flood and parking sensors (downtown only).
Early Successes
When it comes to implementing a smart cities project—it really does take a village! Strong collaboration and partnership with various stakeholders has been the key ingredient to the successful liftoff of this project in San Antonio. Examples include;
- Open communication, close coordination and support with installation crews. This included coordinating approvals for night installations due to heavy daytime traffic and finding 24x7 power in the downtown area1
- Easy to use deployment tools like SLV:GO helped speed implementation and lower operational costs
- Comprehensive pre-deployment testing for all solutions prior to field installation helped to make the process efficient
- Highly coordinated solution and implementation planning from technology partners
- TerraGo – SLV:GO application
- Cleverciti – smart parking solution that included three cameras and two Circ displays
- US3 – flood, water level, and weather sensors and onsite installation
- Rongwen – noise sensors
- Tomorrow.io – weather and air quality sensors
Installer scans NLC with the SLV:GO application prior to installation2
It certainly takes a village to bring a smart city vision to life, and strong partnerships by all stakeholders are a key to this success. We look forward to sharing more lessons learned as we partner with innovative cities like San Antonio on their smart city journeys.
US3 provided expert installation support2
1An Interesting bit of San Antonio History
According to a CPS Energy representative, during World War II, because of the high concentration of military bases and personnel, the City of San Antonio was concerned about becoming a target for enemy bombers. The City wired all their downtown electric streetlights to circuits controlled by a master relay that controlled many sub-relays. The thought was, if there was an air raid, the City could go dark by de-energizing the master relay. To this day, much of the downtown area is still controlled by the original master and sub-relay network. To energize Itron’s deployment area on Market Street, CPS Energy had to bypass the Market Street sub-relays and now uses NLCs to control the streetlights.
2 Photo credit: All photos by Tom Marek
Wystąpił błąd podczas przetwarzania szablonu.
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>
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>