MQTT NodeMCU servo can react only on decimal array payload












1















I'm creating a fish feeder with SG90 servo and NodeMCU



I used this sketch:



#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Servo.h>
// Update these with values suitable for your network.
const char* ssid = "your_wifi_hotspot";
const char* password = "your_wifi_password";
const char* mqtt_server = "broker.mqttdashboard.com";
//const char* mqtt_server = "iot.eclipse.org";

Servo myservo; // create servo object to control a servo
WiFiClient espClient;
PubSubClient client(espClient);

void setup_wifi() {
delay(100);
// We start by connecting to a WiFi network
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length)
{
Serial.print("Command from MQTT broker is : [");
Serial.print(topic);
for(int i=0;i<length;i++)
{
if((int)payload[i]>194||(int)payload[i]<0)
break;
myservo.write((int)payload[i]); // tell servo to go to position in variable '(int)payload[i]'
}
}//end callback

void reconnect() {
// Loop until we're reconnected
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
//if you MQTT broker has clientID,username and password
//please change following line to if (client.connect(clientId,userName,passWord))
if (client.connect(clientId.c_str()))
{
Serial.println("connected");
//once connected to MQTT broker, subscribe command if any
client.subscribe("OsoyooCommand");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 6 seconds before retrying
delay(6000);
}
}
} //end reconnect()

void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
myservo.attach(D1); // attaches the servo on pin D1 to the servo object
}

void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();

}


The servo is working when I use MQTTBox in order to send a payload as "Decimal Array", it is however is giving me a hard time when I send payload as JSON string.



If I send "Decimal Array" 1 it does turn Servo to position 1, however if I simply send 1 as a payload as a string it moves Servo to position 49.
If I send payload as 2 it moves to position 50.
If I send payload as 10 then position is 4948
looks like position of 1 and position of 0 at the same time.



My ultimate goal is to send those payloads via HomeAssistant which are sent as string or JSON, however I don't find a correct solution at the moment.
I would highly appreciate any help or solution.










