﻿<?xml version="1.0" encoding="utf-8"?>
<Templates format="2" protocolVersion="73">
  <Template revision="1.0" id = "3f6aaef1-d351-4ca7-906d-1ca7addcf702">
    <SuggestedCCUParameters />
    <RevisionHistory>
      <Revision id="1.0">Initial version</Revision>
    </RevisionHistory>
    <Name>Shelly 3EM</Name>
    <CcuModel>PacketParserCCU</CcuModel>
    <Producer></Producer>
    <Model></Model>
    <Description></Description>
     <ImportParameters>
      <Parameter>
        <Name>${ipAddress}</Name>	
        <Value>192.168.0.1</Value>
        <Id>IpAddress</Id>
      </Parameter>
      </ImportParameters>
    <Module>
      <Name>Shelly 3EM</Name>
      <Id>-1</Id>
      <Model>PacketParserModuleHttp</Model>
      <DeviceProperties>
        <InternalPollInterval>5000</InternalPollInterval>
        <CustomVariables>[{"Name":"emeter0","ValueTypeId":2,"NumericValue":0,"StringValue":"0"},{"Name":"emeter1","ValueTypeId":2,"NumericValue":0,"StringValue":"0"},{"Name":"emeter2","ValueTypeId":2,"NumericValue":0,"StringValue":"0"}]</CustomVariables>
        <IpAddress>$[IpAddress]</IpAddress>
        <Port>80</Port>
        <UseHttps>False</UseHttps>
      </DeviceProperties>
      <Devices>
        <Device>
          <Name>Electric meter (phase 1)</Name>
          <Model>PacketParserElectricityMeter</Model>
          <Id>-2</Id>
          <DeviceProperties>
            <ReadScriptPacketParser>VAR response := SENDHTTPREQUEST("/emeter/0");
IF response.IsSuccess
 emeter0 := response.Content;
ELSE
 ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
 RETURN(NaN);
END
</ReadScriptPacketParser>
            <InternalPollInterval>15000</InternalPollInterval>
            <CustomVariables />
            <ServiceAttributesScriptsPacketParser>[{"AttributeDefinition":{"Name":"power factor"},"ReadFormula":"RETURN(todouble(PARSEjson(emeter0, \u0022pf\u0022)));"},{"AttributeDefinition":{"Name":"Current [A]"},"ReadFormula":"RETURN(PARSEjson(emeter0, \u0022current\u0022));"},{"AttributeDefinition":{"Name":"voltage [V]"},"ReadFormula":"RETURN(PARSEjson(emeter0, \u0022voltage\u0022));"},{"AttributeDefinition":{"Name":"Total returned energy [Wh]"},"ReadFormula":"RETURN(PARSEjson(emeter0, \u0022total_returned\u0022));"}]</ServiceAttributesScriptsPacketParser>
            <ServiceActionsScriptsPacketParser>[{"ActionDefinition":{"Name":"Reset total","NumericParameters":[],"BoolParameters":[],"EnumParameters":[]},"Script":"sendhttprequest(\u0022/emeter/0?reset_totals\u0022);"}]</ServiceActionsScriptsPacketParser>
            <ReadTotalConsumptionScriptPacketParser>RETURN(todouble(PARSEjson(emeter0, "total"))/1000);</ReadTotalConsumptionScriptPacketParser>
            <ReadDemandScriptPacketParser>RETURN(todouble(PARSEjson(emeter0, "power"))/1000);
</ReadDemandScriptPacketParser>
            <Calibration>0</Calibration>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Electric meter (phase 2)</Name>
          <Model>PacketParserElectricityMeter</Model>
          <Id>-3</Id>
          <DeviceProperties>
            <ReadScriptPacketParser>VAR response := SENDHTTPREQUEST("/emeter/1");
IF response.IsSuccess
 emeter1 := response.Content;
ELSE
 ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
 RETURN(NaN);
