Add event prefix + arbitrary JSON options for IFTTT.

This commit is contained in:
Orne Brocaar 2023-05-19 14:43:39 +01:00
parent 5146c87940
commit 513aa7804d
19 changed files with 3453 additions and 2737 deletions

View File

@ -163,204 +163,205 @@ namespace Chirpstack.Api {
"bG90VGhpbmdzSW50ZWdyYXRpb24iVwojVXBkYXRlUGlsb3RUaGluZ3NJbnRl",
"Z3JhdGlvblJlcXVlc3QSMAoLaW50ZWdyYXRpb24YASABKAsyGy5hcGkuUGls",
"b3RUaGluZ3NJbnRlZ3JhdGlvbiI9CiNEZWxldGVQaWxvdFRoaW5nc0ludGVn",
"cmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSJOChBJZnR0",
"cmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSJ8ChBJZnR0",
"dEludGVncmF0aW9uEhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJEgsKA2tleRgC",
"IAEoCRIVCg11cGxpbmtfdmFsdWVzGAMgAygJIksKHUNyZWF0ZUlmdHR0SW50",
"ZWdyYXRpb25SZXF1ZXN0EioKC2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklm",
"dHR0SW50ZWdyYXRpb24iNAoaR2V0SWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QS",
"FgoOYXBwbGljYXRpb25faWQYASABKAkiSQobR2V0SWZ0dHRJbnRlZ3JhdGlv",
"blJlc3BvbnNlEioKC2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklmdHR0SW50",
"ZWdyYXRpb24iSwodVXBkYXRlSWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QSKgoL",
"aW50ZWdyYXRpb24YASABKAsyFS5hcGkuSWZ0dHRJbnRlZ3JhdGlvbiI3Ch1E",
"ZWxldGVJZnR0dEludGVncmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9p",
"ZBgBIAEoCSJJCi9HZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRp",
"ZmljYXRlUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSKWAQowR2Vu",
"ZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZVJlc3BvbnNl",
"EhAKCHRsc19jZXJ0GAEgASgJEg8KB3Rsc19rZXkYAiABKAkSDwoHY2FfY2Vy",
"dBgDIAEoCRIuCgpleHBpcmVzX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVm",
"LlRpbWVzdGFtcCoiCghFbmNvZGluZxIICgRKU09OEAASDAoIUFJPVE9CVUYQ",
"ASq/AQoPSW50ZWdyYXRpb25LaW5kEggKBEhUVFAQABINCglJTkZMVVhfREIQ",
"ARIQCgxUSElOR1NfQk9BUkQQAhIOCgpNWV9ERVZJQ0VTEAMSDgoKTE9SQV9D",
"TE9VRBAEEg8KC0dDUF9QVUJfU1VCEAUSCwoHQVdTX1NOUxAGEhUKEUFaVVJF",
"X1NFUlZJQ0VfQlVTEAcSEAoMUElMT1RfVEhJTkdTEAgSDwoLTVFUVF9HTE9C",
"QUwQCRIJCgVJRlRUVBAKKj8KEUluZmx1eERiUHJlY2lzaW9uEgYKAk5TEAAS",
"BQoBVRABEgYKAk1TEAISBQoBUxADEgUKAU0QBBIFCgFIEAUqMQoPSW5mbHV4",
"RGJWZXJzaW9uEg4KCklORkxVWERCXzEQABIOCgpJTkZMVVhEQl8yEAEyuDwK",
"EkFwcGxpY2F0aW9uU2VydmljZRJlCgZDcmVhdGUSHS5hcGkuQ3JlYXRlQXBw",
"bGljYXRpb25SZXF1ZXN0Gh4uYXBpLkNyZWF0ZUFwcGxpY2F0aW9uUmVzcG9u",
"c2UiHILT5JMCFiIRL2FwaS9hcHBsaWNhdGlvbnM6ASoSXgoDR2V0EhouYXBp",
"LkdldEFwcGxpY2F0aW9uUmVxdWVzdBobLmFwaS5HZXRBcHBsaWNhdGlvblJl",
"c3BvbnNlIh6C0+STAhgSFi9hcGkvYXBwbGljYXRpb25zL3tpZH0SbgoGVXBk",
"YXRlEh0uYXBpLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBoWLmdvb2dsZS5w",
"cm90b2J1Zi5FbXB0eSItgtPkkwInGiIvYXBpL2FwcGxpY2F0aW9ucy97YXBw",
"bGljYXRpb24uaWR9OgEqEl8KBkRlbGV0ZRIdLmFwaS5EZWxldGVBcHBsaWNh",
"dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiHoLT5JMCGCoW",
"L2FwaS9hcHBsaWNhdGlvbnMve2lkfRJeCgRMaXN0EhwuYXBpLkxpc3RBcHBs",
"aWNhdGlvbnNSZXF1ZXN0Gh0uYXBpLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25z",
"ZSIZgtPkkwITEhEvYXBpL2FwcGxpY2F0aW9ucxKIAQoQTGlzdEludGVncmF0",
"aW9ucxIcLmFwaS5MaXN0SW50ZWdyYXRpb25zUmVxdWVzdBodLmFwaS5MaXN0",
"SW50ZWdyYXRpb25zUmVzcG9uc2UiN4LT5JMCMRIvL2FwaS9hcHBsaWNhdGlv",
"bnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMSnwEKFUNyZWF0ZUh0",
"dHBJbnRlZ3JhdGlvbhIhLmFwaS5DcmVhdGVIdHRwSW50ZWdyYXRpb25SZXF1",
"ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkuC0+STAkUiQC9hcGkvYXBw",
"IAEoCRIVCg11cGxpbmtfdmFsdWVzGAMgAygJEhYKDmFyYml0cmFyeV9qc29u",
"GAQgASgIEhQKDGV2ZW50X3ByZWZpeBgFIAEoCSJLCh1DcmVhdGVJZnR0dElu",
"dGVncmF0aW9uUmVxdWVzdBIqCgtpbnRlZ3JhdGlvbhgBIAEoCzIVLmFwaS5J",
"ZnR0dEludGVncmF0aW9uIjQKGkdldElmdHR0SW50ZWdyYXRpb25SZXF1ZXN0",
"EhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJIkkKG0dldElmdHR0SW50ZWdyYXRp",
"b25SZXNwb25zZRIqCgtpbnRlZ3JhdGlvbhgBIAEoCzIVLmFwaS5JZnR0dElu",
"dGVncmF0aW9uIksKHVVwZGF0ZUlmdHR0SW50ZWdyYXRpb25SZXF1ZXN0EioK",
"C2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklmdHR0SW50ZWdyYXRpb24iNwod",
"RGVsZXRlSWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QSFgoOYXBwbGljYXRpb25f",
"aWQYASABKAkiSQovR2VuZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0",
"aWZpY2F0ZVJlcXVlc3QSFgoOYXBwbGljYXRpb25faWQYASABKAkilgEKMEdl",
"bmVyYXRlTXF0dEludGVncmF0aW9uQ2xpZW50Q2VydGlmaWNhdGVSZXNwb25z",
"ZRIQCgh0bHNfY2VydBgBIAEoCRIPCgd0bHNfa2V5GAIgASgJEg8KB2NhX2Nl",
"cnQYAyABKAkSLgoKZXhwaXJlc19hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1",
"Zi5UaW1lc3RhbXAqIgoIRW5jb2RpbmcSCAoESlNPThAAEgwKCFBST1RPQlVG",
"EAEqvwEKD0ludGVncmF0aW9uS2luZBIICgRIVFRQEAASDQoJSU5GTFVYX0RC",
"EAESEAoMVEhJTkdTX0JPQVJEEAISDgoKTVlfREVWSUNFUxADEg4KCkxPUkFf",
"Q0xPVUQQBBIPCgtHQ1BfUFVCX1NVQhAFEgsKB0FXU19TTlMQBhIVChFBWlVS",
"RV9TRVJWSUNFX0JVUxAHEhAKDFBJTE9UX1RISU5HUxAIEg8KC01RVFRfR0xP",
"QkFMEAkSCQoFSUZUVFQQCio/ChFJbmZsdXhEYlByZWNpc2lvbhIGCgJOUxAA",
"EgUKAVUQARIGCgJNUxACEgUKAVMQAxIFCgFNEAQSBQoBSBAFKjEKD0luZmx1",
"eERiVmVyc2lvbhIOCgpJTkZMVVhEQl8xEAASDgoKSU5GTFVYREJfMhABMrg8",
"ChJBcHBsaWNhdGlvblNlcnZpY2USZQoGQ3JlYXRlEh0uYXBpLkNyZWF0ZUFw",
"cGxpY2F0aW9uUmVxdWVzdBoeLmFwaS5DcmVhdGVBcHBsaWNhdGlvblJlc3Bv",
"bnNlIhyC0+STAhYiES9hcGkvYXBwbGljYXRpb25zOgEqEl4KA0dldBIaLmFw",
"aS5HZXRBcHBsaWNhdGlvblJlcXVlc3QaGy5hcGkuR2V0QXBwbGljYXRpb25S",
"ZXNwb25zZSIegtPkkwIYEhYvYXBpL2FwcGxpY2F0aW9ucy97aWR9Em4KBlVw",
"ZGF0ZRIdLmFwaS5VcGRhdGVBcHBsaWNhdGlvblJlcXVlc3QaFi5nb29nbGUu",
"cHJvdG9idWYuRW1wdHkiLYLT5JMCJxoiL2FwaS9hcHBsaWNhdGlvbnMve2Fw",
"cGxpY2F0aW9uLmlkfToBKhJfCgZEZWxldGUSHS5hcGkuRGVsZXRlQXBwbGlj",
"YXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ih6C0+STAhgq",
"Fi9hcGkvYXBwbGljYXRpb25zL3tpZH0SXgoETGlzdBIcLmFwaS5MaXN0QXBw",
"bGljYXRpb25zUmVxdWVzdBodLmFwaS5MaXN0QXBwbGljYXRpb25zUmVzcG9u",
"c2UiGYLT5JMCExIRL2FwaS9hcHBsaWNhdGlvbnMSiAEKEExpc3RJbnRlZ3Jh",
"dGlvbnMSHC5hcGkuTGlzdEludGVncmF0aW9uc1JlcXVlc3QaHS5hcGkuTGlz",
"dEludGVncmF0aW9uc1Jlc3BvbnNlIjeC0+STAjESLy9hcGkvYXBwbGljYXRp",
"b25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zEp8BChVDcmVhdGVI",
"dHRwSW50ZWdyYXRpb24SIS5hcGkuQ3JlYXRlSHR0cEludGVncmF0aW9uUmVx",
"dWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJLgtPkkwJFIkAvYXBpL2Fw",
"cGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVn",
"cmF0aW9ucy9odHRwOgEqEpMBChJHZXRIdHRwSW50ZWdyYXRpb24SHi5hcGku",
"R2V0SHR0cEludGVncmF0aW9uUmVxdWVzdBofLmFwaS5HZXRIdHRwSW50ZWdy",
"YXRpb25SZXNwb25zZSI8gtPkkwI2EjQvYXBpL2FwcGxpY2F0aW9ucy97YXBw",
"bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9odHRwEp8BChVVcGRhdGVIdHRw",
"SW50ZWdyYXRpb24SIS5hcGkuVXBkYXRlSHR0cEludGVncmF0aW9uUmVxdWVz",
"dBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJLgtPkkwJFGkAvYXBpL2FwcGxp",
"Y2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0",
"aW9ucy9odHRwOgEqEpABChVEZWxldGVIdHRwSW50ZWdyYXRpb24SIS5hcGku",
"RGVsZXRlSHR0cEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1",
"Zi5FbXB0eSI8gtPkkwI2KjQvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRp",
"b25faWR9L2ludGVncmF0aW9ucy9odHRwEqsBChlDcmVhdGVJbmZsdXhEYklu",
"dGVncmF0aW9uEiUuYXBpLkNyZWF0ZUluZmx1eERiSW50ZWdyYXRpb25SZXF1",
"ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ik+C0+STAkkiRC9hcGkvYXBw",
"bGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdy",
"YXRpb25zL2h0dHA6ASoSkwEKEkdldEh0dHBJbnRlZ3JhdGlvbhIeLmFwaS5H",
"ZXRIdHRwSW50ZWdyYXRpb25SZXF1ZXN0Gh8uYXBpLkdldEh0dHBJbnRlZ3Jh",
"dGlvblJlc3BvbnNlIjyC0+STAjYSNC9hcGkvYXBwbGljYXRpb25zL3thcHBs",
"aWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2h0dHASnwEKFVVwZGF0ZUh0dHBJ",
"bnRlZ3JhdGlvbhIhLmFwaS5VcGRhdGVIdHRwSW50ZWdyYXRpb25SZXF1ZXN0",
"GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkuC0+STAkUaQC9hcGkvYXBwbGlj",
"YXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRp",
"b25zL2h0dHA6ASoSkAEKFURlbGV0ZUh0dHBJbnRlZ3JhdGlvbhIhLmFwaS5E",
"ZWxldGVIdHRwSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm",
"LkVtcHR5IjyC0+STAjYqNC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlv",
"bl9pZH0vaW50ZWdyYXRpb25zL2h0dHASqwEKGUNyZWF0ZUluZmx1eERiSW50",
"ZWdyYXRpb24SJS5hcGkuQ3JlYXRlSW5mbHV4RGJJbnRlZ3JhdGlvblJlcXVl",
"c3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiT4LT5JMCSSJEL2FwaS9hcHBs",
"aWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3Jh",
"dGlvbnMvaW5mbHV4ZGI6ASoSowEKFkdldEluZmx1eERiSW50ZWdyYXRpb24S",
"Ii5hcGkuR2V0SW5mbHV4RGJJbnRlZ3JhdGlvblJlcXVlc3QaIy5hcGkuR2V0",
"SW5mbHV4RGJJbnRlZ3JhdGlvblJlc3BvbnNlIkCC0+STAjoSOC9hcGkvYXBw",
"bGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2luZmx1",
"eGRiEqsBChlVcGRhdGVJbmZsdXhEYkludGVncmF0aW9uEiUuYXBpLlVwZGF0",
"ZUluZmx1eERiSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm",
"LkVtcHR5Ik+C0+STAkkaRC9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlv",
"bi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2luZmx1eGRiOgEqEpwB",
"ChlEZWxldGVJbmZsdXhEYkludGVncmF0aW9uEiUuYXBpLkRlbGV0ZUluZmx1",
"eERiSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5",
"IkCC0+STAjoqOC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0v",
"aW50ZWdyYXRpb25zL2luZmx1eGRiErQBChxDcmVhdGVUaGluZ3NCb2FyZElu",
"dGVncmF0aW9uEiguYXBpLkNyZWF0ZVRoaW5nc0JvYXJkSW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IlKC0+STAkwiRy9hcGkv",
"YXRpb25zL2luZmx1eGRiOgEqEqMBChZHZXRJbmZsdXhEYkludGVncmF0aW9u",
"EiIuYXBpLkdldEluZmx1eERiSW50ZWdyYXRpb25SZXF1ZXN0GiMuYXBpLkdl",
"dEluZmx1eERiSW50ZWdyYXRpb25SZXNwb25zZSJAgtPkkwI6EjgvYXBpL2Fw",
"cGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pbmZs",
"dXhkYhKrAQoZVXBkYXRlSW5mbHV4RGJJbnRlZ3JhdGlvbhIlLmFwaS5VcGRh",
"dGVJbmZsdXhEYkludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1",
"Zi5FbXB0eSJPgtPkkwJJGkQvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRp",
"b24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pbmZsdXhkYjoBKhKc",
"AQoZRGVsZXRlSW5mbHV4RGJJbnRlZ3JhdGlvbhIlLmFwaS5EZWxldGVJbmZs",
"dXhEYkludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0",
"eSJAgtPkkwI6KjgvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9",
"L2ludGVncmF0aW9ucy9pbmZsdXhkYhK0AQocQ3JlYXRlVGhpbmdzQm9hcmRJ",
"bnRlZ3JhdGlvbhIoLmFwaS5DcmVhdGVUaGluZ3NCb2FyZEludGVncmF0aW9u",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMIkcvYXBp",
"L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu",
"dGVncmF0aW9ucy90aGluZ3Nib2FyZDoBKhKvAQoZR2V0VGhpbmdzQm9hcmRJ",
"bnRlZ3JhdGlvbhIlLmFwaS5HZXRUaGluZ3NCb2FyZEludGVncmF0aW9uUmVx",
"dWVzdBomLmFwaS5HZXRUaGluZ3NCb2FyZEludGVncmF0aW9uUmVzcG9uc2Ui",
"Q4LT5JMCPRI7L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9p",
"bnRlZ3JhdGlvbnMvdGhpbmdzYm9hcmQStAEKHFVwZGF0ZVRoaW5nc0JvYXJk",
"SW50ZWdyYXRpb24SKC5hcGkuVXBkYXRlVGhpbmdzQm9hcmRJbnRlZ3JhdGlv",
"blJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUoLT5JMCTBpHL2Fw",
"aS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9p",
"bnRlZ3JhdGlvbnMvdGhpbmdzYm9hcmQ6ASoSpQEKHERlbGV0ZVRoaW5nc0Jv",
"YXJkSW50ZWdyYXRpb24SKC5hcGkuRGVsZXRlVGhpbmdzQm9hcmRJbnRlZ3Jh",
"dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiQ4LT5JMCPSo7",
"L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlv",
"bnMvdGhpbmdzYm9hcmQSrgEKGkNyZWF0ZU15RGV2aWNlc0ludGVncmF0aW9u",
"EiYuYXBpLkNyZWF0ZU15RGV2aWNlc0ludGVncmF0aW9uUmVxdWVzdBoWLmdv",
"b2dsZS5wcm90b2J1Zi5FbXB0eSJQgtPkkwJKIkUvYXBpL2FwcGxpY2F0aW9u",
"cy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9t",
"eWRldmljZXM6ASoSpwEKF0dldE15RGV2aWNlc0ludGVncmF0aW9uEiMuYXBp",
"LkdldE15RGV2aWNlc0ludGVncmF0aW9uUmVxdWVzdBokLmFwaS5HZXRNeURl",
"dmljZXNJbnRlZ3JhdGlvblJlc3BvbnNlIkGC0+STAjsSOS9hcGkvYXBwbGlj",
"YXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL215ZGV2aWNl",
"cxKuAQoaVXBkYXRlTXlEZXZpY2VzSW50ZWdyYXRpb24SJi5hcGkuVXBkYXRl",
"TXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm",
"LkVtcHR5IlCC0+STAkoaRS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlv",
"bi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL215ZGV2aWNlczoBKhKf",
"AQoaRGVsZXRlTXlEZXZpY2VzSW50ZWdyYXRpb24SJi5hcGkuRGVsZXRlTXlE",
"ZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVt",
"cHR5IkGC0+STAjsqOS9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9p",
"ZH0vaW50ZWdyYXRpb25zL215ZGV2aWNlcxKuAQoaQ3JlYXRlTG9yYUNsb3Vk",
"SW50ZWdyYXRpb24SJi5hcGkuQ3JlYXRlTG9yYUNsb3VkSW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IlCC0+STAkoiRS9hcGkv",
"YXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50",
"ZWdyYXRpb25zL3RoaW5nc2JvYXJkOgEqEq8BChlHZXRUaGluZ3NCb2FyZElu",
"dGVncmF0aW9uEiUuYXBpLkdldFRoaW5nc0JvYXJkSW50ZWdyYXRpb25SZXF1",
"ZXN0GiYuYXBpLkdldFRoaW5nc0JvYXJkSW50ZWdyYXRpb25SZXNwb25zZSJD",
"gtPkkwI9EjsvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2lu",
"dGVncmF0aW9ucy90aGluZ3Nib2FyZBK0AQocVXBkYXRlVGhpbmdzQm9hcmRJ",
"bnRlZ3JhdGlvbhIoLmFwaS5VcGRhdGVUaGluZ3NCb2FyZEludGVncmF0aW9u",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMGkcvYXBp",
"L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu",
"dGVncmF0aW9ucy90aGluZ3Nib2FyZDoBKhKlAQocRGVsZXRlVGhpbmdzQm9h",
"cmRJbnRlZ3JhdGlvbhIoLmFwaS5EZWxldGVUaGluZ3NCb2FyZEludGVncmF0",
"aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJDgtPkkwI9Kjsv",
"ZWdyYXRpb25zL2xvcmFjbG91ZDoBKhKnAQoXR2V0TG9yYUNsb3VkSW50ZWdy",
"YXRpb24SIy5hcGkuR2V0TG9yYUNsb3VkSW50ZWdyYXRpb25SZXF1ZXN0GiQu",
"YXBpLkdldExvcmFDbG91ZEludGVncmF0aW9uUmVzcG9uc2UiQYLT5JMCOxI5",
"L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlv",
"bnMvbG9yYWNsb3VkEq4BChpVcGRhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvbhIm",
"LmFwaS5VcGRhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29n",
"bGUucHJvdG9idWYuRW1wdHkiUILT5JMCShpFL2FwaS9hcHBsaWNhdGlvbnMv",
"e2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbG9y",
"YWNsb3VkOgEqEp8BChpEZWxldGVMb3JhQ2xvdWRJbnRlZ3JhdGlvbhImLmFw",
"aS5EZWxldGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUu",
"cHJvdG9idWYuRW1wdHkiQYLT5JMCOyo5L2FwaS9hcHBsaWNhdGlvbnMve2Fw",
"cGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbG9yYWNsb3VkErABChpDcmVh",
"dGVHY3BQdWJTdWJJbnRlZ3JhdGlvbhImLmFwaS5DcmVhdGVHY3BQdWJTdWJJ",
"bnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUoLT",
"5JMCTCJHL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0",
"aW9uX2lkfS9pbnRlZ3JhdGlvbnMvZ2NwLXB1Yi1zdWI6ASoSqQEKF0dldEdj",
"cFB1YlN1YkludGVncmF0aW9uEiMuYXBpLkdldEdjcFB1YlN1YkludGVncmF0",
"aW9uUmVxdWVzdBokLmFwaS5HZXRHY3BQdWJTdWJJbnRlZ3JhdGlvblJlc3Bv",
"bnNlIkOC0+STAj0SOy9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9p",
"ZH0vaW50ZWdyYXRpb25zL2djcC1wdWItc3ViErABChpVcGRhdGVHY3BQdWJT",
"dWJJbnRlZ3JhdGlvbhImLmFwaS5VcGRhdGVHY3BQdWJTdWJJbnRlZ3JhdGlv",
"blJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUoLT5JMCTBpHL2Fw",
"aS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9p",
"bnRlZ3JhdGlvbnMvZ2NwLXB1Yi1zdWI6ASoSoQEKGkRlbGV0ZUdjcFB1YlN1",
"YkludGVncmF0aW9uEiYuYXBpLkRlbGV0ZUdjcFB1YlN1YkludGVncmF0aW9u",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJDgtPkkwI9KjsvYXBp",
"L2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9n",
"Y3AtcHViLXN1YhKmAQoXQ3JlYXRlQXdzU25zSW50ZWdyYXRpb24SIy5hcGku",
"Q3JlYXRlQXdzU25zSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3Rv",
"YnVmLkVtcHR5Ik6C0+STAkgiQy9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3Jh",
"dGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2F3cy1zbnM6ASoS",
"nAEKFEdldEF3c1Nuc0ludGVncmF0aW9uEiAuYXBpLkdldEF3c1Nuc0ludGVn",
"cmF0aW9uUmVxdWVzdBohLmFwaS5HZXRBd3NTbnNJbnRlZ3JhdGlvblJlc3Bv",
"bnNlIj+C0+STAjkSNy9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9p",
"ZH0vaW50ZWdyYXRpb25zL2F3cy1zbnMSpgEKF1VwZGF0ZUF3c1Nuc0ludGVn",
"cmF0aW9uEiMuYXBpLlVwZGF0ZUF3c1Nuc0ludGVncmF0aW9uUmVxdWVzdBoW",
"Lmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJOgtPkkwJIGkMvYXBpL2FwcGxpY2F0",
"aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u",
"cy9hd3Mtc25zOgEqEpcBChdEZWxldGVBd3NTbnNJbnRlZ3JhdGlvbhIjLmFw",
"aS5EZWxldGVBd3NTbnNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJv",
"dG9idWYuRW1wdHkiP4LT5JMCOSo3L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxp",
"Y2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXdzLXNucxLCAQogQ3JlYXRlQXp1",
"cmVTZXJ2aWNlQnVzSW50ZWdyYXRpb24SLC5hcGkuQ3JlYXRlQXp1cmVTZXJ2",
"aWNlQnVzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVt",
"cHR5IliC0+STAlIiTS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5h",
"cHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2F6dXJlLXNlcnZpY2UtYnVz",
"OgEqEsEBCh1HZXRBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIpLmFwaS5H",
"ZXRBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaKi5hcGkuR2V0",
"QXp1cmVTZXJ2aWNlQnVzSW50ZWdyYXRpb25SZXNwb25zZSJJgtPkkwJDEkEv",
"YXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u",
"cy90aGluZ3Nib2FyZBKuAQoaQ3JlYXRlTXlEZXZpY2VzSW50ZWdyYXRpb24S",
"Ji5hcGkuQ3JlYXRlTXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29v",
"Z2xlLnByb3RvYnVmLkVtcHR5IlCC0+STAkoiRS9hcGkvYXBwbGljYXRpb25z",
"L3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL215",
"ZGV2aWNlczoBKhKnAQoXR2V0TXlEZXZpY2VzSW50ZWdyYXRpb24SIy5hcGku",
"R2V0TXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GiQuYXBpLkdldE15RGV2",
"aWNlc0ludGVncmF0aW9uUmVzcG9uc2UiQYLT5JMCOxI5L2FwaS9hcHBsaWNh",
"dGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2Vz",
"Eq4BChpVcGRhdGVNeURldmljZXNJbnRlZ3JhdGlvbhImLmFwaS5VcGRhdGVN",
"eURldmljZXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYu",
"RW1wdHkiUILT5JMCShpFL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9u",
"LmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2VzOgEqEp8B",
"ChpEZWxldGVNeURldmljZXNJbnRlZ3JhdGlvbhImLmFwaS5EZWxldGVNeURl",
"dmljZXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w",
"dHkiQYLT5JMCOyo5L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2VzEq4BChpDcmVhdGVMb3JhQ2xvdWRJ",
"bnRlZ3JhdGlvbhImLmFwaS5DcmVhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJl",
"cXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUILT5JMCSiJFL2FwaS9h",
"cHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRl",
"Z3JhdGlvbnMvbG9yYWNsb3VkOgEqEqcBChdHZXRMb3JhQ2xvdWRJbnRlZ3Jh",
"dGlvbhIjLmFwaS5HZXRMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaJC5h",
"cGkuR2V0TG9yYUNsb3VkSW50ZWdyYXRpb25SZXNwb25zZSJBgtPkkwI7Ejkv",
"YXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u",
"cy9sb3JhY2xvdWQSrgEKGlVwZGF0ZUxvcmFDbG91ZEludGVncmF0aW9uEiYu",
"YXBpLlVwZGF0ZUxvcmFDbG91ZEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2ds",
"ZS5wcm90b2J1Zi5FbXB0eSJQgtPkkwJKGkUvYXBpL2FwcGxpY2F0aW9ucy97",
"aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9sb3Jh",
"Y2xvdWQ6ASoSnwEKGkRlbGV0ZUxvcmFDbG91ZEludGVncmF0aW9uEiYuYXBp",
"LkRlbGV0ZUxvcmFDbG91ZEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5w",
"cm90b2J1Zi5FbXB0eSJBgtPkkwI7KjkvYXBpL2FwcGxpY2F0aW9ucy97YXBw",
"bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9sb3JhY2xvdWQSsAEKGkNyZWF0",
"ZUdjcFB1YlN1YkludGVncmF0aW9uEiYuYXBpLkNyZWF0ZUdjcFB1YlN1Yklu",
"dGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPk",
"kwJMIkcvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRp",
"b25faWR9L2ludGVncmF0aW9ucy9nY3AtcHViLXN1YjoBKhKpAQoXR2V0R2Nw",
"UHViU3ViSW50ZWdyYXRpb24SIy5hcGkuR2V0R2NwUHViU3ViSW50ZWdyYXRp",
"b25SZXF1ZXN0GiQuYXBpLkdldEdjcFB1YlN1YkludGVncmF0aW9uUmVzcG9u",
"c2UiQ4LT5JMCPRI7L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvZ2NwLXB1Yi1zdWISsAEKGlVwZGF0ZUdjcFB1YlN1",
"YkludGVncmF0aW9uEiYuYXBpLlVwZGF0ZUdjcFB1YlN1YkludGVncmF0aW9u",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMGkcvYXBp",
"cy9henVyZS1zZXJ2aWNlLWJ1cxLCAQogVXBkYXRlQXp1cmVTZXJ2aWNlQnVz",
"SW50ZWdyYXRpb24SLC5hcGkuVXBkYXRlQXp1cmVTZXJ2aWNlQnVzSW50ZWdy",
"YXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IliC0+STAlIa",
"TS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9p",
"ZH0vaW50ZWdyYXRpb25zL2F6dXJlLXNlcnZpY2UtYnVzOgEqErMBCiBEZWxl",
"dGVBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIsLmFwaS5EZWxldGVBenVy",
"ZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i",
"dWYuRW1wdHkiSYLT5JMCQypBL2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0",
"aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXMStQEKHENy",
"ZWF0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb24SKC5hcGkuQ3JlYXRlUGlsb3RU",
"aGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w",
"dHkiU4LT5JMCTSJIL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFw",
"cGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvcGlsb3QtdGhpbmdzOgEqErAB",
"ChlHZXRQaWxvdFRoaW5nc0ludGVncmF0aW9uEiUuYXBpLkdldFBpbG90VGhp",
"bmdzSW50ZWdyYXRpb25SZXF1ZXN0GiYuYXBpLkdldFBpbG90VGhpbmdzSW50",
"ZWdyYXRpb25SZXNwb25zZSJEgtPkkwI+EjwvYXBpL2FwcGxpY2F0aW9ucy97",
"YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3MStQEK",
"HFVwZGF0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb24SKC5hcGkuVXBkYXRlUGls",
"b3RUaGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYu",
"RW1wdHkiU4LT5JMCTRpIL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9u",
"LmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvcGlsb3QtdGhpbmdzOgEq",
"EqYBChxEZWxldGVQaWxvdFRoaW5nc0ludGVncmF0aW9uEiguYXBpLkRlbGV0",
"ZVBpbG90VGhpbmdzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3Rv",
"YnVmLkVtcHR5IkSC0+STAj4qPC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNh",
"dGlvbl9pZH0vaW50ZWdyYXRpb25zL3BpbG90LXRoaW5ncxKiAQoWQ3JlYXRl",
"SWZ0dHRJbnRlZ3JhdGlvbhIiLmFwaS5DcmVhdGVJZnR0dEludGVncmF0aW9u",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJMgtPkkwJGIkEvYXBp",
"L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu",
"dGVncmF0aW9ucy9nY3AtcHViLXN1YjoBKhKhAQoaRGVsZXRlR2NwUHViU3Vi",
"SW50ZWdyYXRpb24SJi5hcGkuRGVsZXRlR2NwUHViU3ViSW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkOC0+STAj0qOy9hcGkv",
"YXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2dj",
"cC1wdWItc3ViEqYBChdDcmVhdGVBd3NTbnNJbnRlZ3JhdGlvbhIjLmFwaS5D",
"cmVhdGVBd3NTbnNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i",
"dWYuRW1wdHkiToLT5JMCSCJDL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0",
"aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXdzLXNuczoBKhKc",
"AQoUR2V0QXdzU25zSW50ZWdyYXRpb24SIC5hcGkuR2V0QXdzU25zSW50ZWdy",
"YXRpb25SZXF1ZXN0GiEuYXBpLkdldEF3c1Nuc0ludGVncmF0aW9uUmVzcG9u",
"c2UiP4LT5JMCORI3L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvYXdzLXNucxKmAQoXVXBkYXRlQXdzU25zSW50ZWdy",
"YXRpb24SIy5hcGkuVXBkYXRlQXdzU25zSW50ZWdyYXRpb25SZXF1ZXN0GhYu",
"Z29vZ2xlLnByb3RvYnVmLkVtcHR5Ik6C0+STAkgaQy9hcGkvYXBwbGljYXRp",
"b25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25z",
"L2F3cy1zbnM6ASoSlwEKF0RlbGV0ZUF3c1Nuc0ludGVncmF0aW9uEiMuYXBp",
"LkRlbGV0ZUF3c1Nuc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90",
"b2J1Zi5FbXB0eSI/gtPkkwI5KjcvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGlj",
"YXRpb25faWR9L2ludGVncmF0aW9ucy9hd3Mtc25zEsIBCiBDcmVhdGVBenVy",
"ZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIsLmFwaS5DcmVhdGVBenVyZVNlcnZp",
"Y2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w",
"dHkiWILT5JMCUiJNL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFw",
"cGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXM6",
"ASoSwQEKHUdldEF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uEikuYXBpLkdl",
"dEF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uUmVxdWVzdBoqLmFwaS5HZXRB",
"enVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlc3BvbnNlIkmC0+STAkMSQS9h",
"cGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25z",
"L2F6dXJlLXNlcnZpY2UtYnVzEsIBCiBVcGRhdGVBenVyZVNlcnZpY2VCdXNJ",
"bnRlZ3JhdGlvbhIsLmFwaS5VcGRhdGVBenVyZVNlcnZpY2VCdXNJbnRlZ3Jh",
"dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiWILT5JMCUhpN",
"dGVncmF0aW9ucy9pZnR0dDoBKhKXAQoTR2V0SWZ0dHRJbnRlZ3JhdGlvbhIf",
"LmFwaS5HZXRJZnR0dEludGVncmF0aW9uUmVxdWVzdBogLmFwaS5HZXRJZnR0",
"dEludGVncmF0aW9uUmVzcG9uc2UiPYLT5JMCNxI1L2FwaS9hcHBsaWNhdGlv",
"bnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvaWZ0dHQSogEKFlVw",
"ZGF0ZUlmdHR0SW50ZWdyYXRpb24SIi5hcGkuVXBkYXRlSWZ0dHRJbnRlZ3Jh",
"dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiTILT5JMCRhpB",
"L2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXM6ASoSswEKIERlbGV0",
"ZUF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uEiwuYXBpLkRlbGV0ZUF6dXJl",
"U2VydmljZUJ1c0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1",
"Zi5FbXB0eSJJgtPkkwJDKkEvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRp",
"b25faWR9L2ludGVncmF0aW9ucy9henVyZS1zZXJ2aWNlLWJ1cxK1AQocQ3Jl",
"YXRlUGlsb3RUaGluZ3NJbnRlZ3JhdGlvbhIoLmFwaS5DcmVhdGVQaWxvdFRo",
"aW5nc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0",
"eSJTgtPkkwJNIkgvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBw",
"bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3M6ASoSsAEK",
"GUdldFBpbG90VGhpbmdzSW50ZWdyYXRpb24SJS5hcGkuR2V0UGlsb3RUaGlu",
"Z3NJbnRlZ3JhdGlvblJlcXVlc3QaJi5hcGkuR2V0UGlsb3RUaGluZ3NJbnRl",
"Z3JhdGlvblJlc3BvbnNlIkSC0+STAj4SPC9hcGkvYXBwbGljYXRpb25zL3th",
"cHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL3BpbG90LXRoaW5ncxK1AQoc",
"VXBkYXRlUGlsb3RUaGluZ3NJbnRlZ3JhdGlvbhIoLmFwaS5VcGRhdGVQaWxv",
"dFRoaW5nc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5F",
"bXB0eSJTgtPkkwJNGkgvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24u",
"YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3M6ASoS",
"pgEKHERlbGV0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb24SKC5hcGkuRGVsZXRl",
"UGlsb3RUaGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i",
"dWYuRW1wdHkiRILT5JMCPio8L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0",
"aW9uX2lkfS9pbnRlZ3JhdGlvbnMvcGlsb3QtdGhpbmdzEqIBChZDcmVhdGVJ",
"ZnR0dEludGVncmF0aW9uEiIuYXBpLkNyZWF0ZUlmdHR0SW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkyC0+STAkYiQS9hcGkv",
"YXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50",
"ZWdyYXRpb25zL2lmdHR0OgEqEpcBChNHZXRJZnR0dEludGVncmF0aW9uEh8u",
"YXBpLkdldElmdHR0SW50ZWdyYXRpb25SZXF1ZXN0GiAuYXBpLkdldElmdHR0",
"SW50ZWdyYXRpb25SZXNwb25zZSI9gtPkkwI3EjUvYXBpL2FwcGxpY2F0aW9u",
"cy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pZnR0dBKiAQoWVXBk",
"YXRlSWZ0dHRJbnRlZ3JhdGlvbhIiLmFwaS5VcGRhdGVJZnR0dEludGVncmF0",
"aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJMgtPkkwJGGkEv",
"YXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9",
"L2ludGVncmF0aW9ucy9pZnR0dDoBKhKTAQoWRGVsZXRlSWZ0dHRJbnRlZ3Jh",
"dGlvbhIiLmFwaS5EZWxldGVJZnR0dEludGVncmF0aW9uUmVxdWVzdBoWLmdv",
"b2dsZS5wcm90b2J1Zi5FbXB0eSI9gtPkkwI3KjUvYXBpL2FwcGxpY2F0aW9u",
"cy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pZnR0dBLhAQooR2Vu",
"ZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZRI0LmFwaS5H",
"ZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRpZmljYXRlUmVxdWVz",
"dBo1LmFwaS5HZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRpZmlj",
"YXRlUmVzcG9uc2UiSILT5JMCQiJAL2FwaS9hcHBsaWNhdGlvbnMve2FwcGxp",
"Y2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXF0dC9jZXJ0aWZpY2F0ZUJoChFp",
"by5jaGlycHN0YWNrLmFwaUIQQXBwbGljYXRpb25Qcm90b1ABWi5naXRodWIu",
"Y29tL2NoaXJwc3RhY2svY2hpcnBzdGFjay9hcGkvZ28vdjQvYXBpqgIOQ2hp",
"cnBzdGFjay5BcGliBnByb3RvMw=="));
"fS9pbnRlZ3JhdGlvbnMvaWZ0dHQ6ASoSkwEKFkRlbGV0ZUlmdHR0SW50ZWdy",
"YXRpb24SIi5hcGkuRGVsZXRlSWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QaFi5n",
"b29nbGUucHJvdG9idWYuRW1wdHkiPYLT5JMCNyo1L2FwaS9hcHBsaWNhdGlv",
"bnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvaWZ0dHQS4QEKKEdl",
"bmVyYXRlTXF0dEludGVncmF0aW9uQ2xpZW50Q2VydGlmaWNhdGUSNC5hcGku",
"R2VuZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZVJlcXVl",
"c3QaNS5hcGkuR2VuZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZp",
"Y2F0ZVJlc3BvbnNlIkiC0+STAkIiQC9hcGkvYXBwbGljYXRpb25zL3thcHBs",
"aWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL21xdHQvY2VydGlmaWNhdGVCaAoR",
"aW8uY2hpcnBzdGFjay5hcGlCEEFwcGxpY2F0aW9uUHJvdG9QAVouZ2l0aHVi",
"LmNvbS9jaGlycHN0YWNrL2NoaXJwc3RhY2svYXBpL2dvL3Y0L2FwaaoCDkNo",
"aXJwc3RhY2suQXBpYgZwcm90bzM="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Api.AnnotationsReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.EmptyReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Chirpstack.Api.Encoding), typeof(global::Chirpstack.Api.IntegrationKind), typeof(global::Chirpstack.Api.InfluxDbPrecision), typeof(global::Chirpstack.Api.InfluxDbVersion), }, null, new pbr::GeneratedClrTypeInfo[] {
@ -432,7 +433,7 @@ namespace Chirpstack.Api {
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetPilotThingsIntegrationResponse), global::Chirpstack.Api.GetPilotThingsIntegrationResponse.Parser, new[]{ "Integration" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.UpdatePilotThingsIntegrationRequest), global::Chirpstack.Api.UpdatePilotThingsIntegrationRequest.Parser, new[]{ "Integration" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.DeletePilotThingsIntegrationRequest), global::Chirpstack.Api.DeletePilotThingsIntegrationRequest.Parser, new[]{ "ApplicationId" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.IftttIntegration), global::Chirpstack.Api.IftttIntegration.Parser, new[]{ "ApplicationId", "Key", "UplinkValues" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.IftttIntegration), global::Chirpstack.Api.IftttIntegration.Parser, new[]{ "ApplicationId", "Key", "UplinkValues", "ArbitraryJson", "EventPrefix" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.CreateIftttIntegrationRequest), global::Chirpstack.Api.CreateIftttIntegrationRequest.Parser, new[]{ "Integration" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetIftttIntegrationRequest), global::Chirpstack.Api.GetIftttIntegrationRequest.Parser, new[]{ "ApplicationId" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetIftttIntegrationResponse), global::Chirpstack.Api.GetIftttIntegrationResponse.Parser, new[]{ "Integration" }, null, null, null, null),
@ -10997,7 +10998,8 @@ namespace Chirpstack.Api {
private string credentialsFile_ = "";
/// <summary>
/// Credentials file.
/// This IAM service-account credentials file (JSON) must have the following Pub/Sub roles:
/// This IAM service-account credentials file (JSON) must have the following
/// Pub/Sub roles:
/// * Pub/Sub Publisher
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -16231,6 +16233,8 @@ namespace Chirpstack.Api {
applicationId_ = other.applicationId_;
key_ = other.key_;
uplinkValues_ = other.uplinkValues_.Clone();
arbitraryJson_ = other.arbitraryJson_;
eventPrefix_ = other.eventPrefix_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
@ -16287,7 +16291,8 @@ namespace Chirpstack.Api {
/// You would specify the following fields:
/// uplink_values = ["batteryLevel", "buttons_0_pressed"]
///
/// Note: The first value is always used for the DevEUI.
/// Notes: The first value is always used for the DevEUI.
/// Ignored if arbitrary_json is set to true.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -16295,6 +16300,42 @@ namespace Chirpstack.Api {
get { return uplinkValues_; }
}
/// <summary>Field number for the "arbitrary_json" field.</summary>
public const int ArbitraryJsonFieldNumber = 4;
private bool arbitraryJson_;
/// <summary>
/// Arbitrary JSON.
/// If set to true, ChirpStack events will be sent as-is as arbitrary JSON
/// payload. If set to false (default), the 3 JSON values format will be used.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool ArbitraryJson {
get { return arbitraryJson_; }
set {
arbitraryJson_ = value;
}
}
/// <summary>Field number for the "event_prefix" field.</summary>
public const int EventPrefixFieldNumber = 5;
private string eventPrefix_ = "";
/// <summary>
/// Event prefix.
/// If set, the event name will be PREFIX_EVENT. For example if event_prefix
/// is set to weatherstation, and uplink event will be sent as
/// weatherstation_up to the IFTTT webhook.
/// Note: Only characters in the A-Z, a-z and 0-9 range are allowed.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string EventPrefix {
get { return eventPrefix_; }
set {
eventPrefix_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
@ -16313,6 +16354,8 @@ namespace Chirpstack.Api {
if (ApplicationId != other.ApplicationId) return false;
if (Key != other.Key) return false;
if(!uplinkValues_.Equals(other.uplinkValues_)) return false;
if (ArbitraryJson != other.ArbitraryJson) return false;
if (EventPrefix != other.EventPrefix) return false;
return Equals(_unknownFields, other._unknownFields);
}
@ -16323,6 +16366,8 @@ namespace Chirpstack.Api {
if (ApplicationId.Length != 0) hash ^= ApplicationId.GetHashCode();
if (Key.Length != 0) hash ^= Key.GetHashCode();
hash ^= uplinkValues_.GetHashCode();
if (ArbitraryJson != false) hash ^= ArbitraryJson.GetHashCode();
if (EventPrefix.Length != 0) hash ^= EventPrefix.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
@ -16350,6 +16395,14 @@ namespace Chirpstack.Api {
output.WriteString(Key);
}
uplinkValues_.WriteTo(output, _repeated_uplinkValues_codec);
if (ArbitraryJson != false) {
output.WriteRawTag(32);
output.WriteBool(ArbitraryJson);
}
if (EventPrefix.Length != 0) {
output.WriteRawTag(42);
output.WriteString(EventPrefix);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
@ -16369,6 +16422,14 @@ namespace Chirpstack.Api {
output.WriteString(Key);
}
uplinkValues_.WriteTo(ref output, _repeated_uplinkValues_codec);
if (ArbitraryJson != false) {
output.WriteRawTag(32);
output.WriteBool(ArbitraryJson);
}
if (EventPrefix.Length != 0) {
output.WriteRawTag(42);
output.WriteString(EventPrefix);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
@ -16386,6 +16447,12 @@ namespace Chirpstack.Api {
size += 1 + pb::CodedOutputStream.ComputeStringSize(Key);
}
size += uplinkValues_.CalculateSize(_repeated_uplinkValues_codec);
if (ArbitraryJson != false) {
size += 1 + 1;
}
if (EventPrefix.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(EventPrefix);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
@ -16405,6 +16472,12 @@ namespace Chirpstack.Api {
Key = other.Key;
}
uplinkValues_.Add(other.uplinkValues_);
if (other.ArbitraryJson != false) {
ArbitraryJson = other.ArbitraryJson;
}
if (other.EventPrefix.Length != 0) {
EventPrefix = other.EventPrefix;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@ -16432,6 +16505,14 @@ namespace Chirpstack.Api {
uplinkValues_.AddEntriesFrom(input, _repeated_uplinkValues_codec);
break;
}
case 32: {
ArbitraryJson = input.ReadBool();
break;
}
case 42: {
EventPrefix = input.ReadString();
break;
}
}
}
#endif
@ -16459,6 +16540,14 @@ namespace Chirpstack.Api {
uplinkValues_.AddEntriesFrom(ref input, _repeated_uplinkValues_codec);
break;
}
case 32: {
ArbitraryJson = input.ReadBool();
break;
}
case 42: {
EventPrefix = input.ReadString();
break;
}
}
}
}

View File

@ -9,7 +9,8 @@ using grpc = global::Grpc.Core;
namespace Chirpstack.Api {
/// <summary>
/// ApplicationService is the service providing API methods for managing applications.
/// ApplicationService is the service providing API methods for managing
/// applications.
/// </summary>
public static partial class ApplicationService
{

File diff suppressed because it is too large Load Diff

View File

@ -1555,6 +1555,12 @@ export class IftttIntegration extends jspb.Message {
clearUplinkValuesList(): IftttIntegration;
addUplinkValues(value: string, index?: number): IftttIntegration;
getArbitraryJson(): boolean;
setArbitraryJson(value: boolean): IftttIntegration;
getEventPrefix(): string;
setEventPrefix(value: string): IftttIntegration;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): IftttIntegration.AsObject;
static toObject(includeInstance: boolean, msg: IftttIntegration): IftttIntegration.AsObject;
@ -1568,6 +1574,8 @@ export namespace IftttIntegration {
applicationId: string,
key: string,
uplinkValuesList: Array<string>,
arbitraryJson: boolean,
eventPrefix: string,
}
}

View File

@ -13195,7 +13195,9 @@ proto.api.IftttIntegration.toObject = function(includeInstance, msg) {
var f, obj = {
applicationId: jspb.Message.getFieldWithDefault(msg, 1, ""),
key: jspb.Message.getFieldWithDefault(msg, 2, ""),
uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f
uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f,
arbitraryJson: jspb.Message.getBooleanFieldWithDefault(msg, 4, false),
eventPrefix: jspb.Message.getFieldWithDefault(msg, 5, "")
};
if (includeInstance) {
@ -13244,6 +13246,14 @@ proto.api.IftttIntegration.deserializeBinaryFromReader = function(msg, reader) {
var value = /** @type {string} */ (reader.readString());
msg.addUplinkValues(value);
break;
case 4:
var value = /** @type {boolean} */ (reader.readBool());
msg.setArbitraryJson(value);
break;
case 5:
var value = /** @type {string} */ (reader.readString());
msg.setEventPrefix(value);
break;
default:
reader.skipField();
break;
@ -13294,6 +13304,20 @@ proto.api.IftttIntegration.serializeBinaryToWriter = function(message, writer) {
f
);
}
f = message.getArbitraryJson();
if (f) {
writer.writeBool(
4,
f
);
}
f = message.getEventPrefix();
if (f.length > 0) {
writer.writeString(
5,
f
);
}
};
@ -13370,6 +13394,42 @@ proto.api.IftttIntegration.prototype.clearUplinkValuesList = function() {
};
/**
* optional bool arbitrary_json = 4;
* @return {boolean}
*/
proto.api.IftttIntegration.prototype.getArbitraryJson = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false));
};
/**
* @param {boolean} value
* @return {!proto.api.IftttIntegration} returns this
*/
proto.api.IftttIntegration.prototype.setArbitraryJson = function(value) {
return jspb.Message.setProto3BooleanField(this, 4, value);
};
/**
* optional string event_prefix = 5;
* @return {string}
*/
proto.api.IftttIntegration.prototype.getEventPrefix = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
};
/**
* @param {string} value
* @return {!proto.api.IftttIntegration} returns this
*/
proto.api.IftttIntegration.prototype.setEventPrefix = function(value) {
return jspb.Message.setProto3StringField(this, 5, value);
};

