Brink Renovent Excellent 300 air ventilation integration

I have integrated a Brink Renovent Excellent 300 in openhab in order to monitor filter state and control the amount of airflow in the house.

From Brink you get the “Brink Connect” module which allows access to the Renovent 300 via modbus/RS485. I conneced my pi with a USB-RS485 converter to the Brink Connect module.

Here are my things for the Renovent:

Bridge modbus:serial:brink [ port="/dev/ttyUSB0", id=11, baud=9600, dataBits=8, parity="even", stopBits="1" ] {

    Bridge poller air [ start=4008, length=5, refresh=300000, type="holding" ] {
        Thing data holding4009 [ readStart="4008", readValueType="int16", readTransform="JS(divide10.js)" ] // temperature outdoors
        Thing data holding4010 [ readStart="4009", readValueType="int16", readTransform="JS(divide10.js)" ] // temperature dwelling
        Thing data holding4011 [ readStart="4010", readValueType="uint16" ]  // pressure supply 
        Thing data holding4012 [ readStart="4011", readValueType="uint16" ]  // pressure exhaust
    }
    Bridge poller actFlow [ start=4027, length=2, refresh=300000, type="holding" ] {
        Thing data holding4028 [ readStart="4027", readValueType="uint16" ]  // flowrate supply
        Thing data holding4029 [ readStart="4028", readValueType="uint16" ]  // flowrate exhaust
    }
    Bridge poller bypass [ start=4029, length=2, refresh=300000, type="holding" ] {
        Thing data holding4030 [ readStart="4029", readValueType="uint16" ]  // bypass position
        Thing data holding4031 [ readStart="4030", readValueType="uint16" ]  // bypass operation
    }
    Bridge poller preHeater [ start=4036, length=2, refresh=300000, type="holding" ] {
        Thing data holding4037 [ readStart="4036", readValueType="uint16" ]  //preheater status
        Thing data holding4038 [ readStart="4037", readValueType="uint16" ]  // preheater power %
    }
    Bridge poller maintenance [ start=4038, length=2, refresh=300000, type="holding" ] {
        Thing data holding4039 [ readStart="4038", readValueType="uint16" ]  // current fault code
        Thing data holding4040 [ readStart="4039", readValueType="uint16" ]  // error message filter
    }


	Thing data holding6001 [ writeStart="6000", writeValueType="int16", writeType="holding" ] // set flowrate
	Thing data holding6013 [ writeStart="6012", writeValueType="int16", writeType="holding" ] // set control mode
}

Here are my items:

Number	TempSupply            		"Zulufttemperatur [%.0f °C]"    			<temperature>	{ channel="modbus:data:brink:air:holding4009:number" }
Number	TempExhaust       			"Ablufttemperatur [%.0f °C]"    			<temperature>	{ channel="modbus:data:brink:air:holding4010:number" }
Number	PressureSupply            	        "Zuluftdruck [%.0f Pa]"    					<pressure>		{ channel="modbus:data:brink:air:holding4011:number" }
Number	PressureExhaust                    "Abluftdruck [%.0f Pa]"    					<pressure>		{ channel="modbus:data:brink:air:holding4012:number" }

Number	FlowrateSupply			     "Zuluftdurchsatz [%.0f m³/h]"    			<flow>			{ channel="modbus:data:brink:actFlow:holding4028:number" }
Number	FlowrateExhaust			     "Abluftdurchsatz [%.0f m³/h]"    			<flow>			{ channel="modbus:data:brink:actFlow:holding4029:number" }

Number	BypassPosition			    "Bypass [MAP(brinkBypassPosition.map):%s]"    				{ channel="modbus:data:brink:bypass:holding4030:number" }
Number	BypassMode			        "Bypass Betriebsart [MAP(brinkBypassMode.map):%s]"  	 	{ channel="modbus:data:brink:bypass:holding4031:number" }

Number	HeaterMode			        "Vorheizung [MAP(brinkPreHeaterMode.map):%s]"				{ channel="modbus:data:brink:preHeater:holding4037:number" }
Number	HeaterPower			        "Vorheizung Leistung [%s %%]"								{ channel="modbus:data:brink:preHeater:holding4038:number" }

