commit
						e81627b8ec
					
				| @ -19,5 +19,6 @@ import './procedures'; | ||||
| import './time'; | ||||
| import './variables'; | ||||
| import './lists'; | ||||
| import './webserver'; | ||||
| 
 | ||||
| import '../helpers/types' | ||||
| @ -1,6 +1,5 @@ | ||||
| import * as Blockly from 'blockly/core'; | ||||
| import { getColour } from '../helpers/colour'; | ||||
| import * as Types from '../helpers/types' | ||||
| 
 | ||||
| /** | ||||
|  * MQTT Blocks | ||||
| @ -36,7 +35,7 @@ Blockly.Blocks["sensebox_mqtt_setup"] = { | ||||
|     }, | ||||
|     onchange: function (e) { | ||||
|         let service = this.getFieldValue('service'); | ||||
|         switch (this.getFieldValue('service')) { | ||||
|         switch (service) { | ||||
|             case 'adafruitio': | ||||
|                 this.getField('server').setValue("io.adafruit.com"); | ||||
|                 this.getField('port').setValue("1883"); | ||||
|  | ||||
							
								
								
									
										334
									
								
								src/components/Blockly/blocks/webserver.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										334
									
								
								src/components/Blockly/blocks/webserver.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,334 @@ | ||||
| import Blockly from 'blockly/core'; | ||||
| import { getColour } from '../helpers/colour'; | ||||
| import { getCompatibleTypes } from '../helpers/types' | ||||
| import * as Types from '../helpers/types'; | ||||
| 
 | ||||
| /**  | ||||
|  * Webserver Blocks By Lucas Steinmann | ||||
|  *  */ | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_initialize_http_server'] = { | ||||
|     init: function () { | ||||
|         this.setTooltip(Blockly.Msg.senseBox_init_http_server_tip); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.appendDummyInput() | ||||
|             .appendField(Blockly.Msg.senseBox_init_http_server); | ||||
|         this.appendDummyInput() | ||||
|             .setAlign(Blockly.ALIGN_LEFT) | ||||
|             .appendField("Port") | ||||
|             .appendField(new Blockly.FieldNumber(80), "Port"); | ||||
|         this.setPreviousStatement(true, null); | ||||
|         this.setNextStatement(true, null); | ||||
|     }, | ||||
|     onchange: function (e) { | ||||
|         // Is the block nested in a loop?
 | ||||
|         var block = this; | ||||
|         do { | ||||
|             if (this.LOOP_TYPES.indexOf(block.type) !== -1) { | ||||
|                 break; | ||||
|             } | ||||
|             block = block.getSurroundParent(); | ||||
|         } while (block); | ||||
|     }, | ||||
|     LOOP_TYPES: ['arduino_functions'], | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_http_on_client_connect'] = { | ||||
|     init: function () { | ||||
|         this.setTooltip(Blockly.Msg.senseBox_http_on_client_connect_tip); | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.appendDummyInput().appendField(Blockly.Msg.senseBox_http_on_client_connect); | ||||
|         this.appendStatementInput('ON_CONNECT'); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|         this.setPreviousStatement(true, null); | ||||
|         this.setNextStatement(true, null); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_http_method'] = { | ||||
|     init: function () { | ||||
|         this.appendDummyInput() | ||||
|             .appendField(Blockly.Msg.senseBox_http_method) | ||||
|         this.setOutput(true, Types.TEXT.typeName); | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_http_method_tip); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|     }, | ||||
|     getBlockType: function () { | ||||
|         return Blockly.Types.TEXT; | ||||
|     }, | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_http_uri'] = { | ||||
|     init: function () { | ||||
|         this.appendDummyInput() | ||||
|             .appendField(Blockly.Msg.senseBox_http_uri) | ||||
|         this.setOutput(true, Types.TEXT.typeName); | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_http_uri_tip); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_http_protocol_version'] = { | ||||
|     init: function () { | ||||
|         this.appendDummyInput() | ||||
|             .appendField(Blockly.Msg.senseBox_http_protocol_version) | ||||
|         this.setOutput(true, Types.TEXT.typeName); | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_http_protocol_version_tip); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_ip_address'] = { | ||||
|     init: function () { | ||||
|         this.appendDummyInput() | ||||
|             .appendField(Blockly.Msg.senseBox_ip_address); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_ip_address_tip); | ||||
|         this.setHelpUrl(''); | ||||
|         this.setOutput(true, Types.TEXT.typeName); | ||||
|         this.setColour(getColour().webserver); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_http_user_agent'] = { | ||||
|     init: function () { | ||||
|         this.appendDummyInput() | ||||
|             .appendField(Blockly.Msg.senseBox_http_user_agent) | ||||
|         this.setOutput(true, Types.TEXT.typeName); | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_http_user_agent_tip); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_generate_html_doc'] = { | ||||
|     init: function () { | ||||
|         this.appendDummyInput() | ||||
|             .appendField(Blockly.Msg.senseBox_html_document); | ||||
|         this.appendValueInput('HEADER') | ||||
|             .setAlign(Blockly.ALIGN_LEFT) | ||||
|             .setCheck(getCompatibleTypes('String')) | ||||
|             .appendField(Blockly.Msg.senseBox_html_header); | ||||
|         this.appendValueInput('BODY') | ||||
|             .setAlign(Blockly.ALIGN_LEFT) | ||||
|             .setCheck(getCompatibleTypes('String')) | ||||
|             .appendField(Blockly.Msg.senseBox_html_body); | ||||
|         this.setInputsInline(false); | ||||
|         this.setOutput(true, Types.TEXT.typeName); | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_html_document_tip); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|     }, | ||||
| }; | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_generate_http_succesful_response'] = { | ||||
|     init: function () { | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.appendDummyInput() | ||||
|             .appendField(Blockly.Msg.senseBox_http_success); | ||||
|         this.appendDummyInput() | ||||
|             .appendField(Blockly.Msg.senseBox_http_success_l2); | ||||
|         this.appendValueInput('CONTENT') | ||||
|             .appendField(Blockly.Msg.senseBox_http_success_buildhtml) | ||||
|             .setCheck(getCompatibleTypes('String')); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_http_success_tip); | ||||
|         this.setInputsInline(false); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|         this.setPreviousStatement(true, null); | ||||
|         this.setNextStatement(true, null); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_generate_http_not_found_response'] = { | ||||
|     init: function () { | ||||
|         this.setTooltip(Blockly.Msg.senseBox); | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.appendDummyInput().appendField(Blockly.Msg.senseBox_http_not_found); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_http_not_found_tip); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|         this.setPreviousStatement(true, null); | ||||
|         this.setNextStatement(true, null); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_general_html_tag'] = { | ||||
|     init: function () { | ||||
|         this.setTooltip(Blockly.Msg.senseBox_html_general_tag_tip); | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.appendDummyInput() | ||||
|             .appendField("<") | ||||
|             .appendField(new Blockly.FieldTextInput("Tag"), "TAG") | ||||
|             .appendField(">"); | ||||
|         this.appendValueInput('DO0') | ||||
|             .setCheck(getCompatibleTypes('String')); | ||||
|         this.setInputsInline(false); | ||||
|         this.setOutput(true, Types.TEXT.typeName); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|         this.setPreviousStatement(false); | ||||
|         this.setNextStatement(false); | ||||
|         this.setMutator(new Blockly.Mutator(['additional_child'])); | ||||
|         this.additionalChildCount_ = 0; | ||||
|     }, | ||||
|     /** | ||||
|      * Create XML to represent the number of else-if and else inputs. | ||||
|      * @return {Element} XML storage element. | ||||
|      * @this Blockly.Block | ||||
|      */ | ||||
|     mutationToDom: function () { | ||||
|         if (!this.additionalChildCount_) { | ||||
|             return null; | ||||
|         } | ||||
|         var container = document.createElement('mutation'); | ||||
|         if (this.additionalChildCount_) { | ||||
|             container.setAttribute('add_child', this.additionalChildCount_); | ||||
|         } | ||||
|         return container; | ||||
|     }, | ||||
|     /** | ||||
|      * Parse XML to restore the else-if and else inputs. | ||||
|      * @param {!Element} xmlElement XML storage element. | ||||
|      * @this Blockly.Block | ||||
|      */ | ||||
|     domToMutation: function (xmlElement) { | ||||
|         this.additionalChildCount_ = parseInt(xmlElement.getAttribute('add_child'), 10) || 0; | ||||
|         this.updateShape_(); | ||||
|     }, | ||||
|     /** | ||||
|      * Populate the mutator's dialog with this block's components. | ||||
|      * @param {!Blockly.Workspace} workspace Mutator's workspace. | ||||
|      * @return {!Blockly.Block} Root block in mutator. | ||||
|      * @this Blockly.Block | ||||
|      */ | ||||
|     decompose: function (workspace) { | ||||
|         var containerBlock = workspace.newBlock('first_child'); | ||||
|         containerBlock.initSvg(); | ||||
|         var connection = containerBlock.nextConnection; | ||||
|         for (var i = 1; i <= this.additionalChildCount_; i++) { | ||||
|             var elseifBlock = workspace.newBlock('additional_child'); | ||||
|             elseifBlock.initSvg(); | ||||
|             connection.connect(elseifBlock.previousConnection); | ||||
|             connection = elseifBlock.nextConnection; | ||||
|         } | ||||
|         return containerBlock; | ||||
|     }, | ||||
|     /** | ||||
|      * Reconfigure this block based on the mutator dialog's components. | ||||
|      * @param {!Blockly.Block} containerBlock Root block in mutator. | ||||
|      * @this Blockly.Block | ||||
|      */ | ||||
|     compose: function (containerBlock) { | ||||
|         var clauseBlock = containerBlock.nextConnection.targetBlock(); | ||||
|         // Count number of inputs.
 | ||||
|         this.additionalChildCount_ = 0; | ||||
|         var statementConnections = [null]; | ||||
|         while (clauseBlock) { | ||||
|             switch (clauseBlock.type) { | ||||
|                 case 'additional_child': | ||||
|                     this.additionalChildCount_++; | ||||
|                     statementConnections.push(clauseBlock.statementConnection_); | ||||
|                     break; | ||||
|                 default: | ||||
|                     throw new Error("Unknown block type."); | ||||
|             } | ||||
|             clauseBlock = clauseBlock.nextConnection && | ||||
|                 clauseBlock.nextConnection.targetBlock(); | ||||
|         } | ||||
|         this.updateShape_(); | ||||
|         // Reconnect any child blocks.
 | ||||
|         for (var i = 1; i <= this.additionalChildCount_; i++) { | ||||
|             Blockly.Mutator.reconnect(statementConnections[i], this, 'DO' + i); | ||||
|         } | ||||
|     }, | ||||
|     /** | ||||
|      * Store pointers to any connected child blocks. | ||||
|      * @param {!Blockly.Block} containerBlock Root block in mutator. | ||||
|      * @this Blockly.Block | ||||
|      */ | ||||
|     saveConnections: function (containerBlock) { | ||||
|         var clauseBlock = containerBlock.nextConnection.targetBlock(); | ||||
|         var i = 1; | ||||
|         while (clauseBlock) { | ||||
|             switch (clauseBlock.type) { | ||||
|                 case 'additional_child': | ||||
|                     var inputDo = this.getInput('DO' + i); | ||||
|                     clauseBlock.statementConnection_ = | ||||
|                         inputDo && inputDo.connection.targetConnection; | ||||
|                     i++; | ||||
|                     break; | ||||
|                 default: | ||||
|                     throw new Error('Unknown block type.'); | ||||
|             } | ||||
|             clauseBlock = clauseBlock.nextConnection && | ||||
|                 clauseBlock.nextConnection.targetBlock(); | ||||
|         } | ||||
|     }, | ||||
|     /** | ||||
|      * Modify this block to have the correct number of inputs. | ||||
|      * @private | ||||
|      * @this Blockly.Block | ||||
|      */ | ||||
|     updateShape_: function () { | ||||
|         // Delete everything.
 | ||||
|         var i = 1; | ||||
|         while (this.getInput('DO' + i)) { | ||||
|             this.removeInput('DO' + i); | ||||
|             i++; | ||||
|         } | ||||
|         // Rebuild block.
 | ||||
|         for (i = 1; i <= this.additionalChildCount_; i++) { | ||||
|             this.appendValueInput('DO' + i, Blockly.Arduino.ORDER_NONE); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| Blockly.Blocks['first_child'] = { | ||||
|     init: function () { | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.appendDummyInput() | ||||
|             .appendField("<Tag>"); | ||||
|         this.setNextStatement(true); | ||||
|         this.setInputsInline(true); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_tag_first_mutator_tip); | ||||
|         this.contextMenu = false; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| Blockly.Blocks['additional_child'] = { | ||||
|     init: function () { | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.appendDummyInput() | ||||
|             .appendField("<Tag>"); | ||||
|         this.setPreviousStatement(true); | ||||
|         this.setInputsInline(true); | ||||
|         this.setNextStatement(true); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_tag_optional_mutator_tip); | ||||
|         this.contextMenu = false; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // Additional Webserver Blocks
 | ||||
| 
 | ||||
| Blockly.Blocks['sensebox_web_readHTML'] = { | ||||
|     init: function () { | ||||
|         this.appendDummyInput() | ||||
|             .appendField(Blockly.Msg.senseBox_sd_web_readHTML) | ||||
|             .setAlign(Blockly.ALIGN_LEFT); | ||||
|         this.appendDummyInput() | ||||
|             .setAlign(Blockly.ALIGN_LEFT) | ||||
|             .appendField(Blockly.Msg.sensebox_web_readHTML_filename) | ||||
|             .appendField(new Blockly.FieldTextInput("index.txt"), "FILENAME"); | ||||
|         this.setOutput(true, Types.TEXT.typeName); | ||||
|         this.setColour(getColour().webserver); | ||||
|         this.setTooltip(Blockly.Msg.senseBox_output_safetosd_tip); | ||||
|         this.setHelpUrl('https://sensebox.de/books'); | ||||
|     } | ||||
| }; | ||||
| @ -19,5 +19,6 @@ import './procedures'; | ||||
| import './time'; | ||||
| import './variables'; | ||||
| import './lists'; | ||||
| import './webserver'; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										114
									
								
								src/components/Blockly/generator/webserver.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								src/components/Blockly/generator/webserver.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,114 @@ | ||||
| import Blockly from 'blockly'; | ||||
| /** | ||||
|  * Webserver Blocks by Lucas Steinmann | ||||
|  *  | ||||
|  */ | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_initialize_http_server = function (block) { | ||||
|     var box_id = this.getFieldValue('Port'); | ||||
|     Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; | ||||
|     Blockly.Arduino.codeFunctions_['define_wifi_server'] = 'WiFiServer server(' + box_id + ');'; | ||||
|     Blockly.Arduino.setupCode_['sensebox_wifi_server_beging'] = 'server.begin();'; | ||||
|     return ''; | ||||
| }; | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_http_on_client_connect = function (block) { | ||||
|     var onConnect = Blockly.Arduino.statementToCode(block, 'ON_CONNECT'); | ||||
|     var code = ''; | ||||
|     code += 'WiFiClient client = server.available();\n'; | ||||
|     code += 'if (client && client.available()) {\n'; | ||||
|     code += '  String request_string = listenClient(client);\n'; | ||||
|     code += '  Request request;\n'; | ||||
|     code += '  if (parseRequestSafe(request_string, request)) {\n'; | ||||
|     code += onConnect; | ||||
|     code += '  }\n'; | ||||
|     code += '  delay(1);\n'; | ||||
|     code += '  client.stop();\n'; | ||||
|     code += '  delay(1);\n'; | ||||
|     code += '}\n'; | ||||
|     return code; | ||||
| }; | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_http_method = function (block) { | ||||
|     var code = "request.method"; | ||||
|     return [code, Blockly.Arduino.ORDER_ATOMIC]; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_http_uri = function (block) { | ||||
|     var code = "request.uri"; | ||||
|     return [code, Blockly.Arduino.ORDER_ATOMIC]; | ||||
| }; | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_http_protocol_version = function (block) { | ||||
|     var code = "request.protocol_version"; | ||||
|     return [code, Blockly.Arduino.ORDER_ATOMIC]; | ||||
| }; | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_http_user_agent = function (block) { | ||||
|     var code = "request.user_agent"; | ||||
|     return [code, Blockly.Arduino.ORDER_ATOMIC]; | ||||
| }; | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_generate_html_doc = function (block) { | ||||
|     var header = Blockly.Arduino.valueToCode(block, 'HEADER', Blockly.Arduino.ORDER_NONE) || '""'; | ||||
|     var body = Blockly.Arduino.valueToCode(block, 'BODY', Blockly.Arduino.ORDER_NONE) || '""'; | ||||
|     var code = 'buildHTML(' + header + ', ' + body + ')'; | ||||
|     return [code, Blockly.Arduino.ORDER_ATOMIC]; | ||||
| }; | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_generate_http_succesful_response = function (block) { | ||||
|     var content = Blockly.Arduino.valueToCode(block, 'CONTENT', Blockly.Arduino.ORDER_NONE) || '""'; | ||||
|     var code = 'client.println(buildSuccessfulResponse(request, ' + content + '));\n'; | ||||
|     return code; | ||||
| }; | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_generate_http_not_found_response = function (block) { | ||||
|     var code = 'client.println(buildNotFoundResponse(request));\n'; | ||||
|     return code; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_ip_address = function (block) { | ||||
|     var code = "b->getIpAddress()"; | ||||
|     return [code, Blockly.Arduino.ORDER_ATOMIC]; | ||||
| }; | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_general_html_tag = function (block) { | ||||
|     var tag = this.getFieldValue('TAG'); | ||||
|     var code = 'buildTag("' + tag + '",'; | ||||
|     var n = 0; | ||||
|     var branch = Blockly.Arduino.valueToCode(block, 'DO' + n, Blockly.Arduino.ORDER_NONE); | ||||
|     if (branch.length > 0) { | ||||
|         code += '\n ' + branch; | ||||
|     } else { | ||||
|         code += '""'; | ||||
|     } | ||||
|     for (n = 1; n <= block.additionalChildCount_; n++) { | ||||
|         branch = Blockly.Arduino.valueToCode(block, 'DO' + n, Blockly.Arduino.ORDER_NONE); | ||||
|         code += ' +' + branch; | ||||
|     } | ||||
|     return [code + ')', Blockly.Arduino.ORDER_ATOMIC]; | ||||
| }; | ||||
| 
 | ||||
| Blockly.Arduino.sensebox_web_readHTML = function (block) { | ||||
|     var filename = this.getFieldValue('FILENAME'); | ||||
|     Blockly.Arduino.libraries_['library_spi'] = '#include <SPI.h>'; | ||||
|     Blockly.Arduino.libraries_['library_sd'] = '#include <SD.h>'; | ||||
|     Blockly.Arduino.codeFunctions_['define_sd' + filename] = 'File webFile;'; | ||||
|     Blockly.Arduino.setupCode_['sensebox_sd'] = 'SD.begin(28);'; | ||||
|     var func = [ | ||||
|         'String generateHTML(){', | ||||
|         ' webFile = SD.open("' + filename + '", FILE_READ);', | ||||
|         ' String finalString ="";', | ||||
|         ' while (webFile.available())', | ||||
|         '   {', | ||||
|         '   finalString+=(char)webFile.read();', | ||||
|         '   }', | ||||
|         ' return finalString;', | ||||
|         '}']; | ||||
|     var functionName = Blockly.Arduino.addFunction( | ||||
|         'generateHTML', func.join('\n')); | ||||
|     var code = functionName + '()'; | ||||
|     return [code, Blockly.Arduino.ORDER_ATOMIC]; | ||||
| }; | ||||
| @ -11,7 +11,8 @@ const colours = { | ||||
|     variables: 330, | ||||
|     audio: 250, | ||||
|     arrays: 33, | ||||
|     mqtt: 90 | ||||
|     mqtt: 90, | ||||
|     webserver: 40 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -282,6 +282,20 @@ class Toolbox extends React.Component { | ||||
|                         <Block type="sensebox_lora_cayenne_gps" /> | ||||
|                     </Category> | ||||
|                 </Category> | ||||
|                 <Category id="webserver" name="Webserver" colour={getColour().webserver}> | ||||
|                     <Block type="sensebox_initialize_http_server"></Block> | ||||
|                     <Block type="sensebox_http_on_client_connect"></Block> | ||||
|                     <Block type="sensebox_ip_address"></Block> | ||||
|                     <Block type="sensebox_http_method"></Block> | ||||
|                     <Block type="sensebox_http_uri"></Block> | ||||
|                     <Block type="sensebox_http_protocol_version"></Block> | ||||
|                     <Block type="sensebox_http_user_agent"></Block> | ||||
|                     <Block type="sensebox_generate_http_succesful_response"></Block> | ||||
|                     <Block type="sensebox_generate_http_not_found_response"></Block> | ||||
|                     <Block type="sensebox_generate_html_doc"></Block> | ||||
|                     <Block type="sensebox_general_html_tag"></Block> | ||||
|                     <Block type="sensebox_web_readHTML"></Block> | ||||
|                 </Category> | ||||
|                 <Category id="mqtt" name="MQTT" colour={getColour().mqtt}> | ||||
|                     <Block type="sensebox_mqtt_setup" /> | ||||
|                     <Block type="sensebox_mqtt_publish" /> | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user