cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

Community Tip - Want the oppurtunity to discuss enhancements to PTC products? Join a working group! X

Change properties values any undefined amount of time

fmanniti
10-Marble

Change properties values any undefined amount of time

Hi, I have this current situation:

ThingTemplate named "MyTemplate" with three properties: Prop1 (Number), Prop2 (number), Prop3 (number).

25 Things named "TH-1"..."TH-25".


Those properties will change every x seconds (where x is a random number) and I can see on a mashup the new value on three gauges each one binded to a property.


Now I have the following questions:


  1. What I should write in the service to change the thing any random time? Because if it is a fixed time, I can make a Timer Thing but what about a random time? Would you make me a simple example of code?
  2. I know the widget "Autorefresh" which refreshes the page automatically every T seconds where T is set in the widget properties but I have random time. What can I do to autorefresh when it triggers?

Thank you

ACCEPTED SOLUTION

Accepted Solutions

1. With a normal timer, which every time it's executed "rolls a dice" to decide it has to be executed the corresponding service or not. How to roll a dice? with for instance (Math.random()>0.5)

2. Right now TW doesn't supports to send events to the browser from the server. Then you need to do a Poll every n-seconds, if you don't want to refresh the whole gauges every fixed n-seconds, you can set a property called "anyUpdates" and every n-seconds you query for that property, if that property it's true then you call the real data pull and you set again anyUpdates=false. If you have multiple users looking each one from their browser, then you will need to set this anyUpdates on the user session.

View solution in original post

7 REPLIES 7

1. With a normal timer, which every time it's executed "rolls a dice" to decide it has to be executed the corresponding service or not. How to roll a dice? with for instance (Math.random()>0.5)

2. Right now TW doesn't supports to send events to the browser from the server. Then you need to do a Poll every n-seconds, if you don't want to refresh the whole gauges every fixed n-seconds, you can set a property called "anyUpdates" and every n-seconds you query for that property, if that property it's true then you call the real data pull and you set again anyUpdates=false. If you have multiple users looking each one from their browser, then you will need to set this anyUpdates on the user session.

I am sorry for my question but, since I'm quite new in "ThingWorx's world", I still didn't understand very well the services situation, so I didn't understand your answer.

From what I got the service is a function while the subscription is an action that "happens" when an event occurs.

If I see it in this way, I guess that what I need is not a service but a subscription and that my event should occur randomly.

So, that's what I've done. May you please tell me if there is something wrong?

  1. Created a Thing called: TH-1 which is a Generic Thing and which as a number property called Temp
  2. Created a Stream called TestStream with a Data Shape called TestDataFeed with a field called T (number)
  3. Now, you said that I must use a normal time so I created a Timer Thing called RandTime; the problem is that this TimerThing already has a configuration with a time set at 60 seconds.
  4. Anyways, I go to TH-1 subscriptions and Add a new subscription where the source is RandTime and the Event is Timer.
  5. Then I wrote this code:
    // values:INFOTABLE(Datashape: TestDataFeed)
    var values = Things["TestStream"].CreateValues();
    me.Temp=Math.floor(Math.random()*100)+1;
    values.T = me.Temp; //NUMBER
    var params = {
      values : values
    };
    // AddStreamEntry(tags:TAGS, timestamp:DATETIME, source:STRING("me.name"), values:INFOTABLE(TestDataFeed), location:LOCATION):NOTHING
    Things["TestStream"].AddStreamEntry(params);
  6. This works, but it changes my value not randomly.
  7. If I would write a random value changing in a random time in a normal HTML page I would do this
    var myVar;
    function doRandom() {
         myVar=Math.floor((Math.random()*100)+1);
    }
    (function loop() {
        var rand = Math.round(Math.random() * (3000 - 500)) + 500;
        setTimeout(function() {
    doRandom();
                loop(); 
        }, rand);
    }());

I would like to know: According to what are you saying, am I right in part or I'm totally wrong?
Thank you

7. You don't have a setTimeout on ThingWorx, if you want it, you will have to implement with a "queue" an a timer which consumes the pending timeout services.

Ok, but if I want to make a queue, don't I have to make a service instead of a subscription (as I did in 4)?

I mean, queue is an option of services, isn't it?

No, there's no queue services for the platform itself ( you can queue Remote Thing Service calls, but not service calls on the platform itself ). If you want a queue you should implement it.

I was thinking about your "roll the dice" solution.

I don't know if, maybe, I got it wrong, but I don't know if it is the right solution.

What I understood was this kind of solution, tell me if you meant something else:

You make a regular timer thing (RandTimer) which is configured any 1 second.

In your thing template you make one more property that you call "var".

In the subscription of the thing template you give a random value to var from 0 to 1.

If var<0.5 you change myProp, else you don't.

Is it correct according to your idea?

Because in this case it is not exactly a really random amount of time because my value change any 1*(number of failures) seconds, but the number of failures follow the 2^(-n) law and it obviously is bigger for 1, 2 or 3, and lower (almost 0) for 10, 11. For sure I will never get to 100.

*******

Instead, I was thinking about this, but I don't know if it is possible.

Any second, I "stop" the timer

var timer = Things["RandTimer"]; 

timer.DisableTimer(); 

(Is this correct to stop my timer?)

I declare a new variable calle newTimeRate which i a random number.

I change via code randTimer rate with the new value, than I enable the Timer.

Is it possible to do this?

And, if so, would you please tell me which is the code to change the timer rate?


Thank you very much

First approach should work, you can also store the Timeout on a variable, and only execute it when Timeout<"now"

For the Second approach you will need a second timer which Enables the Timer, you can try to play around changing the UpdateRate on the timer, but for my experience that will put you in troubles ( for instance, without a restart some TW versions doesn't updates the Timer frequency ).

Carles.

Announcements


Top Tags