To the page content
T IoT

Elvaco: NB-IoT makes heat meters ready for remote reading

By the end of 2026, all heat meters in Germany and Europe must be connected. Elvaco supports municipal utilities in meeting this challenge with NB-IoT retrofit modules compatible with a wide range of manufacturers, as well as Telekom mobile network services. 

Door handle with a Wi-Fi symbol and a smartphone

In brief

  • Retrofit rather than replacement: Elvaco enables existing heat meters to be read remotely using NB-IoT modules. This saves costs, reduces effort and extends the service life of existing devices.
  • Ready to meet regulatory requirements: With remote meter reading, the modules help municipal utilities and energy suppliers to meet the requirements of the EED and FFVAV by the end of 2026.
  • Reliably connected across Europe: Thanks to Telekom’s NB-IoT connectivity, the meters transmit consumption data securely and automatically – even from basements or hard-to-reach buildings.

Retrofitting existing meters with smart technology

The clock is ticking for energy suppliers in Europe until the end of 2026: The District Heating Regulation (see info box) requires them to provide their customers with monthly billing statements. In practice, this means that all heat meters must be readable remotely - because manual monthly readings cannot be managed by personnel. Municipal utilities, regional suppliers, metering point operators and housing associations are therefore faced with the challenge of installing new meters or - with a focus on sustainability - digitizing their existing meters. 

EED & FFVAV – Greater transparency for consumers

The European Energy Efficiency Directive (EED) requires all EU member states to significantly reduce energy consumption by 2030. A key component: Consumers should receive transparent and regular information about their energy consumption. The EED stipulates that, starting at the end of 2026, end customers must receive monthly consumption information for all energy sources, such as electricity, gas, water, heating, and district heating. Germany has implemented this EU requirement through various national regulations. Since 2021, the FFVAV (Fernwärme- oder Fernkälte-Verbrauchserfassungs- und Abrechnungsverordnung - meaning District Heating and District Cooling Metering and Billing Regulation) has governed remote meter reading and monthly billing specifically for district heating and district cooling. To enable utilities to meet these requirements, all meters must be readable remotely—a task that is virtually impossible to accomplish without IoT technology. 

Retrofit instead of replacement: Sustainability meets cost-effectiveness

The good news: Many of these meters are technically sound and do not need to be replaced. In most cases, they can simply be upgraded digitally. This is where Elvaco comes in. For more than 15 years, the Swedish company has specialized in connectivity modules that retrofit existing energy meters to connect them to the cloud. This retrofit principle is remarkably simple: Wireless modules in the form of plug-in cards can be inserted into the standard interface of most heat meters, transforming devices — some of which have been in operation for years — into modern smart heat meters. The modules contain a Telekom SIM card with NB-IoT technology (see info box). Once installed, the meters automatically transmit their data without the need for a meter reader to be on-site. 

The advantages are clear: Old but reliable meters can be retrofitted with modern wireless technology—for example, as part of a calibration test, which must be performed every six years anyway—and reinstalled. This not only saves utilities money but also helps protect the environment in times of raw material shortages and rising material costs. In addition, it eliminates the logistical effort involved in replacing thousands of meters. 

To support its expansion in Europe, Elvaco needed a connectivity solution that would work across the entire continent. Deutsche Telekom stood out with a reliable NB-IoT network that offers Europe-wide coverage thanks to its own infrastructure and roaming partnerships. 

Before the introduction of NB-IoT, utility companies relied on 2G and GPRS to connect heat meters. The problem was that, unlike in Sweden, district heating meters in Germany do not have a power connection. This meant that a gateway was required to collect data from multiple meters and transmit it in batches. The gateway, in turn, required a power supply, which made installation significantly more difficult. 

With NB-IoT, that’s a thing of the past: “Now a technician simply presses a button on the module, and the meter automatically connects to the cloud,” says Florian Schmidt, Head of Sales OEM, DACH & BeNeLux at Elvaco. “Point-to-point transmission, without any additional infrastructure. NB-IoT’s narrow bandwidth is more than sufficient for the data volumes being transmitted.”

