<?xml version="1.0" encoding="utf-8"?>
<Templates format="2" protocolVersion="83">
  <Template id="a3f7c2d1-85b4-4e9a-bc6f-0d1e2f3a4b5c" revision="1.0">
    <SuggestedCCUParameters>
      <Baudrate>9600</Baudrate>
      <Parity>None</Parity>
      <StopBits>One</StopBits>
      <DataBits>8</DataBits>
      <UseAsciiCommunication>False</UseAsciiCommunication>
      <DelayBetweenRequests>-1</DelayBetweenRequests>
      <ReadWriteTimeout>1000</ReadWriteTimeout>
    </SuggestedCCUParameters>
    <Name>Vaillant aroVAIR pro WN VA 3-025 WN</Name>
    <CcuModel>ModbusRtuCCU</CcuModel>
    <Producer>Vaillant</Producer>
    <Model>aroVAIR pro WN VA 3-025 WN</Model>
    <Description>Vaillant aroVAIR pro WN fan coil unit (VA 3-025/035/045 WN). Communicates via Modbus RTU over RS-485. Supports heating, cooling, ventilation, and automatic mode with setpoint control and fan speed selection.</Description>
    <Category>1</Category>
    <ImportParameters>
      <Parameter>
        <Id>SlaveId</Id>
        <Name>Modbus Slave ID (1–64)</Name>
        <Value>1</Value>
      </Parameter>
    </ImportParameters>
    <Module>
      <Name>aroVAIR pro WN</Name>
      <Id>-1</Id>
      <Model>ModbusModule</Model>
      <DeviceProperties>
        <SlaveId>$[SlaveId]</SlaveId>
        <MaxPrefetchGroupSize>16</MaxPrefetchGroupSize>
        <ReadScript>VAR errBits := MODBUSR(H, 1614, UInt16);
