---
title: "IKB Case Study"
canonical: https://wavect.io/case-studies/ikb/
language: en
description: "IKB, Innsbruck's municipal utility (water, energy, waste, telecom), needed engineering hands for its city-scale smart-city build."
image: "https://wavect.io/img/general/bak/open_graph_preview.jpg"
---

[← All case studies](/case-studies/)

![IKB logo](/img/clients/bak/ikb.png)

CASE STUDIES

IKB

# Engineering inside Innsbruck's city-wide IoT build. Infra, devices, codecs. Handed over completely, still on call.

IKB (Innsbrucker Kommunalbetriebe) is the municipal utility of Innsbruck, Austria, water, energy, waste, telecom. They had a Smart City build underway and needed engineering hands to help take it to city scale.

ENTERPRISE IoT Infrastructure Live

At a glance

Engagement IoT Infrastructure

Industry [IoT / Smart City / Public Sector](/industries/public-sector-smart-city/)

Stage Enterprise

Engagement size Hourly rate

Year 2019-2023

Stack

Kubernetes LoRaWAN Docker JavaScript Node.js Linux

Status Live

Live [www.ikb.at](https://www.ikb.at/)

## Overview

IKB (Innsbrucker Kommunalbetriebe) is the municipal utility of Innsbruck, Austria, water, energy, waste, telecom. They had a Smart City build underway and needed engineering hands to help take it to city scale.

## What's the challenge?

Help take an in-flight Smart City build to city scale. Real streets, real devices from real vendors, none speaking the same dialect. LoRaWAN backbone on Kubernetes to extend and scale. Multi-manufacturer hardware to evaluate and integrate. Per-device uplink and downlink payloads to decode. Datasheets that did not always match the hardware.

## What call did we make?

### Every device, its own dialect. And every device, its own clock.

> IKB had work underway when we joined. Extending the LoRaWAN backbone to production scale was tractable. Writing codecs against datasheets that did not match the hardware in front of us was not. Every manufacturer handled packets its own way. Some devices spoke daily, some quarterly, some only when a water meter detected a leak. A wrong byte cost a full cycle to verify. We built a per-vendor codec workbench, captured real packets, replayed them offline.

## What We Did

We joined IKB’s in-flight Smart City build as part of the engineering taking it to city scale, against multi-vendor reality where no two devices speak the same dialect. Our lane was infrastructure and devices: extending the Kubernetes cluster running ChirpStack, field-testing water meters and cargo-bike trackers, and writing uplink decoders and downlink encoders. We handed the platform over to IKB’s in-house team completely and stayed on as external support for new device integrations, the Grafana stack, field connectivity, and manufacturer calls.

## Outcomes

### Complete - Platform Handover

### Multi-vendor - Research & Integration

Want outcomes like these on your build?

Fixed scope. Fixed deadline. Signed SoW.

[Get in touch](/contact/)

## What We Learned

City-scale IoT is a coordination problem dressed up as a hardware problem. Protocols are tractable. Datasheets are not. Every vendor documents things a little differently, every payload is its own dialect. Tight coordination across the whole stack is the only thing that works. The free [LoRaWAN payload codec tester](/tools/lorawan-payload-codec-tester/) packages the offline fixture workflow we used for those device dialects.

## Tech Stack

- [Kubernetes](https://kubernetes.io/)
- [LoRaWAN](https://lora-alliance.org/)
- [Docker](https://www.docker.com/)
- [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
- [Node.js](https://nodejs.org/)
- [Linux](https://www.kernel.org/)
- [ChirpStack](https://www.chirpstack.io/)
- [MQTT](https://mqtt.org/)
- [Grafana](https://grafana.com/)
- [PostgreSQL](https://www.postgresql.org/)

## Tags

- IoT
- Smart City
- LoRaWAN

## Links & Resources

[IKB](https://www.ikb.at/) [Smart City Lab](https://www.ikb.at/smart-city-lab)

Related services

- [Internet of Things](/services/internet-of-things/)
- [Custom Software Development](/services/software-development/)

Client references and trademarks

Wavect publishes these case studies about its own work. Client names, logos and trademarks are the property of their respective owners and are used here to identify the work, not to imply any partnership, sponsorship or endorsement. Each case study describes Wavect's own contribution inside a larger effort, and other parties, including the client's own teams and other vendors, contributed to the results. Figures attributed to a client are that client's own reported numbers. Figures about our work come from our records as of the review date, and we provide evidence on request. Reviews are reproduced from the platform named on each card and link to their source. We do not publish the commercial terms of any engagement, and product screenshots remain the property of the client shown. If you are named here and want a correction, a change or a removal, write to us and we will act on it: [office@wavect.io](mailto:office@wavect.io)

### [MyMerch](/case-studies/mymerch/)

MyMerch is a German merchandise and print-on-demand brand based at the Chiemsee. They sell custom apparel and branded goods through Shopify across more than 10 …

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/case-studies/ikb/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-05-21",
      "inLanguage": "en",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-05-21",
      "speakable": {
        "@type": "SpeakableSpecification",
        "cssSelector": [
          ".faq-question",
          ".faq-answer"
        ]
      },
      "url": "https://wavect.io/case-studies/ikb/"
    },
    {
      "@id": "https://wavect.io/verified-claims.json#ikb-complete-handover",
      "@type": "Claim",
      "appearance": {
        "@id": "https://wavect.io/case-studies/ikb/#webpage",
        "@type": "WebPage",
        "inLanguage": "en",
        "url": "https://wavect.io/case-studies/ikb/"
      },
      "author": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "dateModified": "2026-08-04",
      "identifier": "ikb-complete-handover",
      "inLanguage": "en",
      "text": "Wavect handed the IKB Smart City IoT platform over to IKB's in-house team completely and stayed on as external support."
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@id": "https://wavect.io/case-studies/ikb/#case-study",
  "@type": "Article",
  "about": {
    "@id": "https://wavect.io/case-studies/ikb/#project",
    "@type": "CreativeWork",
    "creator": {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ]
    },
    "dateCreated": "2019-01-01",
    "description": "IoT Infrastructure engagement",
    "funder": {
      "@type": "Organization",
      "name": "IKB"
    },
    "name": "IKB",
    "subjectOf": {
      "@id": "https://wavect.io/case-studies/ikb/#case-study",
      "@type": "Article"
    },
    "url": "https://www.ikb.at/"
  },
  "abstract": "Help take an in-flight Smart City build to city scale. Real streets, real devices from real vendors, none speaking the same dialect. LoRaWAN backbone on Kubernetes to extend and scale. Multi-manufacturer hardware to evaluate and integrate. Per-device uplink and downlink payloads to decode. Datasheets that did not always match the hardware.",
  "author": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "datePublished": "2019-01-01",
  "description": "IKB (Innsbrucker Kommunalbetriebe) is the municipal utility of Innsbruck, Austria, water, energy, waste, telecom. They had a Smart City build underway and needed engineering hands to help take it to city scale.",
  "headline": "IKB, Wavect Case Study",
  "image": "https://wavect.io/img/clients/bak/ikb.png",
  "inLanguage": "en",
  "isPartOf": {
    "@type": "CollectionPage",
    "name": "Wavect Case Studies",
    "url": "https://wavect.io/case-studies/"
  },
  "keywords": "IoT, Smart City, LoRaWAN, Kubernetes, LoRaWAN, Docker, JavaScript, Node.js, Linux, ChirpStack, MQTT, Grafana, PostgreSQL",
  "mainEntityOfPage": "https://wavect.io/case-studies/ikb/",
  "mentions": [
    {
      "@type": "DefinedTerm",
      "name": "Kubernetes",
      "url": "https://kubernetes.io/"
    },
    {
      "@type": "DefinedTerm",
      "name": "LoRaWAN",
      "url": "https://lora-alliance.org/"
    },
    {
      "@type": "DefinedTerm",
      "name": "Docker",
      "url": "https://www.docker.com/"
    },
    {
      "@type": "DefinedTerm",
      "name": "JavaScript",
      "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript"
    },
    {
      "@type": "DefinedTerm",
      "name": "Node.js",
      "url": "https://nodejs.org/"
    },
    {
      "@type": "DefinedTerm",
      "name": "Linux",
      "url": "https://www.kernel.org/"
    },
    {
      "@type": "DefinedTerm",
      "name": "ChirpStack",
      "url": "https://www.chirpstack.io/"
    },
    {
      "@type": "DefinedTerm",
      "name": "MQTT",
      "url": "https://mqtt.org/"
    },
    {
      "@type": "DefinedTerm",
      "name": "Grafana",
      "url": "https://grafana.com/"
    },
    {
      "@type": "DefinedTerm",
      "name": "PostgreSQL",
      "url": "https://www.postgresql.org/"
    }
  ],
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/case-studies/ikb/"
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/",
      "name": "Home",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/case-studies/",
      "name": "Case Studies",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/case-studies/ikb/",
      "name": "IKB",
      "position": 3
    }
  ]
}
```
