{"id":1298,"date":"2026-02-13T00:09:15","date_gmt":"2026-02-12T23:09:15","guid":{"rendered":"https:\/\/www.homeserver.lu\/?p=1298"},"modified":"2026-02-13T00:11:13","modified_gmt":"2026-02-12T23:11:13","slug":"brink-renovent-excellent-400-integration-into-ebus","status":"publish","type":"post","link":"https:\/\/www.homeserver.lu\/?p=1298","title":{"rendered":"Brink Renovent Excellent 400 integration into eBus"},"content":{"rendered":"\n<p>This guide documents the complete integration of a Brink Renovent Excellent 400 ventilation system through ebusd and MQTT for monitoring in openHAB.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"924\" height=\"695\" src=\"https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Workflow.jpg\" alt=\"\" class=\"wp-image-1300\" srcset=\"https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Workflow.jpg 924w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Workflow-300x226.jpg 300w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Workflow-768x578.jpg 768w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Workflow-624x469.jpg 624w\" sizes=\"auto, (max-width: 924px) 100vw, 924px\" \/><figcaption class=\"wp-element-caption\">Architecture<\/figcaption><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>28+ data points<\/strong> monitored every 10 seconds<\/li>\n\n\n\n<li><strong>Real-time monitoring<\/strong> of temperatures, airflows, fan speeds<\/li>\n\n\n\n<li><strong>Filter tracking<\/strong> (days used, volume processed)<\/li>\n\n\n\n<li><strong>Bypass status<\/strong> and configuration<\/li>\n\n\n\n<li><strong>System diagnostics<\/strong> (frost protection, preheater, errors)<\/li>\n\n\n\n<li><strong>Operating hours<\/strong> and performance metrics<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware Requirements<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Brink Renovent Excellent 400<\/strong> ventilation system<\/li>\n\n\n\n<li><strong>Esera ECO 305 eBUS Controller<\/strong> (or compatible eBus gateway)<\/li>\n\n\n\n<li><strong>2-wire cable<\/strong> for eBus connection (polarity-sensitive<\/li>\n\n\n\n<li><strong>Network connectivity<\/strong> for <a href=\"https:\/\/esera.de\/esera_doku\/produkte\/12020-230_Manual.pdf\">Esera<\/a> gateway<\/li>\n\n\n\n<li><strong>Proxmox server<\/strong> (or any Linux host) for LXC\/VM<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Configure Renovent for eBus Mode<\/h2>\n\n\n\n<p>Access the Renovent service menu: Use the menu button on the display to enter service mode and navigate to <em>Parameter 08<\/em>. Set to: <em>eBus<\/em> (Not OT &#8211; OpenTherme). Navigate to <em>Parameter 09<\/em> (eBus mode) and configure Master (<em>0<\/em>) or Slave (<em>1<\/em>) mode.<br>The Renovent can operate as either eBus Master or Slave. Slave mode (<em>1<\/em>) is recommended for passive monitoring. If you experience issues, try Master mode (<em>0<\/em>).<br>I am running master mode.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Physical Connection<\/h2>\n\n\n\n<p><strong>Step 1: Locate Renovent eBus Connection<\/strong><\/p>\n\n\n\n<p><strong>CRITICAL: Find the correct connector!<\/strong><br><strong>X1 Connector:<\/strong> 2-pin green terminal block on the back of the Renovent display housing. <strong>NOT the X2 connector<\/strong> (used for other purposes). Refer to the Renovent service manual, <a href=\"https:\/\/www.brinkclimatesystems.nl\/documenten\/renovent-excellent-300-400-612054-en.pdf\">page 14<\/a>, for connector location diagrams.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"568\" height=\"348\" src=\"https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/X1.png\" alt=\"\" class=\"wp-image-1302\" srcset=\"https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/X1.png 568w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/X1-300x184.png 300w\" sizes=\"auto, (max-width: 568px) 100vw, 568px\" \/><figcaption class=\"wp-element-caption\">X1 connector location on the top rear of the Renovent Excellent 400<\/figcaption><\/figure>\n\n\n\n<p><strong>Step 2: Connect to Esera Gateway<\/strong><\/p>\n\n\n\n<p><strong>Wire the eBus connection: <\/strong>Switch off the Renovent appliance and the Esera gateway. Connect the Renovent X1 terminals to Esera eBus terminals. <strong>Polarity matters!<\/strong> Follow the wiring diagram. The following two pictures show which pins I connected on what device. You may use standard 2-wire cable (no shielding required for short runs). I used shielded KNX-EIB cable, as I had some spare lying around. Keep away from high-voltage AC cables. The following pictures show which pins I connected on what device.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"814\" src=\"https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Renovent-1024x814.jpg\" alt=\"\" class=\"wp-image-1304\" srcset=\"https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Renovent-1024x814.jpg 1024w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Renovent-300x239.jpg 300w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Renovent-768x611.jpg 768w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Renovent-1536x1221.jpg 1536w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Renovent-2048x1628.jpg 2048w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Renovent-624x496.jpg 624w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">X1 connection using a KNX-EIB shielded cable<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"781\" src=\"https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Esera-Gateway-1024x781.jpg\" alt=\"\" class=\"wp-image-1306\" srcset=\"https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Esera-Gateway-1024x781.jpg 1024w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Esera-Gateway-300x229.jpg 300w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Esera-Gateway-768x585.jpg 768w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Esera-Gateway-1536x1171.jpg 1536w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Esera-Gateway-2048x1561.jpg 2048w, https:\/\/www.homeserver.lu\/wp-content\/uploads\/2026\/02\/Esera-Gateway-624x476.jpg 624w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Esera gateway connection on pins 22 and 23<\/figcaption><\/figure>\n\n\n\n<p>Do NOT use termination resistors. eBus does not need termination! Termination resistors will prevent proper communication. The Esera gateway has built-in termination.<\/p>\n\n\n\n<p><strong>Verify the connection<\/strong>. Switch on both devices. LED indicators on Esera should show activity once connected.<br>PWR: Solid green means power OK.<br>Station: Solid green means that the eBus is ready.<br>Data: Flashing green ~1Hz (eBus communication)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Esera Gateway Setup<\/h2>\n\n\n\n<p><strong>Step 1: Access Esera Web Interface<\/strong><\/p>\n\n\n\n<p>Connect your Esera gateway to your network. Access the web interface: `http:\/\/192.168.X.Y` (or your gateway IP). Default login password (<strong>eserapwd<\/strong>). Please change immediately.<\/p>\n\n\n\n<p><strong>Step 2: Configure eBus Settings<\/strong><\/p>\n\n\n\n<p>Navigate to: <strong>eBus Settings<\/strong>. You need to select:<br>Server protocol: TCP<br>Port: 5001<br>Automatic Bus Calibration: Automatic Mode<br>Calibration Value: 130 (auto-detected)<br>Compatibility: &#8220;Support ebusd enhanced protocol&#8221; (should be checked already)<br><\/p>\n\n\n\n<p><strong>Important<\/strong>: The &#8220;enhanced protocol&#8221; checkbox <strong>CANNOT be disabled<\/strong> &#8211; this is normal. Port 5001 uses the enhanced eBus protocol (required for ebusd). Port 5000 uses Esera ASCII protocol (not used in this setup).<\/p>\n\n\n\n<p><strong>Step 3: Verify Connection<\/strong><\/p>\n\n\n\n<p>Test the raw data flow. In your CLI, enter:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>nc 192.168.X.Y 5001<\/code><\/pre><\/div>\n\n\n\n<p>You should see binary data streaming (appears as garbled characters):<br>\u01aa\u01aa\u01aa\u01aaw}@\u01a0\u01b4\u01b4\u01aa\u01aa\u01aa\u01aa\u2026<\/p>\n\n\n\n<p>This confirms the Esera is receiving eBus data from the Renovent.<br><strong>CRITICAL:<\/strong> The Esera gateway only allows <em>ONE TCP connection at a time<\/em> to port 5001! If `nc` is connected, ebusd cannot connect. Always close test connections before starting ebusd.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">LXC Container Setup<\/h2>\n\n\n\n<p><strong>Step 1: Create LXC Container in Proxmox<\/strong><\/p>\n\n\n\n<p>Here is my config:<br>OS: Ubuntu 24.04 LTS<br>Hostname: ebus<br>Memory: 512 MB<br>Swap: 512 MB<br>CPU: 1 core<br>Disk: 8 GB (minimal, only needs ~2 GB)<br>Network: Bridge to your LAN<\/p>\n\n\n\n<p><strong>Step 2: Initial Setup<\/strong><\/p>\n\n\n\n<p>SSH into your container, update your system and install <em>wget<\/em>.<\/p>\n\n\n\n<p><em>ebusd<\/em> Installation. <strong>Important:<\/strong> Always use the <strong>MQTT1<\/strong> variant (includes MQTT support)<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>cd \/tmp\nwget https:\/\/github.com\/john30\/ebusd\/releases\/download\/v26.1\/ebusd-26.1_amd64-trixie_mqtt1.deb<\/code><\/pre><\/div>\n\n\n\n<p><strong>Step 2: Install ebusd<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>dpkg -i ebusd-26.1_amd64-trixie_mqtt1.deb\n# Fix any dependency issues\napt-get install -f<\/code><\/pre><\/div>\n\n\n\n<p><strong>Step 3: Verify Installation<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>ebusd --version\n# Should show: ebusd 26.1.26.1<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration Files<\/h2>\n\n\n\n<p><strong>Step 1: Create Directory Structure<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>mkdir -p \/etc\/ebusd\/encon<\/code><\/pre><\/div>\n\n\n\n<p>The <code>encon<\/code> directory is for the manufacturer <strong>ENCON<\/strong> (Brink&#8217;s eBus identifier).<\/p>\n\n\n\n<p><strong>Step 2: Obtain Renovent Configuration File<\/strong><\/p>\n\n\n\n<p>Grab the custom configuration file for The Renovent Excellent 400 from <a href=\"https:\/\/github.com\/christiaanderidder\/brink-renovent-hru\/blob\/main\/ebusd\/config\/7c.Excellent400.csv\">Github<\/a>. Find the exact file link and WGET it into your \/tmp.<\/p>\n\n\n\n<p><strong>Step 3: Fix Character Encoding<\/strong><\/p>\n\n\n\n<p>The original file contains German umlauts (\u00fc, \u00f6, \u00e4) that cause parsing errors. Convert to ASCII:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>sed &#39;s\/\u00fc\/ue\/g; s\/\u00e4\/ae\/g; s\/\u00f6\/oe\/g; s\/\u00dc\/Ue\/g; s\/\u00c4\/Ae\/g; s\/\u00d6\/Oe\/g; s\/\u00df\/ss\/g&#39; \\\n    \/tmp\/7c.renovent-excellent-400.csv &gt; \/etc\/ebusd\/encon\/7c.csv<\/code><\/pre><\/div>\n\n\n\n<p>Verify the file:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>head -20 \/etc\/ebusd\/encon\/7c.csv<\/code><\/pre><\/div>\n\n\n\n<p><strong>Step 4: Configure ebusd Service<\/strong><\/p>\n\n\n\n<p>Edit the configuration file:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>nano \/etc\/default\/ebusd<\/code><\/pre><\/div>\n\n\n\n<p>Add the following:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>EBUSD_OPTS=&quot;--device=enh:192.168.X.Y:5001 \\\n  --latency=50 \\\n  --scanconfig \\\n  --configpath=\/etc\/ebusd \\\n  --mqtthost=10.0.10.41 \\\n  --mqttport=1883 \\\n  --mqttjson \\\n  --mqtttopic=ebusd \\\n  --log=all:notice \\\n  --pollinterval=10&quot;<\/code><\/pre><\/div>\n\n\n\n<p>Parameter explanations:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>--device=enh:192.168.X.Y:5001<\/code> &#8211; <em>Esera gateway with enhanced protocol<\/em><\/li>\n\n\n\n<li><code>--latency=50<\/code> &#8211; <em>50ms latency compensation<\/em><\/li>\n\n\n\n<li><code>--scanconfig<\/code> &#8211; <em>Auto-detect and load device configurations<\/em><\/li>\n\n\n\n<li><code>--configpath=\/etc\/ebusd<\/code> &#8211; <em>Where to find CSV configs<\/em><\/li>\n\n\n\n<li><code>--mqtthost=192.168.A.B<\/code> &#8211; <em>Your MQTT broker IP<\/em><\/li>\n\n\n\n<li><code>--mqttport=1883<\/code> &#8211; <em>Standard MQTT port<\/em><\/li>\n\n\n\n<li><code>--mqttjson<\/code> &#8211; <em>Publish in JSON format<\/em><\/li>\n\n\n\n<li><code>--mqtttopic=ebusd<\/code> &#8211; <em>MQTT topic prefix<\/em><\/li>\n\n\n\n<li><code>--log=all:notice<\/code> &#8211; <em>Logging level<\/em><\/li>\n\n\n\n<li><code>--pollinterval=10<\/code> &#8211; <em>Poll interval (not used for active polling in our setup)<\/em><\/li>\n<\/ul>\n\n\n\n<p><strong>Step 5: Start and Enable ebusd<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>systemctl enable ebusd\nsystemctl start ebusd\n\n# Wait 30 seconds for initialization\nsleep 30\n\n# Verify it&#39;s running\nsystemctl status ebusd<\/code><\/pre><\/div>\n\n\n\n<p><strong>Step 6: Verify ebusd Connection<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>ebusctl info<\/code><\/pre><\/div>\n\n\n\n<p>Expected output:<br>version: ebusd 26.1.26.1<br>device: 192.168.X.Y:5001, TCP, enhanced<br>signal: acquired<br>scan: finished<br>masters: 2<br>messages: 141<br>address 31: master #8, ebusd<br>address 36: slave #8, ebusd<br>address 77: master #19<br>address 7c: slave #19, scanned &#8220;MF=ENCON;ID= ;SW=-;HW=-&#8220;, loaded &#8220;encon\/7c.csv&#8221;<\/p>\n\n\n\n<p>Key indicators of success:<br>`signal: acquired` (not &#8220;no signal&#8221;)<br>`messages: 141` (config loaded)<br>`address 7c: slave #19, scanned &#8220;MF=ENCON&#8221;` (Renovent detected)<br>`loaded &#8220;encon\/7c.csv&#8221;` (configuration file loaded)<\/p>\n\n\n\n<p>Test reading a value:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>ebusctl read -c Excellent400 Aussenlufttemperatur\n# Should return a temperature value like: 10.2<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Polling Script<\/h2>\n\n\n\n<p>Why a Polling Script? <em>ebusd<\/em> can passively listen to eBus telegrams, but the Renovent doesn&#8217;t broadcast all values automatically. We need to <strong>actively request<\/strong> data.<\/p>\n\n\n\n<p><strong>The Challenge: <\/strong>Setting `poll` in CSV files doesn&#8217;t work reliably with ebusd 26.1. Solution: External polling script that calls `<em>ebusctl read<\/em>`.<\/p>\n\n\n\n<p><strong>Step 1: Create Polling Script<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>nano \/root\/ebus\/poll_renovent.sh<\/code><\/pre><\/div>\n\n\n\n<p>Script content:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#!\/bin\/bash\nwhile true; do\n    # Temperatures\n    ebusctl read -c Excellent400 Aussenlufttemperatur &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 Ablufttemperatur &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 ZusaetzlicherTemperaturfuehler &gt; \/dev\/null 2&gt;&1\n    \n    # Airflows - Actual\n    ebusctl read -c Excellent400 TatsaechlicheZuluftmenge &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 TatsaechlicheAbluftmenge &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 Zuluftmenge &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 Abluftmenge &gt; \/dev\/null 2&gt;&1\n    \n    # Airflow Setpoints\n    ebusctl read -c Excellent400 LuftmengeStufe0 &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 LuftmengeStufe1 &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 LuftmengeStufe2 &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 LuftmengeStufe3 &gt; \/dev\/null 2&gt;&1\n    \n    # Fan speeds\n    ebusctl read -c Excellent400 TatsaechlicheDrehzahlZuluft &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 TatsaechlicheDrehzahlAbluft &gt; \/dev\/null 2&gt;&1\n    \n    # Operating Mode & Status\n    ebusctl read -c Excellent400 Ventilatorbetrieb &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 StatusBypass &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 StatusVentilator &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 StatusFrostschutz &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 StatusVorheizregister &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 LeistungVorheizregister &gt; \/dev\/null 2&gt;&1\n    \n    # Switch position\n    ebusctl read -c Excellent400 PositionStufenschalter &gt; \/dev\/null 2&gt;&1\n    \n    # Bypass\n    ebusctl read -c Excellent400 BypassTemperatur &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 BypassHysterese &gt; \/dev\/null 2&gt;&1\n    \n    # Filter\n    ebusctl read -c Excellent400 Filtermeldung &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 FilterverwendungTage &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 Filterverwendung &gt; \/dev\/null 2&gt;&1\n    \n    # Pressure\n    ebusctl read -c Excellent400 IstwertZuluftdruck &gt; \/dev\/null 2&gt;&1\n    ebusctl read -c Excellent400 IstwertAbluftdruck &gt; \/dev\/null 2&gt;&1\n    \n    sleep 10\ndone<\/code><\/pre><\/div>\n\n\n\n<p>Make it executable:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>chmod +x \/root\/ebus\/poll_renovent.sh<\/code><\/pre><\/div>\n\n\n\n<p>Script details:<br>Polls **28 data points** every 10 seconds. Each read is redirected to `\/dev\/null` (we only care about MQTT publication). `sleep 10` controls update frequency.<br>Customization: Increase `sleep 10` to `sleep 30` for less frequent updates (lower CPU usage). Remove unwanted data points to reduce eBus traffic (these are the ones I use). Add more data points from the CSV file as needed.<\/p>\n\n\n\n<p><strong>Step 2: Create Systemd Service<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>nano \/etc\/systemd\/system\/ebusd-poll.service<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>[Unit]\nDescription=eBus Renovent Polling Script\nAfter=ebusd.service\nRequires=ebusd.service\n\n[Service]\nType=simple\nExecStart=\/root\/ebus\/poll_renovent.sh\nRestart=always\nRestartSec=10\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre><\/div>\n\n\n\n<p>Enable and start:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>systemctl daemon-reload\nsystemctl enable ebusd-poll\nsystemctl start ebusd-poll\n\n# Check status\nsystemctl status ebusd-poll<\/code><\/pre><\/div>\n\n\n\n<p><strong>Step 3: Verify Polling<\/strong><\/p>\n\n\n\n<p>Check that values are being updated. Wait 15 seconds, then check:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>ebusctl find -c Excellent400 | grep -v &quot;no data&quot; | head -10<\/code><\/pre><\/div>\n\n\n\n<p>You should see values instead of &#8220;no data stored&#8221;:<br>Excellent400 Aussenlufttemperatur = 10.2<br>Excellent400 Ablufttemperatur = 22.0<br>Excellent400 TatsaechlicheZuluftmenge = 180<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MQTT Integration<\/h2>\n\n\n\n<p>Verify MQTT Publishing<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>apt install mosquitto-clients<\/code><\/pre><\/div>\n\n\n\n<p>Subscribe to all ebusd topics:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>mosquitto_sub -h 192.168.A.B -p 1883 -v -t &#39;ebusd\/#&#39;<\/code><\/pre><\/div>\n\n\n\n<p><strong>Expected output (updates every 10 seconds):<\/strong><br>json<br>ebusd\/Excellent400\/Aussenlufttemperatur {<br>       &#8220;0&#8221;: {&#8220;name&#8221;: &#8220;&#8221;, &#8220;value&#8221;: 10.1}}<br>ebusd\/Excellent400\/Ablufttemperatur {<br>       &#8220;0&#8221;: {&#8220;name&#8221;: &#8220;&#8221;, &#8220;value&#8221;: 22.0}}<br>ebusd\/Excellent400\/TatsaechlicheZuluftmenge {<br>       &#8220;0&#8221;: {&#8220;name&#8221;: &#8220;&#8221;, &#8220;value&#8221;: 180}}<br>ebusd\/Excellent400\/Ventilatorbetrieb {<br>       &#8220;0&#8221;: {&#8220;name&#8221;: &#8220;&#8221;, &#8220;value&#8221;: &#8220;Normal&#8221;}}<br>ebusd\/Excellent400\/StatusBypass {<br>       &#8220;0&#8221;: {&#8220;name&#8221;: &#8220;&#8221;, &#8220;value&#8221;: &#8220;Closed&#8221;}}<br>ebusd\/Excellent400\/Filtermeldung {<br>        &#8220;0&#8221;: {&#8220;name&#8221;: &#8220;&#8221;, &#8220;value&#8221;: &#8220;Clean&#8221;}}<\/p>\n\n\n\n<p><strong>MQTT Message Format:<\/strong><br>All Excellent400 values: `{&#8220;0&#8221;: {&#8220;name&#8221;: &#8220;&#8221;, &#8220;value&#8221;: &lt;VALUE&gt;}}`<br>Error messages: `{&#8220;error&#8221;: {&#8220;value&#8221;: &#8220;E100&#8221;}}`<br>Global values: May vary in format<br><strong>JSON Path for extraction:<\/strong> <code><em>$.0.value<\/em><\/code> (for most messages)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">openHAB Configuration<\/h2>\n\n\n\n<p><strong>Step 1: Install Required Add-ons<\/strong><\/p>\n\n\n\n<p>In openHAB UI:<br>Settings &#8211; Add-ons &#8211; Bindings:<br>  Install: <em>MQTT Binding<\/em><br>Settings &#8211; Add-ons &#8211; Transformations:<br>  Install: <em>JSONPath Transformation<\/em><br>  Install: <em>MAP Transformation<\/em><br>  Install: <em>REGEX Transformation<\/em> (for multi-value fields)<\/p>\n\n\n\n<p><strong>Step 2: Configure MQTT Broker Thing<\/strong><\/p>\n\n\n\n<p>Settings \u2192 Things \u2192 + \u2192 MQTT Binding \u2192 MQTT Broker<br>Configuration:<br>Broker Hostname\/IP: 192.162.A.B<br>Port: 1883<br>Client ID: openhab<br>Save and ensure status shows <strong>ONLINE<\/strong>.<\/p>\n\n\n\n<p><strong>Step 3: Create VMC MQTT Thing<\/strong><\/p>\n\n\n\n<p>Settings \u2192 Things \u2192 + \u2192 MQTT Binding \u2192 Generic MQTT Thing<br>Thing ID: MqttVMC<br>Label: VMC MQTT<br>Bridge: Select your MQTT Broker<\/p>\n\n\n\n<p><strong>Step 4: Add Channels<\/strong><\/p>\n\n\n\n<p>For each data point, add a channel. Here is one example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Channel ID: <em>VmcAussenlufttemperatur<\/em>\nLabel: <em>VMC Aussenluft Temperatur<\/em>\nChannel Type: <em>Number Value<\/em>\nState Topic: <em>ebusd\/Excellent400\/Aussenlufttemperatur<\/em>\nIncoming Value Transformations:<em> JSONPATH:$.0.value<\/em>\nUnit of Measurement: <em>\u00b0C<\/em><\/code><\/pre>\n\n\n\n<p><br>Here is a different example. Error uses different JSON path: <code>$.error.value<\/code> instead of <code>$.0.value<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Channel ID: <em>VMC_errorCode<\/em>\nLabel: <em>VMC Error Code<\/em>\nChannel Type: <em>Text Value<\/em>\nState Topic: <em>ebusd\/Broadcast\/Error<\/em>\nIncoming Value Transformations: <em>JSONPATH:$.error.value<\/em><\/code><\/pre>\n\n\n\n<p><strong>Step 5: Create MAP Transformation Files<\/strong><\/p>\n\n\n\n<p>Bypass Status Map: <code>\/etc\/openhab\/transform\/vmc_bypass.map<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0=Initializing\n1=Opening\n2=Closing\n3=Open\n4=Closed\n5=Error\n6=Calibrating\n255=Error\n-=Unknown\nNULL=Unknown\nUNDEF=Unknown<\/code><\/pre>\n\n\n\n<p>Filter Status Map: \/etc\/openhab\/transform\/vmc_filter.map<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0=Clean\n1=Dirty\nClean=Clean\nDirty=Dirty\n-=Unknown\nNULL=Unknown\nUNDEF=Unknown<\/code><\/pre>\n\n\n\n<p>Switch Position Map: \/etc\/openhab\/transform\/vmc_switch.map<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0=Standby\n1=Position_1\n2=Position_2\n3=Position_3\nPosition_0=Standby\nPosition_1=1\nPosition_2=2\nPosition_3=3\n-=Unknown\nNULL=Unknown\nUNDEF=Unknown<\/code><\/pre>\n\n\n\n<p><strong>Step 6: Link Channels to Items<\/strong><\/p>\n\n\n\n<p>For each channel, create an Item and link it:<br>Settings \u2192 Items \u2192 Create Item<br>Select &#8220;Link to Channel&#8221;<br>Choose the VMC MQTT Thing and specific channel<br>Configure Item:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>Type:<\/strong> Match channel type (Number\/String)\n<strong>Name:<\/strong> e.g., `VMC_Aussenluft_Temperatur`\n<strong>Label:<\/strong> e.g., `Outside Temperature`\n<strong>Category: <\/strong>Choose appropriate icon\n<strong>State Description Pattern:<\/strong> Add MAP transformation if needed\n- Example: `MAP(vmc_bypass.map):%s` for bypass status<\/code><\/pre>\n\n\n\n<p><strong>Step 7: Understanding multi-value fields<\/strong><\/p>\n\n\n\n<p>Some values return multiple fields separated by semicolons:<br><strong>Format:<\/strong> <code>Current;Min;Max;Step;Default<\/code><br><strong>Example:<\/strong> <code>FilterverwendungTage<\/code> returns <code>6;0;32767;1;0<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- Current: 6 days\n- Min: 0 days\n- Max: 32767 days\n- Step: 1 day\n- Default: 0 days<\/code><\/pre>\n\n\n\n<p>This was one of the most complicated configurations I went through until now.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This guide documents the complete integration of a Brink Renovent Excellent 400 ventilation system through ebusd and MQTT for monitoring in openHAB. Hardware Requirements Configure Renovent for eBus Mode Access the Renovent service menu: Use the menu button on the display to enter service mode and navigate to Parameter 08. Set to: eBus (Not OT [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[25],"tags":[],"class_list":["post-1298","post","type-post","status-publish","format-standard","hentry","category-vmc"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.homeserver.lu\/index.php?rest_route=\/wp\/v2\/posts\/1298","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.homeserver.lu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.homeserver.lu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.homeserver.lu\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.homeserver.lu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1298"}],"version-history":[{"count":48,"href":"https:\/\/www.homeserver.lu\/index.php?rest_route=\/wp\/v2\/posts\/1298\/revisions"}],"predecessor-version":[{"id":1350,"href":"https:\/\/www.homeserver.lu\/index.php?rest_route=\/wp\/v2\/posts\/1298\/revisions\/1350"}],"wp:attachment":[{"href":"https:\/\/www.homeserver.lu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.homeserver.lu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.homeserver.lu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}