• Categories
    • Recent
    • Tags
    • Popular
    • Register
    • Login

    How to set sensor value with javascript

    Scheduled Pinned Locked Moved Developers Zone
    8 Posts 3 Posters 3.3k Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S Offline
      seant
      last edited by

      Hi

      I have an ultrasonic distance sensor that sends distances in cm to mycontroller. I would like to add 2 virtual sensors, one for litres and one for percentage and the values for these to be calculated and set/saved when the distance sensor values are received.

      I have attempted to do this via a javascript script, but I cannot seem to figure out how to set the values for the virtual sensors.

      Please can you let me know how to save a value for a sensor using javascript.

      Thanks

      jkandasaJ 1 Reply Last reply Reply Quote 0
      • jkandasaJ Offline
        jkandasa @seant
        last edited by

        @seant For now there is no event feature in MyController. You can create a virtual sensor and update value with javascript.

        • Map your script with operation
        • Create a rule with real sensor and set threshold as in negative number(ex: > -1). And uncheck ignore duplicate check box. Map your script operation with this rule.
        • Your script will be executed, when you receive value from your sensor.
        1 Reply Last reply Reply Quote 0
        • S Offline
          seant
          last edited by jkandasa

          @jkandasa Thanks I have already done those steps. The issue I have is trying to set a value for the virtual sensor via javascript.
          What I have done thus far is

          1. Create 2 virtual sensors
          2. Create a "operation" script - using javascript
          3. Create a rule that triggers the script when value changes

          I've added my javascript here, but the last 2 lines of code are not setting the virtual sensors values. Can you assist with how to do this please?

          // Get Pump sensor via UID-Tag
          var tankDistanceSensor = mcApi.uidTag().getByUid("water-tank-distance").getResource();
          var tankLitresSensor = mcApi.uidTag().getByUid("water-tank-litres").getResource();
          var tankPercentageSensor = mcApi.uidTag().getByUid("water-tank-percentage").getResource();
          
          //get config in variable
          tankConfig = mcApi.variable().get("water-tank-config");
          fullDistance       = tankConfig.value; // Value 
          emptyDistance = tankConfig.value2; // Value 2
          totalLitres = tankConfig.value3; // Value 3
          
          //Get sensor values with UID Tags
          var pingDistance =  tankDistanceSensor.value; //Water tank level percent
          
          if (pingDistance > 0 && pingDistance < (fullDistance + 50)) {
            percentage =  ((pingDistance - emptyDistance) / (fullDistance - emptyDistance) * 100);
            litres = percentage / 100 * totalLitres;
          
            //THESE 2 LINES DO NOT SEEM TO SET THE VALUES  
            tankLitresSensor.setValue(litres);
            tankPercentageSensor.setValue(percentage);
          
          }
          
          1 Reply Last reply Reply Quote 1
          • jkandasaJ Offline
            jkandasa
            last edited by

            @seant

            var pingDistance = tankDistanceSensor.value; //Water tank level percent

            You have to use parseInt(tankDistanceSensor.value), Sensor variable always have String value.
            var pingDistance = parseInt(tankDistanceSensor.value); //Water tank level percent

            //THESE 2 LINES DO NOT SEEM TO SET THE VALUES
            tankLitresSensor.setValue(litres);
            tankPercentageSensor.setValue(percentage);

            After these two lines add the following lines,

              mcApi.sensor().sendPayload(tankLitresSensor); 
              mcApi.sensor().sendPayload(tankPercentageSensor); 
            
            1 Reply Last reply Reply Quote 2
            • S Offline
              seant
              last edited by

              @jkandasa Thanks. Got it working.

              S 1 Reply Last reply Reply Quote 1
              • S Offline
                seant @seant
                last edited by seant

                @jkandasa This method no longer works when you set the gateway to use ACK. Is there not a way to set a value for a sensor variable only on the server, without transmitting through the gateway as well.

                jkandasaJ 1 Reply Last reply Reply Quote 0
                • jkandasaJ Offline
                  jkandasa @seant
                  last edited by

                  @seant unfortunately no. This looks useful request. can you please create a ticket in github issues?

                  1 Reply Last reply Reply Quote 1
                  • D Offline
                    Daniele
                    last edited by

                    Maybe I missed something, but I have fake sensors defined on real nodes, and I update them thru scripts, and I have ack enabled.
                    Everything works fine!

                    The message goes thru the gateway, the node receives it and replies with ack, even if it doesn't anything with it.

                    Is your nose sleeping maybe?

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post

                    0

                    Online

                    586

                    Users

                    529

                    Topics

                    3.4k

                    Posts
                    Copyright © 2015-2025 MyController.org | Contributors | Localization