﻿<?xml version="1.0" encoding="utf-8"?>
<Templates format="2" protocolVersion="83">
  <Template revision="1.1" id ="2d0e5a24-1dbb-4ffd-b7a4-ee8667e63d64">
    <SuggestedCCUParameters />
    <RevisionHistory>
      <Revision id="1.0">Initial version</Revision>
      <Revision id="1.1">Changed to use RECEIVEDMSG</Revision>
    </RevisionHistory>
    <Name>Shelly 3EM MQTT</Name>
    <CcuModel>PacketParserCCU</CcuModel>
    <Producer></Producer>
    <Model></Model>
    <Description>To enable MQTT in browser interface go to Internet and Security / Advanced - Developer Settings, tick "Enable action execution via MQTT" and fill out "Server" input by formula {MQTT broker IP address}:{port}" and press SAVE.

To find Device ID in browser interface go to Settings / Device Info / Device ID. It is the first string of characters (not in the brackets!)
</Description>
<ImportParameters>
      <Parameter>
        <Name>Mqtt Broker ${ipAddress}</Name>	
        <Value>192.168.0.1</Value>
        <Id>IpAddress</Id>
      </Parameter>
          <Parameter>
        <Name>Mqtt Broker port</Name>	
        <Value>1883</Value>
        <Id>Port</Id>
      </Parameter>
          <Parameter>
        <Name>Device ID</Name>	
        <Value></Value>
        <Id>dID</Id>
      </Parameter>
    </ImportParameters>
    <Module>
      <Name>Shelly 3EM MQTT</Name>
      <Id>-1</Id>
      <Model>PacketParserModuleMqtt</Model>
      <DeviceProperties>
        <InternalPollInterval>5000</InternalPollInterval>
        <CustomVariables>[{"Name":"dID","ValueTypeId":2,"NumericValue":0,"StringValue":"$[dID]"},{"Name":"x","ValueTypeId":2,"NumericValue":0,"StringValue":"0"}]</CustomVariables>
        <ListenerScriptPacketParser></ListenerScriptPacketParser>
        <IpAddress>$[IpAddress]</IpAddress>
        <Port>$[Port]</Port>
        <RootTopic>shellies/#</RootTopic>
      </DeviceProperties>
      <Devices>
        <Device>
          <Name>Electric meter (phase 1)</Name>
          <Model>PacketParserElectricityMeter</Model>
          <Id>-2</Id>
          <DeviceProperties>
            <ReadScriptPacketParser />
            <InternalPollInterval>15000</InternalPollInterval>
            <CustomVariables>[]</CustomVariables>
            <ServiceAttributesScriptsPacketParser>[{"AttributeDefinition":{"Name":"returned energy [Wh]"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/0/total_returned\u0022)\r\n return(parsejson(x, \u0022Payload\u0022));\r\nEND"},{"AttributeDefinition":{"Name":"voltage [V]"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/0/voltage\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"},{"AttributeDefinition":{"Name":"current [A]"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/0/current\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"},{"AttributeDefinition":{"Name":"power factor"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/0/pf\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"}]</ServiceAttributesScriptsPacketParser>
            <ServiceActionsScriptsPacketParser>[{"ActionDefinition":{"Name":"Reset total","NumericParameters":[],"BoolParameters":[],"EnumParameters":[]},"Script":"mqttpublish(\u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/0/command\u0022, \u0022reset_totals\u0022);"}]</ServiceActionsScriptsPacketParser>
            <ListenerScriptPacketParser>
IF(RECEIVEDMSG.TOPIC = "shellies/shellyem3-"+dID+"/emeter/0/power")
 Ed := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD))/1000;
elseif(RECEIVEDMSG.TOPIC = "shellies/shellyem3-"+dID+"/emeter/0/total")
 To := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD))/1000;
END</ListenerScriptPacketParser>
            <ReadTotalConsumptionScriptPacketParser># Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");</ReadTotalConsumptionScriptPacketParser>
            <ReadDemandScriptPacketParser># Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");</ReadDemandScriptPacketParser>
            <Calibration>0</Calibration>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Electric meter (phase 2)</Name>
          <Model>PacketParserElectricityMeter</Model>
          <Id>-3</Id>
          <DeviceProperties>
            <ReadScriptPacketParser />
            <InternalPollInterval>15000</InternalPollInterval>
            <CustomVariables />
            <ServiceAttributesScriptsPacketParser>[{"AttributeDefinition":{"Name":"total returned [Wh]"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/1/total_returned\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"},{"AttributeDefinition":{"Name":"voltage [V]"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/1/voltage\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"},{"AttributeDefinition":{"Name":"current [A]"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/1/current\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"},{"AttributeDefinition":{"Name":"power factor"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/1/pf\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"}]</ServiceAttributesScriptsPacketParser>
            <ServiceActionsScriptsPacketParser>[{"ActionDefinition":{"Name":"Reset total","NumericParameters":[],"BoolParameters":[],"EnumParameters":[]},"Script":"mqttpublish(\u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/1/command\u0022, \u0022reset_totals\u0022);"}]</ServiceActionsScriptsPacketParser>
            <ListenerScriptPacketParser>
IF(RECEIVEDMSG.TOPIC = "shellies/shellyem3-"+dID+"/emeter/1/power")
 Ed := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD))/1000;
 elseif(RECEIVEDMSG.TOPIC = "shellies/shellyem3-"+dID+"/emeter/1/total")
 To := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD))/1000;
