8 #include <ESP8266WiFi.h>
9 #include "Adafruit_MQTT.h"
10 #include "Adafruit_MQTT_Client.h"
12 #define MQTT_topic "new001"
13 #define NUM_BACKGROUND_BEHAVIOURS 5
25 Adafruit_MQTT_Client* _mqtt;
26 Adafruit_MQTT_Subscribe* _device_subscription;
28 Adafruit_MQTT_Publish* _announce;
29 Adafruit_MQTT_Publish* _my_announce;
30 String _my_announce_channel;
32 Adafruit_MQTT_Publish* _input;
33 Adafruit_MQTT_Publish* _my_input;
34 String _my_input_channel;
39 String capabilitiesJSON[50];
42 VizBlocks(
char*
id,
char* ssid=
"VizBlocksNet",
char* wifi_pass=
"VizBlocksAP",
43 char* server=
"172.20.10.8",
int port=1883) : _id(id), _server(server), _port(port), _ssid(ssid), _wifi_pass(wifi_pass) {} ;
46 Serial.println(
"Got command: ");
56 Serial.setTimeout(100);
58 Serial.println(F(
"VizBlocks Node starting up"));
59 Serial.println(
"Initialising " + String(_id));
64 WiFi.setSleepMode(WIFI_NONE_SLEEP);
68 Serial.print(
"Connecting to ");
69 Serial.println(_ssid);
71 WiFi.begin(_ssid, _wifi_pass);
72 while (WiFi.status() != WL_CONNECTED) {
78 Serial.println(
"WiFi connected");
79 Serial.println(
"IP address: "); Serial.println(WiFi.localIP());
83 _client =
new WiFiClient();
84 _mqtt =
new Adafruit_MQTT_Client(_client, _server, _port,
"" ,
"" );
85 _device_subscription =
new Adafruit_MQTT_Subscribe(_mqtt, _id);
86 _announce =
new Adafruit_MQTT_Publish(_mqtt,
"announce");
87 _my_announce_channel = String(
"announce/") + String(_id);
88 _my_announce =
new Adafruit_MQTT_Publish(_mqtt, _my_announce_channel.c_str());
91 _mqtt->subscribe(_device_subscription);
100 Serial.println(
"Init finished");
117 int loop_start_time = millis();
122 if( ! _active->
is_running() ) { _active =
nullptr; }
126 if( _background[i] ) {
127 _background[i] -> update();
128 if( !_background[i] -> is_running() ) { _background[i] =
nullptr; }
132 int loop_time_taken = millis()-loop_start_time;
133 if( loop_time_taken < _loop_time ) {
134 delay( _loop_time - loop_time_taken );
142 if( Serial.available() ) {
143 String cmd = Serial.readStringUntil(
'\n');
144 cmd.replace(
"\r",
"");
155 Adafruit_MQTT_Subscribe *subscription;
156 while ((subscription = _mqtt->readSubscription(50))) {
157 if (subscription == _device_subscription) {
158 Serial.print(F(
"Got: "));
159 Serial.println((
char *)_device_subscription->lastread);
160 Serial.println(
process((
char *)_device_subscription->lastread));
172 if (!(input.indexOf(
"<") >= 0 || input.indexOf(
">") >= 0 || input.indexOf(
"-") >= 0)) {
173 int index = input.indexOf(
" ");
178 command = input.substring(0,index);
179 args = input.substring(index+1);
197 Serial.println(
"Processing <"+command+
"> <"+args+
">");
201 if( _active ) { _active->
stop(); }
202 Serial.println(
"Found behaviour: <"+command+
">" );
207 if ( _background[i] ) {
208 if ( b->
name() == _background[i]->
name() ) {
209 return( b->
start(args) );
215 if ( !_background[i] ) {
217 return( b->
start(args) );
220 return "Couldn't run command: " + command +
". Background behaviours full.";
224 return( b->
start(args) );
226 return "Couldn't process command: " + command;
238 if (_mqtt->connected()) {
242 Serial.print(
"Connecting to MQTT... ");
245 while ((ret = _mqtt->connect()) != 0) {
246 Serial.println(_mqtt->connectErrorString(ret));
247 Serial.println(
"Retrying MQTT connection in 5 seconds...");
256 Serial.println(
"MQTT Connected!");
260 String head =
"{\"id\":\"" + String(_id) +
"\",\"Behaviour\":{";
263 String args = b->
args();
264 String body =
"\"name\":\"" + b->
name() +
"\",\"args\":\"" + args +
"\"}}";
265 String str = head + body;
266 capabilitiesJSON[i] = str;
271 if( _wifi ) { _my_announce->publish(doc.c_str()); }
279 if( ! _announce->publish(_id) ) { Serial.println(
"Couldn't make announcement"); }
282 doc = capabilitiesJSON[i];