How to set sensor value with javascript
-
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
-
@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.
-
@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- Create 2 virtual sensors
- Create a "operation" script - using javascript
- 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); }
-
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);
-
@jkandasa Thanks. Got it working.
-
@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.
-
-
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?