<?xml version="1.0" encoding="utf-8"?>
<Templates format="2" protocolVersion="88">
  <Template id="b6d4f0f2-6a51-4c8e-9a1b-5f0e7c2d3a14" revision="1.0">
    <SuggestedCCUParameters>
      <Baudrate>19200</Baudrate>
      <Parity>None</Parity>
      <StopBits>One</StopBits>
      <DataBits>8</DataBits>
      <UseAsciiCommunication>False</UseAsciiCommunication>
      <DelayBetweenRequests>-1</DelayBetweenRequests>
      <ReadWriteTimeout>1000</ReadWriteTimeout>
    </SuggestedCCUParameters>
    <RevisionHistory>
      <Revision id="1.0">Community version 2026-10-14: corrected readings, protected settings writes, remote power control</Revision>
    </RevisionHistory>
    <Name>SolaX X3-Ultra Hybrid Inverter — monitoring and power control (Modbus RTU)</Name>
    <CcuModel>ModbusRtuCCU</CcuModel>
    <Producer>SolaX Power</Producer>
    <Model>X3-Ultra (X3-ULT-15K/20K/25K/30K)</Model>
    <Description>Three-phase hybrid inverter: energy flows for the Energy Dashboard, battery, grid, faults, protected settings writes and remote AC power control (SolaX remote control mode 1).</Description>
    <Category>2</Category>
    <ImportParameters>
      <Parameter>
        <Id>SlaveId</Id>
        <Name>Modbus Slave ID</Name>
        <Value>1</Value>
      </Parameter>
    </ImportParameters>
    <Module>
      <Name>SolaX X3-Ultra</Name>
      <Id>-1</Id>
      <Model>ModbusModule</Model>
      <DeviceProperties>
        <DeviceType>7001</DeviceType>
        <InternalPollInterval>30000</InternalPollInterval>
        <SlaveId>$[SlaveId]</SlaveId>
        <MaxPrefetchGroupSize>32</MaxPrefetchGroupSize>
        <PrefetchModeId>0</PrefetchModeId>
        <ReadScript>VAR mode := MODBUSR(A, 0x0009, UInt16);
