indeed 0.7.2 works now. It does say 0.7.1 though but is the new one.
yeap, just re-created the 0.7.2 with the 0.7.2 tag
just re-download.
This is my config file
{
"switch_module": [
{
"description": "Switch Module S1",
"model": "05-000-02",
"address": "B909",
"channels": [
{"description": "NB_S1_01_lichtWC"},
{"description": "NB_S1_02_lichtbadkamer"},
{"description": "NB_S1_03_lichtkeuken"},
{"description": "NB_S1_04_raamtransparant"},
{"description": "NB_S1_05_lichtbureauzij"},
{"description": "NB_S1_06_lampjesdressoirbovenuit"},
{"description": "NB_S1_07_lichtgarage"},
{"description": "NB_S1_08_lichttraphal"},
{"description": "NB_S1_09_buzzer"},
{"description": "NB_S1_10_siren"},
{"description": "NB_S1_11_lichteetplaats"},
{"description": "NB_S1_12_kastkinesis"}
]
},
{
"description": "Switch Module S2",
"model": "05-000-02",
"address": "2155",
"channels": [
{"description": "NB_S2_01_lichtnisbed"},
{"description": "NB_S2_02_lichtsterrenhemel"},
{"description": "NB_S2_03_lichtterras"},
{"description": "NB_S2_04_lichtoversteektuin"},
{"description": "NB_S2_05_lichtoversteekvoor"},
{"description": "NB_S2_06_lichtspotvoordeur"},
{"description": "NB_S2_07_lichtledvoordeur"},
{"description": "NB_S2_08_lichtleddressing"},
{"description": "NB_S2_09_lichtleddouche"},
{"description": "NB_S2_10_lichtkinesis"},
{"description": "NB_S2_11_lichtwcboven"},
{"description": "NB_S2_12_lichtlavabo"}
]
},
{
"description": "Switch Module S3",
"model": "05-000-02",
"address": "29FA",
"channels": [
{"description": "not_in_use NB_S3_01_"},
{"description": "not_in_use NB_S3_02_"},
{"description": "NB_S3_03_lichtbrievenbus"},
{"description": "NB_S3_04_lichtbrievenbusknop"},
{"description": "NB_S3_05_lichtbureaucentraal"},
{"description": "NB_S3_06_lichtbureaubed"},
{"description": "NB_S3_07_lichtbureaudownlight"},
{"description": "NB_S3_08_collectorventilosboven"},
{"description": "NB_S3_09_collectorheatingonly"},
{"description": "not_in_use NB_S3_10_"},
{"description": "not_in_use NB_S3_11_"},
{"description": "not_in_use NB_S3_12_"}
]
},
{
"description": "Switch Module S4",
"model": "05-000-02",
"address": "3162",
"channels": [
{"description": "NB_S4_01_lichtbos"},
{"description": "NB_S4_02_tuinpad"},
{"description": "NB_S4_03_LEDtuinhuis"},
{"description": "not_in_use NB_S4_04_"},
{"description": "not_in_use NB_S4_05_"},
{"description": "not_in_use NB_S4_06_"},
{"description": "not_in_use NB_S4_07_"},
{"description": "not_in_use NB_S4_08_"},
{"description": "not_in_use NB_S4_09_"},
{"description": "not_in_use NB_S4_10_"},
{"description": "NB_S4_11_groenpoortlinks"},
{"description": "NB_S4_12_groenpoortrechts"}
]
}
],
"dimmer_module": [
{
"description": "Dimmer Module D1",
"model": "05-007-02",
"address": "116D",
"channels": [
{"description": "NB_D1_01_LEDkeuken"},
{"description": "NB_D1_02_LEDrandboven"},
{"description": "not_in_use NB_D1_03"},
{"description": "not_in_use NB_D1_04"},
{"description": "not_in_use NB_D1_05"},
{"description": "NB_D1_06_LEDnachtlichtWC"},
{"description": "NB_D1_07_nachthal"},
{"description": "NB_D1_08_livingbureau"},
{"description": "NB_D1_09_livingtv"},
{"description": "NB_D1_10_spotdressingboven"},
{"description": "NB_D1_11_LEDfitness"},
{"description": "NB_D1_12_ventilatieunitboven"}
]
},
{
"description": "Dimmer Module D2",
"model": "05-007-02",
"address": "0E0A",
"channels": [
{"description": "NB_D2_01_buttonsbed"},
{"description": "NB_D2_02_ventilatieroosterbeneden"},
{"description": "NB_D1_03_ventilatieroosterboven"},
{"description": "NB_D1_04_climacanalliving"},
{"description": "NB_D1_05_ventilonachthal"},
{"description": "NB_D2_06_ventilobovenbed"},
{"description": "NB_D2_07_ventilobovenlavabo"},
{"description": "NB_D2_08_ventilobovenkinesis"},
{"description": "not_in_use NB_D2_09_"},
{"description": "not_in_use NB_D2_10_"},
{"description": "not_in_use NB_D2_11_"},
{"description": "not_in_use NB_D2_12_"}
]
}
],
"roller_module": [
{
"description": "Rollershutter Module R1",
"model": "05-001-02",
"address": "72C8",
"channels": [
{"description": "NB_R1_01_living_achter_groot", "operation_time": "45"},
{"description": "NB_R1_02_living_voor_groot", "operation_time": "70"},
{"description": "NB_R1_03_fitness_zij", "operation_time": "30"},
{"description": "NB_R1_04_bureau", "operation_time": "32"},
{"description": "NB_R1_05_nachthal", "operation_time": "28"},
{"description": "NB_R1_06_fitness_achter", "operation_time": "39"}
]
},
{
"description": "Rollershutter Module R2",
"model": "05-001-02",
"address": "7B05",
"channels": [
{"description": "NB_R2_01_schuifraam_buiten", "operation_time": "40"},
{"description": "NB_R2_02_groot_raam_buiten", "operation_time": "40"},
{"description": "NB_R2_03_screen_TV", "operation_time": "35"},
{"description": "NB_R2_04_lamellen_voordeur", "operation_time": "85"},
{"description": "NB_R2_05_living_achter_klein", "operation_time": "45"},
{"description": "NB_R2_06_living_voor_klein", "operation_time": "70"}
]
},
{
"description": "Rollershutter Module R3",
"model": "05-001-02",
"address": "5538",
"channels": [
{"description": "NB_R3_01_dressing_screen_1", "operation_time": "45"},
{"description": "NB_R3_02_dressing_screen_2", "operation_time": "45"},
{"description": "NB_R3_03_dressing_screen_3", "operation_time": "45"},
{"description": "NB_R3_04_dressing_screen_4", "operation_time": "45"},
{"description": "NB_R3_05_dressing_screen_5", "operation_time": "45"},
{"description": "NB_R3_06_projector_up_down", "operation_time": "21"}
]
},
{
"description": "Rollershutter Module R4",
"model": "05-001-02",
"address": "4F91",
"channels": [
{"description": "NB_R4_01_dakterras_buiten_links", "operation_time": "20"},
{"description": "NB_R4_02_dakterras_buiten_rechts", "operation_time": "20"},
{"description": "NB_R4_03_WC_boven", "operation_time": "60"},
{"description": "NB_R4_04_sauna_boven", "operation_time": "60"},
{"description": "NB_R4_05_douche_boven", "operation_time": "50"},
{"description": "NB_R4_06_kinesis", "operation_time": "50"}
]
},
{
"description": "Rollershutter Module R5",
"model": "05-001-02",
"address": "48A7",
"channels": [
{"description": "NB_R5_01_dakterras_binnen_links", "operation_time": "40"},
{"description": "NB_R5_02_dakterras_binnen_rechts", "operation_time": "40"},
{"description": "NB_R5_03_groot_raam_binnen", "operation_time": "40"},
{"description": "NB_R5_04_schuifraam_binnen", "operation_time": "40"},
{"description": "not_in_use NB_R5_05", "operation_time": "40"},
{"description": "not_in_use NB_R5_06", "operation_time": "40"}
]
},
{
"description": "Rollershutter Module R6",
"model": "05-001-02",
"address": "53D5",
"channels": [
{"description": "not_in_use NB_R6_01", "operation_time": "40"},
{"description": "not_in_use NB_R6_02", "operation_time": "40"},
{"description": "not_in_use NB_R6_03", "operation_time": "40"},
{"description": "not_in_use NB_R6_04", "operation_time": "40"},
{"description": "not_in_use NB_R6_05", "operation_time": "40"},
{"description": "not_in_use NB_R6_06", "operation_time": "40"}
]
}
]
}
I guess you want them to be labelled D2 vs D1, other than that typo which has no impact. your config is clean. I have also added new checks in 0.7.2 that would reject an invalid config vs stopping with error.
That would not be a problem to implement, switch will still be a switch, so the code does not change but displayed as the user wish it to be, being Fan, Light, etc…
Now, this is a one time user setup (unless the developer does a mistake have have to rename entities
) So what would be the value to have it in the config file vs the user changing the ‘display as’ one time at setup time ? may be I’m overlooking something ?
If it’s just the visualisation I agree, it can be done in HA, that’s what I do now.
I just assumed it would at source create lights instead of switches and therefore would avoid the hidden switch entities that are left behind when you change your switch into a light.
But agree it’s not a big issue. And once again thanks for the great work on this one.
Implemented in the dev channel, fdebrus/Nikobus-HA at dev testing…
Required vs optional fields
- Required (module level):
description,model,address, andchannels. - Required (per channel):
description. - Optional (per channel):
led_on/led_off: Feedback LED addresses (case-sensitive, format like8AA8FA).operation_time: For roller outputs, the time in seconds to fully open/close. If omitted, the cover will still work but uses a default timing, which may reduce position accuracy.entity_type: Override the default entity type (see matrix below).
Entity type by module
entity_type controls how Home Assistant exposes each channel. If you omit it, the integration uses the module default.
| Module key | Default entity_type | Allowed entity_type values | Notes |
|---|---|---|---|
switch_module |
switch |
switch, light |
Useful when you want a switch output to show up as a light. |
dimmer_module |
light |
light |
Dimmers are always exposed as lights. |
roller_module |
cover |
cover, switch, light |
switch maps to open on “on” and stop on “off”. |
You can download and test the code from the dev channel.
Mind that defining a switch output as a light will REMOVE the switch entity and create a light entity, so anything linked to the switch will no longer work. need to recode towards the light entity. you can check which ones have been removed from the log.
- Removing orphan Nikobus entity: switch.chambre_theo_lumiere (unique_id=nikobus_switch_relay_switch_C9A5_8)
- Removing orphan Nikobus entity: switch.hall_rdc_lumiere (unique_id=nikobus_switch_relay_switch_C9A5_9)
- Removing orphan Nikobus entity: switch.exterieur_allee_arriere (unique_id=nikobus_switch_relay_switch_C9A5_10)
- Removing orphan Nikobus entity: switch.toilet_1er_etage (unique_id=nikobus_switch_relay_switch_C9A5_11)
- Removing orphan Nikobus entity: switch.chambre_lea_lumiere (unique_id=nikobus_switch_relay_switch_C9A5_12)
Great, I will test and provide feedback. Might only be next weekend though as I don’t think I will have time during the week to test.
Hello,
New to HomeAssistant. Presently using Homebridge (on a Raspberry Pi 4) to access my Nikobus installation.
Try to setup Nikobus in HA - Raspberry Pi 4
I’m stuck, Nikobus (/dev/ttyUSB0) Failed to set up. I’m using the same Serial/USB connection cable as with Homebridge.
This is what I found in there error log:
Logger: homeassistant.config_entries
Source: config_entries.py:762
First occurred: 4:11:35 PM (4 occurrences)
Last logged: 4:25:56 PM
Error setting up entry Nikobus (/dev/ttyUSB0) for nikobus
Traceback (most recent call last):
File “/config/custom_components/nikobus/nkbconfig.py”, line 34, in load_json_data
async with aio_open(file_path, mode=“r”) as file:
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/aiofiles/base.py”, line 63, in aenter
return await self
^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/aiofiles/base.py”, line 59, in await
self._obj = yield from self._coro.await()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/aiofiles/threadpool/init.py”, line 92, in _open
f = await loop.run_in_executor(executor, cb)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/concurrent/futures/thread.py”, line 59, in run
result = self.fn(*self.args, **self.kwargs)
File “/usr/src/homeassistant/homeassistant/util/loop.py”, line 201, in protected_loop_func
return func(*args, **kwargs)
FileNotFoundError: [Errno 2] No such file or directory: ‘/config/nikobus_scene_config.json’
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File “/usr/src/homeassistant/homeassistant/config_entries.py”, line 762, in __async_setup_with_context
result = await component.async_setup_entry(hass, self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/config/custom_components/nikobus/init.py”, line 59, in async_setup_entry
await coordinator.connect()
File “/config/custom_components/nikobus/coordinator.py”, line 112, in connect
self.dict_scene_data = await self.nikobus_config.load_json_data(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
“nikobus_scene_config.json”, “scene”
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File “/config/custom_components/nikobus/nkbconfig.py”, line 39, in load_json_data
self._handle_file_not_found(file_path, data_type)
~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
File “/config/custom_components/nikobus/nkbconfig.py”, line 87, in _handle_file_not_found
raise NikobusDataError(
f"{data_type.capitalize()} configuration file not found: {file_path}"
)
custom_components.nikobus.exceptions.NikobusDataError: Scene configuration file not found: /config/nikobus_scene_config.json
Thanks in advance
Weird, seams like the integration is wanting that file to exist to setup. My bad, I created an helper to manage missing configuration file, I forgot to flag scene as ‘optional’.
As a workaround till I release a new version:
Create an file named nikobus_scene_config.json in your /config directory. with
{}
as content.
Let me know
I have bought the following 2 cables on Alibaba to connect my Nikobus system to Home Assistant:
USB to Serial Converter Cable with LED USB to RS232 FTDI Chipset in Stock
The problem is nothing works and I get allot of CRC8 mismatch errors:
CRC8 mismatch: calculated 2E, expected 2, message $1017C9A543EC2
CRC8 mismatch: calculated 17, expected 80, message $10120E6287080
CRC8 mismatch: calculated B6, expected 80, message $101206287480
CRC8 mismatch: calculated AF, expected A, message $101291048AC1A
CRC8 mismatch: calculated AF, expected 67, message $1C159100000 00002FF02F267
I asked Gemini and it said that it is probably the first cable that gets interference because apparently it is not shielded even though it is specifically made for Nikobus. Gemini suggested to add aluminium foil to this cable to shield it. I did this but I still get the same problem. Could there be something else wrong with my setup?
I do not trust you have a cable issue but a module address issue.
In your nikobus_module_config.json file, are the address of the module exactly as displayed in nikobus software ?
Example
“address”: “C9A5”
Try reverting
“address”: “A5C9”
They must be as in the Nikobus software
I tried reverting them but I still get the same CRC8 mismatch errors.
Restarted ha after reverting ?
I’ve added the “scene” configuration file as optional
def _handle_file_not_found(self, file_path: str, data_type: str) -> None:
"""Handle the case where the configuration file is not found."""
if data_type == "button":
_LOGGER.info(
"Button configuration file not found: %s. A new file will be created upon discovering the first button.",
file_path,
)
elif data_type == "scene":
_LOGGER.info(
"Scene configuration file not found: %s. Skipping.",
file_path,
)
else:
raise NikobusDataError(
f"{data_type.capitalize()} configuration file not found: {file_path}"
)
all good, will release 0.7.3
2026-01-18 20:39:46.921 INFO (MainThread) [custom_components.nikobus.nkbconnect] Nikobus handshake successful.
2026-01-18 20:39:46.921 INFO (MainThread) [custom_components.nikobus.nkbconfig] Loading module data from /config/nikobus_module_config.json
2026-01-18 20:39:46.924 INFO (MainThread) [custom_components.nikobus.nkbconfig] Loading button data from /config/nikobus_button_config.json
2026-01-18 20:39:46.933 INFO (MainThread) [custom_components.nikobus.nkbconfig] Loading scene data from /config/nikobus_scene_config.json
2026-01-18 20:39:46.933 INFO (MainThread) [custom_components.nikobus.nkbconfig] Scene configuration file not found: /config/nikobus_scene_config.json. Skipping.
2026-01-18 20:39:46.934 INFO (MainThread) [custom_components.nikobus.nkblistener] Nikobus Event Listener started.
2026-01-18 20:39:46.934 DEBUG (MainThread) [custom_components.nikobus.coordinator] Refreshing Nikobus data
Yes, I did restart but still same errors.
I will need more log, enable debuglog, filter on “niko”, restart, send the log
Also you can try to run the discovery, do not input any module address, this action will create a nikobus_module_discovered.json file in the config directory (only to assist the user to setup the integration, not actually used by the integration) and the nikobus_button_config.json file will be updated or created.
Wait a couple of minutes, taking the inventory from nikobus takes time.
I’ve also just noticied that you have a CH340, which a very basic / very low cost cable. Might get error from the physical adaptor. Give (CP2102/CP2109) chipsets cable a try, many on Amazon and others…
your debuglog will confirm
Yep! Solved the problem.
Will start to populate all Switch- and Dimmer-controllers now. This is a huge improvement vs what I got through Homebridge. Thanks so much
New release 0.7.4
BREAKING CHANGE – Configuration Update Required
use_as_switch has been removed
- The legacy
use_as_switchoption is no longer supported - It has been replaced by
entity_type - Any configuration still using
use_as_switchmust be migrated - Failure to migrate will result in missing or incorrectly created entities
New Feature – Per-Channel Entity Type
A new entity_type option allows precise control over how each individual module output is exposed in Home Assistant.
Highlights
- Defines the Home Assistant entity type per channel
(e.g.switch,light,cover) - Falls back automatically to the module’s default entity type when omitted
- Allows mixed entity types within the same module, where supported
- Enables advanced and non-standard wiring scenarios
- Improves flexibility and long-term maintainability
Documentation & Migration Guide
See the updated README for configuration examples and migration instructions:

