Case studies › Panel HMI w energetyce · Energetyka · HMI / SCADA · 2026

Nowy moduł. Dwa tygodnie. Klient kontynuuje sam.

Operator infrastruktury energetycznej potrzebował nowego modułu raportowania w istniejącym panelu operatorskim Qt/QML. Od pierwszego szkicu interfejsu do podpisu odbioru — dwa tygodnie. Najistotniejszy efekt: zespół po stronie klienta przejął kod i bez naszego udziału dorobił już trzy kolejne widoki. Skala pilota: tak wygląda pierwszy kwartał przy zespole 3–4 osób. Przy 30+ pracujemy falami, zespół po zespole.

Oszroniony przemysłowy panel HMI ze światłem interfejsu pod lodem
nowy moduł → 2 tygczas dostarczenia
Pełny + dokumentacjatransfer wiedzy
Klient rozwija samstatus po 3 mc · Qt 6 · QML · C++17

01 / Kontekst klienta

Panel operatorski w stacjach. Moduł raportowania odkładany od półtora roku.

Operator infrastruktury energetycznej średniego napięcia — kilkadziesiąt stacji rozdzielczych, dziesiątki tysięcy klientów końcowych. Panel operatorski na bazie Qt/QML, działający na lokalnych stanowiskach w stacjach. Wymaganie: nowy moduł raportowania zużycia z eksportem do CSV i wizualizacją trendów godzinowych — z integracją z OPC UA z istniejącego systemu SCADA.

Zespół po stronie klienta: dwóch programistów C++ z 10+ letnim stażem, jeden frontendowiec QML z 3 latami, jeden integrator SCADA. Wcześniej tworzyli aplikacje desktopowe na Qt 5, ale migracja na Qt 6 i nowy moduł raportowania były odkładane od półtora roku — „nikt nie ma czasu zacząć".

02 / Kto to prowadził

Dwie osoby, 12 dni do odbioru, klient dorabia kolejne widoki sam.

Maciej StopaLead operacyjny
Migracja Qt 5 → Qt 6, wzorzec MVVM z separacją logiki i widoku, ViewModel w C++17 (Catch2, dependency injection), integracja z OPC UA przez open62541.
Tomek WojciechowskiAI workflow dopasowany do QML
QML jest słabo wspierany przez modele językowe out-of-the-box — Tomek napisał CLAUDE.md z listą anti-patternów (240 linii), których AI domyślnie nie zna. Do tego setup QML Tests i screenshotów regresyjnych.

03 / Problem · Co naprawdę bolało

Dług architekturalny i AI, które proponowało anti-patterny QML.

  • Wewnętrzny dług architekturalny. Aplikacja na Qt 5 z mieszanką QWidget i QML, bez wzorca MVVM, bez wyraźnego rozdziału logiki od widoku. Każdy nowy widok powielał błędy starych.
  • Brak wzorca pracy dla nowych widoków. Każdy programista robił to po swojemu. Code review trwało tygodnie, bo nie było wspólnego punktu odniesienia.
  • Migracja Qt 5 → Qt 6 odkładana w nieskończoność. Ze strachu, że „połamiemy to, co działa".
  • QML słabo wspierany w narzędziach AI. Zespół próbował AI-coding, ale Claude/Copilot proponowały zwykle anti-patterny QML — kod, który działał, ale nie skalował się.

04 / Podejście SZRON

Nie nowy moduł — wzorzec, który zespół powiela.

Diagnoza pokazała, że problem nie jest tym, co robić, tylko jak ustawić wzorzec, żeby zespół mógł powielać. Sam nowy moduł raportowania to było 3–4 dni pracy. Pozostałe 8 dni z 2-tygodniowego sprintu poświęciliśmy na to, co zostaje na stałe.

  • Migracja Qt 5 → Qt 6 jako warunek wstępny. Nie chcieliśmy budować nowego modułu w starym frameworku. Migracja zajęła 3 dni, wykonana wspólnie z zespołem klienta — ze szczegółowym opisem każdej różnicy w CLAUDE.md.
  • Wzorzec MVVM z separacją logiki/widoku. ViewModel w C++17 (testowalny w Catch2), View w QML (deklaratywny, bez logiki biznesowej). Jeden konkretny przykład, który zespół potem powiela.
  • CLAUDE.md dla QML. Lista anti-patternów (kiedy nie używać Connections, jak nie tworzyć cykli w property bindings, kiedy preferować deklaratywne nad imperatywne). To, czego AI nie wiedziało domyślnie.
  • Test bench dla QML. Setup QML Tests + automatyczne screenshoty regresyjne — żeby zespół miał feedback szybciej niż „kompiluj i kliknij".
