Rev 2284 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 2047 | arune | 1 | function RRD_Tool() {Log("\033[31mCall to RRD_Tool() can be removed from autostart.js!\033[0m\n");} |
| 2 | |||
| 2048 | arune | 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 | |||
| 2047 | arune | 10 | function RRD_Tool_Init() |
| 1770 | linlun | 11 | { |
| 2047 | arune | 12 | //Log("\033[33mRRD Tool updater starting...\033[0m"); |
| 1770 | linlun | 13 | |
| 2042 | arune | 14 | var last_value_string = Storage_GetParameters(RRD_Tool_Config); |
| 15 | RRD_Tool_StoredData = new Array(); |
||
| 16 | RRD_Tool_Timers = new Array(); |
||
| 1770 | linlun | 17 | for (var name in last_value_string) |
| 18 | { |
||
| 2042 | arune | 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); |
||
| 1770 | linlun | 22 | } |
| 2047 | arune | 23 | //Log("\033[33mRRD Tool updater created.\033[0m"); |
| 1770 | linlun | 24 | } |
| 25 | |||
| 2048 | arune | 26 | RRD_Tool_Init(); |
| 2042 | arune | 27 | RRD_Tool_timerUpdate = function(timer) |
| 1770 | linlun | 28 | { |
| 29 | var alias_string = Storage_GetParameters("LastValues"); |
||
| 2042 | arune | 30 | for (var name in RRD_Tool_Timers) |
| 1770 | linlun | 31 | { |
| 2279 | linlun | 32 | if (RRD_Tool_Timers[name] == timer) { |
| 2042 | arune | 33 | //Log("Timer: "+timer+", named: "+name+" with data: "+RRD_Tool_StoredData[name]["rrd"]["file"]+"\n"); |
| 1770 | linlun | 34 | /* Create command to execute...*/ |
| 35 | var names = ""; |
||
| 36 | var values = "N"; |
||
| 37 | var cmd = "/usr/bin/rrdtool update --template "; |
||
| 38 | var first = 1; |
||
| 2042 | arune | 39 | for (var label in RRD_Tool_StoredData[name]["rrdNames"]) |
| 1770 | linlun | 40 | { |
| 41 | //Log("Found label: "+label+"\n"); |
||
| 2042 | arune | 42 | var data = eval("(" + alias_string[RRD_Tool_StoredData[name]["rrdNames"][label]["Module"]] + ")"); |
| 2284 | linlun | 43 | var datatype=RRD_Tool_StoredData[name]["rrdNames"][label]["data"]; |
| 2300 | linlun | 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 | } |
||
| 2284 | linlun | 56 | var periodicity=RRD_Tool_StoredData[name]["rrd"]["Period_s"]; |
| 2300 | linlun | 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') |
||
| 2284 | linlun | 59 | { |
| 2300 | linlun | 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 | } |
||
| 2284 | linlun | 73 | } |
| 1770 | linlun | 74 | if (first == 1) { |
| 75 | names += label; |
||
| 76 | first = 0; |
||
| 77 | } else { |
||
| 78 | names += ":"+label; |
||
| 79 | } |
||
| 2141 | linlun | 80 | if (typeof data[RRD_Tool_StoredData[name]["rrdNames"][label]["data"]]["value"] == "string") |
| 81 | { |
||
| 2220 | arune | 82 | values += ":"+data[RRD_Tool_StoredData[name]["rrdNames"][label]["data"]]["value"]; |
| 2141 | linlun | 83 | } |
| 84 | else |
||
| 85 | { |
||
| 2284 | linlun | 86 | values += ":"+data[RRD_Tool_StoredData[name]["rrdNames"][label]["data"]]["value"][RRD_Tool_StoredData[name]["rrdNames"][label]["value"]]; |
| 2141 | linlun | 87 | } |
| 1770 | linlun | 88 | } |
| 2284 | linlun | 89 | if (first != 1) { |
| 90 | cmd += names + " "+RRD_Tool_StoredData[name]["rrd"]["file"]+" "+values; |
||
| 2300 | linlun | 91 | // Log("Command: "+cmd); |
| 2284 | linlun | 92 | Execute(cmd); |
| 93 | } |
||
| 2279 | linlun | 94 | break; |
| 1770 | linlun | 95 | } |
| 96 | } |
||
| 97 | } |
||
| 2042 | arune | 98 | |
| 2279 | linlun | 99 | |
| 2042 | arune | 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 ]; }; |
||
| 2218 | arune | 103 | RRD_Tool_MinValues = function() { return [ -40, 0 ]; }; |
| 104 | RRD_Tool_MaxValues = function() { return [ 50, 100, 10000, 20000 ]; }; |
||
| 2042 | arune | 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 | { |
||
| 2046 | arune | 141 | if (arguments.length < 6) |
| 142 | { |
||
| 143 | Log("\033[31mNot enough parameters given.\033[0m\n"); |
||
| 144 | return false; |
||
| 145 | } |
||
| 146 | |||
| 2042 | arune | 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 | |||
| 2218 | arune | 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 |