View File

@ -701,7 +701,8 @@ function deserialize_google_protobuf_Empty(buffer_arg) {
}
// ApplicationService is the service providing API methods for managing applications.
// ApplicationService is the service providing API methods for managing
// applications.
var ApplicationServiceService = exports.ApplicationServiceService = {
// Create creates the given application.
create: {

View File

@ -1691,6 +1691,12 @@ export class IftttIntegration extends jspb.Message {
setUplinkValuesList(value: Array<string>): void;
addUplinkValues(value: string, index?: number): string;
getArbitraryJson(): boolean;
setArbitraryJson(value: boolean): void;
getEventPrefix(): string;
setEventPrefix(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): IftttIntegration.AsObject;
static toObject(includeInstance: boolean, msg: IftttIntegration): IftttIntegration.AsObject;
@ -1706,6 +1712,8 @@ export namespace IftttIntegration {
applicationId: string,
key: string,
uplinkValuesList: Array<string>,
arbitraryJson: boolean,
eventPrefix: string,
}
}

View File

@ -13195,7 +13195,9 @@ proto.api.IftttIntegration.toObject = function(includeInstance, msg) {
var f, obj = {
applicationId: jspb.Message.getFieldWithDefault(msg, 1, ""),
key: jspb.Message.getFieldWithDefault(msg, 2, ""),
uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f
uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f,
arbitraryJson: jspb.Message.getBooleanFieldWithDefault(msg, 4, false),
eventPrefix: jspb.Message.getFieldWithDefault(msg, 5, "")
};
if (includeInstance) {
@ -13244,6 +13246,14 @@ proto.api.IftttIntegration.deserializeBinaryFromReader = function(msg, reader) {
var value = /** @type {string} */ (reader.readString());
msg.addUplinkValues(value);
break;
case 4:
var value = /** @type {boolean} */ (reader.readBool());
msg.setArbitraryJson(value);
break;
case 5:
var value = /** @type {string} */ (reader.readString());
msg.setEventPrefix(value);
break;
default:
reader.skipField();
break;
@ -13294,6 +13304,20 @@ proto.api.IftttIntegration.serializeBinaryToWriter = function(message, writer) {
f
);
}
f = message.getArbitraryJson();
if (f) {
writer.writeBool(
4,
f
);
}
f = message.getEventPrefix();
if (f.length > 0) {
writer.writeString(
5,
f
);
}
};
@ -13370,6 +13394,42 @@ proto.api.IftttIntegration.prototype.clearUplinkValuesList = function() {
};
/**
* optional bool arbitrary_json = 4;
* @return {boolean}
*/
proto.api.IftttIntegration.prototype.getArbitraryJson = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false));
};
/**
* @param {boolean} value
* @return {!proto.api.IftttIntegration} returns this
*/
proto.api.IftttIntegration.prototype.setArbitraryJson = function(value) {
return jspb.Message.setProto3BooleanField(this, 4, value);
};
/**
* optional string event_prefix = 5;
* @return {string}
*/
proto.api.IftttIntegration.prototype.getEventPrefix = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
};
/**
* @param {string} value
* @return {!proto.api.IftttIntegration} returns this
*/
proto.api.IftttIntegration.prototype.setEventPrefix = function(value) {
return jspb.Message.setProto3StringField(this, 5, value);
};