Number	ErrorCode			        "Aktueller Fehler [%d]"						<error>			{ channel="modbus:data:brink:maintenance:holding4039:number" }
Number	FilterNeedsCleaning			"Filter [MAP(brinkFilterState.map):%s]"						{ channel="modbus:data:brink:maintenance:holding4040:number" }

Number	brinkSetFlowrate			"Lüftung Durchsatz [%.0f m³/h]"    							{ channel="modbus:data:brink:holding6001:number" }
Number	brinkControlMode	        "6013 [%s %%]"												{ channel="modbus:data:brink:holding6013:number" }

String 	brinkMode					"Brink Mode"
Number	FlowrateProxy				"Flowrate Proxy"

Some transformations are required:

brinkBypassMode.map:

0=automatisch
1=geschlossen
2=geöffnet

brinkBypassPosition.map

0=initialisieren
1=öffnen...
2=schließen...
3=aktiv
4=nicht aktiv
255=unbekannt

brinkFilterState.map

0=sauber
1=verschmutzt

brinkPreHeaterMode.map

0=initialisieren
1=Aus
2=An
3=Test
255=unbekannt

divide10.js

(function(inputData) {
    var DIVIDE_BY = 10;
    return parseFloat(inputData) / DIVIDE_BY;
})(input)

rules:

import org.eclipse.smarthome.core.types.RefreshType

rule "Brink goes online"
when
	Thing "modbus:data:brink:maintenance:holding4040" changed to ONLINE
then
	brinkControlMode.sendCommand("4");  // 4: ventilation flow as per modbus (0: as per Brink appliance)
end

rule "Release brink"
when
    System shuts down
then
	brinkControlMode.sendCommand("0");  // flow control as per Brink appliance
end





rule "However you want to control airflow amount"
when
	Item ...
then
	var Number x

	x= ComputeAppropriateFlowrate()

	brinkSetFlowrate.sendCommand(x)
end

// refresh more frequently to give better feedback in UI
rule "Refresh after flow change"
when
	Item brinkSetFlowrate received command
then
	if (receivedCommand != RefreshType.REFRESH) {
		// Update more frequently for a short while, to get
		// refreshed data after the newly received command
	    var i = 1;
		while((i=i+1) < 20) {
			createTimer(now.plusSeconds(i*5), [|
						PressureSupply.sendCommand(RefreshType.REFRESH)
						FlowrateSupply.sendCommand(RefreshType.REFRESH)
				])
		}
	}
end



rule "Send mail filter needs cleaning"
when
    Item FilterNeedsCleaning changed to 1
then
		sendMail("x@y.com", "Filter needs cleaning", "no text")
end

sitemap Status:

	Text label="Lüftung" icon="flow" {
			Text item=TempSupply
			Text item=TempExhaust
			Text item=PressureSupply
			Text item=PressureExhaust
			Text item=FlowrateSupply
			Text item=FlowrateExhaust
			Text item=BypassPosition
			Text item=BypassMode
			Text item=HeaterMode
			Text item=HeaterPower
			Text item=ErrorCode
			Text item=FilterNeedsCleaning
		}

Item that is only visible if filter needs cleaning:

	Text item=FilterNeedsCleaning icon="alarm" visibility=[FilterNeedsCleaning==1]
3 Likes

Hello Berndq!
Can you give me a more detailed description or a link from your USB-RS-485 converter. I’m also trying to connect my ventilation system to openhab …

Best wishes, Michael

Hi Michael,

these adapters are cheap and all the same, from the software side of view. Just search the web (or the well known auction house) for USB RS485 adapter. Maybe choose the one with the electrical connectors you prefer to use.

On linux they appear as e.g. /dev/ttyUSB0 you the configure the OH modbus plugin with the respective registers (these depend on your ventilation system)

Does your ventilation system use Modbus?

br
Bernd

Hallo!
Yes, my system supports Modbus. I have a Wolf system (CWL-2-400). The ventilation from Wolf (CWL-2-400) is identical to the ventilation from Brink (Flair 400). The Flair 400 ventilation is the successor to the Brink Renovent Excellent 400. Both the CWL-2-400 and Flair 400 now have the Modbus interface on the main board. The Modbus registers are also identical for the CWL-2-400, Flair 400, Renovent Excellent 400/300.
At the moment I am trying to control the CWL-2-400 via an RS 485 adapter and my Windows 10 PC. I use the CAS Modbus Scanner program. And these adapters:

Unfortunately the CWL-2-400 does not answer. The adapters work. The adapters work with another device that supports Modbus!

br
Michael

This will be much easier to experiment with to establish how to connect to your CWL.
You’d need to get right address, baud, parity, wiring polarity, cable type, etc. here.

Hi Michael

to check the connection try to read values from the device (e.g. flow rate or a temperature). Writing is a bit more complicated.

I did my first tests with modpoll (under linux, mabe it is also available for windows)

Reading the supply air temperature:
[19:45:16] oh@openHABianPi2:~/mbpoll/build$ mbpoll -v -m rtu -a 11 -r 4009 -c 1 -b 9600 -d 8 -p even -1 /dev/ttyUSB0
debug enabled
Set mode=rtu
iGetIntList(11)
Integer found: 11
iCount=1
Set start reference=4009
Set number of values=1
Set rtu baudrate=9600
Set rtu data bits=8
Set device=/dev/ttyUSB0
mbpoll 1.4-8 - FieldTalk™ Modbus® Master Simulator
Copyright © 2015-2018 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type ‘mbpoll -w’ for details.

Opening /dev/ttyUSB0 at 9600 bauds (E, 8, 1)
Set response timeout to 1 sec, 0 us
Protocol configuration: Modbus RTU
Slave configuration...: address = [11]
                        start reference = 4009, count = 1
Communication.........: /dev/ttyUSB0,       9600-8E1
                        t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, output (holding) register table

-- Polling slave 11...
[0B][03][0F][A8][00][01][06][54]
Waiting for a confirmation...
<0B><03><02><00><1F><61><8D>
[4009]:         31

31 meaning 3.1°C

If this doesn’t work, as rossko57 said, double check the communication parameters: baudrate, parity, stop bits, modbus slave address.

You max also check the status of your open hab items: Are they online? Have you checked to openhab logs? You can increase the log level of the modbus plugin to get more detailed information about the problem. There is some documentation about how to increase the logging in OH. IIRC check the modbus plugin docu, it should state about how to increase the log level for diagnostics.

br
Bernd

I am using the first of your adapters.

Hi Bernd,
thanks for sharing your experience. I was solving the same issue but with Brink Flair 300 unit and your code helped me a lot. The Modbus params and addresses are different from Renovent Excellent 300 and the Brink Modbus documentation for my unit is poor, but after few hours of experimenting I was able to read/write all the data I needed.

Here’s my testing code, maybe it might be helpful for somebody. But sorry, the texts are in Czech. In the future I want to add there openHAB config files too.
https://github.com/sirjackal/brink-modbus

And here is a screenshot from openHAB BasicUI:

Best regards,
Jan

1 Like

Hi,

I have found this document at Brink, It describes all Modbus addresses for our Flair ventilation systems: https://www.brinkclimatesystems.nl/documenten/modbus-uwa2-b-uwa2-e-installation-regulations-614882.pdf

HTH.

Kind regards,
Xavier Miller

Hi Berndq, how did you generate this data? If I connect my Pi to the USB-RS485 device, how do I get this data for my Brink Renovent Excellent 300?

Also, tangential question: before connecting the USB-RS485 to the Brink, should I power off the Brink device?

how do I get this data for my Brink Renovent Excellent 300?

not sure if I understand your question. you can use it as is, it’s the same for all Brink Renovent Excellent 300.

I figured it out using the manual of the Brink Connect and lots of trial and error with modpoll. details see above.

before connecting the USB-RS485 to the Brink, should I power off the Brink device?
YES. You have to open the device in order to connect the brink connect.
Why do you cosinder not to open it?

To be honest, reading your questions makes me recommend you to ask someone with an electrical engineering background for assistance.

thank you, Berndq.

I was wondering: which command in the terminal resulted in this this output?
Please let me know if this is not clear yet.

this is not an output from any command but (part) of open hab configuration.

alright, thank you for the clarification

do you remember which command did you issue to use modpoll? I’m reading the documentation but I don’t see it can use /dev/ttyUSB0 . It seems to be connecting via http. Or am I wrong?