<?xml version="1.0" encoding="utf-8"?>
<Templates format="2" protocolVersion="83">
  <Template id="7f3c2a9e-5b41-4d8a-9c07-2e6f815d4b3a" revision="1.0">
    <Name>HomeWizard Wi-Fi P1 Meter</Name>
    <CcuModel>PacketParserCCU</CcuModel>
    <Producer>HomeWizard</Producer>
    <Model>Wi-Fi P1 Meter (HWE-P1)</Model>
    <Description>Reads electricity and gas measurements from the HomeWizard Wi-Fi P1 Meter over its local HTTP API (v1).</Description>
    <Category>2</Category>
    <ImportParameters>
      <Parameter>
        <Id>IpAddress</Id>
        <Name>IP address</Name>
        <Value/>
      </Parameter>
    </ImportParameters>
    <Module>
      <Name>HomeWizard Wi-Fi P1 Meter</Name>
      <Id>-1</Id>
      <Model>PacketParserModuleHttp</Model>
      <DeviceProperties>
        <IpAddress>$[IpAddress]</IpAddress>
        <Port>80</Port>
        <UseHttps>False</UseHttps>
        <InternalPollInterval>5000</InternalPollInterval>
        <CustomVariables>[{&quot;Name&quot;:&quot;P1Data&quot;,&quot;ValueTypeId&quot;:2,&quot;NumericValue&quot;:0,&quot;StringValue&quot;:&quot;0&quot;}]</CustomVariables>
        <ReadScriptPacketParser>VAR response := SENDHTTPREQUEST(&quot;/api/v1/data&quot;);
IF response.IsSuccess
    P1Data := response.Content;
ELSE
    ADDERROR(response.StatusCode + &quot; (&quot; + response.ReasonPhrase + &quot;)&quot;);
END</ReadScriptPacketParser>
      </DeviceProperties>
      <Devices>
        <Device>
          <Name>Energy Import</Name>
          <Id>-2</Id>
          <Model>PacketParserElectricityMeter</Model>
          <DeviceProperties>
            <DeviceType>9004</DeviceType>
            <InternalPollInterval>5000</InternalPollInterval>
            <ReadTotalConsumptionScriptPacketParser>var total := parsejson(P1Data, &quot;total_power_import_kwh&quot;, true);
IF ISNULL(total)
    var t1 := parsejson(P1Data, &quot;total_power_import_t1_kwh&quot;, true);
    var t2 := parsejson(P1Data, &quot;total_power_import_t2_kwh&quot;, true);
    return(IF(ISNULL(t1), 0, todouble(t1)) + IF(ISNULL(t2), 0, todouble(t2)));
END
return(todouble(total));</ReadTotalConsumptionScriptPacketParser>
            <ReadDemandScriptPacketParser>var p := parsejson(P1Data, &quot;active_power_w&quot;, true);
IF ISNULL(p)
    return(0);
END
return(MAX(0, todouble(p)) / 1000);</ReadDemandScriptPacketParser>
            <ServiceAttributesScriptsPacketParser>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Import tariff 1&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;total_power_import_t1_kwh\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;total_power_import_t1_kwh\&quot;, true)), \&quot;F3\&quot;) + \&quot; kWh\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Import tariff 2&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;total_power_import_t2_kwh\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;total_power_import_t2_kwh\&quot;, true)), \&quot;F3\&quot;) + \&quot; kWh\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Line frequency&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;active_frequency_hz\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;active_frequency_hz\&quot;, true)), \&quot;F2\&quot;) + \&quot; Hz\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Wi-Fi signal&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;wifi_strength\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;wifi_strength\&quot;, true)), \&quot;F0\&quot;) + \&quot; %\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Smart meter model&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;meter_model\&quot;, true)), \&quot;-\&quot;, parsejson(P1Data, \&quot;meter_model\&quot;, true))&quot;}]</ServiceAttributesScriptsPacketParser>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Energy Export</Name>
          <Id>-3</Id>
          <Model>PacketParserElectricityMeter</Model>
          <DeviceProperties>
            <DeviceType>9005</DeviceType>
            <InternalPollInterval>5000</InternalPollInterval>
            <ReadTotalConsumptionScriptPacketParser>var total := parsejson(P1Data, &quot;total_power_export_kwh&quot;, true);
