{"id":15648173,"url":"https://github.com/yozik04/nibe","last_synced_at":"2026-01-28T22:02:25.561Z","repository":{"id":38318506,"uuid":"480117861","full_name":"yozik04/nibe","owner":"yozik04","description":"Library for communication with Nibe heatpumps.","archived":false,"fork":false,"pushed_at":"2026-01-22T11:34:29.000Z","size":2197,"stargazers_count":77,"open_issues_count":20,"forks_count":60,"subscribers_count":8,"default_branch":"master","last_synced_at":"2026-01-23T02:29:36.304Z","etag":null,"topics":["api","heatpump","library","modbus","nibe","rs485"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yozik04.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-04-10T19:23:45.000Z","updated_at":"2026-01-22T11:34:32.000Z","dependencies_parsed_at":"2024-01-16T00:35:31.504Z","dependency_job_id":"8d5ba10f-f44f-4c0f-b194-33bdebe11b11","html_url":"https://github.com/yozik04/nibe","commit_stats":{"total_commits":420,"total_committers":27,"mean_commits":"15.555555555555555","dds":0.5261904761904762,"last_synced_commit":"53618e5db7cfb6607bfcb57c66813cf1406f767c"},"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"purl":"pkg:github/yozik04/nibe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yozik04%2Fnibe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yozik04%2Fnibe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yozik04%2Fnibe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yozik04%2Fnibe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yozik04","download_url":"https://codeload.github.com/yozik04/nibe/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yozik04%2Fnibe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28853196,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T15:15:36.453Z","status":"ssl_error","status_checked_at":"2026-01-28T15:15:13.020Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","heatpump","library","modbus","nibe","rs485"],"created_at":"2024-10-03T12:23:53.092Z","updated_at":"2026-01-28T22:02:25.538Z","avatar_url":"https://github.com/yozik04.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Test and Lint](https://github.com/yozik04/nibe/actions/workflows/test.yml/badge.svg)](https://github.com/yozik04/nibe/actions/workflows/test.yml)\n![PyPI - Status](https://img.shields.io/pypi/status/nibe)\n![PyPI - Downloads](https://img.shields.io/pypi/dm/nibe)\n[![PyPI](https://img.shields.io/pypi/v/nibe)](https://pypi.org/project/nibe/)\n![PyPI - License](https://img.shields.io/pypi/l/nibe)\n[![Codecov](https://codecov.io/gh/yozik04/nibe/branch/master/graph/badge.svg?token=ZJIOTGLNW5)](https://codecov.io/gh/yozik04/nibe)\n\n# Nibe library\n\nLibrary for communication with Nibe heatpumps.\n\n### Supported heatpump models\n\n#### F series\n\n - F370\n - F470\n - F730\n - F750\n - F1145\n - F1155\n - F1245\n - F1255\n - F1345\n - F1355\n\n#### S series\n\n - S320\n - S325\n - S330\n - S332\n - S735\n - S1156\n - S1256\n - S2125\n\n#### SMO series\n\n - SMO20\n - SMO40\n\n#### SMOS series\n\n - SMOS40\n\n#### VVM series\n\n - VVM225\n - VVM310\n - VVM320\n - VVM325\n - VVM500\n\n#### VVMS series\n\n - VVMS325\n\n## Connection methods\n\n- RS485 hardwired using NibeGW on Arduino or RPi. NibeGW was developed by Pauli Anttila for [Openhab's integration](https://www.openhab.org/addons/bindings/nibeheatpump/).\n- TCP Modbus for S Models\n- Serial Modbus for Nibe Modbus 40)\n\n### NibeGW\n\nFor this connection method to work you will need to connect an Arduino with special firmware that will act as a proxy between Heatpump RS485 and this library. Some details regarding how this method works can be found [here](https://www.openhab.org/addons/bindings/nibeheatpump/#prerequisites).\n\nNibeGW firmware for Arduino or RPi can be [download here](https://github.com/openhab/openhab-addons/tree/3.2.x/bundles/org.openhab.binding.nibeheatpump/contrib/NibeGW).\n\n- Library will open 9999 UDP listening port to receive packets from NibeGW.\n- For read commands library will send UDP packets to NibeGW port 9999.\n- For write commands library will send UDP packets to NibeGW port 10000.\n\nPorts are configurable\n\n```python3\nimport asyncio\nimport logging\n\nfrom nibe.coil import CoilData\nfrom nibe.connection.nibegw import NibeGW\nfrom nibe.heatpump import HeatPump, Model\n\nlogger = logging.getLogger(\"nibe\").getChild(__name__)\n\ndef on_coil_update(coil_data: CoilData):\n    logger.debug(coil_data)\n\nasync def main():\n    heatpump = HeatPump(Model.F1255)\n    # heatpump.word_swap = False  # uncomment if you have word swap disabled in 5.3.11 service menu\n    await heatpump.initialize()\n\n    heatpump.subscribe(HeatPump.COIL_UPDATE_EVENT, on_coil_update)\n\n    connection = NibeGW(heatpump=heatpump, remote_ip=\"192.168.1.2\")\n    await connection.start()\n\nif __name__ == '__main__':\n    logging.basicConfig(level=logging.DEBUG)\n\n    loop = asyncio.get_event_loop()\n    loop.run_until_complete(main())\n    loop.run_forever()\n```\n\n### TCP Modbus\n\nWith S series heatpumps\n\n```python3\nimport asyncio\nimport logging\n\nfrom nibe.coil import CoilData\nfrom nibe.connection.modbus import Modbus\nfrom nibe.heatpump import HeatPump, Model\n\nlogger = logging.getLogger(\"nibe\").getChild(__name__)\n\ndef on_coil_update(coil_data: CoilData):\n    logger.debug(f\"on_coil_update: {coil_data}\")\n\nasync def main():\n    heatpump = HeatPump(Model.F1255)\n    # heatpump.word_swap = False  # uncomment if you have word swap disabled in 5.3.11 service menu\n    await heatpump.initialize()\n\n    heatpump.subscribe(HeatPump.COIL_UPDATE_EVENT, on_coil_update)\n\n    connection = Modbus(heatpump=heatpump, url=\"tcp://192.168.1.2:502\", slave_id=1)\n\n    coil = heatpump.get_coil_by_name('bt50-room-temp-s1-40033')\n    coil_data = await connection.read_coil(coil)\n\n    logger.debug(f\"main: {coil_data}\")\n\nif __name__ == '__main__':\n    logging.basicConfig(level=logging.DEBUG)\n\n    loop = asyncio.get_event_loop()\n    loop.run_until_complete(main())\n    loop.run_forever()\n```\n\n### Serial Modbus\n\nWith NIBE MODBUS 40\n\n```python3\nimport asyncio\nimport logging\n\nfrom nibe.coil import CoilData\nfrom nibe.connection.modbus import Modbus\nfrom nibe.heatpump import HeatPump, Model\n\nlogger = logging.getLogger(\"nibe\").getChild(__name__)\n\ndef on_coil_update(coil_data: CoilData):\n    logger.debug(f\"on_coil_update: {coil_data}\")\n\nasync def main():\n    heatpump = HeatPump(Model.F1255)\n    # heatpump.word_swap = False  # uncomment if you have word swap disabled in 5.3.11 service menu\n    await heatpump.initialize()\n\n    heatpump.subscribe(HeatPump.COIL_UPDATE_EVENT, on_coil_update)\n\n    connection = Modbus(heatpump=heatpump, url=\"serial:///dev/ttyS0\", slave_id=1, conn_options={\"baudrate\": 9600})\n\n    coil = heatpump.get_coil_by_name('bt50-room-temp-s1-40033')\n    coil_data = await connection.read_coil(coil)\n\n    logger.debug(f\"main: {coil_data}\")\n\nif __name__ == '__main__':\n    logging.basicConfig(level=logging.DEBUG)\n\n    loop = asyncio.get_event_loop()\n    loop.run_until_complete(main())\n    loop.run_forever()\n```\n\n### Model auto detection\n\nWith NibeGW it is possible to auto identify heatpump model.\nHeatpump sends information about model every 15 seconds.\n```\nheatpump = HeatPump()  # Note that we do not specify model here\n\n# ...\n\nconnection = NibeGW(heatpump=heatpump, remote_ip=\"192.168.1.2\")\nawait connection.start()\nheatpump.product_info = await connection.read_product_info()\nawait heatpump.initialize()\n```\n\n## Disclaimer\n\nNibe is registered mark of NIBE Energy Systems.\n\nThe code was developed as a way of integrating personally owned Nibe heatpump, and it cannot be used for other purposes. It is not affiliated with any company, and it doesn't have commercial intent.\n\nThe code is provided AS IS and the developers will not be held responsible for failures in the heatpump operation or any other malfunction.\n\n**IMPORTANT**: Using this library to control your heatpump is done at your own risk. The developers assume no responsibility for any damage that may occur to your heating system, property, or for any unsafe conditions that may result from improper use. Changing heatpump parameters can potentially damage your equipment or create hazardous conditions. Users should have sufficient knowledge of their heating system before attempting to control it.\n\n# HOWTOs for developers\n\n## How to capture and replay traffic from NibeGW\n\n### Requirements\n\nAPT:\n - tcpdump\n - tcpreplay\n\nOn recipient device run:\n```bash\nsudo tcpdump -i eth0 udp port 9999 -w nibe-9999.pcap\n\ntcprewrite --infile=nibe-9999.pcap --outfile=nibe-9999rw.pcap --dstipmap=192.168.1.3:192.168.1.2 --enet-dmac=CC:CC:CC:CC:CC:CC --fixcsum\n\nsudo tcpreplay --intf1=eth0 nibe-9999rw.pcap\n```\n\nYou will need to replace IP addresses for rewrite and Mac address of new recipient device\n\n## I want to add/update registers in the library\n\nTo add/edit registers in the library first of all you need to find documentation how these parameters are officially called. There will be a backward compatibility break if a name will change.\n\nThe process contains of mainly next steps: 1. Update source CSV files. 2. Convert CSV files to JSON. 3. Edit extensions.json if needed. 4. Submit PR.\n\n### 1.A For F series pumps\n\nUse [ModbusManager](https://professional.nibe.eu/sv/proffshjalp/kommunikation/nibe-modbus). Do CSV export for the unit you want to update. Find the correct file in `nibe/data` folder. Merge data into that file (Do not change/update any lines. All CSV files are source files they must not be changed).\n\n### 1.B For S series pumps\n\nChange your pump language to English and do registers export. Merge that data into the correct file in `nibe/data` folder (Do not change/update any lines. All CSV files are source files they must not be changed).\n\n### 2. Convert source CSV files to JSON\n\n```bash\npython3 -m nibe.console_scripts.convert_csv\n```\n\n### 3. Verify JSON files\n\nVerify that conversion was successful and required lines correctly appeared in the json files. If some modifications are required you need to edit `extensions.json` to fix these. Do not edit source CSV files.\n\n### 4. Submit PR\n\nAttach your source CSV file for reference so we could verify as well.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyozik04%2Fnibe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyozik04%2Fnibe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyozik04%2Fnibe/lists"}