From fe328f9da34a2f2078ddd559f06c3eb904d8415e Mon Sep 17 00:00:00 2001 From: Mario Date: Wed, 11 Nov 2020 11:09:19 +0100 Subject: [PATCH 1/2] add first draft for mqtt blocks --- src/components/Blockly/blocks/index.js | 1 + src/components/Blockly/blocks/mqtt.js | 62 +++++++++++++++++++++++ src/components/Blockly/generator/index.js | 1 + src/components/Blockly/generator/mqtt.js | 61 ++++++++++++++++++++++ src/components/Blockly/helpers/colour.js | 3 +- src/components/Blockly/msg/de.js | 14 +++++ src/components/Blockly/msg/en.js | 11 ++++ src/components/Blockly/toolbox/Toolbox.js | 5 ++ 8 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 src/components/Blockly/blocks/mqtt.js create mode 100644 src/components/Blockly/generator/mqtt.js diff --git a/src/components/Blockly/blocks/index.js b/src/components/Blockly/blocks/index.js index 7eeae60..ae24de3 100644 --- a/src/components/Blockly/blocks/index.js +++ b/src/components/Blockly/blocks/index.js @@ -9,6 +9,7 @@ import './sensebox-display'; import './sensebox-lora'; import './sensebox-led'; import './sensebox-sd'; +import './mqtt'; import './text'; import './io'; import './audio'; diff --git a/src/components/Blockly/blocks/mqtt.js b/src/components/Blockly/blocks/mqtt.js new file mode 100644 index 0000000..3678ad6 --- /dev/null +++ b/src/components/Blockly/blocks/mqtt.js @@ -0,0 +1,62 @@ +import * as Blockly from 'blockly/core'; +import { getColour } from '../helpers/colour'; +import * as Types from '../helpers/types' + +/** + * MQTT Blocks + */ + +Blockly.Blocks["sensebox_mqtt_setup"] = { + init: function () { + + //this.setTooltip(Blockly.Msg.senseBox_wifi_); + this.setHelpUrl(''); + this.setColour(getColour().mqtt); + this.appendDummyInput() + .appendField(Blockly.Msg.senseBox_mqtt_init); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.senseBox_mqtt_server) + .appendField(new Blockly.FieldTextInput("Server"), "server"); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.senseBox_mqtt_port) + .appendField(new Blockly.FieldTextInput("Port"), "port"); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.senseBox_mqtt_username) + .appendField(new Blockly.FieldTextInput("Username"), "username"); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.senseBox_mqtt_password) + .appendField(new Blockly.FieldTextInput("Password"), "password"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + + +Blockly.Blocks["sensebox_mqtt_publish"] = { + init: function () { + this.setColour(getColour().mqtt); + this.appendDummyInput() + .appendField(Blockly.Msg.senseBox_mqtt_publish); + this.appendValueInput('value') + .setCheck(null) + .appendField('Feed') + .appendField(new Blockly.FieldTextInput('Feedname'), 'publishfeed'); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +Blockly.Blocks["sensebox_mqtt_subscribe"] = { + init: function () { + this.setColour(getColour().mqtt); + this.appendDummyInput() + .appendField(Blockly.Msg.sensebox_mqtt_subscribe); + this.appendDummyInput() + .appendField(new Blockly.FieldTextInput('Feedname'), 'subscribefeed'); + this.setOutput(true, null); + } +}; diff --git a/src/components/Blockly/generator/index.js b/src/components/Blockly/generator/index.js index afe28a7..8f6859c 100644 --- a/src/components/Blockly/generator/index.js +++ b/src/components/Blockly/generator/index.js @@ -8,6 +8,7 @@ import './sensebox-display'; import './sensebox-lora'; import './sensebox-led'; import './sensebox-sd'; +import './mqtt'; import './logic'; import './text'; import './math'; diff --git a/src/components/Blockly/generator/mqtt.js b/src/components/Blockly/generator/mqtt.js new file mode 100644 index 0000000..b51c018 --- /dev/null +++ b/src/components/Blockly/generator/mqtt.js @@ -0,0 +1,61 @@ +import * as Blockly from 'blockly/core'; +/** +* MQTT Blocks +*/ + +Blockly.Arduino.sensebox_mqtt_setup = function () { + var server = this.getFieldValue('server'); + var port = this.getFieldValue('port'); + var username = this.getFieldValue('username'); + var pass = this.getFieldValue('password'); + Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; + Blockly.Arduino.libraries_['library_adafruitmqtt'] = '#include "Adafruit_MQTT.h"'; + Blockly.Arduino.libraries_['library_adafruitmqttclient'] = '#include "Adafruit_MQTT_Client.h"'; + Blockly.Arduino.definitions_['mqtt_server'] = '#define SERVER "' + server + '"'; + Blockly.Arduino.definitions_['mqtt_port'] = '#define SERVERPORT ' + port + ''; + Blockly.Arduino.definitions_['mqtt_username'] = '#define USERNAME "' + username + '"'; + Blockly.Arduino.definitions_['mqtt_pass'] = '#define PASS "' + pass + '"'; + Blockly.Arduino.definitions_['wifi_client'] = 'WiFiClient client;'; + Blockly.Arduino.definitions_['mqtt_client'] = 'Adafruit_MQTT_Client mqtt(&client, SERVER, SERVERPORT, USERNAME, PASS);' + var code = ''; + return code; +}; + +Blockly.Arduino.sensebox_mqtt_publish = function (block) { + var feedname = this.getFieldValue('publishfeed'); + var res = feedname.split("/"); + var feed_client = res[res.length - 1]; + var value = Blockly.Arduino.valueToCode(this, 'value', Blockly.Arduino.ORDER_ATOMIC) || '"No Block connected"'; + Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, USERNAME "/feeds/' + feedname + '");' + Blockly.Arduino.codeFunctions_['mqtt_connect_function'] = `// Function to connect and reconnect as necessary to the MQTT server. + // Should be called in the loop function and it will take care if connecting. +void MQTT_connect() { + int8_t ret; + // Stop if already connected. + if (mqtt.connected()) { + return; + } + while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected + mqtt.disconnect(); + delay(5000); // wait 5 seconds + } +}`; + Blockly.Arduino.loopCodeOnce_['mqtt_connect'] = 'MQTT_connect();'; + var code = '' + feed_client + '.publish(' + value + ');'; + return code +}; + +Blockly.Arduino.sensebox_mqtt_subscribe = function (block) { + var feedname = this.getFieldValue('subscribefeed'); + var x = 5, feed_client; + feed_client = feedname.substr(feedname.length - x, x); + Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Subscribe ' + feed_client + '= Adafruit_MQTT_Subscribe(&mqtt,' + feedname + ');'; + Blockly.Arduino.codeFunctions_['mqtt_' + feed_client + 'callbackFunction'] = `void ` + feed_client + `Callback (double x){ + Serial.println(x); + }`; + Blockly.Arduino.setupCode_['mqtt_' + feed_client + '_callback'] = '' + feed_client + '.setCallback(' + feed_client + 'Callback);'; + Blockly.Arduino.setupCode_['mqtt_' + feed_client + '_subscribe'] = 'mqtt.subscribe(&' + feed_client + ');'; + Blockly.Arduino.loopCodeOnce_['mqtt_processPackages'] = 'mqtt.processPackets(10);'; + var code = ''; + return code; +}; \ No newline at end of file diff --git a/src/components/Blockly/helpers/colour.js b/src/components/Blockly/helpers/colour.js index e807695..8813d0e 100644 --- a/src/components/Blockly/helpers/colour.js +++ b/src/components/Blockly/helpers/colour.js @@ -10,7 +10,8 @@ const colours = { text: 160, variables: 330, audio: 250, - arrays: 33 + arrays: 33, + mqtt: 90 } diff --git a/src/components/Blockly/msg/de.js b/src/components/Blockly/msg/de.js index bc722be..4753447 100644 --- a/src/components/Blockly/msg/de.js +++ b/src/components/Blockly/msg/de.js @@ -779,4 +779,18 @@ Blockly.Msg.senseBox_ws2818_rgb_led = "senseBox WS2812 - RGB LED"; Blockly.Msg.senseBox_ws2818_rgb_led_position = "Position"; Blockly.Msg.senseBox_ws2818_rgb_led_brightness = "Helligkeit"; + + +/*** + * MQTT + */ + +Blockly.Msg.senseBox_mqtt_init = "Initialisiere MQTT Broker"; +Blockly.Msg.senseBox_mqtt_server = "Server"; +Blockly.Msg.senseBox_mqtt_port = "Port"; +Blockly.Msg.senseBox_mqtt_username = "Benutzername"; +Blockly.Msg.senseBox_mqtt_password = "Passwort"; +Blockly.Msg.sensebox_mqtt_subscribe = "Subscribe to Feed" +Blockly.Msg.senseBox_mqtt_publish = "Sende an Feed"; + export const De = Blockly.Msg; diff --git a/src/components/Blockly/msg/en.js b/src/components/Blockly/msg/en.js index 3b66e33..0a7de78 100644 --- a/src/components/Blockly/msg/en.js +++ b/src/components/Blockly/msg/en.js @@ -763,5 +763,16 @@ Blockly.Msg.senseBox_ws2818_rgb_led = "senseBox WS2812 - RGB LED"; Blockly.Msg.senseBox_ws2818_rgb_led_brightness = "Helligkeit"; Blockly.Msg.senseBox_ws2818_rgb_led_position = "Position"; +/*** + * MQTT + */ + +Blockly.Msg.senseBox_mqtt_init = "Initialize MQTT Broker"; +Blockly.Msg.senseBox_mqtt_server = "Server"; +Blockly.Msg.senseBox_mqtt_port = "Port"; +Blockly.Msg.senseBox_mqtt_username = "Username"; +Blockly.Msg.senseBox_mqtt_password = "Password"; +Blockly.Msg.sensebox_mqtt_subscribe = "Subscribe to Feed" +Blockly.Msg.senseBox_mqtt_publish = "Publish to Feed"; export const En = Blockly.Msg; diff --git a/src/components/Blockly/toolbox/Toolbox.js b/src/components/Blockly/toolbox/Toolbox.js index 2b886e4..f0e51dd 100644 --- a/src/components/Blockly/toolbox/Toolbox.js +++ b/src/components/Blockly/toolbox/Toolbox.js @@ -282,6 +282,11 @@ class Toolbox extends React.Component { + + + + {/* */} + From 9318d3ef1229d5093cf8303c76fc311cf7348602 Mon Sep 17 00:00:00 2001 From: Mario Date: Wed, 11 Nov 2020 12:37:51 +0100 Subject: [PATCH 2/2] add services --- src/components/Blockly/blocks/mqtt.js | 29 ++++++++++++++++++++++-- src/components/Blockly/generator/mqtt.js | 21 ++++++++++++++++- src/components/Blockly/msg/de.js | 2 +- src/components/Blockly/msg/en.js | 2 +- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/components/Blockly/blocks/mqtt.js b/src/components/Blockly/blocks/mqtt.js index 3678ad6..1c31015 100644 --- a/src/components/Blockly/blocks/mqtt.js +++ b/src/components/Blockly/blocks/mqtt.js @@ -13,7 +13,8 @@ Blockly.Blocks["sensebox_mqtt_setup"] = { this.setHelpUrl(''); this.setColour(getColour().mqtt); this.appendDummyInput() - .appendField(Blockly.Msg.senseBox_mqtt_init); + .appendField(Blockly.Msg.senseBox_mqtt_init) + .appendField(new Blockly.FieldDropdown([["Adafruit IO", 'adafruitio'], ["DIOTY", 'dioty'], ["Other Service", 'custom']]), "service"); this.appendDummyInput() .setAlign(Blockly.ALIGN_LEFT) .appendField(Blockly.Msg.senseBox_mqtt_server) @@ -28,10 +29,34 @@ Blockly.Blocks["sensebox_mqtt_setup"] = { .appendField(new Blockly.FieldTextInput("Username"), "username"); this.appendDummyInput() .setAlign(Blockly.ALIGN_LEFT) - .appendField(Blockly.Msg.senseBox_mqtt_password) + .appendField(Blockly.Msg.senseBox_mqtt_password, "passwordmsg") .appendField(new Blockly.FieldTextInput("Password"), "password"); this.setPreviousStatement(true, null); this.setNextStatement(true, null); + }, + onchange: function (e) { + let service = this.getFieldValue('service'); + switch (this.getFieldValue('service')) { + case 'adafruitio': + this.getField('server').setValue("io.adafruit.com"); + this.getField('port').setValue("1883"); + this.getField('passwordmsg').setValue("Adafruit IO Key"); + break; + case 'dioty': + this.getField('server').setValue("mqtt.dioty.co"); + this.getField('port').setValue("1883"); + this.getField('passwordmsg').setValue(Blockly.Msg.senseBox_mqtt_password); + break; + + case "custom": + this.getField('server').setValue("server"); + this.getField('port').setValue("port"); + this.getField('passwordmsg').setValue(Blockly.Msg.senseBox_mqtt_password); + break; + default: + + break; + } } }; diff --git a/src/components/Blockly/generator/mqtt.js b/src/components/Blockly/generator/mqtt.js index b51c018..03c1af1 100644 --- a/src/components/Blockly/generator/mqtt.js +++ b/src/components/Blockly/generator/mqtt.js @@ -3,11 +3,14 @@ import * as Blockly from 'blockly/core'; * MQTT Blocks */ +let service; + Blockly.Arduino.sensebox_mqtt_setup = function () { var server = this.getFieldValue('server'); var port = this.getFieldValue('port'); var username = this.getFieldValue('username'); var pass = this.getFieldValue('password'); + service = this.getFieldValue('service'); Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_['library_adafruitmqtt'] = '#include "Adafruit_MQTT.h"'; Blockly.Arduino.libraries_['library_adafruitmqttclient'] = '#include "Adafruit_MQTT_Client.h"'; @@ -26,7 +29,23 @@ Blockly.Arduino.sensebox_mqtt_publish = function (block) { var res = feedname.split("/"); var feed_client = res[res.length - 1]; var value = Blockly.Arduino.valueToCode(this, 'value', Blockly.Arduino.ORDER_ATOMIC) || '"No Block connected"'; - Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, USERNAME "/feeds/' + feedname + '");' + + switch (service) { + case 'adafruitio': + Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, USERNAME "/feeds/' + feedname + '");' + break; + case 'dioty': + Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, "/"USERNAME"/' + feedname + '");' + break; + case 'custom': + Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, ' + feedname + ');' + break; + default: + break; + + } + + //Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, USERNAME "/feeds/' + feedname + '");' Blockly.Arduino.codeFunctions_['mqtt_connect_function'] = `// Function to connect and reconnect as necessary to the MQTT server. // Should be called in the loop function and it will take care if connecting. void MQTT_connect() { diff --git a/src/components/Blockly/msg/de.js b/src/components/Blockly/msg/de.js index 4753447..302bf8e 100644 --- a/src/components/Blockly/msg/de.js +++ b/src/components/Blockly/msg/de.js @@ -785,7 +785,7 @@ Blockly.Msg.senseBox_ws2818_rgb_led_brightness = "Helligkeit"; * MQTT */ -Blockly.Msg.senseBox_mqtt_init = "Initialisiere MQTT Broker"; +Blockly.Msg.senseBox_mqtt_init = "Verbinde mit MQTT Broker"; Blockly.Msg.senseBox_mqtt_server = "Server"; Blockly.Msg.senseBox_mqtt_port = "Port"; Blockly.Msg.senseBox_mqtt_username = "Benutzername"; diff --git a/src/components/Blockly/msg/en.js b/src/components/Blockly/msg/en.js index 0a7de78..9be6d36 100644 --- a/src/components/Blockly/msg/en.js +++ b/src/components/Blockly/msg/en.js @@ -767,7 +767,7 @@ Blockly.Msg.senseBox_ws2818_rgb_led_position = "Position"; * MQTT */ -Blockly.Msg.senseBox_mqtt_init = "Initialize MQTT Broker"; +Blockly.Msg.senseBox_mqtt_init = "Connect to MQTT Broker"; Blockly.Msg.senseBox_mqtt_server = "Server"; Blockly.Msg.senseBox_mqtt_port = "Port"; Blockly.Msg.senseBox_mqtt_username = "Username";