7
api/md/api/api.md vendored
View File

@ -1108,7 +1108,9 @@
| key | [string](#string) | | Key. This key can be obtained from the IFTTT Webhooks documentation page. |
| uplink_values | [string](#string) | repeated | Values. Up to 2 values can be forwarded to IFTTT. These values must map to the decoded payload keys. For example: { &#34;batteryLevel&#34;: 75.3, &#34;buttons&#34;: [{&#34;pressed&#34;: false}, {&#34;pressed&#34;: true}] } You would specify the following fields: uplink_values = [&#34;batteryLevel&#34;, &#34;buttons_0_pressed&#34;]
Note: The first value is always used for the DevEUI. |
Notes: The first value is always used for the DevEUI. Ignored if arbitrary_json is set to true. |
| arbitrary_json | [bool](#bool) | | Arbitrary JSON. If set to true, ChirpStack events will be sent as-is as arbitrary JSON payload. If set to false (default), the 3 JSON values format will be used. |
| event_prefix | [string](#string) | | Event prefix. If set, the event name will be PREFIX_EVENT. For example if event_prefix is set to weatherstation, and uplink event will be sent as weatherstation_up to the IFTTT webhook. Note: Only characters in the A-Z, a-z and 0-9 range are allowed. |
@ -1549,7 +1551,8 @@ Note: The first value is always used for the DevEUI. |
<a name="api-ApplicationService"></a>
### ApplicationService
ApplicationService is the service providing API methods for managing applications.
ApplicationService is the service providing API methods for managing
applications.
| Method Name | Request Type | Response Type | Description |
| ----------- | ------------ | ------------- | ------------|

View File

@ -12,7 +12,8 @@ import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
// ApplicationService is the service providing API methods for managing applications.
// ApplicationService is the service providing API methods for managing
// applications.
service ApplicationService {
// Create creates the given application.
rpc Create(CreateApplicationRequest) returns (CreateApplicationResponse) {
@ -52,14 +53,16 @@ service ApplicationService {
}
// List all configured integrations.
rpc ListIntegrations(ListIntegrationsRequest) returns (ListIntegrationsResponse) {
rpc ListIntegrations(ListIntegrationsRequest)
returns (ListIntegrationsResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations"
};
}
// Create HTTP integration.
rpc CreateHttpIntegration(CreateHttpIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateHttpIntegration(CreateHttpIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post : "/api/applications/{integration.application_id}/integrations/http"
body : "*"
@ -67,14 +70,16 @@ service ApplicationService {
}
// Get the configured HTTP integration.
rpc GetHttpIntegration(GetHttpIntegrationRequest) returns (GetHttpIntegrationResponse) {
rpc GetHttpIntegration(GetHttpIntegrationRequest)
returns (GetHttpIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/http"
};
}
// Update the HTTP integration.
rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put : "/api/applications/{integration.application_id}/integrations/http"
body : "*"
@ -82,254 +87,305 @@ service ApplicationService {
}
// Delete the HTTP integration.
rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/http"
};
}
// Create InfluxDb integration.
rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/influxdb"
post : "/api/applications/{integration.application_id}/integrations/"
"influxdb"
body : "*"
};
}
// Get InfluxDb integration.
rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest) returns (GetInfluxDbIntegrationResponse) {
rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest)
returns (GetInfluxDbIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/influxdb"
};
}
// Update InfluxDb integration.
rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/influxdb"
put : "/api/applications/{integration.application_id}/integrations/"
"influxdb"
body : "*"
};
}
// Delete InfluxDb integration.
rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/influxdb"
};
}
// Create ThingsBoard integration.
rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/thingsboard"
post : "/api/applications/{integration.application_id}/integrations/"
"thingsboard"
body : "*"
};
}
// Get ThingsBoard integration.
rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest) returns (GetThingsBoardIntegrationResponse) {
rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest)
returns (GetThingsBoardIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/thingsboard"
};
}
// Update ThingsBoard integration.
rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/thingsboard"
put : "/api/applications/{integration.application_id}/integrations/"
"thingsboard"
body : "*"
};
}
// Delete ThingsBoard integration.
rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/thingsboard"
};
}
// Create myDevices integration.
rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/mydevices"
post : "/api/applications/{integration.application_id}/integrations/"
"mydevices"
body : "*"
};
}
// Get myDevices integration.
rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest) returns (GetMyDevicesIntegrationResponse) {
rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest)
returns (GetMyDevicesIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/mydevices"
};
}
// Update myDevices integration.
rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/mydevices"
put : "/api/applications/{integration.application_id}/integrations/"
"mydevices"
body : "*"
};
}
// Delete myDevices integration.
rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/mydevices"
};
}
// Create LoRaCloud integration.
rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/loracloud"
post : "/api/applications/{integration.application_id}/integrations/"
"loracloud"
body : "*"
};
}
// Get LoRaCloud integration.
rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest) returns (GetLoraCloudIntegrationResponse) {
rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest)
returns (GetLoraCloudIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/loracloud"
};
}
// Update LoRaCloud integration.
rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/loracloud"
put : "/api/applications/{integration.application_id}/integrations/"
"loracloud"
body : "*"
};
}
// Delete LoRaCloud integration.
rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/loracloud"
};
}
// Create GCP Pub/Sub integration.
rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub"
post : "/api/applications/{integration.application_id}/integrations/"
"gcp-pub-sub"
body : "*"
};
}
// Get GCP Pub/Sub integration.
rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest) returns (GetGcpPubSubIntegrationResponse) {
rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest)
returns (GetGcpPubSubIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/gcp-pub-sub"
};
}
// Update GCP Pub/Sub integration.
rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub"
put : "/api/applications/{integration.application_id}/integrations/"
"gcp-pub-sub"
body : "*"
};
}
// Delete GCP Pub/Sub integration.
rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/gcp-pub-sub"
};
}
// Create AWS SNS integration.
rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/aws-sns"
post : "/api/applications/{integration.application_id}/integrations/"
"aws-sns"
body : "*"
};
}
// Get AWS SNS integration.
rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest) returns (GetAwsSnsIntegrationResponse) {
rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest)
returns (GetAwsSnsIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/aws-sns"
};
}
// Update AWS SNS integration.
rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/aws-sns"
put : "/api/applications/{integration.application_id}/integrations/"
"aws-sns"
body : "*"
};
}
// Delete AWS SNS integration.
rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/aws-sns"
};
}
// Create Azure Service-Bus integration.
rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/azure-service-bus"
post : "/api/applications/{integration.application_id}/integrations/"
"azure-service-bus"
body : "*"
};
}
// Get Azure Service-Bus integration.
rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest) returns (GetAzureServiceBusIntegrationResponse) {
rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest)
returns (GetAzureServiceBusIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/azure-service-bus"
};
}
// Update Azure Service-Bus integration.
rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/azure-service-bus"
put : "/api/applications/{integration.application_id}/integrations/"
"azure-service-bus"
body : "*"
};
}
// Delete Azure Service-Bus integration.
rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete: "/api/applications/{application_id}/integrations/azure-service-bus"
delete : "/api/applications/{application_id}/integrations/"
"azure-service-bus"
};
}
// Create Pilot Things integration.
rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/pilot-things"
post : "/api/applications/{integration.application_id}/integrations/"
"pilot-things"
body : "*"
};
}
// Get Pilot Things integration.
rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest) returns (GetPilotThingsIntegrationResponse) {
rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest)
returns (GetPilotThingsIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/pilot-things"
};
}
// Update Pilot Things integration.
rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/pilot-things"
put : "/api/applications/{integration.application_id}/integrations/"
"pilot-things"
body : "*"
};
}
// Delete Pilot Things integration.
rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/pilot-things"
};
}
// Create IFTTT integration.
rpc CreateIftttIntegration(CreateIftttIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateIftttIntegration(CreateIftttIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post : "/api/applications/{integration.application_id}/integrations/ifttt"
body : "*"
@ -337,14 +393,16 @@ service ApplicationService {
}
// Get IFTTT integration.
rpc GetIftttIntegration(GetIftttIntegrationRequest) returns (GetIftttIntegrationResponse) {
rpc GetIftttIntegration(GetIftttIntegrationRequest)
returns (GetIftttIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/ifttt"
};
}
// Update IFTTT integration.
rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put : "/api/applications/{integration.application_id}/integrations/ifttt"
body : "*"
@ -352,14 +410,17 @@ service ApplicationService {
}
// Delete IFTTT integration.
rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/ifttt"
};
}
// Generates application ID specific client-certificate.
rpc GenerateMqttIntegrationClientCertificate(GenerateMqttIntegrationClientCertificateRequest) returns (GenerateMqttIntegrationClientCertificateResponse) {
rpc GenerateMqttIntegrationClientCertificate(
GenerateMqttIntegrationClientCertificateRequest)
returns (GenerateMqttIntegrationClientCertificateResponse) {
option (google.api.http) = {
post : "/api/applications/{application_id}/integrations/mqtt/certificate"
};
@ -792,7 +853,8 @@ message GcpPubSubIntegration {
Encoding encoding = 2;
// Credentials file.
// This IAM service-account credentials file (JSON) must have the following Pub/Sub roles:
// This IAM service-account credentials file (JSON) must have the following
// Pub/Sub roles:
// * Pub/Sub Publisher
string credentials_file = 3;
@ -968,8 +1030,21 @@ message IftttIntegration {
// You would specify the following fields:
// uplink_values = ["batteryLevel", "buttons_0_pressed"]
//
// Note: The first value is always used for the DevEUI.
// Notes: The first value is always used for the DevEUI.
// Ignored if arbitrary_json is set to true.
repeated string uplink_values = 3;
// Arbitrary JSON.
// If set to true, ChirpStack events will be sent as-is as arbitrary JSON
// payload. If set to false (default), the 3 JSON values format will be used.
bool arbitrary_json = 4;
// Event prefix.
// If set, the event name will be PREFIX_EVENT. For example if event_prefix
// is set to weatherstation, and uplink event will be sent as
// weatherstation_up to the IFTTT webhook.
// Note: Only characters in the A-Z, a-z and 0-9 range are allowed.
string event_prefix = 5;
}
message CreateIftttIntegrationRequest {

View File

@ -12,7 +12,8 @@ import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
// ApplicationService is the service providing API methods for managing applications.
// ApplicationService is the service providing API methods for managing
// applications.
service ApplicationService {
// Create creates the given application.
rpc Create(CreateApplicationRequest) returns (CreateApplicationResponse) {
@ -52,14 +53,16 @@ service ApplicationService {
}
// List all configured integrations.
rpc ListIntegrations(ListIntegrationsRequest) returns (ListIntegrationsResponse) {
rpc ListIntegrations(ListIntegrationsRequest)
returns (ListIntegrationsResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations"
};
}
// Create HTTP integration.
rpc CreateHttpIntegration(CreateHttpIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateHttpIntegration(CreateHttpIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post : "/api/applications/{integration.application_id}/integrations/http"
body : "*"
@ -67,14 +70,16 @@ service ApplicationService {
}
// Get the configured HTTP integration.
rpc GetHttpIntegration(GetHttpIntegrationRequest) returns (GetHttpIntegrationResponse) {
rpc GetHttpIntegration(GetHttpIntegrationRequest)
returns (GetHttpIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/http"
};
}
// Update the HTTP integration.
rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put : "/api/applications/{integration.application_id}/integrations/http"
body : "*"
@ -82,254 +87,305 @@ service ApplicationService {
}
// Delete the HTTP integration.
rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/http"
};
}
// Create InfluxDb integration.
rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/influxdb"
post : "/api/applications/{integration.application_id}/integrations/"
"influxdb"
body : "*"
};
}
// Get InfluxDb integration.
rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest) returns (GetInfluxDbIntegrationResponse) {
rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest)
returns (GetInfluxDbIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/influxdb"
};
}
// Update InfluxDb integration.
rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/influxdb"
put : "/api/applications/{integration.application_id}/integrations/"
"influxdb"
body : "*"
};
}
// Delete InfluxDb integration.
rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/influxdb"
};
}
// Create ThingsBoard integration.
rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/thingsboard"
post : "/api/applications/{integration.application_id}/integrations/"
"thingsboard"
body : "*"
};
}
// Get ThingsBoard integration.
rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest) returns (GetThingsBoardIntegrationResponse) {
rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest)
returns (GetThingsBoardIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/thingsboard"
};
}
// Update ThingsBoard integration.
rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/thingsboard"
put : "/api/applications/{integration.application_id}/integrations/"
"thingsboard"
body : "*"
};
}
// Delete ThingsBoard integration.
rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/thingsboard"
};
}
// Create myDevices integration.
rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/mydevices"
post : "/api/applications/{integration.application_id}/integrations/"
"mydevices"
body : "*"
};
}
// Get myDevices integration.
rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest) returns (GetMyDevicesIntegrationResponse) {
rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest)
returns (GetMyDevicesIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/mydevices"
};
}
// Update myDevices integration.
rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/mydevices"
put : "/api/applications/{integration.application_id}/integrations/"
"mydevices"
body : "*"
};
}
// Delete myDevices integration.
rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/mydevices"
};
}
// Create LoRaCloud integration.
rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/loracloud"
post : "/api/applications/{integration.application_id}/integrations/"
"loracloud"
body : "*"
};
}
// Get LoRaCloud integration.
rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest) returns (GetLoraCloudIntegrationResponse) {
rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest)
returns (GetLoraCloudIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/loracloud"
};
}
// Update LoRaCloud integration.
rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/loracloud"
put : "/api/applications/{integration.application_id}/integrations/"
"loracloud"
body : "*"
};
}
// Delete LoRaCloud integration.
rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/loracloud"
};
}
// Create GCP Pub/Sub integration.
rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub"
post : "/api/applications/{integration.application_id}/integrations/"
"gcp-pub-sub"
body : "*"
};
}
// Get GCP Pub/Sub integration.
rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest) returns (GetGcpPubSubIntegrationResponse) {
rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest)
returns (GetGcpPubSubIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/gcp-pub-sub"
};
}
// Update GCP Pub/Sub integration.
rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub"
put : "/api/applications/{integration.application_id}/integrations/"
"gcp-pub-sub"
body : "*"
};
}
// Delete GCP Pub/Sub integration.
rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/gcp-pub-sub"
};
}
// Create AWS SNS integration.
rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/aws-sns"
post : "/api/applications/{integration.application_id}/integrations/"
"aws-sns"
body : "*"
};
}
// Get AWS SNS integration.
rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest) returns (GetAwsSnsIntegrationResponse) {
rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest)
returns (GetAwsSnsIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/aws-sns"
};
}
// Update AWS SNS integration.
rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/aws-sns"
put : "/api/applications/{integration.application_id}/integrations/"
"aws-sns"
body : "*"
};
}
// Delete AWS SNS integration.
rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/aws-sns"
};
}
// Create Azure Service-Bus integration.
rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/azure-service-bus"
post : "/api/applications/{integration.application_id}/integrations/"
"azure-service-bus"
body : "*"
};
}
// Get Azure Service-Bus integration.
rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest) returns (GetAzureServiceBusIntegrationResponse) {
rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest)
returns (GetAzureServiceBusIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/azure-service-bus"
};
}
// Update Azure Service-Bus integration.
rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/azure-service-bus"
put : "/api/applications/{integration.application_id}/integrations/"
"azure-service-bus"
body : "*"
};
}
// Delete Azure Service-Bus integration.
rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete: "/api/applications/{application_id}/integrations/azure-service-bus"
delete : "/api/applications/{application_id}/integrations/"
"azure-service-bus"
};
}
// Create Pilot Things integration.
rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/pilot-things"
post : "/api/applications/{integration.application_id}/integrations/"
"pilot-things"
body : "*"
};
}
// Get Pilot Things integration.
rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest) returns (GetPilotThingsIntegrationResponse) {
rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest)
returns (GetPilotThingsIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/pilot-things"
};
}
// Update Pilot Things integration.
rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/pilot-things"
put : "/api/applications/{integration.application_id}/integrations/"
"pilot-things"
body : "*"
};
}
// Delete Pilot Things integration.
rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/pilot-things"
};
}
// Create IFTTT integration.
rpc CreateIftttIntegration(CreateIftttIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateIftttIntegration(CreateIftttIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post : "/api/applications/{integration.application_id}/integrations/ifttt"
body : "*"
@ -337,14 +393,16 @@ service ApplicationService {
}
// Get IFTTT integration.
rpc GetIftttIntegration(GetIftttIntegrationRequest) returns (GetIftttIntegrationResponse) {
rpc GetIftttIntegration(GetIftttIntegrationRequest)
returns (GetIftttIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/ifttt"
};
}
// Update IFTTT integration.
rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put : "/api/applications/{integration.application_id}/integrations/ifttt"
body : "*"
@ -352,14 +410,17 @@ service ApplicationService {
}
// Delete IFTTT integration.
rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/ifttt"
};
}
// Generates application ID specific client-certificate.
rpc GenerateMqttIntegrationClientCertificate(GenerateMqttIntegrationClientCertificateRequest) returns (GenerateMqttIntegrationClientCertificateResponse) {
rpc GenerateMqttIntegrationClientCertificate(
GenerateMqttIntegrationClientCertificateRequest)
returns (GenerateMqttIntegrationClientCertificateResponse) {
option (google.api.http) = {
post : "/api/applications/{application_id}/integrations/mqtt/certificate"
};
@ -792,7 +853,8 @@ message GcpPubSubIntegration {
Encoding encoding = 2;
// Credentials file.
// This IAM service-account credentials file (JSON) must have the following Pub/Sub roles:
// This IAM service-account credentials file (JSON) must have the following
// Pub/Sub roles:
// * Pub/Sub Publisher
string credentials_file = 3;
@ -968,8 +1030,21 @@ message IftttIntegration {
// You would specify the following fields:
// uplink_values = ["batteryLevel", "buttons_0_pressed"]
//
// Note: The first value is always used for the DevEUI.
// Notes: The first value is always used for the DevEUI.
// Ignored if arbitrary_json is set to true.
repeated string uplink_values = 3;
// Arbitrary JSON.
// If set to true, ChirpStack events will be sent as-is as arbitrary JSON
// payload. If set to false (default), the 3 JSON values format will be used.
bool arbitrary_json = 4;
// Event prefix.
// If set, the event name will be PREFIX_EVENT. For example if event_prefix
// is set to weatherstation, and uplink event will be sent as
// weatherstation_up to the IFTTT webhook.
// Note: Only characters in the A-Z, a-z and 0-9 range are allowed.
string event_prefix = 5;
}
message CreateIftttIntegrationRequest {

File diff suppressed because one or more lines are too long

View File

@ -412,14 +412,18 @@ class HttpIntegration(_message.Message):
def __init__(self, application_id: _Optional[str] = ..., headers: _Optional[_Mapping[str, str]] = ..., encoding: _Optional[_Union[Encoding, str]] = ..., event_endpoint_url: _Optional[str] = ...) -> None: ...
class IftttIntegration(_message.Message):
__slots__ = ["application_id", "key", "uplink_values"]
__slots__ = ["application_id", "arbitrary_json", "event_prefix", "key", "uplink_values"]
APPLICATION_ID_FIELD_NUMBER: _ClassVar[int]
ARBITRARY_JSON_FIELD_NUMBER: _ClassVar[int]
EVENT_PREFIX_FIELD_NUMBER: _ClassVar[int]
KEY_FIELD_NUMBER: _ClassVar[int]
UPLINK_VALUES_FIELD_NUMBER: _ClassVar[int]
application_id: str
arbitrary_json: bool
event_prefix: str
key: str
uplink_values: _containers.RepeatedScalarFieldContainer[str]
def __init__(self, application_id: _Optional[str] = ..., key: _Optional[str] = ..., uplink_values: _Optional[_Iterable[str]] = ...) -> None: ...
def __init__(self, application_id: _Optional[str] = ..., key: _Optional[str] = ..., uplink_values: _Optional[_Iterable[str]] = ..., arbitrary_json: bool = ..., event_prefix: _Optional[str] = ...) -> None: ...
class InfluxDbIntegration(_message.Message):
__slots__ = ["application_id", "bucket", "db", "endpoint", "organization", "password", "precision", "retention_policy_name", "token", "username", "version"]

View File

@ -7,7 +7,8 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
class ApplicationServiceStub(object):
"""ApplicationService is the service providing API methods for managing applications.
"""ApplicationService is the service providing API methods for managing
applications.
"""
def __init__(self, channel):
@ -254,7 +255,8 @@ class ApplicationServiceStub(object):
class ApplicationServiceServicer(object):
"""ApplicationService is the service providing API methods for managing applications.
"""ApplicationService is the service providing API methods for managing
applications.
"""
def Create(self, request, context):
@ -832,7 +834,8 @@ def add_ApplicationServiceServicer_to_server(servicer, server):
# This class is part of an EXPERIMENTAL API.
class ApplicationService(object):
"""ApplicationService is the service providing API methods for managing applications.
"""ApplicationService is the service providing API methods for managing
applications.
"""
@staticmethod

View File

@ -12,7 +12,8 @@ import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
// ApplicationService is the service providing API methods for managing applications.
// ApplicationService is the service providing API methods for managing
// applications.
service ApplicationService {
// Create creates the given application.
rpc Create(CreateApplicationRequest) returns (CreateApplicationResponse) {
@ -52,14 +53,16 @@ service ApplicationService {
}
// List all configured integrations.
rpc ListIntegrations(ListIntegrationsRequest) returns (ListIntegrationsResponse) {
rpc ListIntegrations(ListIntegrationsRequest)
returns (ListIntegrationsResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations"
};
}
// Create HTTP integration.
rpc CreateHttpIntegration(CreateHttpIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateHttpIntegration(CreateHttpIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post : "/api/applications/{integration.application_id}/integrations/http"
body : "*"
@ -67,14 +70,16 @@ service ApplicationService {
}
// Get the configured HTTP integration.
rpc GetHttpIntegration(GetHttpIntegrationRequest) returns (GetHttpIntegrationResponse) {
rpc GetHttpIntegration(GetHttpIntegrationRequest)
returns (GetHttpIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/http"
};
}
// Update the HTTP integration.
rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put : "/api/applications/{integration.application_id}/integrations/http"
body : "*"
@ -82,254 +87,305 @@ service ApplicationService {
}
// Delete the HTTP integration.
rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/http"
};
}
// Create InfluxDb integration.
rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/influxdb"
post : "/api/applications/{integration.application_id}/integrations/"
"influxdb"
body : "*"
};
}
// Get InfluxDb integration.
rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest) returns (GetInfluxDbIntegrationResponse) {
rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest)
returns (GetInfluxDbIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/influxdb"
};
}
// Update InfluxDb integration.
rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/influxdb"
put : "/api/applications/{integration.application_id}/integrations/"
"influxdb"
body : "*"
};
}
// Delete InfluxDb integration.
rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/influxdb"
};
}
// Create ThingsBoard integration.
rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/thingsboard"
post : "/api/applications/{integration.application_id}/integrations/"
"thingsboard"
body : "*"
};
}
// Get ThingsBoard integration.
rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest) returns (GetThingsBoardIntegrationResponse) {
rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest)
returns (GetThingsBoardIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/thingsboard"
};
}
// Update ThingsBoard integration.
rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/thingsboard"
put : "/api/applications/{integration.application_id}/integrations/"
"thingsboard"
body : "*"
};
}
// Delete ThingsBoard integration.
rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/thingsboard"
};
}
// Create myDevices integration.
rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/mydevices"
post : "/api/applications/{integration.application_id}/integrations/"
"mydevices"
body : "*"
};
}
// Get myDevices integration.
rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest) returns (GetMyDevicesIntegrationResponse) {
rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest)
returns (GetMyDevicesIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/mydevices"
};
}
// Update myDevices integration.
rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/mydevices"
put : "/api/applications/{integration.application_id}/integrations/"
"mydevices"
body : "*"
};
}
// Delete myDevices integration.
rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/mydevices"
};
}
// Create LoRaCloud integration.
rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/loracloud"
post : "/api/applications/{integration.application_id}/integrations/"
"loracloud"
body : "*"
};
}
// Get LoRaCloud integration.
rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest) returns (GetLoraCloudIntegrationResponse) {
rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest)
returns (GetLoraCloudIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/loracloud"
};
}
// Update LoRaCloud integration.
rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/loracloud"
put : "/api/applications/{integration.application_id}/integrations/"
"loracloud"
body : "*"
};
}
// Delete LoRaCloud integration.
rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/loracloud"
};
}
// Create GCP Pub/Sub integration.
rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub"
post : "/api/applications/{integration.application_id}/integrations/"
"gcp-pub-sub"
body : "*"
};
}
// Get GCP Pub/Sub integration.
rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest) returns (GetGcpPubSubIntegrationResponse) {
rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest)
returns (GetGcpPubSubIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/gcp-pub-sub"
};
}
// Update GCP Pub/Sub integration.
rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub"
put : "/api/applications/{integration.application_id}/integrations/"
"gcp-pub-sub"
body : "*"
};
}
// Delete GCP Pub/Sub integration.
rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/gcp-pub-sub"
};
}
// Create AWS SNS integration.
rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/aws-sns"
post : "/api/applications/{integration.application_id}/integrations/"
"aws-sns"
body : "*"
};
}
// Get AWS SNS integration.
rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest) returns (GetAwsSnsIntegrationResponse) {
rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest)
returns (GetAwsSnsIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/aws-sns"
};
}
// Update AWS SNS integration.
rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/aws-sns"
put : "/api/applications/{integration.application_id}/integrations/"
"aws-sns"
body : "*"
};
}
// Delete AWS SNS integration.
rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/aws-sns"
};
}
// Create Azure Service-Bus integration.
rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/azure-service-bus"
post : "/api/applications/{integration.application_id}/integrations/"
"azure-service-bus"
body : "*"
};
}
// Get Azure Service-Bus integration.
rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest) returns (GetAzureServiceBusIntegrationResponse) {
rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest)
returns (GetAzureServiceBusIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/azure-service-bus"
};
}
// Update Azure Service-Bus integration.
rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/azure-service-bus"
put : "/api/applications/{integration.application_id}/integrations/"
"azure-service-bus"
body : "*"
};
}
// Delete Azure Service-Bus integration.
rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete: "/api/applications/{application_id}/integrations/azure-service-bus"
delete : "/api/applications/{application_id}/integrations/"
"azure-service-bus"
};
}
// Create Pilot Things integration.
rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/api/applications/{integration.application_id}/integrations/pilot-things"
post : "/api/applications/{integration.application_id}/integrations/"
"pilot-things"
body : "*"
};
}
// Get Pilot Things integration.
rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest) returns (GetPilotThingsIntegrationResponse) {
rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest)
returns (GetPilotThingsIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/pilot-things"
};
}
// Update Pilot Things integration.
rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put: "/api/applications/{integration.application_id}/integrations/pilot-things"
put : "/api/applications/{integration.application_id}/integrations/"
"pilot-things"
body : "*"
};
}
// Delete Pilot Things integration.
rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/pilot-things"
};
}
// Create IFTTT integration.
rpc CreateIftttIntegration(CreateIftttIntegrationRequest) returns (google.protobuf.Empty) {
rpc CreateIftttIntegration(CreateIftttIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
post : "/api/applications/{integration.application_id}/integrations/ifttt"
body : "*"
@ -337,14 +393,16 @@ service ApplicationService {
}
// Get IFTTT integration.
rpc GetIftttIntegration(GetIftttIntegrationRequest) returns (GetIftttIntegrationResponse) {
rpc GetIftttIntegration(GetIftttIntegrationRequest)
returns (GetIftttIntegrationResponse) {
option (google.api.http) = {
get : "/api/applications/{application_id}/integrations/ifttt"
};
}
// Update IFTTT integration.
rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest) returns (google.protobuf.Empty) {
rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
put : "/api/applications/{integration.application_id}/integrations/ifttt"
body : "*"
@ -352,14 +410,17 @@ service ApplicationService {
}
// Delete IFTTT integration.
rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest) returns (google.protobuf.Empty) {
rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest)
returns (google.protobuf.Empty) {
option (google.api.http) = {
delete : "/api/applications/{application_id}/integrations/ifttt"
};
}
// Generates application ID specific client-certificate.
rpc GenerateMqttIntegrationClientCertificate(GenerateMqttIntegrationClientCertificateRequest) returns (GenerateMqttIntegrationClientCertificateResponse) {
rpc GenerateMqttIntegrationClientCertificate(
GenerateMqttIntegrationClientCertificateRequest)
returns (GenerateMqttIntegrationClientCertificateResponse) {
option (google.api.http) = {
post : "/api/applications/{application_id}/integrations/mqtt/certificate"
};
@ -792,7 +853,8 @@ message GcpPubSubIntegration {
Encoding encoding = 2;
// Credentials file.
// This IAM service-account credentials file (JSON) must have the following Pub/Sub roles:
// This IAM service-account credentials file (JSON) must have the following
// Pub/Sub roles:
// * Pub/Sub Publisher
string credentials_file = 3;
@ -968,8 +1030,21 @@ message IftttIntegration {
// You would specify the following fields:
// uplink_values = ["batteryLevel", "buttons_0_pressed"]
//
// Note: The first value is always used for the DevEUI.
// Notes: The first value is always used for the DevEUI.
// Ignored if arbitrary_json is set to true.
repeated string uplink_values = 3;
// Arbitrary JSON.
// If set to true, ChirpStack events will be sent as-is as arbitrary JSON
// payload. If set to false (default), the 3 JSON values format will be used.
bool arbitrary_json = 4;
// Event prefix.
// If set, the event name will be PREFIX_EVENT. For example if event_prefix
// is set to weatherstation, and uplink event will be sent as
// weatherstation_up to the IFTTT webhook.
// Note: Only characters in the A-Z, a-z and 0-9 range are allowed.
string event_prefix = 5;
}
message CreateIftttIntegrationRequest {

View File

@ -1716,6 +1716,16 @@ impl ApplicationService for Application {
)
.await?;
if !req_int.event_prefix.is_empty()
&& !regex::Regex::new(r"^[a-zA-Z0-9]+$")
.unwrap()
.is_match(&req_int.event_prefix)
{
return Err(Status::invalid_argument(
"event_prefix may only contain A-Z, a-z and 0-9 characters",
));
}
let _ = application::create_integration(application::Integration {
application_id: app_id,
kind: application::IntegrationKind::Ifttt,
@ -1726,6 +1736,8 @@ impl ApplicationService for Application {
req_int.uplink_values.get(0).cloned().unwrap_or_default(),
req_int.uplink_values.get(1).cloned().unwrap_or_default(),
],
arbitrary_json: req_int.arbitrary_json,
event_prefix: req_int.event_prefix.clone(),
},
),
..Default::default()
@ -1766,6 +1778,8 @@ impl ApplicationService for Application {
application_id: app_id.to_string(),
key: conf.key.clone(),
uplink_values: conf.uplink_values.to_vec(),
arbitrary_json: conf.arbitrary_json,
event_prefix: conf.event_prefix.clone(),
}),
});
resp.metadata_mut()
@ -1806,6 +1820,8 @@ impl ApplicationService for Application {
req_int.uplink_values.get(0).cloned().unwrap_or_default(),
req_int.uplink_values.get(1).cloned().unwrap_or_default(),
],
arbitrary_json: req_int.arbitrary_json,
event_prefix: req_int.event_prefix.clone(),
},
),
..Default::default()
@ -3353,6 +3369,8 @@ pub mod test {
application_id: app.id.to_string(),
key: "verysecret".into(),
uplink_values: vec!["value_1".into(), "value_2".into()],
arbitrary_json: false,
event_prefix: "foo".to_string(),
}),
},
);
@ -3372,6 +3390,8 @@ pub mod test {
application_id: app.id.to_string(),
key: "verysecret".into(),
uplink_values: vec!["value_1".into(), "value_2".into()],
arbitrary_json: false,
event_prefix: "foo".to_string(),
}),
get_resp.integration
);
@ -3384,6 +3404,8 @@ pub mod test {
application_id: app.id.to_string(),
key: "verysecrettoo".into(),
uplink_values: vec!["value_4".into(), "value_5".into()],
arbitrary_json: true,
event_prefix: "bar".to_string(),
}),
},
);
@ -3403,6 +3425,8 @@ pub mod test {
application_id: app.id.to_string(),
key: "verysecrettoo".into(),
uplink_values: vec!["value_4".into(), "value_5".into()],
arbitrary_json: true,
event_prefix: "bar".to_string(),
}),
get_resp.integration
);

View File

@ -27,6 +27,8 @@ pub struct Integration {
key: String,
uplink_values: [String; 2],
server: String,
arbitrary_json: bool,
event_prefix: String,
}
impl Integration {
@ -37,11 +39,30 @@ impl Integration {
key: conf.key.clone(),
uplink_values: conf.uplink_values.clone(),
server: "https://maker.ifttt.com".to_string(),
arbitrary_json: conf.arbitrary_json,
event_prefix: conf.event_prefix.clone(),
}
}
async fn post(&self, event: &str, v: Values) -> Result<()> {
let url = format!("{}/trigger/{}/with/key/{}", self.server, event, self.key);
async fn post<T>(&self, event: &str, v: &T) -> Result<()>
where
T: Serialize,
{
let event = if self.event_prefix.is_empty() {
event.to_string()
} else {
format!("{}_{}", self.event_prefix, event)
};
let url = if self.arbitrary_json {
format!(
"{}/trigger/{}/json/with/key/{}",
self.server, event, self.key
)
} else {
format!("{}/trigger/{}/with/key/{}", self.server, event, self.key)
};
let client = Client::builder().timeout(Duration::from_secs(5)).build()?;
let mut headers = HeaderMap::new();
headers.insert(CONTENT_TYPE, "application/json".parse().unwrap());
@ -65,6 +86,10 @@ impl IntegrationTrait for Integration {
_vars: &HashMap<String, String>,
pl: &integration::UplinkEvent,
) -> Result<()> {
if self.arbitrary_json {
return self.post("up", pl).await;
}
let data_measurements: HashMap<String, pbjson_types::value::Kind> = match &pl.object {
None => {
trace!("object is None, nothing to send");
@ -91,7 +116,7 @@ impl IntegrationTrait for Integration {
return Ok(());
}
self.post("up", v).await
self.post("up", &v).await
}
async fn join_event(
@ -170,13 +195,15 @@ pub mod test {
use httpmock::prelude::*;
#[tokio::test]
async fn test_ifttt() {
async fn test_ifttt_no_prefix() {
let server = MockServer::start();
let i = Integration {
key: "verysecret".into(),
uplink_values: ["temp".to_string(), "door_open".to_string()],
server: server.url(""),
arbitrary_json: false,
event_prefix: "".into(),
};
// uplink event
@ -228,4 +255,121 @@ pub mod test {
mock.assert();
mock.delete();
}
#[tokio::test]
async fn test_ifttt_prefix() {
let server = MockServer::start();
let i = Integration {
key: "verysecret".into(),
uplink_values: ["temp".to_string(), "door_open".to_string()],
server: server.url(""),
arbitrary_json: false,
event_prefix: "weatherstation".into(),
};
// uplink event
let pl = integration::UplinkEvent {
device_info: Some(integration::DeviceInfo {
dev_eui: "0102030405060708".to_string(),
..Default::default()
}),
object: Some(pbjson_types::Struct {
fields: [
(
"temp".to_string(),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::NumberValue(23.5)),
},
),
(
"door_open".to_string(),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::StringValue(
"closed".to_string(),
)),
},
),
]
.iter()
.cloned()
.collect(),
}),
..Default::default()
};
let mut mock = server.mock(|when, then| {
when.method(POST)
.path("/trigger/weatherstation_up/with/key/verysecret")
.header("Content-Type", "application/json")
.body(
serde_json::to_string(&Values {
value1: "0102030405060708".to_string(),
value2: "23.5".to_string(),
value3: "closed".to_string(),
})
.unwrap(),
);
then.status(200);
});
i.uplink_event(&HashMap::new(), &pl).await.unwrap();
mock.assert();
mock.delete();
}
#[tokio::test]
async fn test_ifttt_arbitrary_json() {
let server = MockServer::start();
let i = Integration {
key: "verysecret".into(),
uplink_values: ["temp".to_string(), "door_open".to_string()],
server: server.url(""),
arbitrary_json: true,
event_prefix: "".into(),
};
// uplink event
let pl = integration::UplinkEvent {
device_info: Some(integration::DeviceInfo {
dev_eui: "0102030405060708".to_string(),
..Default::default()
}),
object: Some(pbjson_types::Struct {
fields: [
(
"temp".to_string(),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::NumberValue(23.5)),
},
),
(
"door_open".to_string(),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::StringValue(
"closed".to_string(),
)),
},
),
]
.iter()
.cloned()
.collect(),
}),
..Default::default()
};
let mut mock = server.mock(|when, then| {
when.method(POST)
.path("/trigger/up/json/with/key/verysecret")
.header("Content-Type", "application/json")
.body(serde_json::to_string(&pl).unwrap());
then.status(200);
});
i.uplink_event(&HashMap::new(), &pl).await.unwrap();
mock.assert();
mock.delete();
}
}

View File

@ -252,10 +252,13 @@ pub struct PilotThingsConfiguration {
pub token: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct IftttConfiguration {
pub key: String,
pub uplink_values: [String; 2], // The first value is reserved for the DevEUI
pub arbitrary_json: bool,
pub event_prefix: String,
}
#[derive(Clone, Queryable, Insertable, PartialEq, Eq, Debug)]

View File

@ -1,6 +1,6 @@
import React, { Component } from "react";
import { Form, Input, AutoComplete, Button } from "antd";
import { Form, Input, AutoComplete, Button, Row, Col, Switch } from "antd";
import { IftttIntegration } from "@chirpstack/chirpstack-api-grpc-web/api/application_pb";
@ -10,18 +10,46 @@ interface IProps {
onFinish: (obj: IftttIntegration) => void;
}
class IftttIntegrationForm extends Component<IProps> {
interface IState {
arbitraryJson: boolean;
}
class IftttIntegrationForm extends Component<IProps, IState> {
constructor(props: IProps) {
super(props);
this.state = {
arbitraryJson: false,
};
}
componentDidMount() {
const v = this.props.initialValues;
this.setState({
arbitraryJson: v.getArbitraryJson(),
});
}
onFinish = (values: IftttIntegration.AsObject) => {
const v = Object.assign(this.props.initialValues.toObject(), values);
let i = new IftttIntegration();
i.setApplicationId(v.applicationId);
i.setKey(v.key);
i.setEventPrefix(v.eventPrefix);
i.setArbitraryJson(v.arbitraryJson);
i.setUplinkValuesList(v.uplinkValuesList);
this.props.onFinish(i);
};
onArbitraryJsonChange = (checked: boolean) => {
this.setState({
arbitraryJson: checked,
});
}
render() {
const options: {
value: string;
@ -39,10 +67,33 @@ class IftttIntegrationForm extends Component<IProps> {
>
<Input.Password />
</Form.Item>
<Form.List name="uplinkValuesList">
<Row gutter={24}>
<Col span={12}>
<Form.Item
label="Event prefix"
name="eventPrefix"
rules={[{ pattern: /[A-Za-z0-9]+/, message: "Only use A-Z, a-z and 0-9 characters" }]}
tooltip="The prefix will be added to the Webhook event, e.g. if set an uplink will be published as PREFIX_up instead of up."
>
<Input />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Publish as arbitrary JSON"
name="arbitraryJson"
valuePropName="checked"
tooltip="If enabled, the event payload will be published as-is (arbitrary JSON payload instead of 3 JSON values format)."
>
<Switch onChange={this.onArbitraryJsonChange} />
</Form.Item>
</Col>
</Row>
{!this.state.arbitraryJson && <Form.List name="uplinkValuesList">
{fields => (
<div>
<Row gutter={24}>
{fields.map((field, i) => (
<Col span={12}>
<Form.Item
label={`Value ${i + 1} key`}
{...field}
@ -50,10 +101,11 @@ class IftttIntegrationForm extends Component<IProps> {
>
<AutoComplete options={options} />
</Form.Item>
</Col>
))}
</div>
</Row>
)}
</Form.List>
</Form.List>}
<Form.Item>
<Button type="primary" htmlType="submit">
Submit