Subversion Repositories HomeAutomation

Rev

Rev 2284 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. function RRD_Tool() {Log("\033[31mCall to RRD_Tool() can be removed from autostart.js!\033[0m\n");}
  2.  
  3. /* Declaration of static variables */
  4. RRD_Tool_myInterval = null;
  5. RRD_Tool_StoredData = null;
  6. RRD_Tool_Timers = null;
  7. /* Constant config name */
  8. RRD_Tool_Config = "RRD_Tool_config";
  9.  
  10. function RRD_Tool_Init()
  11. {
  12.     //Log("\033[33mRRD Tool updater starting...\033[0m");
  13.    
  14.     var last_value_string = Storage_GetParameters(RRD_Tool_Config);
  15.     RRD_Tool_StoredData = new Array();
  16.     RRD_Tool_Timers = new Array();
  17.     for (var name in last_value_string)
  18.     {
  19.         RRD_Tool_StoredData[name] = eval("(" + last_value_string[name] + ")");
  20.         Log("\033[33mFound: "+name+" with update rate of "+RRD_Tool_StoredData[name]["rrd"]["Period_s"]+"s.\033[0m");
  21.         RRD_Tool_Timers[name] = Timer_SetTimer(function(timer) {RRD_Tool_timerUpdate(timer)}, RRD_Tool_StoredData[name]["rrd"]["Period_s"]*1000, true);
  22.     }
  23.     //Log("\033[33mRRD Tool updater created.\033[0m");
  24. }
  25.  
  26. RRD_Tool_Init();
  27. RRD_Tool_timerUpdate = function(timer)
  28. {
  29.     var alias_string = Storage_GetParameters("LastValues");
  30.     for (var name in RRD_Tool_Timers)
  31.     {  
  32.         if (RRD_Tool_Timers[name] == timer) {
  33.             //Log("Timer: "+timer+", named: "+name+" with data: "+RRD_Tool_StoredData[name]["rrd"]["file"]+"\n");
  34.             /* Create command to execute...*/
  35.             var names = "";
  36.             var values = "N";
  37.             var cmd = "/usr/bin/rrdtool update --template ";
  38.             var first = 1;
  39.             for (var label in RRD_Tool_StoredData[name]["rrdNames"])
  40.             {
  41.                 //Log("Found label: "+label+"\n");
  42.                 var data = eval("(" + alias_string[RRD_Tool_StoredData[name]["rrdNames"][label]["Module"]] + ")");
  43.                 var datatype=RRD_Tool_StoredData[name]["rrdNames"][label]["data"];
  44.                 if (typeof data[datatype] == 'undefined')
  45.                 {
  46.                     //Log("\033[31mCould not find datatype: "+RRD_Tool_StoredData[name]["rrdNames"][label]["data"]+".\033[0m");
  47.                     continue;
  48.                 }
  49.                 if (typeof data[datatype]["value"][RRD_Tool_StoredData[name]["rrdNames"][label]["value"]] == 'undefined')
  50.                 {
  51.                     //Log("\033[33mwifipid: result was: " + JSON.stringify(data[datatype]) + "\033[0m\n");
  52.                    
  53.                     //Log("\033[31mCould not find value: "+RRD_Tool_StoredData[name]["rrdNames"][label]["value"]+".\033[0m");
  54.                     continue;
  55.                 }
  56.                 var periodicity=RRD_Tool_StoredData[name]["rrd"]["Period_s"];
  57.                 //Log("\033[31mTimeout: "+RRD_Tool_StoredData[name]["rrdNames"][label]["noTimeOut"]+"  "+datatype+".\033[0m");
  58.                 if (typeof RRD_Tool_StoredData[name]["rrdNames"][label]["noTimeOut"] == 'undefined')
  59.                 {
  60. //                Log("\033[31mUndef.\033[0m");
  61.                     if (((get_time() - periodicity*2) > data[datatype]["timestamp"]))
  62.                     {
  63. //                      Log("\033[31mError1: RRD-store "+name+" could not store data, too old. Current time="+get_time()+", periodicity="+periodicity+", data timestamp="+data[datatype]["timestamp"]+" data: "+RRD_Tool_StoredData[name]["rrdNames"][label]["data"]+" value: "+RRD_Tool_StoredData[name]["rrdNames"][label]["value"]+".\033[0m");
  64.                         continue;
  65.                     }
  66.                 } else {
  67. //                Log("\033[31mDef.\033[0m");
  68.                     if (((get_time() - periodicity*2) > data[datatype]["timestamp"])&& RRD_Tool_StoredData[name]["rrdNames"][label]["noTimeOut"] != '1')
  69.                     {
  70. //                      Log("\033[31mError2: RRD-store "+name+" could not store data, too old. Current time="+get_time()+", periodicity="+periodicity+", data timestamp="+data[datatype]["timestamp"]+" data: "+RRD_Tool_StoredData[name]["rrdNames"][label]["data"]+" value: "+RRD_Tool_StoredData[name]["rrdNames"][label]["value"]+".\033[0m");
  71.                         continue;
  72.                     }
  73.                 }
  74.                 if (first == 1) {
  75.                     names += label;
  76.                     first = 0;
  77.                 } else {
  78.                     names += ":"+label;  
  79.                 }
  80.                 if (typeof data[RRD_Tool_StoredData[name]["rrdNames"][label]["data"]]["value"] == "string")
  81.                 {
  82.                     values += ":"+data[RRD_Tool_StoredData[name]["rrdNames"][label]["data"]]["value"];
  83.                 }
  84.                 else
  85.                 {
  86.                     values += ":"+data[RRD_Tool_StoredData[name]["rrdNames"][label]["data"]]["value"][RRD_Tool_StoredData[name]["rrdNames"][label]["value"]];
  87.                 }  
  88.             }
  89.             if (first != 1) {
  90.                 cmd += names + " "+RRD_Tool_StoredData[name]["rrd"]["file"]+" "+values;
  91. //              Log("Command: "+cmd);
  92.                 Execute(cmd);
  93.             }
  94.             break;
  95.         }
  96.     }
  97. }
  98.  
  99.  
  100. /* Tab complete stuff */
  101. RRD_Tool_Aliases        = function() { return Module_GetAliasNames(); };
  102. RRD_Tool_Intervals      = function() { return [ 5, 10, 30, 60, 120, 150, 300 ]; };
  103. RRD_Tool_MinValues      = function() { return [ -40, 0 ]; };
  104. RRD_Tool_MaxValues      = function() { return [ 50, 100, 10000, 20000 ]; };
  105. /* Function returns an array with all CAN variables existing in LastValues storage */
  106. RRD_Tool_Variables      = function()
  107. {
  108.     var last_value_string = Storage_GetParameters("LastValues");
  109.     var last_values = new Array();
  110.     var last_values_variables = [];
  111.     for (var name in last_value_string)
  112.     {
  113.         last_values[name] = eval("(" + last_value_string[name] + ")");
  114.         for (var name2 in last_values[name])
  115.         {
  116.             /* Only get unique variables */
  117.             if (last_values_variables.indexOf(name2) == -1)
  118.             {
  119.                 last_values_variables.push(name2);
  120.             }
  121.         }
  122.     }
  123.     return last_values_variables;
  124. };
  125.  
  126. /*
  127. electricPower={"rrd":{"file":"/var/www/appdata/rrd-data-new/electricPower.rrd","Period_s":"60"}, "rrdNames":{"power":{"Module":"powerMeter","data":"Power32","value":"value"}}}
  128.  
  129. <store_name>={"rrd":{"file":"<rrd_filename>","Period_s":"<push_interval>"}, "rrdNames":{"<rrd_data_source_name>":{"Module":"<alias_name>","data":"<variable_name>","value":"value"}}}
  130. */
  131.  
  132. /*
  133. TODO:
  134. handle more than one rrd data source (not possible with different alias/variables)
  135. function RRDTool_AddConfig(alias_name, variable_name, push_interval, store_name, rrd_filename, rrd_data_source_name_array)
  136. */
  137.  
  138. /* Function to add new rrd config on atomic command line interface */
  139. function RRDTool_AddConfig(alias_name, variable_name, push_interval, store_name, rrd_filename, rrd_data_source_name)
  140. {
  141.     if (arguments.length < 6)
  142.     {
  143.         Log("\033[31mNot enough parameters given.\033[0m\n");
  144.         return false;
  145.     }
  146.  
  147.     if (RRD_Tool_Config == null || RRD_Tool_StoredData == null || RRD_Tool_Timers == null)
  148.     {
  149.         RRD_Tool_Config = "RRD_Tool_config";
  150.         RRD_Tool_StoredData = new Array();
  151.         RRD_Tool_Timers = new Array();
  152.     }
  153.    
  154.     //Log("rrd data source array length: "+rrd_data_source_name_array.length);
  155.     //if (rrd_data_source_name_array.length > 0)
  156.     //{
  157.         var newString = "{\"rrd\":{\"file\":\"" + rrd_filename + "\",\"Period_s\":\"" + push_interval + "\"},\"rrdNames\":{\"" + rrd_data_source_name + "\":{\"Module\":\""+alias_name+"\",\"data\":\""+variable_name+"\",\"value\":\"value\"}}";
  158.         //for (var rrd_data_source in rrd_data_source_name_array)
  159.         //{
  160.         //  newString += "";
  161.         //}
  162.         newString += "}";
  163.        
  164.         /* Push new config line to storage */
  165.         Storage_SetParameter(RRD_Tool_Config, store_name, newString);
  166.         //Log("New config: "+newString + " configname " + RRD_Tool_Config +"\n");
  167.     //}
  168.  
  169.     /* Start this new config now */
  170.     RRD_Tool_StoredData[store_name] = eval("(" + newString + ")");
  171.     RRD_Tool_Timers[store_name] = Timer_SetTimer(function(timer) {RRD_Tool_timerUpdate(timer)}, RRD_Tool_StoredData[store_name]["rrd"]["Period_s"]*1000, true);
  172.     Log("\033[33mCreated: "+store_name+" with update rate of "+RRD_Tool_StoredData[store_name]["rrd"]["Period_s"]+"s.\033[0m\n");
  173. }
  174. Console_RegisterCommand(RRDTool_AddConfig, function(arg_index, args) { return Console_StandardAutocomplete(arg_index, args, RRD_Tool_Aliases(), RRD_Tool_Variables(), RRD_Tool_Intervals() ); });
  175.  
  176.  
  177. /* Function to add new rrd config and create rrd file on atomic command line interface */
  178. function RRDTool_AddConfigCreateRrd(alias_name, variable_name, push_interval, data_max, data_min, store_name, rrd_filename, rrd_data_source_name)
  179. {
  180.     /* Create new rrd file */
  181.     /* Two avarages, one with 1 value avarage and one with 12 values avarage */
  182.     /* Make sure 1 value avarage last 14 days and 12 value avarage last 10 years, independant of push interval */
  183.    
  184.     /* set data timeout to double push interval */
  185.     /* set step to push interval */
  186.    
  187. }
  188. //Console_RegisterCommand(RRDTool_AddConfigCreateRrd, function(arg_index, args) { return Console_StandardAutocomplete(arg_index, args, RRD_Tool_Aliases(), RRD_Tool_Variables(), RRD_Tool_Intervals(), RRD_Tool_MaxValues(), RRD_Tool_MinValues() ); });
  189.  
  190.