IF(mode = 3, ADDERROR(1, &quot;Inverter fault (run mode 3)&quot;));
IF(mode = 4, ADDERROR(2, &quot;Inverter permanent fault (run mode 4)&quot;));
VAR inv := MODBUSR(A, 0x0040, LittleEndianUint32);
IF(GETBIT(inv, 0) = 1, ADDERROR(100, &quot;TZ Protect Fault&quot;));
IF(GETBIT(inv, 1) = 1, ADDERROR(101, &quot;Grid Lost Fault&quot;));
IF(GETBIT(inv, 2) = 1, ADDERROR(102, &quot;Grid Volt Fault&quot;));
IF(GETBIT(inv, 3) = 1, ADDERROR(103, &quot;Grid Freq Fault&quot;));
IF(GETBIT(inv, 4) = 1, ADDERROR(104, &quot;PV Volt Fault&quot;));
IF(GETBIT(inv, 5) = 1, ADDERROR(105, &quot;Bus Volt Fault&quot;));
IF(GETBIT(inv, 6) = 1, ADDERROR(106, &quot;Bat Volt Fault&quot;));
IF(GETBIT(inv, 7) = 1, ADDERROR(107, &quot;AC10mins Volt Fault&quot;));
IF(GETBIT(inv, 8) = 1, ADDERROR(108, &quot;DCI OCP Fault&quot;));
IF(GETBIT(inv, 9) = 1, ADDERROR(109, &quot;DCV OCP Fault&quot;));
IF(GETBIT(inv, 10) = 1, ADDERROR(110, &quot;SW OCP Fault&quot;));
IF(GETBIT(inv, 11) = 1, ADDERROR(111, &quot;RC OCP Fault&quot;));
IF(GETBIT(inv, 12) = 1, ADDERROR(112, &quot;Isolation Fault&quot;));
IF(GETBIT(inv, 13) = 1, ADDERROR(113, &quot;Temp Over Fault&quot;));
IF(GETBIT(inv, 14) = 1, ADDERROR(114, &quot;BatConnDir Fault&quot;));
IF(GETBIT(inv, 15) = 1, ADDERROR(115, &quot;Off-grid Overload&quot;));
IF(GETBIT(inv, 16) = 1, ADDERROR(116, &quot;Overload&quot;));
IF(GETBIT(inv, 17) = 1, ADDERROR(117, &quot;Bat Power Low&quot;));
IF(GETBIT(inv, 18) = 1, ADDERROR(118, &quot;BMS Lost&quot;));
IF(GETBIT(inv, 19) = 1, ADDERROR(119, &quot;Fan Fault&quot;));
IF(GETBIT(inv, 20) = 1, ADDERROR(120, &quot;Low Temp Fault&quot;));
IF(GETBIT(inv, 21) = 1, ADDERROR(121, &quot;Parallel Fault&quot;));
IF(GETBIT(inv, 22) = 1, ADDERROR(122, &quot;Hard Limit Fault&quot;));
IF(GETBIT(inv, 23) = 1, ADDERROR(123, &quot;INV Volt Sample Fault&quot;));
IF(GETBIT(inv, 24) = 1, ADDERROR(124, &quot;Inner Comm Fault&quot;));
IF(GETBIT(inv, 25) = 1, ADDERROR(125, &quot;INV EEPROM Fault&quot;));
IF(GETBIT(inv, 26) = 1, ADDERROR(126, &quot;RCD Fault&quot;));
IF(GETBIT(inv, 27) = 1, ADDERROR(127, &quot;Grid Relay Fault&quot;));
IF(GETBIT(inv, 28) = 1, ADDERROR(128, &quot;Off-grid Relay Fault&quot;));
IF(GETBIT(inv, 29) = 1, ADDERROR(129, &quot;PV ConnDir Fault&quot;));
IF(GETBIT(inv, 30) = 1, ADDERROR(130, &quot;Charger Relay Fault&quot;));
IF(GETBIT(inv, 31) = 1, ADDERROR(131, &quot;Earth Relay Fault&quot;));
VAR mgr := MODBUSR(A, 0x0043, UInt16);
IF(GETBIT(mgr, 0) = 1, ADDERROR(200, &quot;Power Type Fault&quot;));
IF(GETBIT(mgr, 1) = 1, ADDWARNING(201, &quot;Port OC Warning&quot;));
IF(GETBIT(mgr, 2) = 1, ADDERROR(202, &quot;Mgr EEPROM Fault&quot;));
IF(GETBIT(mgr, 4) = 1, ADDERROR(204, &quot;NTC Sample Invalid&quot;));
IF(GETBIT(mgr, 5) = 1, ADDERROR(205, &quot;Battery Temperature Low&quot;));
IF(GETBIT(mgr, 6) = 1, ADDERROR(206, &quot;Battery Temperature High&quot;));
IF(GETBIT(mgr, 9) = 1, ADDERROR(209, &quot;Meter Fault&quot;));
IF(GETBIT(mgr, 10) = 1, ADDERROR(210, &quot;Bypass Relay Fault&quot;));
IF(GETBIT(mgr, 11) = 1, ADDERROR(211, &quot;Fan 2 Fault&quot;));</ReadScript>
        <ServiceAttributesFormulas>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Run mode&quot;},&quot;ReadFormula&quot;:&quot;SWITCH(MODBUSR(A, 0x0009, UInt16), 0, \&quot;Waiting\&quot;, 1, \&quot;Checking\&quot;, 2, \&quot;Normal\&quot;, 3, \&quot;Fault\&quot;, 4, \&quot;Permanent fault\&quot;, 5, \&quot;Update\&quot;, 6, \&quot;Off-grid waiting\&quot;, 7, \&quot;Off-grid\&quot;, 8, \&quot;Self testing\&quot;, 9, \&quot;Idle\&quot;, 10, \&quot;Standby\&quot;, 20, \&quot;Remote control\&quot;, \&quot;Other\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Machine type&quot;},&quot;ReadFormula&quot;:&quot;SWITCH(MODBUSR(H, 0x0105, UInt16), 1, \&quot;X1 (single-phase)\&quot;, 3, \&quot;X3 (three-phase)\&quot;, \&quot;Unknown\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Settings lock&quot;},&quot;ReadFormula&quot;:&quot;SWITCH(MODBUSR(A, 0x0054, UInt16), 0, \&quot;Locked\&quot;, 1, \&quot;Unlocked\&quot;, \&quot;Unknown\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Remote control mode&quot;},&quot;ReadFormula&quot;:&quot;SWITCH(MODBUSR(A, 0x0100, UInt16), 0, \&quot;Off\&quot;, 1, \&quot;Power control\&quot;, 2, \&quot;Energy target\&quot;, 3, \&quot;SOC target\&quot;, \&quot;Other\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Remote control - maximum target&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x010A, LittleEndianInt32)) + \&quot; W\&quot;&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Remote control - minimum target&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x010C, LittleEndianInt32)) + \&quot; W\&quot;&quot;}]</ServiceAttributesFormulas>
        <ServiceActionsScripts>[{&quot;ActionDefinition&quot;:{&quot;Name&quot;:&quot;Unlock settings (password 2014)&quot;,&quot;NumericParameters&quot;:[],&quot;BoolParameters&quot;:[],&quot;EnumParameters&quot;:[]},&quot;Script&quot;:&quot;MODBUSW(SH, 0x0000, Uint16, 2014);&quot;},{&quot;ActionDefinition&quot;:{&quot;Name&quot;:&quot;End remote control&quot;,&quot;NumericParameters&quot;:[],&quot;BoolParameters&quot;:[],&quot;EnumParameters&quot;:[]},&quot;Script&quot;:&quot;MODBUSW(H, 0x007C, Uint16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);&quot;}]</ServiceActionsScripts>
      </DeviceProperties>
      <Devices>
        <Device>
          <Name>${deviceType_PVProduction}</Name>
          <Id>-2</Id>
          <Model>ModbusElectricityMeter</Model>
          <DeviceProperties>
            <DeviceType>9002</DeviceType>
            <InternalPollInterval>10000</InternalPollInterval>
            <ReadDemand>(MODBUSR(A, 0x000A, UInt16) + MODBUSR(A, 0x000B, UInt16) + MODBUSR(A, 0x0124, UInt16)) / 1000</ReadDemand>
            <ReadTotalConsumption>MODBUSR(A, 0x0094, LittleEndianUint32) / 10</ReadTotalConsumption>
            <ServiceAttributesFormulas>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;PV1 power&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x000A, UInt16)) + \&quot; W\&quot;&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;PV2 power&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x000B, UInt16)) + \&quot; W\&quot;&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;PV3 power&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x0124, UInt16)) + \&quot; W\&quot;&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Inverter AC output - total energy&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x0052, LittleEndianUint32) / 10, \&quot;F1\&quot;) + \&quot; kWh\&quot;&quot;}]</ServiceAttributesFormulas>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Grid - power balance</Name>
          <Id>-3</Id>
          <Model>ModbusElectricityMeter</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>5000</InternalPollInterval>
            <ReadDemand>MODBUSR(A, 0x0046, LittleEndianInt32) / -1000</ReadDemand>
            <ReadTotalConsumption/>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>${deviceType_PVFromGrid}</Name>
          <Id>-4</Id>
          <Model>ModbusElectricityMeter</Model>
          <DeviceProperties>
            <DeviceType>9004</DeviceType>
            <InternalPollInterval>10000</InternalPollInterval>
            <ReadDemand>MAX(-MODBUSR(A, 0x0046, LittleEndianInt32), 0) / 1000</ReadDemand>
            <ReadTotalConsumption>MODBUSR(A, 0x004A, LittleEndianUint32) / 100</ReadTotalConsumption>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>${deviceType_PVToGrid}</Name>
          <Id>-5</Id>
          <Model>ModbusElectricityMeter</Model>
          <DeviceProperties>
            <DeviceType>9005</DeviceType>
            <InternalPollInterval>10000</InternalPollInterval>
            <ReadDemand>MAX(MODBUSR(A, 0x0046, LittleEndianInt32), 0) / 1000</ReadDemand>
            <ReadTotalConsumption>MODBUSR(A, 0x0048, LittleEndianUint32) / 100</ReadTotalConsumption>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>${deviceType_PVToBattery}</Name>
          <Id>-6</Id>
          <Model>ModbusElectricityMeter</Model>
          <DeviceProperties>
            <DeviceType>9007</DeviceType>
            <InternalPollInterval>10000</InternalPollInterval>
            <ReadDemand>MAX(MODBUSR(A, 0x0016, Int16), 0) / 1000</ReadDemand>
            <ReadTotalConsumption>MODBUSR(A, 0x0021, LittleEndianUint32) / 10</ReadTotalConsumption>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>${deviceType_PVFromBattery}</Name>
          <Id>-7</Id>
          <Model>ModbusElectricityMeter</Model>
          <DeviceProperties>
            <DeviceType>9006</DeviceType>
            <InternalPollInterval>10000</InternalPollInterval>
            <ReadDemand>MAX(-MODBUSR(A, 0x0016, Int16), 0) / 1000</ReadDemand>
            <ReadTotalConsumption>MODBUSR(A, 0x001D, LittleEndianUint32) / 10</ReadTotalConsumption>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>${deviceType_PVLoad}</Name>
          <Id>-8</Id>
          <Model>ModbusElectricityMeter</Model>
          <DeviceProperties>
            <DeviceType>9003</DeviceType>
            <InternalPollInterval>10000</InternalPollInterval>
            <ReadDemand>((MODBUSR(A, 0x006C, Int16) + MODBUSR(A, 0x0070, Int16) + MODBUSR(A, 0x0074, Int16)) - MODBUSR(A, 0x0046, LittleEndianInt32)) / 1000</ReadDemand>
            <ReadTotalConsumption/>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>${deviceType_BatterySOC}</Name>
          <Id>-9</Id>
          <Model>ModbusAnalogInput</Model>
          <DeviceProperties>
            <DeviceType>11001</DeviceType>
            <InternalPollInterval>15000</InternalPollInterval>
            <ReadInputLevel>MODBUSR(A, 0x001C, UInt16) / 100</ReadInputLevel>
            <ServiceAttributesFormulas>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Remaining energy&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x0118, LittleEndianUint32) / 1000, \&quot;F2\&quot;) + \&quot; kWh\&quot;&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Chargeable energy&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x0116, LittleEndianUint32) / 1000, \&quot;F2\&quot;) + \&quot; kWh\&quot;&quot;}]</ServiceAttributesFormulas>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Battery 2 - state of charge</Name>
          <Id>-10</Id>
          <Model>ModbusAnalogInput</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>30000</InternalPollInterval>
            <ReadInputLevel>MODBUSR(A, 0x012D, UInt16) / 100</ReadInputLevel>
            <ServiceAttributesFormulas>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Battery 2 power&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x0129, Int16)) + \&quot; W\&quot;&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Battery 2 temperature&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x0131, Int16)) + \&quot; °C\&quot;&quot;}]</ServiceAttributesFormulas>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Battery - temperature</Name>
          <Id>-11</Id>
          <Model>ModbusTemperatureSensor</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>30000</InternalPollInterval>
            <ReadTemperature>MODBUSR(A, 0x0018, Int16)</ReadTemperature>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Inverter - AC power</Name>
          <Id>-12</Id>
          <Model>ModbusVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>10000</InternalPollInterval>
            <IsReadOnly>True</IsReadOnly>
            <ReadState>(MODBUSR(A, 0x006C, Int16) + MODBUSR(A, 0x0070, Int16) + MODBUSR(A, 0x0074, Int16)) / 1000</ReadState>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Grid - voltage L1</Name>
          <Id>-13</Id>
          <Model>ModbusVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>15000</InternalPollInterval>
            <IsReadOnly>True</IsReadOnly>
            <ReadState>MODBUSR(A, 0x006A, UInt16) / 10</ReadState>
            <ServiceAttributesFormulas>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Grid voltage L2&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x006E, UInt16) / 10, \&quot;F1\&quot;) + \&quot; V\&quot;&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Grid voltage L3&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x0072, UInt16) / 10, \&quot;F1\&quot;) + \&quot; V\&quot;&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Grid frequency L1&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x006D, UInt16) / 100, \&quot;F2\&quot;) + \&quot; Hz\&quot;&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Grid frequency L2&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x0071, UInt16) / 100, \&quot;F2\&quot;) + \&quot; Hz\&quot;&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Grid frequency L3&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x0075, UInt16) / 100, \&quot;F2\&quot;) + \&quot; Hz\&quot;&quot;}]</ServiceAttributesFormulas>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Settings - work mode</Name>
          <Id>-14</Id>
          <Model>ModbusMultiValueSwitch</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>10000</InternalPollInterval>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <ReadSwitchState>MODBUSR(H, 0x008B, UInt16)</ReadSwitchState>
            <WriteSwitchState>IF(MODBUSR(H, 0x008B, UInt16) != Mu AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(MODBUSR(H, 0x008B, UInt16) != Mu, MODBUSW(SH, 0x001F, Uint16, Mu));</WriteSwitchState>
            <Value0>0</Value0>
            <Value0Index>0</Value0Index>
            <Value0Name>Self use</Value0Name>
            <Value0IconId>37</Value0IconId>
            <Value1>1</Value1>
            <Value1Index>1</Value1Index>
            <Value1Name>Feed-in priority</Value1Name>
            <Value1IconId>121</Value1IconId>
            <Value2>2</Value2>
            <Value2Index>2</Value2Index>
            <Value2Name>Backup</Value2Name>
            <Value2IconId>368</Value2IconId>
            <Value3>3</Value3>
            <Value3Index>3</Value3Index>
            <Value3Name>Manual</Value3Name>
            <Value3IconId>60</Value3IconId>
            <Value4>4</Value4>
            <Value4Index>4</Value4Index>
            <Value4Name>Peak shaving</Value4Name>
            <Value4IconId>366</Value4IconId>
            <Value5>5</Value5>
            <Value5Index>5</Value5Index>
            <Value5Name>Time of use</Value5Name>
            <Value5IconId>2027</Value5IconId>
            <Value6Index>70</Value6Index>
            <Value7Index>71</Value7Index>
            <Value8Index>72</Value8Index>
            <Value9Index>73</Value9Index>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Settings - manual mode</Name>
          <Id>-15</Id>
          <Model>ModbusMultiValueSwitch</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>10000</InternalPollInterval>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <ReadSwitchState>MODBUSR(H, 0x008C, UInt16)</ReadSwitchState>
            <WriteSwitchState>IF(MODBUSR(H, 0x008C, UInt16) != Mu AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(MODBUSR(H, 0x008C, UInt16) != Mu, MODBUSW(SH, 0x0020, Uint16, Mu));</WriteSwitchState>
            <Value0>0</Value0>
            <Value0Index>0</Value0Index>
            <Value0Name>Stop charge and discharge</Value0Name>
            <Value0IconId>215</Value0IconId>
            <Value1>1</Value1>
            <Value1Index>1</Value1Index>
            <Value1Name>Force charge</Value1Name>
            <Value1IconId>231</Value1IconId>
            <Value2>2</Value2>
            <Value2Index>2</Value2Index>
            <Value2Name>Force discharge</Value2Name>
            <Value2IconId>367</Value2IconId>
            <Value3Index>67</Value3Index>
            <Value4Index>68</Value4Index>
            <Value5Index>69</Value5Index>
            <Value6Index>70</Value6Index>
            <Value7Index>71</Value7Index>
            <Value8Index>72</Value8Index>
            <Value9Index>73</Value9Index>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Settings - self-use minimum SOC</Name>
          <Id>-16</Id>
          <Model>ModbusDimmer</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>30000</InternalPollInterval>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <ReadLevel>GETBYTE(MODBUSR(H, 0x0093, UInt16), 1) / 100</ReadLevel>
            <WriteLevel>VAR v := MAX(ROUND(Le * 100), 10);
IF(GETBYTE(MODBUSR(H, 0x0093, UInt16), 1) != v AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(GETBYTE(MODBUSR(H, 0x0093, UInt16), 1) != v, MODBUSW(SH, 0x0061, Uint16, v));</WriteLevel>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Settings - night charge from grid</Name>
          <Id>-17</Id>
          <Model>ModbusSwitch</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>30000</InternalPollInterval>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <OnStateIconId>60</OnStateIconId>
            <OffStateIconId>61</OffStateIconId>
            <OnStateName>${general_on}</OnStateName>
            <OffStateName>${general_off}</OffStateName>
            <ReadSwitchState>GETBYTE(MODBUSR(H, 0x0093, UInt16), 0)</ReadSwitchState>
            <WriteSwitchState>IF(GETBYTE(MODBUSR(H, 0x0093, UInt16), 0) != St AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(GETBYTE(MODBUSR(H, 0x0093, UInt16), 0) != St, MODBUSW(SH, 0x0062, Uint16, St));</WriteSwitchState>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Settings - night charge target SOC</Name>
          <Id>-18</Id>
          <Model>ModbusDimmer</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>30000</InternalPollInterval>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <ReadLevel>MODBUSR(H, 0x0094, UInt16) / 100</ReadLevel>
            <WriteLevel>VAR v := MAX(ROUND(Le * 100), 10);
IF(MODBUSR(H, 0x0094, UInt16) != v AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(MODBUSR(H, 0x0094, UInt16) != v, MODBUSW(SH, 0x0063, Uint16, v));</WriteLevel>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Settings - export limit</Name>
          <Id>-19</Id>
          <Model>ModbusVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>30000</InternalPollInterval>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <IsReadOnly>False</IsReadOnly>
            <ReadState>MODBUSR(H, 0x00B6, UInt16) / 100</ReadState>
            <WriteState>VAR v := MAX(ROUND(Va * 100), 0);
IF(MODBUSR(H, 0x00B6, UInt16) != v AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(MODBUSR(H, 0x00B6, UInt16) != v, MODBUSW(SH, 0x0042, Uint16, v));</WriteState>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Remote control - AC power target</Name>
          <Id>-20</Id>
          <Model>ModbusVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>60000</InternalPollInterval>
            <ShouldDoPeriodicWrite>True</ShouldDoPeriodicWrite>
            <IsReadOnly>False</IsReadOnly>
            <ReadState>IF(MODBUSR(A, 0x0100, UInt16) = 1, MODBUSR(A, 0x0102, LittleEndianInt32) / 1000, 0)</ReadState>
            <WriteState>VAR w := ROUND(Va * 1000);
VAR u := IF(w &lt; 0, w + 4294967296, w);
IF(w = 0 AND MODBUSR(A, 0x0100, UInt16) != 0, MODBUSW(H, 0x007C, Uint16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
IF(w != 0 AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(w != 0, MODBUSW(H, 0x007C, Uint16, 1, 1, MOD(u, 65536), FLOOR(u / 65536), 0, 0, 120, 0, 0, 0, 0, 0, 60));</WriteState>
            <ServiceAttributesFormulas>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Actual AC power&quot;},&quot;ReadFormula&quot;:&quot;TOSTRING(MODBUSR(A, 0x0106, LittleEndianInt32)) + \&quot; W\&quot;&quot;}]</ServiceAttributesFormulas>
          </DeviceProperties>
        </Device>
      </Devices>
    </Module>
  </Template>
</Templates>