share|improve this question



























    1















    I'm creating a fish feeder with SG90 servo and NodeMCU



    I used this sketch:



    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    #include <Servo.h>
    // Update these with values suitable for your network.
    const char* ssid = "your_wifi_hotspot";
    const char* password = "your_wifi_password";
    const char* mqtt_server = "broker.mqttdashboard.com";
    //const char* mqtt_server = "iot.eclipse.org";

    Servo myservo; // create servo object to control a servo
    WiFiClient espClient;
    PubSubClient client(espClient);

    void setup_wifi() {
    delay(100);
    // We start by connecting to a WiFi network
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
    delay(500);
    Serial.print(".");
    }
    randomSeed(micros());
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    }

    void callback(char* topic, byte* payload, unsigned int length)
    {
    Serial.print("Command from MQTT broker is : [");
    Serial.print(topic);
    for(int i=0;i<length;i++)
    {
    if((int)payload[i]>194||(int)payload[i]<0)
    break;
    myservo.write((int)payload[i]); // tell servo to go to position in variable '(int)payload[i]'
    }
    }//end callback

    void reconnect() {
    // Loop until we're reconnected
    while (!client.connected())
    {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    //if you MQTT broker has clientID,username and password
    //please change following line to if (client.connect(clientId,userName,passWord))
    if (client.connect(clientId.c_str()))
    {
    Serial.println("connected");
    //once connected to MQTT broker, subscribe command if any
    client.subscribe("OsoyooCommand");
    } else {
    Serial.print("failed, rc=");
    Serial.print(client.state());
    Serial.println(" try again in 5 seconds");
    // Wait 6 seconds before retrying
    delay(6000);
    }
    }
    } //end reconnect()

    void setup() {
    Serial.begin(115200);
    setup_wifi();
    client.setServer(mqtt_server, 1883);
    client.setCallback(callback);
    myservo.attach(D1); // attaches the servo on pin D1 to the servo object
    }

    void loop() {
    if (!client.connected()) {
    reconnect();
    }
    client.loop();

    }


    The servo is working when I use MQTTBox in order to send a payload as "Decimal Array", it is however is giving me a hard time when I send payload as JSON string.



    If I send "Decimal Array" 1 it does turn Servo to position 1, however if I simply send 1 as a payload as a string it moves Servo to position 49.
    If I send payload as 2 it moves to position 50.
    If I send payload as 10 then position is 4948
    looks like position of 1 and position of 0 at the same time.



    My ultimate goal is to send those payloads via HomeAssistant which are sent as string or JSON, however I don't find a correct solution at the moment.
    I would highly appreciate any help or solution.










    share|improve this question

























      1












      1








      1








      I'm creating a fish feeder with SG90 servo and NodeMCU



      I used this sketch:



      #include <ESP8266WiFi.h>
      #include <PubSubClient.h>
      #include <Servo.h>
      // Update these with values suitable for your network.
      const char* ssid = "your_wifi_hotspot";
      const char* password = "your_wifi_password";
      const char* mqtt_server = "broker.mqttdashboard.com";
      //const char* mqtt_server = "iot.eclipse.org";

      Servo myservo; // create servo object to control a servo
      WiFiClient espClient;
      PubSubClient client(espClient);

      void setup_wifi() {
      delay(100);
      // We start by connecting to a WiFi network
      Serial.print("Connecting to ");
      Serial.println(ssid);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED)
      {
      delay(500);
      Serial.print(".");
      }
      randomSeed(micros());
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      }

      void callback(char* topic, byte* payload, unsigned int length)
      {
      Serial.print("Command from MQTT broker is : [");
      Serial.print(topic);
      for(int i=0;i<length;i++)
      {
      if((int)payload[i]>194||(int)payload[i]<0)
      break;
      myservo.write((int)payload[i]); // tell servo to go to position in variable '(int)payload[i]'
      }
      }//end callback

      void reconnect() {
      // Loop until we're reconnected
      while (!client.connected())
      {
      Serial.print("Attempting MQTT connection...");
      // Create a random client ID
      String clientId = "ESP8266Client-";
      clientId += String(random(0xffff), HEX);
      // Attempt to connect
      //if you MQTT broker has clientID,username and password
      //please change following line to if (client.connect(clientId,userName,passWord))
      if (client.connect(clientId.c_str()))
      {
      Serial.println("connected");
      //once connected to MQTT broker, subscribe command if any
      client.subscribe("OsoyooCommand");
      } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 6 seconds before retrying
      delay(6000);
      }
      }
      } //end reconnect()

      void setup() {
      Serial.begin(115200);
      setup_wifi();
      client.setServer(mqtt_server, 1883);
      client.setCallback(callback);
      myservo.attach(D1); // attaches the servo on pin D1 to the servo object
      }

      void loop() {
      if (!client.connected()) {
      reconnect();
      }
      client.loop();

      }


      The servo is working when I use MQTTBox in order to send a payload as "Decimal Array", it is however is giving me a hard time when I send payload as JSON string.



      If I send "Decimal Array" 1 it does turn Servo to position 1, however if I simply send 1 as a payload as a string it moves Servo to position 49.
      If I send payload as 2 it moves to position 50.
      If I send payload as 10 then position is 4948
      looks like position of 1 and position of 0 at the same time.



      My ultimate goal is to send those payloads via HomeAssistant which are sent as string or JSON, however I don't find a correct solution at the moment.
      I would highly appreciate any help or solution.










      share|improve this question














      I'm creating a fish feeder with SG90 servo and NodeMCU



      I used this sketch:



      #include <ESP8266WiFi.h>
      #include <PubSubClient.h>
      #include <Servo.h>
      // Update these with values suitable for your network.
      const char* ssid = "your_wifi_hotspot";
      const char* password = "your_wifi_password";
      const char* mqtt_server = "broker.mqttdashboard.com";
      //const char* mqtt_server = "iot.eclipse.org";

      Servo myservo; // create servo object to control a servo
      WiFiClient espClient;
      PubSubClient client(espClient);

      void setup_wifi() {
      delay(100);
      // We start by connecting to a WiFi network
      Serial.print("Connecting to ");
      Serial.println(ssid);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED)
      {
      delay(500);
      Serial.print(".");
      }
      randomSeed(micros());
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      }

      void callback(char* topic, byte* payload, unsigned int length)
      {
      Serial.print("Command from MQTT broker is : [");
      Serial.print(topic);
      for(int i=0;i<length;i++)
      {
      if((int)payload[i]>194||(int)payload[i]<0)
      break;
      myservo.write((int)payload[i]); // tell servo to go to position in variable '(int)payload[i]'
      }
      }//end callback

      void reconnect() {
      // Loop until we're reconnected
      while (!client.connected())
      {
      Serial.print("Attempting MQTT connection...");
      // Create a random client ID
      String clientId = "ESP8266Client-";
      clientId += String(random(0xffff), HEX);
      // Attempt to connect
      //if you MQTT broker has clientID,username and password
      //please change following line to if (client.connect(clientId,userName,passWord))
      if (client.connect(clientId.c_str()))
      {
      Serial.println("connected");
      //once connected to MQTT broker, subscribe command if any
      client.subscribe("OsoyooCommand");
      } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 6 seconds before retrying
      delay(6000);
      }
      }
      } //end reconnect()

      void setup() {
      Serial.begin(115200);
      setup_wifi();
      client.setServer(mqtt_server, 1883);
      client.setCallback(callback);
      myservo.attach(D1); // attaches the servo on pin D1 to the servo object
      }

      void loop() {
      if (!client.connected()) {
      reconnect();
      }
      client.loop();

      }


      The servo is working when I use MQTTBox in order to send a payload as "Decimal Array", it is however is giving me a hard time when I send payload as JSON string.



      If I send "Decimal Array" 1 it does turn Servo to position 1, however if I simply send 1 as a payload as a string it moves Servo to position 49.
      If I send payload as 2 it moves to position 50.
      If I send payload as 10 then position is 4948
      looks like position of 1 and position of 0 at the same time.



      My ultimate goal is to send those payloads via HomeAssistant which are sent as string or JSON, however I don't find a correct solution at the moment.
      I would highly appreciate any help or solution.







      mqtt nodemcu arduino-esp8266 home-automation






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jan 19 at 21:05









      Ivan SorkinIvan Sorkin

      63




      63
























          2 Answers
          2






          active

          oldest

          votes


















          0














          Looks like the motor is taking the position of the ASCII equivalent of the number when you send it as a string.



          i.e.




          • ASCII equivalent of the character '1' in 49 in decimal

          • ASCII equivalent of the character '2' in 50 in decimal


          Try sending the character 'a', the motor will go to 97.



          If you want to send a string, you will have to change the following code:



          for(int i=0;i<length;i++)
          {
          if((int)payload[i]>194||(int)payload[i]<0)
          break;
          myservo.write((int)payload[i]); // tell servo to go to position in variable '(int)payload[i]'
          }


          to:



          int location=String((char*)payload).toInt()
          if((location>194)||(location<0))
          return;
          myservo.write(location);





          share|improve this answer


























          • Thank you for your reply, but following your suggestion produces an error: call of overloaded 'String(byte*&)' is ambiguous

            – Ivan Sorkin
            Jan 20 at 16:04













          • @IvanSorkin Check the edit.

            – Nitro
            Jan 21 at 2:52



















          1














          MQTT payloads are UTF-8 encoded so the Arduino PubSubClient library treats the payload as an array of uint8_t.



          If you want to send and receive JSON then you can use the ArduinoJson library to parse a JSON payload. So assuming a JSON payload like:



          {
          "position": 123
          }


          Then you can implement a callback such as:



          #include <ArduinoJson.h>

          // Assuming a fixed sized JSON buffer
          StaticJsonBuffer<200> jsonBuffer;

          void callback(char* topic, byte* payload, unsigned int length)
          {
          JsonObject& root = jsonBuffer.parseObject(payload);

          if (root.success() && root.is<JsonObject>())
          {
          int position = root.as<JsonObject>().get<int>("position");

          myservo.write(position);
          }
          }





          share|improve this answer

























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54271384%2fmqtt-nodemcu-servo-can-react-only-on-decimal-array-payload%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            Looks like the motor is taking the position of the ASCII equivalent of the number when you send it as a string.



            i.e.




            • ASCII equivalent of the character '1' in 49 in decimal

            • ASCII equivalent of the character '2' in 50 in decimal


            Try sending the character 'a', the motor will go to 97.



            If you want to send a string, you will have to change the following code:



            for(int i=0;i<length;i++)
            {
            if((int)payload[i]>194||(int)payload[i]<0)
            break;
            myservo.write((int)payload[i]); // tell servo to go to position in variable '(int)payload[i]'
            }


            to:



            int location=String((char*)payload).toInt()
            if((location>194)||(location<0))
            return;
            myservo.write(location);





            share|improve this answer


























            • Thank you for your reply, but following your suggestion produces an error: call of overloaded 'String(byte*&)' is ambiguous

              – Ivan Sorkin
              Jan 20 at 16:04













            • @IvanSorkin Check the edit.

              – Nitro
              Jan 21 at 2:52
















            0














            Looks like the motor is taking the position of the ASCII equivalent of the number when you send it as a string.



            i.e.




            • ASCII equivalent of the character '1' in 49 in decimal

            • ASCII equivalent of the character '2' in 50 in decimal


            Try sending the character 'a', the motor will go to 97.



            If you want to send a string, you will have to change the following code:



            for(int i=0;i<length;i++)
            {
            if((int)payload[i]>194||(int)payload[i]<0)
            break;
            myservo.write((int)payload[i]); // tell servo to go to position in variable '(int)payload[i]'
            }


            to:



            int location=String((char*)payload).toInt()
            if((location>194)||(location<0))
            return;
            myservo.write(location);





            share|improve this answer


























            • Thank you for your reply, but following your suggestion produces an error: call of overloaded 'String(byte*&)' is ambiguous

              – Ivan Sorkin
              Jan 20 at 16:04













            • @IvanSorkin Check the edit.

              – Nitro
              Jan 21 at 2:52














            0












            0








            0







            Looks like the motor is taking the position of the ASCII equivalent of the number when you send it as a string.



            i.e.




            • ASCII equivalent of the character '1' in 49 in decimal

            • ASCII equivalent of the character '2' in 50 in decimal


            Try sending the character 'a', the motor will go to 97.



            If you want to send a string, you will have to change the following code:



            for(int i=0;i<length;i++)
            {
            if((int)payload[i]>194||(int)payload[i]<0)
            break;
            myservo.write((int)payload[i]); // tell servo to go to position in variable '(int)payload[i]'
            }


            to:



            int location=String((char*)payload).toInt()
            if((location>194)||(location<0))
            return;
            myservo.write(location);





            share|improve this answer















            Looks like the motor is taking the position of the ASCII equivalent of the number when you send it as a string.



            i.e.




            • ASCII equivalent of the character '1' in 49 in decimal

            • ASCII equivalent of the character '2' in 50 in decimal


            Try sending the character 'a', the motor will go to 97.



            If you want to send a string, you will have to change the following code:



            for(int i=0;i<length;i++)
            {
            if((int)payload[i]>194||(int)payload[i]<0)
            break;
            myservo.write((int)payload[i]); // tell servo to go to position in variable '(int)payload[i]'
            }


            to:



            int location=String((char*)payload).toInt()
            if((location>194)||(location<0))
            return;
            myservo.write(location);






            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Jan 21 at 18:03









            gre_gor

            4,13892631




            4,13892631










            answered Jan 20 at 11:20









            NitroNitro

            7691313




            7691313













            • Thank you for your reply, but following your suggestion produces an error: call of overloaded 'String(byte*&)' is ambiguous

              – Ivan Sorkin
              Jan 20 at 16:04













            • @IvanSorkin Check the edit.

              – Nitro
              Jan 21 at 2:52



















            • Thank you for your reply, but following your suggestion produces an error: call of overloaded 'String(byte*&)' is ambiguous

              – Ivan Sorkin
              Jan 20 at 16:04













            • @IvanSorkin Check the edit.

              – Nitro
              Jan 21 at 2:52

















            Thank you for your reply, but following your suggestion produces an error: call of overloaded 'String(byte*&)' is ambiguous

            – Ivan Sorkin
            Jan 20 at 16:04







            Thank you for your reply, but following your suggestion produces an error: call of overloaded 'String(byte*&)' is ambiguous

            – Ivan Sorkin
            Jan 20 at 16:04















            @IvanSorkin Check the edit.

            – Nitro
            Jan 21 at 2:52





            @IvanSorkin Check the edit.

            – Nitro
            Jan 21 at 2:52













            1














            MQTT payloads are UTF-8 encoded so the Arduino PubSubClient library treats the payload as an array of uint8_t.



            If you want to send and receive JSON then you can use the ArduinoJson library to parse a JSON payload. So assuming a JSON payload like:



            {
            "position": 123
            }


            Then you can implement a callback such as:



            #include <ArduinoJson.h>

            // Assuming a fixed sized JSON buffer
            StaticJsonBuffer<200> jsonBuffer;

            void callback(char* topic, byte* payload, unsigned int length)
            {
            JsonObject& root = jsonBuffer.parseObject(payload);

            if (root.success() && root.is<JsonObject>())
            {
            int position = root.as<JsonObject>().get<int>("position");

            myservo.write(position);
            }
            }





            share|improve this answer






























              1














              MQTT payloads are UTF-8 encoded so the Arduino PubSubClient library treats the payload as an array of uint8_t.



              If you want to send and receive JSON then you can use the ArduinoJson library to parse a JSON payload. So assuming a JSON payload like:



              {
              "position": 123
              }


              Then you can implement a callback such as:



              #include <ArduinoJson.h>

              // Assuming a fixed sized JSON buffer
              StaticJsonBuffer<200> jsonBuffer;

              void callback(char* topic, byte* payload, unsigned int length)
              {
              JsonObject& root = jsonBuffer.parseObject(payload);

              if (root.success() && root.is<JsonObject>())
              {
              int position = root.as<JsonObject>().get<int>("position");

              myservo.write(position);
              }
              }





              share|improve this answer




























                1












                1








                1







                MQTT payloads are UTF-8 encoded so the Arduino PubSubClient library treats the payload as an array of uint8_t.



                If you want to send and receive JSON then you can use the ArduinoJson library to parse a JSON payload. So assuming a JSON payload like:



                {
                "position": 123
                }


                Then you can implement a callback such as:



                #include <ArduinoJson.h>

                // Assuming a fixed sized JSON buffer
                StaticJsonBuffer<200> jsonBuffer;

                void callback(char* topic, byte* payload, unsigned int length)
                {
                JsonObject& root = jsonBuffer.parseObject(payload);

                if (root.success() && root.is<JsonObject>())
                {
                int position = root.as<JsonObject>().get<int>("position");

                myservo.write(position);
                }
                }





                share|improve this answer















                MQTT payloads are UTF-8 encoded so the Arduino PubSubClient library treats the payload as an array of uint8_t.



                If you want to send and receive JSON then you can use the ArduinoJson library to parse a JSON payload. So assuming a JSON payload like:



                {
                "position": 123
                }


                Then you can implement a callback such as:



                #include <ArduinoJson.h>

                // Assuming a fixed sized JSON buffer
                StaticJsonBuffer<200> jsonBuffer;

                void callback(char* topic, byte* payload, unsigned int length)
                {
                JsonObject& root = jsonBuffer.parseObject(payload);

                if (root.success() && root.is<JsonObject>())
                {
                int position = root.as<JsonObject>().get<int>("position");

                myservo.write(position);
                }
                }






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Jan 22 at 10:59

























                answered Jan 21 at 11:27









                bltblt

                987615




                987615






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54271384%2fmqtt-nodemcu-servo-can-react-only-on-decimal-array-payload%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Liquibase includeAll doesn't find base path

                    How to use setInterval in EJS file?

                    Petrus Granier-Deferre