Why NB-IoT is the right choice for district heating meters

The NB-IoT (NarrowBand Internet of Things) mobile communications standard was developed specifically for IoT applications. It offers several advantages that make it the ideal solution for district heating metering:

  • Excellent building penetration: District heating meters are often located in basements or utility rooms with limited signal reception. NB-IoT penetrates thick walls and basement walls significantly better than any other mobile communication technology.
  • Flexibility: Thanks to point-to-point connectivity via M2M radio, neither a power connection nor additional hardware is required.
  • Energy efficiency: The modules are battery-powered and, thanks to a special power-save mode, are extremely energy-efficient.  
  • Long range: NB-IoT reliably reaches even remote areas.
  • Licensed frequency band: Unlike unlicensed radio technologies such as LoRaWAN or Wi-Fi, NB-IoT operates securely and without interference, and without the need to operate a local network.
  • Technology security: Telekom guarantees network technology security for 12 years, based on the hardware’s dual six-year calibration cycle as specified by regulations. 

Real-time data for proactive monitoring

The Elvaco modules take hourly readings and send the collected data to the cloud once a day. The data transmitted includes energy consumption, supply and return temperatures, and alarms: faulty meters, incorrect installation, or leaks are reported immediately, enabling proactive pipeline network monitoring. Utilities can identify and resolve issues before customers are affected. For example, if the return temperature is unusually high, this indicates an incorrectly configured transfer station. Energy is being pumped through the system that nobody needs—an expensive waste that can be avoided with up-to-date data. 

Added value for municipal utilities and end customers

The digitization of district heating meters benefits everyone involved. Thanks to smart metering, municipal utilities and service providers can meet legal requirements on time and bill customers monthly. Remote meter reading also significantly reduces the workload on staff. Instead of coordinating meter reading appointments and reading meters on-site, technicians can focus on their core tasks: installation, replacement, calibration, maintenance, and optimization of the district heating network.

The situation also improves for tenants and end customers. “They no longer have to wait for meter reading appointments and also receive transparent information about their energy consumption,” says Schmidt. “This raises awareness and can lead to more economical energy use. In times of high energy prices, this is a factor that should not be underestimated.” Industrial customers also benefit: consumption data can be integrated into their energy management systems. Consumption profiles help identify saving potentials and optimize processes.

The modules can be kept up to date by the manufacturer via over-the-air (FOTA) firmware updates. Security updates, new encryption methods, or additional features can be installed without the need for an on-site technician. This enhances data security and extends the devices’ lifespan. 

Connected across Europe – with one partner

For Elvaco, the Europe-wide availability of Telekom’s mobile network was a decisive factor in choosing to partner with the company. This means the company doesn’t have to negotiate new contracts in every country: one provider, one SIM card model, one central point of contact—which saves time and effort. Telekom works with more than 600 certified roaming partners worldwide. This guarantees reliable connectivity even in countries where the Bonn-based company does not operate its own network. For Elvaco, this means maximum flexibility for international rollouts. 

Telekom is already collaborating with several partners that use Elvaco modules. One example is Enercity, an energy supplier based in Hanover. Enercity uses the Elvaco modules in combination with the . Telekom’s IoT platform enables centralized management of all devices, as well as the centralized collection and analysis of meter data, which can then be integrated into existing systems via API interfaces. 

“As a Swedish metering connectivity expert serving much of the European continent, we install equipment in many different countries and therefore need access to a wide variety of networks. With Telekom, in addition to their extensive roaming coverage, we also have a direct connection to network experts who provide excellent and prompt support. From an operational standpoint, this is extremely valuable.” 

Erik Wikström, CEO Elvaco AB

