• Recent
    • Tags
    • Popular
    • Register
    • Login

    Please Note This forum exists for community support for the Mango product family and the Radix IoT Platform. Although Radix IoT employees participate in this forum from time to time, there is no guarantee of a response to anything posted here, nor can Radix IoT, LLC guarantee the accuracy of any information expressed or conveyed. Specific project questions from customers with active support contracts are asked to send requests to support@radixiot.com.

    Radix IoT Website Mango 3 Documentation Website Mango 4 Documentation Website Mango 5 Documentation Website

    Using Persistent TCP points in script calculations

    User help
    2
    41
    18.9k
    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.
    • P
      psysak
      last edited by

      K that sounds fair. I'm seriously at the point where I may do it all at the edge and then just push, it would be a lot cleaner.

      Out of curiosity, I'm just playing around with a script which would manually go back and backfill the history for the meta point, ie the script just returns an array of data values since it last ran and then attempts to backfill the historical for the meta. I don't think I'll end up doing this but curious how that would be accomplished. If I return say 15 values, one for each minute, and step through the calculation until the end of the array will the meta point just get one value at the time of script run or does it somehow understand that I am trying to insert values into history? IF that makes sense.

      1 Reply Last reply Reply Quote 0
      • P
        psysak
        last edited by

        You know what, nevermind :) I'm going to do my calculations in the edge from now on.

        phildunlapP 1 Reply Last reply Reply Quote 0
        • phildunlapP
          phildunlap
          last edited by phildunlap

          With the set() function becoming available in all scripting environments, that's the pathway.

          So, one could have a script like this:

          if(p.time > my.time + 15000) { //if the source point is 15 seconds ahead or more
            var values = p.pointValuesSince(my.time);
            for(var k = 0; k < values.length; k+=1) {
              my.set(values[k].doubleValue, values[k].time); //need to be specific about
              // the data type as getPointValuesSince is an array of DataValue objects
            }
          }
          return p.value;
          

          One needs to be mindful of logging types in using the set function. Only logging type 'ALL' on the point being set (the meta point) will work for backdates. Scripting data sources have the setting 'Saves historical' to avoid logging issues when using its set function, but there is no such option in Meta points.

          1 Reply Last reply Reply Quote 0
          • P
            psysak
            last edited by

            You're awesome man, thanks for all the help :) I'll play around with that as well now that I have it

            1 Reply Last reply Reply Quote 0
            • phildunlapP
              phildunlap @psysak
              last edited by phildunlap

              @psysak said in Using Persistent TCP points in script calculations:

              You know what, nevermind :) I'm going to do my calculations in the edge from now on.

              Ha!

              Well, for posterity, the easiest setup for a meta point across a persistent TCP connection is to disable real time publishing (or just not save it), have frequent data syncs, and set the meta point to run on LOGGED events. The meta point can only be expected to update in that setup at each sync. But, computing things at the lowest level that has all the information is often a good distributed computing model.

              You're awesome man, thanks for all the help :) I'll play around with that as well now that I have it

              Certainly :D

              P 1 Reply Last reply Reply Quote 0
              • P
                psysak @phildunlap
                last edited by

                @phildunlap said in Using Persistent TCP points in script calculations:

                @psysak said in Using Persistent TCP points in script calculations:

                You know what, nevermind :) I'm going to do my calculations in the edge from now on.

                Ha!

                Well, for posterity, the easiest setup for a meta point across a persistent TCP connection is to disable real time publishing (or just not save it), have frequent data syncs, and set the meta point to run on LOGGED events. The meta point can only be expected to update in that setup at each sync. But, computing things at the lowest level that has all the information is often a good distributed computing model.

                You're awesome man, thanks for all the help :) I'll play around with that as well now that I have it

                Certainly :D

                Only issue I see with that Phil is communication loss and if you get an extended outage. If I were to go down for an hour then all the sync'd data would cause the same issue again. My thought was in that case run a script which doesn't rely on the LOGGED trigger but rather just manually steps through the source points values, keeping track of what the last one it processed was, which can just be accomplished by comparing what the last timestamps for each (meta and source) are.

                1 Reply Last reply Reply Quote 0
                • phildunlapP
                  phildunlap
                  last edited by

                  The same issue being that point values were queued, then referred to before they were actually stored?

                  That should only have been an issue with backdated points, so when you're also saving the realtime data that backdate area exists because the realtime data got processed first and produced a current value. In a sync, it should go from the older to the newer, and it should log all those sync'ed values quite quickly. You didn't experience the timing issue when you had a separate point doing your realtime, I thought - only when I guided you to saving the real time data into the same meta point and publishing/saving on the LOGGED event did it become an issue. Right?

                  1 Reply Last reply Reply Quote 0
                  • P
                    psysak
                    last edited by

                    Hey, I'll have a think about what you asked in a bit I just have another question right now. In that META script, is there a way to prevent a value being pushed into the history for that point each time the script runs? Ie, the last statement, return p.value, will push a value in the database for that point. Can NOT have a value returned?

                    1 Reply Last reply Reply Quote 0
                    • phildunlapP
                      phildunlap
                      last edited by phildunlap

                      Yes. As of Mango 3.2 set point event handler scripts, point link scripts, and meta point scripts can all

                      return UNCHANGED;

                      to indicate no value should be set forth.

                      1 Reply Last reply Reply Quote 0
                      • P
                        psysak
                        last edited by

                        @phildunlap said in Using Persistent TCP points in script calculations:

                        return UNCHANGED;

                        At some point I will find a question you cannot answer!

                        1 Reply Last reply Reply Quote 0
                        • phildunlapP
                          phildunlap
                          last edited by

                          Bring it on :P

                          1 Reply Last reply Reply Quote 0
                          • P
                            psysak
                            last edited by psysak

                            Interesting, I'm still getting the same errors as before even though I tried changing the script so it doesn't rely on LOGGED or anything like that. I'm literally pulling the data right out of the database

                            if(pulse.lastValue().time > my.lastValue().time + 15000) {
                               var list = pulse.pointValuesSince(my.lastValue().time + 5000);
                            
                               for (var i=0; i < list.length; i++) {
                                   my.set(list*.doubleValue * pfactor * tfactor, list*.time);
                               }
                            }
                            return UNCHANGED;
                            

                            Now I get this error, which is the same as before
                            'MORGUARD': Script error in point "MORGUARD - EO00026SW_BIERMARKTM3": TypeError: Cannot get property "time" of null in at line number 31 in at line number 31Add comment

                            Oh well... That was my last attempt, I'll move it all to the edge devices now.

                            1 Reply Last reply Reply Quote 0
                            • phildunlapP
                              phildunlap
                              last edited by phildunlap

                              The issue is that the meta point doesn't have any values, so my.lastValue() is null, and it cannot have a .time.

                              One can initialize a meta point like this by either setting a value to it, or putting a little handling in the point, like,

                              if(my.lastValue() === null) {
                                //TIMESTAMP = new Date(2018, 1, 1).getTime(); //When does your point begin?
                                //return 0; //What does it begin at?
                              
                                //Edit: I just remembered, you could also do,
                                my.set(0, new Date(2018, 1, 1).getTime());
                                //and then carry on with the script.
                                //be sure your meta point is settable!
                              }
                              
                              1 Reply Last reply Reply Quote 0
                              • P
                                psysak
                                last edited by

                                Noo way! If that's the issue I'm gonna have some kind of egg on my face haha. Classic rookie mistake not validating this.

                                K I'm going to poke this into all my points and see how it feels about it.

                                1 Reply Last reply Reply Quote 0
                                • P
                                  psysak
                                  last edited by

                                  I did that on purpose just to see how well you knew your product.......

                                  1 Reply Last reply Reply Quote 0
                                  • phildunlapP
                                    phildunlap
                                    last edited by

                                    And I wrote getPointValuesSince instead of pointValuesSince the first time to ensure you had something to correct... yes... :D

                                    1 Reply Last reply Reply Quote 0
                                    • P
                                      psysak
                                      last edited by psysak

                                      Huh, I'm getting odd results Phil.

                                      0_1516119104019_MangoData.PNG

                                      And there's time ranges with no issues at all. No errors now though. The only thing I can think of is a timestamp that I'm not aware of which affects the number of data points I get back.

                                      I was hopeful!

                                      My code looks like this now, triggered every 15mins.

                                      if(pulse.lastValue() === null) {
                                         return UNCHANGED;
                                      }
                                      
                                      if(my.lastValue() === null) {
                                         my.set(0, new Date(2017, 1, 1).getTime());
                                      }
                                      
                                      if(pulse.lastValue().time > my.lastValue().time + 15000) {
                                         var list = pulse.pointValuesSince(my.lastValue().time + 5000);
                                      
                                         for (var i=0; i < list.length; i++) {
                                             my.set(list*.doubleValue * pfactor * tfactor, list*.time);
                                         }
                                      }
                                      return UNCHANGED;
                                      

                                      I've turned on TRACE logging for this script, hopefully I can see what's going on.

                                      Saga continues, Empire Strikes Back episode.

                                      1 Reply Last reply Reply Quote 0
                                      • phildunlapP
                                        phildunlap
                                        last edited by

                                        My first thought, pardon the asking, is if your source point has values for that time period.

                                        Also, my offhand new Date() was somewhat off, the month field is zero indexed, so,
                                        new Date(2017, 0, 1).getTime(); //Jan 1 2017 server timezone

                                        1 Reply Last reply Reply Quote 0
                                        • P
                                          psysak
                                          last edited by

                                          Hey, absolutely valid question and yes they do have data for those missing chunks. I also did notice that it was a month off but I'm okay with that I don't have any data prior to middle of last year anyway. Script runs every 15 minutes and I enabled the trace logging a while ago so hopefully when I go back and look at it this afternoon I'll see something useful. I forgot to mention as well that I trigger every 15 minutes starting at 2 minutes past the hour that way hopefully everything is synced properly but it shouldn't matter anyway cuz that scription catch any change. I believe you mentioned that the historical synchronisation through this mechanism starts with the oldest date of first is that correct?

                                          1 Reply Last reply Reply Quote 0
                                          • phildunlapP
                                            phildunlap
                                            last edited by

                                            Yes, values in the history sync are processed oldest to newest.

                                            I wouldn't expect that cron to change anything.

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