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]