Installed, running, stopped — and none of it says the bus is up
The KNXD Add-on has a lifecycle you already recognize from every other Home Assistant add-on: add a repository, install, start, restart, stop, remove. What is different here is that the thing at the other end of the daemon moves lights, blinds and HVAC in a building somebody is standing in. So this part treats each of those states as an evidence layer rather than as progress, walks the gates that have to close before any of them may be pressed, and then does two paper exercises — classifying serial-interface candidates without writing down anything that identifies a site, and picking a driver family from pinned documentation instead of from a product name.
A running daemon is a statement about a process, not about a bus
The Add-on details page in Home Assistant can tell you a small number of things, and it is worth being precise about which ones. It can tell you the Add-on is installed. It can tell you the process is running or stopped. It can tell you the instance has been removed. And, in a future approved exercise, a briefly viewed log can tell you that a de-identified category of message appeared.
That is the whole list. None of it establishes a result for the KNX interface, the bus, ETS, the Home Assistant KNX integration, group operations, or physical control. A running Add-on does not prove the bus is connected.
Think of the daemon as a service counter with a translator behind it. Installing is moving the counter into the building. Starting it is the translator arriving for the shift. Restarting is a shift change, stopping is the translator going home, removing is the counter being carted out again. Every one of those is a fact about the counter. None of them is a fact about whether the shutters between that counter and the street have been raised, or whether anybody outside has walked up to it yet.
flowchart LR
subgraph OUT["Layers this part cannot reach"]
direction LR
O1["A driver is loaded"] --> O2["An interface answers"] --> O3["The KNX bus carries telegrams"] --> O4["A luminaire actually switches"]
end
subgraph IN["What the Add-on page can show"]
direction LR
I1["installed"] --> I2["running"] --> I3["stopped"] --> I4["removed"]
end
Cross-layer inference is the mistake this part exists to prevent. Program state, driver, interface, listener and bus are separate evidence layers, and reading one of them upward into another is how an installer ends up telling a client the system is live when nothing has touched the bus at all.
The isolated-test gate, checked one item at a time
Before the repository is added and before the Add-on is installed, the administrator present verifies each of six conditions. Only a non-production Home Assistant test instance is eligible to continue. These are checked individually, not waved through as a group.
- A non-production test instance. Not a system providing service in a home, an office or a customer site. If it is doing a job for somebody right now, it is out of scope.
- No device paths mapped. The system has no KNX, USB or other device paths mapped into it.
- Interface and bus disconnected. The physical interface and the bus stay disconnected, and there is no alternative connection by which the test program could reach a field device.
- Bounded network scope. Any services that may be enabled stay inside the bounded network test scope the administrator approved, and cannot be reached inadvertently from a general local network or from the public internet.
- Backups and roles reviewed first. Pre-installation Home Assistant backups, a minimal recovery method, and the roles responsible for stopping, removing or restoring have all been reviewed before anything begins.
- An administrator present throughout. Someone with Add-on management rights stays present for the whole process and can stop immediately if anything behaves unexpectedly.
If any one of those cannot be proven, stop before adding the repository and before installing. A Home Assistant instance in production use cannot install Add-ons that have not passed this gate — there is no reduced version of it for a system that is only mostly idle.
Everything from here on is performed manually, step by step, by the administrator present. No shells, no APIs, no scripts, no automation. That constraint is not fussiness about tooling; it is what makes each step individually stoppable.
Eight fields, and the ones that must stay out of them
A privacy-safe change record is established before operation, not written up afterwards. It splits in two: only identifiers with no environmental clues go into public or educational records, while the private approval, the precise operating scope and the six pieces of isolation evidence stay in access-controlled records. If one of the eight fields is missing, the work does not continue.
| Field | What goes in it |
|---|---|
| Change / approval record ID | An organization-issued privacy-safe ID carrying no name, host, address or time clue. This guide deliberately publishes no sample value, because a sample value can be reused as though it were a real record |
| Controlled record reference | Only a reference that authorized personnel can retrieve. It ties to the private approval, the precise operating scope and the six items of isolation evidence — with no name, no system path and no link to a public page |
| Approver role | The role only, never a person's name. “Home Assistant administrator” is the shape of it. Evidence of the private approval stays in the controlled record |
| Approved actions and scope | Item by item, whether this approval covers adding a repository, installing, starting once, restarting once, stopping, removing, or backup and restore. The precise scope does not include the KNX interface, the bus, telegrams, ETS or physical equipment |
| Isolation evidence reference | The controlled record behind the six checks above. It discloses only the conforming / non-conforming / unknown classification, never the environmental values behind them |
| Approval date and time | Kept in the controlled record. The public guide shows only that the status is recorded, so that a timestamp cannot cascade into identifying live-environment activity |
| Stop conditions | The stop conditions binding for this particular action. Isolation fails, a status is unknown, proofs are inconsistent, or behavior is unexpected — any of those means stop immediately |
| Privacy boundaries | The explicit list of what is never recorded, restated in the record itself so that the person filling it in has it in front of them |
That last field is worth spelling out, because it is the one people fill in from memory and get wrong. None of the following belongs in the record:
host namehost IDIP addressKNX addressUSB serial numberdevice pathaccountpasswordtokencertificateA pinned commit and a store version answer different questions
This series is built on a source lock. It pins da-anda/hass-io-addons at commit 60d4a702e2011e75c90a0f1012dfbd916eb24ce0, which declares Add-on version 0.6.1. That is a real and useful thing to have, and it proves exactly one thing: the content of the source at that commit.
It does not prove that the image Home Assistant would fetch and install was built from that commit. The 0.6.1 the store displays is mutable text on a page. It is not build evidence, and it cannot be promoted into build evidence by being read carefully.
You have a recipe in a book, and the page number is written down so anybody can turn to the same page. Then a sealed box arrives at the door with the name of the dish printed on the label. The recipe is not in question. What nobody has checked is whether what is inside the box came out of the kitchen that recipe belongs to. The label on the box is the store version. The seal you have not yet verified is the artifact digest.
Three conditions turn a mutable display into immutable build evidence, and all three have to hold at once.
An approved digest
The controlled record holds an artifact or image digest approved by the administrator, and the algorithm has been checked against the full digest — not a truncated prefix that happens to match.
Attestation back to the source
There is verifiable source-to-build attestation, and it ties that digest to the pinned commit and to the build process. The digest identifies the actual build bytes; the attestation is what connects those bytes back to the pinned source.
Verifiable at fetch time
The operator can verify that the artifact Home Assistant will actually retrieve is the approved digest. Not the name. Not the version text. The digest of the thing being pulled.
Put the three gates in order and the decision has a fixed shape. It is not a scoring exercise where a strong pass on one gate compensates for a gap in another.
flowchart TD A["A lifecycle action is proposed:
add repository, install, start,
restart, stop, remove, restore"] --> B{"All six isolation
conditions proven?"} B -->|"no, or unknown"| S["Stop before the change.
Record it as blocked"] B -->|"yes"| C{"Privacy-safe approval
record complete?"} C -->|"a field is missing"| S C -->|"yes"| D{"Artifact digest and
source-to-build attestation
approved and verifiable?"} D -->|"no. This site has neither"| S D -->|"yes"| E{"Administrator present
for the whole action?"} E -->|"no"| S E -->|"yes"| F["One approved action,
by hand, confirmed step by step"]
What each lifecycle step would look like, and where it stops
What follows describes interface landmarks, the observable state you would expect, and the point at which you stop — deliberately written to survive version differences in the Home Assistant interface. An administrator may perform these manually, using the then-current Home Assistant documentation, and only once the controlled records satisfy every gate above. Seven actions, in this order.
-
1
Add the repository
With the approval record and the artifact digest evidence both valid, find the Add-on management landmark from the Home Assistant configuration area, then follow the official documentation into repository management. Once added, accept only the list of approved repository identities. Stop if the items differ from what was approved, if the source is unrecognizable, or if the interface makes you guess. This site currently lacks an approved digest, so do not execute it.
-
2
Install, manually, into a clean instance
With both proofs still valid, find the KNXD details page for the approved source in the add-on store. After installation the page should let you distinguish the installed state from the lifecycle control area. Do not read the store version as a statement about which commit you got. If it starts automatically, or if it asks for real KNX values, stop immediately. This site currently lacks an approved digest, so do not execute it.
-
3
Start, once
While both proofs remain valid, the administrator present may use the start control on the details page once. The expected observation is narrow: the Add-on process moves from a stopped state to a running state, in whatever wording that version uses. That is the entire observation, and it does not prove the bus is operational. This site currently lacks an approved digest, so do not perform this step.
-
4
Restart, once
Use the restart control once, and only while both proofs remain valid and you can explain the previous state. Expect a brief transition and a return to the running state. If the state is unclear afterwards, stop rather than retry — a second restart to see whether it looks better the second time is a change made without an explanation. This site currently lacks an approved digest, so do not perform this step.
-
5
Stop
Use the stop control when the controlled approval scope includes stopping and the preceding evidence is still valid. The expected state is no longer running, but stopped. Do not repeat the operation because the screen has not changed — stay isolated and fall back to the stop-and-restore guidance instead. No operation has been performed on this site, so there is nothing here to stop.
-
6
Remove
Only when the approval scope includes removal and the Add-on has already been stopped, identify the removal or uninstall action from the details page. Expect the installed state and the lifecycle controls for that instance to disappear, or the page to return to an installable state. That does not prove Home Assistant as a whole has been restored. Nothing has been installed through this site, so there is nothing here to remove.
-
7
Restore
Only when backup coverage is fully consistent with the controlled approval, the administrator selects the pre-verified recovery point from the Home Assistant backup management landmark, reviews the scope of impact first, and then confirms. Expect to return only to the state that backup covers. Recheck the Add-ons and any other affected items afterwards. This site currently has no lifecycle changes that need restoring.
Stop, remove, restore: take the smallest response that fits
When something does need undoing, the instinct to reach for the backup first is the expensive one. Narrow the scope of the change before you choose the response.
flowchart TD
A["Something has to be undone"] --> B{"Did the change involve
only the Add-on?"}
B -->|"yes"| C["Stop the Add-on"]
C --> D["Remove the Add-on"]
D --> E["Confirm only: process not running,
instance gone. Not the same as
Home Assistant restored"]
B -->|"no, other changes happened"| F{"Does a pre-approved backup
cover exactly that scope?"}
F -->|"no"| G["Stay isolated and stop.
Do not widen the restore"]
F -->|"yes"| H["Administrator reviews backup time,
content and what else it covers,
then confirms by hand"]
H --> I["Recheck afterwards, by hand:
Home Assistant in range, Add-on in the
expected state, no unintended effects"]
Three things about the right-hand route are worth stating on their own. The administrator checks the backup time, the content, and what other changes that backup may quietly cover, before confirming. The Home Assistant official backup and restore process is followed as documented for that version. And after restoring, it is the administrator who confirms Home Assistant is back within the expected range, that the KNXD Add-on is in the expected stopped or removed state, and that there are no unintended effects. If any result is unclear, stay isolated and stop rather than continuing.
The three failures you are most likely to hit here
| What you are seeing | What to do about it |
|---|---|
| Digest or attestation missing | Remain blocked. Do not add another repository, and do not install a similar version from somewhere else in the hope that it is close enough |
| Process status unknown | Record the de-identified error category and stop. Do not fill in a bus value, do not change the driver, and do not connect the interface to see what happens |
| The log contains environmental information | Stop sharing it and delete the copy. If a secret has already been exposed, have the administrator revoke or rotate it |
What a finished pass through this section looks like
- You can state what a pinned commit proves. Source content, and nothing further. A store version does not stand in for an artifact digest with source-to-build attestation.
- You checked the six isolation conditions and the complete approval record before adding a repository or installing. The digest is missing, so no change was made.
- You can describe the observable scope of installed, running, stopped, removed and restored separately, without reading one of them into another.
- You did not connect the interface or the bus, did not send telegrams, did not perform group operations, did not perform ETS programming or downloads, and did not control physical equipment.
Next step from here: keep every KNX interface, device mapping and bus disconnected. When you need to interpret process status, interpret it as process status. Without artifact provenance, the only record you keep is the blocked one.
Classifying interface candidates without writing down a single device path
This is a paper exercise, and it takes about fifteen minutes. You are producing one thing: a candidate-classification table with no identifying information in it. You are not listing the devices a computer can see, and you are not identifying suitable hardware. Filling the sheet in completely still establishes nothing about hardware compatibility.
There is no live enumeration step in this chapter and none is provided. Do not prepare terminal commands, device lists or screenshots. Do not view real device paths and do not copy serial numbers. If existing material already contains any of that, stop transferring it and handle it under the safe log-sharing rules from the previous section.
A cloakroom hands you two tickets, numbered 1 and 2. The ticket does the one job it needs to do: it tells you these are two different items rather than the same item written down twice. It does not tell you what the coats are made of, whose they are, or which hook they hang on — and the cloakroom is designed that way on purpose, because a ticket that told you all of that would be a security problem the moment somebody dropped it.
The sheet has five columns and starts empty. Create the fields; do not fill in any environment values.
| Column | What it holds |
|---|---|
| Candidate codename | A meaningless label — Candidate A, Candidate B. Never derived from a path, a serial number, a model or a location |
| Data category | One of three: a documented fact, an item pending manual review, or information that must not be disclosed |
| Field role | Whether this data might be an interface input. The role, not the value |
| Current conclusion | Always starts at hardware suitability not proven, and stays there for the length of this exercise |
| Reason for stopping | An unapproved record, data that might identify an environment, or a source-version mismatch |
Six steps, all of them on offline paper. You do not need to touch the execution environment for any of them.
-
1
Write the shared conclusion at the top first
Put it in the header, before any rows exist: this list is for candidate classification only; hardware compatibility, driver operation and bus status have not been confirmed. Writing it first means every row inherits it, rather than each row having to earn a caveat later.
-
2
Create neutral codenames
When you need to distinguish between de-identified records you already hold, label them
Candidate AandCandidate Bin order. Do not generate a code from a path, a serial number, a model or a location — a codename that encodes any of those is still the thing it encodes. -
3
Classify each record by role
Each item goes into one of three buckets: documented fact, pending manual review, or must not be disclosed. If there is not enough content to place it, mark it unknown and leave it there.
-
4
Write down what is not proven
For every candidate, mark hardware identity, driver family, usability and KNX bus status as unconfirmed. Four marks, on every row, every time.
-
5
Apply the stop condition
If classifying a record would require looking at an actual path, a serial number, a host or a live device list, stop. Do not work toward the answer in small probing steps — a sequence of small lookups is the same disclosure as one large one.
-
6
Hand it to somebody else to review
Deliver only the de-identified classification sheet. Ask the reviewer to confirm two things: that there is no environment-identifying information in it, and that it makes no compatibility claims.
flowchart LR A["One de-identified record
in front of you"] --> B["Label it Candidate A,
Candidate B, in order"] B --> C{"Which category
does it fall into?"} C --> D["Documented fact"] C --> E["Pending manual review"] C --> F["Must not be disclosed"] D --> G["Conclusion column, every row:
hardware suitability unproven"] E --> G F --> G
Three judgments exist in this table and no others: the source document has explained it, it needs manual review, or it is beyond this chapter. When you see that a candidate exists, the strongest thing you may write is “there is a record to classify.” Not “interface found.” Not “available.”
When the sheet starts drifting
| Symptom | Correction |
|---|---|
| You are not sure where a candidate came from | Mark it unknown source and stop. Do not go back to the live system to find out |
| A codename hints at a model or a location | Change it back to a meaningless letter code, and delete the old copy rather than keeping it for reference |
| A colleague asks for the real path | Do not provide it. Convert the request into a question the sheet can answer: which field role needs review? |
| The table has started to look like a compatibility list | Add hardware suitability not confirmed to every column, and strike out words like “recommended” or “confirmed” |
| Somebody suggests starting the candidates one at a time to see | Stop. Starting software is not part of a classification exercise, and it does not bypass the isolation, approval and artifact-provenance gates |
Choosing a driver family from documentation, not from the connector
A driver family is the set of rules by which the software and the interface talk to each other. The temptation, with hardware in front of you, is to pick one from the product name, the shape of the connector or an article somebody linked to. That is exactly the inference this chapter refuses.
A translation desk keeps a rack of instruction cards, one per language. Pulling out the card marked Portuguese tells the desk which set of rules to follow. It does not make the person standing in front of the desk a Portuguese speaker. Matching a name is a fact about the card rack. Whether the conversation works is a fact about the person, and you find that out from somewhere else entirely.
So there are two questions, and a candidate needs a yes to both.
The Add-on 0.6.1 schema accepts nine interface names. These are allowed values, not recommendations, and the presence of a default among them is a schema fact rather than an endorsement:
tpuarttpuart-ipusbft12ft12cemincn5120ncn5120-ipiptdummyIn the upstream KNXD 0.14.72 INI documentation pinned for this chapter, the driver-family terms that can be compared directly are three:
tpuartft12ft12cemiThat supports terminology and documentation coverage. It supports nothing about actual hardware compatibility. A name appearing in both places makes a documented candidate for manual review, and that is the whole of what it makes.
The decision card you fill in is offline and carries no product name, device path, serial number, host, IP address or endpoint. Five fields:
- Requirement category. Only the role — something like a device-type input or an endpoint-type input. Not the make, not the model, not the value.
- Add-on name evidence. Yes, no, or unknown.
- Upstream file documentation. Yes, no, or unknown.
- Manual review status. Pending review, or stopped.
- Non-conclusion. Local hardware compatibility, driver startup and bus status have not been confirmed. This field is not optional and it does not get shortened.
Then work through it in order. Write the required role first. Check the candidate name against the pinned enumeration for Add-on 0.6.1, and if it is not there, stop rather than adjusting the name yourself. Check that upstream 0.14.72 explicitly describes a driver family of the same name; similar names do not count. Keep at most one candidate — when both documents are clear, write “documented candidate, pending manual review,” and when two candidates remain or no answer is clear, make no selection at all. Add the non-conclusion in full: hardware compatibility has not been proven, drivers have not been loaded, services have not been started, and the bus has not been contacted. Then stop at the file level and submit the card to the approval process. Do not attempt a start, and do not use live logs to favor one candidate over another.
flowchart TD A["A driver-family name
somebody wants to use"] --> B{"Is the name in the Add-on 0.6.1
schema enumeration?"} B -->|"no"| X["No selection.
Write down the documentation gap
and send it to manual review"] B -->|"yes"| C{"Does upstream 0.14.72
document a family with
exactly that name?"} C -->|"no, or only a similar name"| X C -->|"yes"| D{"Is exactly one
candidate left?"} D -->|"no, two or more"| X D -->|"yes"| E["Documented candidate,
pending manual review.
Hardware compatibility still unproven"]
The five arguments that will be made to you
| What comes up | The answer |
|---|---|
| The Add-on accepts the name, but there is no upstream description | Insufficient evidence. A schema name on its own does not establish family correspondence |
| The names are similar but not identical | Treat them as different names. Do not infer a match from a prefix, a suffix or a product description |
| Two candidates are both documented | Choose neither. List the documentation gaps and send them to manual review |
| Somebody reads the source default as a recommendation | Remove the recommendation wording. A default in a source schema is a schema fact and nothing more |
| Somebody asks to start it and take a look | Stop. A test boot is not a file-level selection, and it proves nothing about hardware compatibility |
The ones that come up on every job
Can I install it on the Home Assistant we are already using, and just not start it?
What is the actual difference between stop, remove, and a backup restore?
Do I need to reset network isolation for this part?
Can I post an anonymized log to a project issue?
Does Candidate A correspond to an actual device?
Can you give me the commands for finding the device?
Can I hash a serial number and use the hash as the codename?
Once I have seen the candidates, can I choose a driver?
When is the classification table finished?
If the Add-on accepts the name, does that mean my hardware is supported?
Can I just take the source default?
Can I try a family that is not in the documentation, just to see?
If the daemon shows running, does that confirm the driver?
What does the candidate actually deliver to the approver?
Where to go from here
Addresses next, and the port nobody meant to open
Part 3 moves from process evidence to configuration fields: recognizing address and placeholder text without recording real values, and understanding what a KNXnet/IP listener exposes and who becomes responsible for it. Same gates, same pinned sources, and still no telegram on any bus.
Open the full guidePart 2 of the WoowTech KNXD Complete Tutorial series on the Apporo blog.
Adapted from the WoowTech KNXD complete tutorial, produced by WoowTech and republished by Apporo.
Versions and claims are bounded by the pinned sources. Publication does not represent validation of any live site, hardware, network or KNX bus, and is not an authorization to operate KNX, ETS, Home Assistant, group objects or physical control.
Light · Air · Water · Control · apporo