END</ListenerScriptPacketParser>
            <ReadTotalConsumptionScriptPacketParser># Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");</ReadTotalConsumptionScriptPacketParser>
            <ReadDemandScriptPacketParser># Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");</ReadDemandScriptPacketParser>
            <Calibration>0</Calibration>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Electric meter (phase 3)</Name>
          <Model>PacketParserElectricityMeter</Model>
          <Id>-4</Id>
          <DeviceProperties>
            <ReadScriptPacketParser />
            <InternalPollInterval>15000</InternalPollInterval>
            <CustomVariables>[]</CustomVariables>
            <ServiceAttributesScriptsPacketParser>[{"AttributeDefinition":{"Name":"total returned [Wh]"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/2/total_returned\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"},{"AttributeDefinition":{"Name":"voltage [V]"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/2/voltage\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"},{"AttributeDefinition":{"Name":"current [A]"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/2/current\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"},{"AttributeDefinition":{"Name":"Power Factor"},"ReadFormula":"IF(parsejson(x, \u0022Topic\u0022) = \u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/2/pf\u0022)\r\n return(todouble(parsejson(x, \u0022Payload\u0022)));\r\nEND"}]</ServiceAttributesScriptsPacketParser>
            <ServiceActionsScriptsPacketParser>[{"ActionDefinition":{"Name":"reset total","NumericParameters":[],"BoolParameters":[],"EnumParameters":[]},"Script":"mqttpublish(\u0022shellies/shellyem3-\u0022\u002BdID\u002B\u0022/emeter/2/command\u0022, \u0022reset_totals\u0022);"}]</ServiceActionsScriptsPacketParser>
            <ListenerScriptPacketParser>
IF(RECEIVEDMSG.TOPIC = "shellies/shellyem3-"+dID+"/emeter/2/power")
 Ed := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD))/1000;
 elseif(RECEIVEDMSG.TOPIC = "shellies/shellyem3-"+dID+"/emeter/2/total")
 To := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD))/1000;
END</ListenerScriptPacketParser>
            <ReadTotalConsumptionScriptPacketParser># Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");</ReadTotalConsumptionScriptPacketParser>
            <ReadDemandScriptPacketParser># Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");</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>
            <ListenerScriptPacketParser># Parse received bytes:
IF(RECEIVEDMSG.TOPIC = "shellies/shellyem3-"+dID+"/relay/0")
 St := switch(TOSTRING(RECEIVEDMSG.PAYLOAD),"on",1,0);
END
</ListenerScriptPacketParser>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <NegateState>False</NegateState>
            <OnStateIconId>60</OnStateIconId>
            <OffStateIconId>61</OffStateIconId>
            <OnStateName>${general_on}</OnStateName>
            <OffStateName>${general_off}</OffStateName>
            <ReadSwitchStateScriptPacketParser># Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");</ReadSwitchStateScriptPacketParser>
            <WriteSwitchStateScriptPacketParser># Simple HTTP Request:
MQTTPUBLISH("shellies/shellyem3-"+dID+"/relay/0/command", switch(St,1,"on","off"));
# VAR response := SENDHTTPREQUEST("/example/set/value=" + St);
# IF response.IsSuccess = false
#  ADDERROR(response.StatusCode);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/setValue", "GET", "value=" + St, "header1:value1", "header2:value2", ...);\r
# Or VAR request := HTTPREQUEST("/example/setValue");
# request.Method := "PUT";
# VAR response := SENDHTTPREQUEST(request);
#r
#
# Send TCP, UDP data:
# VAR data1 := "{\"name\":\"John\", \"age\":" + St + "}";
# SENDDATA(data1);
# VAR data2 := TOBYTES("{\"name\":\"John\", \"age\":" + St + "}", "iso-8859-1");
# SENDDATA(data2);
# You can process received TCP or UDP data in the Listener script
#
#
# Upload data to FTP:
# FTPUPLOAD("filePath", "somedata=" + St, "write"); # use "append" mode to append data to existing file</WriteSwitchStateScriptPacketParser>
          </DeviceProperties>
        </Device>
      </Devices>
    </Module>
  </Template>
</Templates>