IF(GETBIT(errBits, 2), ADDERROR(2, &quot;Room temperature sensor error&quot;), );
IF(GETBIT(errBits, 3), ADDERROR(3, &quot;Water temperature sensor error&quot;), );
IF(GETBIT(errBits, 7), ADDERROR(7, &quot;EEPROM error&quot;), );
IF(GETBIT(errBits, 8), ADDERROR(8, &quot;Fan speed error&quot;), );
IF(GETBIT(errBits, 14), ADDERROR(14, &quot;Water level error&quot;), );
VAR prot1 := MODBUSR(H, 1615, UInt16);
IF(GETBIT(prot1, 1), ADDWARNING(1, &quot;P1 frost protection active&quot;), );
VAR prot2 := MODBUSR(H, 1617, UInt16);
IF(GETBIT(prot2, 0), ADDWARNING(10, &quot;Frost protection active&quot;), );
IF(GETBIT(prot2, 1), ADDWARNING(11, &quot;Temperature outside operating range&quot;), );
IF(GETBIT(prot2, 2), ADDWARNING(12, &quot;Remote off active&quot;), );
IF(GETBIT(prot2, 15), ADDWARNING(15, &quot;Capacity outside range&quot;), );</ReadScript>
      </DeviceProperties>
      <Devices>
        <Device>
          <Name>Operating Mode</Name>
          <Id>-2</Id>
          <Model>ModbusMultiValueSwitch</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>2500</InternalPollInterval>
            <ReadSwitchState>MODBUSR(H, 1601, UInt16)</ReadSwitchState>
            <WriteSwitchState>MODBUSW(H, 1601, UInt16, Mu)</WriteSwitchState>
            <OffStateValue>0</OffStateValue>
            <ServiceAttributesFormulas>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Key lock&quot;},&quot;ReadFormula&quot;:&quot;IF(GETBIT(MODBUSR(H, 1612, UInt16), 0), \&quot;Remote key lock active\&quot;, \&quot;Not locked\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Locked function&quot;},&quot;ReadFormula&quot;:&quot;IF(GETBITS(MODBUSR(H, 1612, UInt16), 1, 2) = 0, \&quot;No lock\&quot;, IF(GETBITS(MODBUSR(H, 1612, UInt16), 1, 2) = 1, \&quot;Cooling locked\&quot;, \&quot;Heating locked\&quot;))&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Condensate pump&quot;},&quot;ReadFormula&quot;:&quot;IF(GETBIT(MODBUSR(H, 1613, UInt16), 0), \&quot;Running\&quot;, \&quot;Off\&quot;)&quot;}]</ServiceAttributesFormulas>
            <Value0>0</Value0>
            <Value0Index>0</Value0Index>
            <Value0Name>Off</Value0Name>
            <Value0IconId>4</Value0IconId>
            <Value1>1</Value1>
            <Value1Index>1</Value1Index>
            <Value1Name>Ventilation</Value1Name>
            <Value1IconId>24</Value1IconId>
            <Value2>2</Value2>
            <Value2Index>2</Value2Index>
            <Value2Name>Cooling</Value2Name>
            <Value2IconId>2</Value2IconId>
            <Value3>3</Value3>
            <Value3Index>3</Value3Index>
            <Value3Name>Heating</Value3Name>
            <Value3IconId>1</Value3IconId>
            <Value4Index>68</Value4Index>
            <Value5>5</Value5>
            <Value5Index>5</Value5Index>
            <Value5Name>Automatic</Value5Name>
            <Value5IconId>3</Value5IconId>
            <Value6Index>70</Value6Index>
            <Value7Index>71</Value7Index>
            <Value8Index>72</Value8Index>
            <Value9Index>73</Value9Index>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Temperature Setpoint</Name>
          <Id>-3</Id>
          <Model>ModbusThermostat</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>2500</InternalPollInterval>
            <MinTemperature>17</MinTemperature>
            <MaxTemperature>30</MaxTemperature>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <ReadCurrentTemperature>MODBUSR(H, 1606, UInt16) / 2 - 20</ReadCurrentTemperature>
            <ReadDesiredTemperature>MODBUSR(H, 1602, UInt16)</ReadDesiredTemperature>
            <WriteDesiredTemperature>MODBUSWNE(H, 1602, UInt16, Se)</WriteDesiredTemperature>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Fan Speed</Name>
          <Id>-4</Id>
          <Model>ModbusMultiValueSwitch</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>2500</InternalPollInterval>
            <ReadSwitchState>MODBUSR(H, 1603, UInt16)</ReadSwitchState>
            <WriteSwitchState>MODBUSW(H, 1603, UInt16, Mu)</WriteSwitchState>
            <Value0Index>64</Value0Index>
            <Value1Index>65</Value1Index>
            <Value2>2</Value2>
            <Value2Index>2</Value2Index>
            <Value2Name>Low</Value2Name>
            <Value2IconId>25</Value2IconId>
            <Value3>3</Value3>
            <Value3Index>3</Value3Index>
            <Value3Name>Medium</Value3Name>
            <Value3IconId>26</Value3IconId>
            <Value4>4</Value4>
            <Value4Index>4</Value4Index>
            <Value4Name>High</Value4Name>
            <Value4IconId>27</Value4IconId>
            <Value5>5</Value5>
            <Value5Index>5</Value5Index>
            <Value5Name>Automatic</Value5Name>
            <Value5IconId>28</Value5IconId>
            <Value6Index>70</Value6Index>
            <Value7Index>71</Value7Index>
            <Value8Index>72</Value8Index>
            <Value9Index>73</Value9Index>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Water Temperature</Name>
          <Id>-5</Id>
          <Model>ModbusTemperatureSensor</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>15000</InternalPollInterval>
            <ReadTemperature>MODBUSR(H, 1607, UInt16) / 2 - 20</ReadTemperature>
          </DeviceProperties>
        </Device>
      </Devices>
    </Module>
  </Template>
</Templates>