END</ReadScriptPacketParser>
            <InternalPollInterval>15000</InternalPollInterval>
            <CustomVariables />
            <ServiceAttributesScriptsPacketParser>[{"AttributeDefinition":{"Name":"power factor"},"ReadFormula":"RETURN(PARSEjson(emeter1, \u0022pf\u0022));\r\n"},{"AttributeDefinition":{"Name":"current [A["},"ReadFormula":"RETURN(PARSEjson(emeter1, \u0022current\u0022));"},{"AttributeDefinition":{"Name":"voltage [V]"},"ReadFormula":"RETURN(PARSEjson(emeter1, \u0022voltage\u0022));"},{"AttributeDefinition":{"Name":"total returned energy [Wh]"},"ReadFormula":"RETURN(PARSEjson(emeter1, \u0022total_returned\u0022));"}]</ServiceAttributesScriptsPacketParser>
            <ServiceActionsScriptsPacketParser>[{"ActionDefinition":{"Name":"reset total","NumericParameters":[],"BoolParameters":[],"EnumParameters":[]},"Script":"sendhttprequest(\u0022/emeter/1?reset_totals\u0022);"}]</ServiceActionsScriptsPacketParser>
            <ReadTotalConsumptionScriptPacketParser>RETURN(todouble(PARSEjson(emeter1, "total"))/1000);</ReadTotalConsumptionScriptPacketParser>
            <ReadDemandScriptPacketParser>RETURN(todouble(PARSEjson(emeter1, "power"))/1000);</ReadDemandScriptPacketParser>
            <Calibration>0</Calibration>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Electric meter (phase 3)</Name>
          <Model>PacketParserElectricityMeter</Model>
          <Id>-4</Id>
          <DeviceProperties>
            <ReadScriptPacketParser>var response := SENDHTTPREQUEST("/emeter/2");
IF response.IsSuccess
 emeter2 := response.Content;
ELSE
 ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
 RETURN(NaN);
END</ReadScriptPacketParser>
            <InternalPollInterval>15000</InternalPollInterval>
            <CustomVariables />
            <ServiceAttributesScriptsPacketParser>[{"AttributeDefinition":{"Name":"power factor"},"ReadFormula":"RETURN(PARSEjson(emeter2, \u0022pf\u0022));"},{"AttributeDefinition":{"Name":"current [A]"},"ReadFormula":"RETURN(PARSEjson(emeter2, \u0022current\u0022));"},{"AttributeDefinition":{"Name":"voltage [V]"},"ReadFormula":"RETURN(PARSEjson(emeter2, \u0022voltage\u0022));\r\n"},{"AttributeDefinition":{"Name":"Total returned energy [Wh]"},"ReadFormula":"RETURN(PARSEjson(emeter2, \u0022total_returned\u0022));"}]</ServiceAttributesScriptsPacketParser>
            <ServiceActionsScriptsPacketParser>[{"ActionDefinition":{"Name":"reset total","NumericParameters":[],"BoolParameters":[],"EnumParameters":[]},"Script":"sendhttprequest(\u0022/emeter/2?reset_totals\u0022);"}]</ServiceActionsScriptsPacketParser>
            <ReadTotalConsumptionScriptPacketParser>RETURN(todouble(PARSEjson(emeter2, "total"))/1000);</ReadTotalConsumptionScriptPacketParser>
            <ReadDemandScriptPacketParser>RETURN(todouble(PARSEjson(emeter2, "power"))/1000);</ReadDemandScriptPacketParser>
            <Calibration>0</Calibration>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Switch</Name>
          <Model>PacketParserSwitch</Model>
          <Id>-5</Id>
          <DeviceProperties>
            <ReadScriptPacketParser />
            <InternalPollInterval>2500</InternalPollInterval>
            <CustomVariables />
            <ServiceAttributesScriptsPacketParser></ServiceAttributesScriptsPacketParser>
            <ServiceActionsScriptsPacketParser></ServiceActionsScriptsPacketParser>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <NegateState>False</NegateState>
            <OnStateIconId>60</OnStateIconId>
            <OffStateIconId>61</OffStateIconId>
            <OnStateName>${general_on}</OnStateName>
            <OffStateName>${general_off}</OffStateName>
            <ReadSwitchStateScriptPacketParser>VAR response := SENDHTTPREQUEST("/relay/0");
IF response.IsSuccess
 VAR content := response.Content;
 VAR responseHeaders := response.Headers;
 RETURN(PARSEjson(content, "ison"));
ELSE
 ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
 RETURN(NaN);
END</ReadSwitchStateScriptPacketParser>
            <WriteSwitchStateScriptPacketParser>VAR response := SENDHTTPREQUEST("/relay/0?turn=" + switch(St,1,"on","off"));
IF response.IsSuccess = false
 ADDERROR(response.StatusCode);
END</WriteSwitchStateScriptPacketParser>
          </DeviceProperties>
        </Device>
      </Devices>
    </Module>
  </Template>
</Templates>