An error occurred in template CMArticle.[08-Text-Media.ftl for Content with ID 284474.
Show Details
FreemarkerView[template=/jar:id:contentproperty:/Themes/telekom-business/templates/telekom-business-templates.jar/archive!/META-INF/resources/WEB-INF/templates/telekom-business/com.coremedia.blueprint.common.contentbeans/CMArticle.[08-Text-Media].ftl]
com.coremedia.blueprint.cae.contentbeans.CMArticleImpl$$[id=284474]
Error rendering view
No link scheme found for com.coremedia.blueprint.cae.contentbeans.CMChannelImpl$$[id=228136] [class=class com.coremedia.blueprint.cae.contentbeans.CMChannelImpl$$]
com.coremedia.blueprint.cae.contentbeans.CMArticleImpl$$
com.coremedia.objectserver.dataviews.DataView
com.coremedia.dispatch.HasCustomType
com.coremedia.blueprint.cae.contentbeans.CMArticleImpl
com.coremedia.blueprint.cae.contentbeans.CMArticleBase
com.coremedia.blueprint.common.contentbeans.CMArticle
com.coremedia.blueprint.cae.contentbeans.CMTeasableImpl
com.coremedia.blueprint.cae.contentbeans.CMTeasableBase
com.coremedia.blueprint.common.contentbeans.CMTeasable
com.coremedia.blueprint.cae.contentbeans.CMHasContextsImpl
com.coremedia.blueprint.cae.contentbeans.CMHasContextsBase
com.coremedia.blueprint.common.contentbeans.CMHasContexts
com.coremedia.blueprint.cae.contentbeans.CMLinkableImpl
com.coremedia.blueprint.cae.contentbeans.CMLinkableBase
com.coremedia.blueprint.common.contentbeans.CMLinkable
com.coremedia.blueprint.common.navigation.Linkable
com.coremedia.blueprint.common.navigation.HasViewTypeName
com.coremedia.blueprint.common.contentbeans.BelowRootNavigation
com.coremedia.blueprint.common.datevalidation.ValidityPeriod
com.coremedia.blueprint.cae.contentbeans.CMLocalizedImpl
com.coremedia.blueprint.cae.contentbeans.CMLocalizedBase
com.coremedia.blueprint.common.contentbeans.CMLocalized
com.coremedia.blueprint.cae.contentbeans.CMObjectImpl
com.coremedia.blueprint.cae.contentbeans.CMObjectBase
com.coremedia.blueprint.common.contentbeans.CMObject
com.coremedia.objectserver.beans.AbstractContentBean
com.coremedia.objectserver.beans.ContentBean
com.coremedia.objectserver.dataviews.AssumesIdentity
java.lang.Object
com.coremedia.objectserver.view.ViewException: Error rendering view
at com.coremedia.objectserver.view.ViewUtils.rethrow(ViewUtils.java:344)
at com.coremedia.objectserver.view.freemarker.FreemarkerViewEngine$FreemarkerView.render(FreemarkerViewEngine.java:154)
at com.coremedia.objectserver.view.DebugViewDecorator$DebugDecorator.decorate(DebugViewDecorator.java:128)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingBaseView.render(ViewDecoratorBase.java:344)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingServletAndTextView.render(ViewDecoratorBase.java:428)
at com.coremedia.objectserver.view.ExceptionHandlingViewDecorator$ExceptionDecorator.decorate(ExceptionHandlingViewDecorator.java:135)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingBaseView.render(ViewDecoratorBase.java:344)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingServletAndTextView.render(ViewDecoratorBase.java:428)
at com.coremedia.objectserver.view.ViewUtils.render(ViewUtils.java:184)
at com.coremedia.objectserver.view.ViewUtils.render(ViewUtils.java:124)
at com.coremedia.objectserver.view.freemarker.impl.CAEFreemarkerFacadeImpl.include(CAEFreemarkerFacadeImpl.java:177)
at jdk.internal.reflect.GeneratedMethodAccessor139.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1634)
at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:73)
at freemarker.core.MethodCall._eval(MethodCall.java:62)
at freemarker.core.Expression.eval(Expression.java:101)
at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104)
at freemarker.core.DollarVariable.accept(DollarVariable.java:63)
at freemarker.core.Environment.visit(Environment.java:380)
at freemarker.core.Environment.visitAndTransform(Environment.java:511)
at freemarker.core.CompressedBlock.accept(CompressedBlock.java:42)
at freemarker.core.Environment.visit(Environment.java:380)
at freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:886)
at freemarker.core.Environment.invokeMacro(Environment.java:822)
at freemarker.core.UnifiedCall.accept(UnifiedCall.java:83)
at freemarker.core.Environment.visit(Environment.java:380)
at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:321)
at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271)
at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244)
at freemarker.core.Environment.visitIteratorBlock(Environment.java:654)
at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108)
at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
at freemarker.core.Environment.visit(Environment.java:344)
at freemarker.core.Environment.visit(Environment.java:350)
at freemarker.core.Environment.visit(Environment.java:350)
at freemarker.core.Environment.process(Environment.java:323)
at com.coremedia.objectserver.view.freemarker.FreemarkerViewEngine$FreemarkerView.render(FreemarkerViewEngine.java:150)
at com.coremedia.objectserver.view.DebugViewDecorator$DebugDecorator.decorate(DebugViewDecorator.java:128)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingBaseView.render(ViewDecoratorBase.java:344)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingServletAndTextView.render(ViewDecoratorBase.java:428)
at com.coremedia.objectserver.view.ExceptionHandlingViewDecorator$ExceptionDecorator.decorate(ExceptionHandlingViewDecorator.java:135)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingBaseView.render(ViewDecoratorBase.java:344)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingServletAndTextView.render(ViewDecoratorBase.java:428)
at com.coremedia.objectserver.view.ViewUtils.render(ViewUtils.java:184)
at com.coremedia.objectserver.view.ViewUtils.render(ViewUtils.java:124)
at com.coremedia.objectserver.view.freemarker.impl.CAEFreemarkerFacadeImpl.include(CAEFreemarkerFacadeImpl.java:177)
at jdk.internal.reflect.GeneratedMethodAccessor139.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1634)
at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:73)
at freemarker.core.MethodCall._eval(MethodCall.java:62)
at freemarker.core.Expression.eval(Expression.java:101)
at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104)
at freemarker.core.DollarVariable.accept(DollarVariable.java:63)
at freemarker.core.Environment.visit(Environment.java:380)
at freemarker.core.Environment.visitAndTransform(Environment.java:511)
at freemarker.core.CompressedBlock.accept(CompressedBlock.java:42)
at freemarker.core.Environment.visit(Environment.java:380)
at freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:886)
at freemarker.core.Environment.invokeMacro(Environment.java:822)
at freemarker.core.UnifiedCall.accept(UnifiedCall.java:83)
at freemarker.core.Environment.visit(Environment.java:344)
at freemarker.core.Environment.visit(Environment.java:386)
at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:321)
at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271)
at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244)
at freemarker.core.Environment.visitIteratorBlock(Environment.java:654)
at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108)
at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
at freemarker.core.Environment.visit(Environment.java:380)
at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:321)
at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271)
at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244)
at freemarker.core.Environment.visitIteratorBlock(Environment.java:654)
at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108)
at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
at freemarker.core.Environment.visit(Environment.java:344)
at freemarker.core.Environment.visit(Environment.java:350)
at freemarker.core.Environment.process(Environment.java:323)
at com.coremedia.objectserver.view.freemarker.FreemarkerViewEngine$FreemarkerView.render(FreemarkerViewEngine.java:150)
at com.coremedia.objectserver.view.DebugViewDecorator$DebugDecorator.decorate(DebugViewDecorator.java:128)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingBaseView.render(ViewDecoratorBase.java:344)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingServletAndTextView.render(ViewDecoratorBase.java:428)
at com.coremedia.objectserver.view.ExceptionHandlingViewDecorator$ExceptionDecorator.decorate(ExceptionHandlingViewDecorator.java:135)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingBaseView.render(ViewDecoratorBase.java:344)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingServletAndTextView.render(ViewDecoratorBase.java:428)
at com.coremedia.objectserver.view.ViewUtils.render(ViewUtils.java:184)
at com.coremedia.objectserver.view.ViewUtils.render(ViewUtils.java:124)
at com.coremedia.objectserver.view.freemarker.impl.CAEFreemarkerFacadeImpl.include(CAEFreemarkerFacadeImpl.java:177)
at jdk.internal.reflect.GeneratedMethodAccessor139.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1634)
at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:73)
at freemarker.core.MethodCall._eval(MethodCall.java:62)
at freemarker.core.Expression.eval(Expression.java:101)
at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104)
at freemarker.core.DollarVariable.accept(DollarVariable.java:63)
at freemarker.core.Environment.visit(Environment.java:380)
at freemarker.core.Environment.visitAndTransform(Environment.java:511)
at freemarker.core.CompressedBlock.accept(CompressedBlock.java:42)
at freemarker.core.Environment.visit(Environment.java:380)
at freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:886)
at freemarker.core.Environment.invokeMacro(Environment.java:822)
at freemarker.core.UnifiedCall.accept(UnifiedCall.java:83)
at freemarker.core.Environment.visit(Environment.java:344)
at freemarker.core.Environment.visit(Environment.java:350)
at freemarker.core.Environment.process(Environment.java:323)
at com.coremedia.objectserver.view.freemarker.FreemarkerViewEngine$FreemarkerView.render(FreemarkerViewEngine.java:150)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingBaseView.render(ViewDecoratorBase.java:346)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingServletAndTextView.render(ViewDecoratorBase.java:428)
at com.coremedia.objectserver.view.ExceptionHandlingViewDecorator$ExceptionDecorator.decorate(ExceptionHandlingViewDecorator.java:135)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingBaseView.render(ViewDecoratorBase.java:344)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingServletAndTextView.render(ViewDecoratorBase.java:428)
at com.coremedia.objectserver.view.ViewUtils.render(ViewUtils.java:184)
at com.coremedia.objectserver.view.ViewUtils.render(ViewUtils.java:124)
at com.coremedia.objectserver.view.freemarker.impl.CAEFreemarkerFacadeImpl.include(CAEFreemarkerFacadeImpl.java:177)
at jdk.internal.reflect.GeneratedMethodAccessor139.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1634)
at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:73)
at freemarker.core.MethodCall._eval(MethodCall.java:62)
at freemarker.core.Expression.eval(Expression.java:101)
at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104)
at freemarker.core.DollarVariable.accept(DollarVariable.java:63)
at freemarker.core.Environment.visit(Environment.java:380)
at freemarker.core.Environment.visitAndTransform(Environment.java:511)
at freemarker.core.CompressedBlock.accept(CompressedBlock.java:42)
at freemarker.core.Environment.visit(Environment.java:380)
at freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:886)
at freemarker.core.Environment.invokeMacro(Environment.java:822)
at freemarker.core.UnifiedCall.accept(UnifiedCall.java:83)
at freemarker.core.Environment.visit(Environment.java:344)
at freemarker.core.Environment.visit(Environment.java:350)
at freemarker.core.Environment.process(Environment.java:323)
at com.coremedia.objectserver.view.freemarker.FreemarkerViewEngine$FreemarkerView.render(FreemarkerViewEngine.java:150)
at com.coremedia.objectserver.view.freemarker.FreemarkerViewEngine$FreemarkerView.render(FreemarkerViewEngine.java:122)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingBaseView.render(ViewDecoratorBase.java:336)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingServletAndTextView.render(ViewDecoratorBase.java:422)
at com.coremedia.objectserver.view.ExceptionHandlingViewDecorator$ExceptionDecorator.decorate(ExceptionHandlingViewDecorator.java:113)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingBaseView.render(ViewDecoratorBase.java:334)
at com.coremedia.objectserver.view.ViewDecoratorBase$DecoratingServletAndTextView.render(ViewDecoratorBase.java:422)
at com.coremedia.objectserver.view.ViewUtils.render(ViewUtils.java:152)
at com.coremedia.objectserver.view.ViewUtils.render(ViewUtils.java:109)
at com.coremedia.objectserver.view.BeanView.renderMergedOutputModel(BeanView.java:63)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:314)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1438)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1168)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1106)
at com.coremedia.objectserver.web.DispatcherServlet.doDispatch(DispatcherServlet.java:69)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at com.coremedia.blueprint.cae.filter.PreviewViewFilter.doFilterInternal(PreviewViewFilter.java:48)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at com.coremedia.blueprint.cae.filter.SiteFilter.doFilter(SiteFilter.java:64)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:479)
at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:340)
at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:82)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:128)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:117)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:238)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:732)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.IllegalArgumentException: No link scheme found for com.coremedia.blueprint.cae.contentbeans.CMChannelImpl$$[id=228136] [class=class com.coremedia.blueprint.cae.contentbeans.CMChannelImpl$$]
at com.coremedia.objectserver.web.links.LinkFormatter.lambda$formatLink$1(LinkFormatter.java:99)
at java.base/java.util.Optional.orElseThrow(Optional.java:403)
at com.coremedia.objectserver.web.links.LinkFormatter.formatLink(LinkFormatter.java:98)
at de.telekom.cms.common.links.LinkService.getUrl(LinkService.java:187)
at de.telekom.cms.common.links.LinkService.createLinkToTeasable(LinkService.java:778)
at de.telekom.cms.common.links.LinkService.createLinkForTeasable(LinkService.java:575)
at de.telekom.cms.common.links.LinkService.linkFor(LinkService.java:556)
at de.telekom.cms.common.links.LinkService.linkFor(LinkService.java:521)
at jdk.internal.reflect.GeneratedMethodAccessor173.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1634)
at freemarker.ext.beans.ReflectionCallableMemberDescriptor.invokeMethod(ReflectionCallableMemberDescriptor.java:56)
at freemarker.ext.beans.MemberAndArguments.invokeMethod(MemberAndArguments.java:51)
at freemarker.ext.beans.OverloadedMethodsModel.exec(OverloadedMethodsModel.java:62)
at freemarker.core.MethodCall._eval(MethodCall.java:62)
at freemarker.core.Expression.eval(Expression.java:101)
at freemarker.core.Assignment.accept(Assignment.java:134)
at freemarker.core.Environment.visit(Environment.java:344)
at freemarker.core.Environment.visit(Environment.java:350)
at freemarker.core.Environment.process(Environment.java:323)
at com.coremedia.objectserver.view.freemarker.FreemarkerViewEngine$FreemarkerView.render(FreemarkerViewEngine.java:150)
... 269 more

NarrowBand IoT & LTE-M

Abstract lines and dots connecting above a highway at night.

NarrowBand IoT & LTE-M

When energy consumption, building penetration, battery life and, most importantly, cost are key considerations in IoT projects, NB-IoT and LTE-M are the right cellular standards for wireless networking. Learn more about these breakthrough technologies.

Potrait photo Kerstin Koch

Kerstin Koch

Marketing Manager IoT

Since 2016, Kerstin has been part of the IoT journey at Deutsche Telekom. Over the years, she has supported numerous marketing and cultural projects – always with the goal of making IoT tangible and relevant. She translates complex topics into clear, user-focused language and puts real customer success stories front and center. In the IoT blog, she highlights selected use cases and references, showing how companies create measurable value with IoT.

Curious? Find out more now:

IoT security: recognising and closing security gaps

In modern companies, more and more devices are communicating with each other in real time. However, the stronger the networking, the greater the attack surface, as every IoT device is a potential gateway into the company network. Find out here what risks exist and how you can protect your systems effectively.

Read article