Nie zbudowaliśmy „panelu raportów" — zbudowaliśmy wzorzec, który zespół powiela. Pierwszy widok zrobiliśmy razem. Drugi zrobili sami, po code review wewnątrz zespołu. Trzeci i czwarty — nie wiedzieliśmy nawet, że już powstały, dopóki nie zobaczyliśmy ich w raporcie po 3 miesiącach.
Dlaczego to się udało — wniosek SZRON

05 / Przebieg projektu · 2 tygodnie do odbioru

Od migracji po handoff — w 14 dni.

Dni 1–3

Migracja Qt 5 → Qt 6 + setup

Pełna migracja istniejącej aplikacji. Setup nowego repo struktury MVVM, CLAUDE.md, QML Tests. Pierwsze parowania z zespołem.

Dni 4–6

Wzorzec pierwszego widoku

Implementacja ViewModel-a i widoku QML „Raport zużycia godzinowego" — od stałej w C++ do kliknięcia w UI. Code review prowadzone razem z zespołem klienta.

Dni 7–9

Integracja z OPC UA

Wpięcie do istniejącej warstwy SCADA. Eksport CSV, wizualizacja trendów. Drugi widok („Trendy tygodniowe") prowadzony już samodzielnie przez ich programistę QML.

Dni 10–12

Testy końcowe + dokumentacja

Testy regresyjne na danych produkcyjnych z jednej stacji. Dokumentacja architektury i wzorca dla zespołu.

Dni 13–14

Odbiór + handoff

Pokaz dla zarządu, podpisany odbiór. Sesja Q&A z zespołem.

06 / Wynik · Najlepszy widać po 3 miesiącach

Najlepszy efekt widać dopiero po trzech miesiącach.

3–4× szybciej2 tygodnie zamiast 6–8 w zespole
3 widoki samodzielniedorobione przez zespół po naszym wyjściu
0% → 41%pokrycie testami QML
Czas dostarczenia2 tygodnie
2 tygodnie zamiast szacowanych 6–8 tygodni w wewnętrznym zespole (3–4× szybciej).
Trzy kolejne widokibez naszego udziału
Dorobione przez zespół samodzielnie w 3 miesiące po naszym wyjściu. Zero kontaktu z SZRON-em poza jednym pytaniem o property binding.
Migracja Qt 5 → Qt 6„w gratisie"
Zrobiona przy okazji. Wcześniej leżała półtora roku.
Czas code reviewz tygodni na dni
Z tygodni na 1–2 dni. Dzięki wspólnemu wzorcowi i checkliście w CLAUDE.md zespół wie, czego szukać.
Pokrycie testami QMLpierwsze testy frontendowe
Z 0% do 41%. Pierwszy zespół w organizacji klienta, który ma testy frontendowe.
Najfajniejsze nie było to, że dostaliśmy działający moduł. Najfajniejsze jest to, że trzy miesiące później dorobiliśmy trzy kolejne — same, bez SZRON-u. I wiemy, że nie powstaną gorsze.
Programista QML — operator energetyczny (NDA) · współpraca z Maciejem Stopą i Tomkiem Wojciechowskim

07 / Stack technologiczny

Qt 6 / QML, C++17 i MVVM ze ścisłym rozdziałem.

Framework UIQt 6.6 / QML
Qt 6.6 / QML, QtQuick 2, QtCharts.
JęzykC++17 + QML
C++17 dla ViewModel-i, QML dla widoków.
WzorzecMVVM
MVVM ze ścisłym rozdziałem logiki i widoku, dependency injection przez konstruktor.
KomunikacjaOPC UA + CSV
OPC UA (open62541), CSV export, integracja z istniejącą bazą Postgres przez warstwę SCADA.
PlatformaLinux embedded
Linux embedded (Yocto custom), x86-64, ekrany dotykowe 19".
TestyCatch2 + QML Tests
Catch2 dla C++ ViewModel-i, QML Tests + screenshoty regresyjne.
AI workflowClaude Code
Claude Code z CLAUDE.md (240 linii — głównie reguły dla QML i wzorca MVVM).

08 / Co zostało po nas

Działający moduł, żywy szablon MVVM i Qt 6 pod kolejną dekadę.

01

Działający moduł raportowania zużycia

Wdrożony na 12 stacjach, w produkcji od pierwszego dnia po odbiorze.

02

Wzorzec MVVM jako żywy szablon

Repo z przykładami, do których zespół wraca przy każdym nowym widoku.

03

Aplikacja na Qt 6

Wcześniej leżała półtora roku, teraz fundament pod kolejną dekadę rozwoju.

04

CLAUDE.md dla AI w kontekście QML

Żywy dokument, który zespół rozszerza, gdy znajduje nowy anti-pattern.

Wasza aplikacja Qt też wymaga modernizacji?

Qt/QML też się da. Z transferem wiedzy włącznie.

30-minutowa rozmowa — pokażemy, czy migrację Qt 5 → Qt 6 da się ogarnąć przy okazji nowego feature'u, czy wymaga osobnego sprintu.