IF ISNULL(total)
    var t1 := parsejson(P1Data, &quot;total_power_export_t1_kwh&quot;, true);
    var t2 := parsejson(P1Data, &quot;total_power_export_t2_kwh&quot;, true);
    return(IF(ISNULL(t1), 0, todouble(t1)) + IF(ISNULL(t2), 0, todouble(t2)));
END
return(todouble(total));</ReadTotalConsumptionScriptPacketParser>
            <ReadDemandScriptPacketParser>var p := parsejson(P1Data, &quot;active_power_w&quot;, true);
IF ISNULL(p)
    return(0);
END
return(MAX(0, 0 - todouble(p)) / 1000);</ReadDemandScriptPacketParser>
            <ServiceAttributesScriptsPacketParser>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Export tariff 1&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;total_power_export_t1_kwh\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;total_power_export_t1_kwh\&quot;, true)), \&quot;F3\&quot;) + \&quot; kWh\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Export tariff 2&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;total_power_export_t2_kwh\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;total_power_export_t2_kwh\&quot;, true)), \&quot;F3\&quot;) + \&quot; kWh\&quot;)&quot;}]</ServiceAttributesScriptsPacketParser>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Phase L1 Power</Name>
          <Id>-4</Id>
          <Model>PacketParserVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>5000</InternalPollInterval>
            <IsReadOnly>True</IsReadOnly>
            <ReadStateScriptPacketParser>var p := parsejson(P1Data, &quot;active_power_l1_w&quot;, true);
IF ISNULL(p)
    return(NaN);
END
return(todouble(p));</ReadStateScriptPacketParser>
            <ServiceAttributesScriptsPacketParser>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Voltage&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;active_voltage_l1_v\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;active_voltage_l1_v\&quot;, true)), \&quot;F1\&quot;) + \&quot; V\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Current&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;active_current_l1_a\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;active_current_l1_a\&quot;, true)), \&quot;F2\&quot;) + \&quot; A\&quot;)&quot;}]</ServiceAttributesScriptsPacketParser>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Phase L2 Power</Name>
          <Id>-5</Id>
          <Model>PacketParserVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>5000</InternalPollInterval>
            <IsReadOnly>True</IsReadOnly>
            <ReadStateScriptPacketParser>var p := parsejson(P1Data, &quot;active_power_l2_w&quot;, true);
IF ISNULL(p)
    return(NaN);
END
return(todouble(p));</ReadStateScriptPacketParser>
            <ServiceAttributesScriptsPacketParser>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Voltage&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;active_voltage_l2_v\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;active_voltage_l2_v\&quot;, true)), \&quot;F1\&quot;) + \&quot; V\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Current&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;active_current_l2_a\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;active_current_l2_a\&quot;, true)), \&quot;F2\&quot;) + \&quot; A\&quot;)&quot;}]</ServiceAttributesScriptsPacketParser>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Phase L3 Power</Name>
          <Id>-6</Id>
          <Model>PacketParserVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>5000</InternalPollInterval>
            <IsReadOnly>True</IsReadOnly>
            <ReadStateScriptPacketParser>var p := parsejson(P1Data, &quot;active_power_l3_w&quot;, true);
IF ISNULL(p)
    return(NaN);
END
return(todouble(p));</ReadStateScriptPacketParser>
            <ServiceAttributesScriptsPacketParser>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Voltage&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;active_voltage_l3_v\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;active_voltage_l3_v\&quot;, true)), \&quot;F1\&quot;) + \&quot; V\&quot;)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Current&quot;},&quot;ReadFormula&quot;:&quot;IF(ISNULL(parsejson(P1Data, \&quot;active_current_l3_a\&quot;, true)), \&quot;-\&quot;, TOSTRING(todouble(parsejson(P1Data, \&quot;active_current_l3_a\&quot;, true)), \&quot;F2\&quot;) + \&quot; A\&quot;)&quot;}]</ServiceAttributesScriptsPacketParser>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Gas Meter</Name>
          <Id>-7</Id>
          <Model>PacketParserVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>60000</InternalPollInterval>
            <IsReadOnly>True</IsReadOnly>
            <ReadStateScriptPacketParser>var v := parsejson(P1Data, &quot;total_gas_m3&quot;, true);
IF ISNULL(v)
    return(NaN);
END
return(todouble(v));</ReadStateScriptPacketParser>
          </DeviceProperties>
        </Device>
      </Devices>
    </Module>
  </Template>
</Templates>
