function process_controller()
{
    //return array('content'=>"ok");
    global $mysqli, $redis, $user, $session, $route, $feed_settings;
    // There are no actions in the input module that can be performed with less than write privileges
    if (!$session['write']) {
        return array('content' => false);
    }
    $result = false;
    require_once "Modules/feed/feed_model.php";
    $feed = new Feed($mysqli, $redis, $feed_settings);
    require_once "Modules/input/input_model.php";
    $input = new Input($mysqli, $redis, $feed);
    require_once "Modules/process/process_model.php";
    $process = new Process($mysqli, $input, $feed, $user->get_timezone($session['userid']));
    if ($route->format == 'html') {
        if ($route->action == 'api') {
            $result = view("Modules/process/Views/process_api.php", array());
        }
    } else {
        if ($route->format == 'json') {
            if ($route->action == "list") {
                $result = $process->get_process_list();
            }
        }
    }
    return array('content' => $result);
}
function input_controller()
{
    //return array('content'=>"ok");
    global $mysqli, $redis, $user, $session, $route, $max_node_id_limit, $feed_settings;
    // There are no actions in the input module that can be performed with less than write privileges
    if (!$session['write']) {
        return array('content' => false);
    }
    global $feed, $timestore_adminkey;
    $result = false;
    include "Modules/feed/feed_model.php";
    $feed = new Feed($mysqli, $redis, $feed_settings);
    require "Modules/input/input_model.php";
    // 295
    $input = new Input($mysqli, $redis, $feed);
    require "Modules/input/process_model.php";
    // 886
    $process = new Process($mysqli, $input, $feed);
    $process->set_timezone_offset($user->get_timezone($session['userid']));
    if ($route->format == 'html') {
        if ($route->action == 'api') {
            $result = view("Modules/input/Views/input_api.php", array());
        }
        if ($route->action == 'view') {
            $result = view("Modules/input/Views/input_view.php", array());
        }
    }
    if ($route->format == 'json') {
        /*
        
        input/bulk.json?data=[[0,16,1137],[2,17,1437,3164],[4,19,1412,3077]]
        
        The first number of each node is the time offset (see below).
        
        The second number is the node id, this is the unique identifer for the wireless node.
        
        All the numbers after the first two are data values. The first node here (node 16) has only one data value: 1137.
        
        Optional offset and time parameters allow the sender to set the time
        reference for the packets.
        If none is specified, it is assumed that the last packet just arrived.
        The time for the other packets is then calculated accordingly.
        
        offset=-10 means the time of each packet is relative to [now -10 s].
        time=1387730127 means the time of each packet is relative to 1387730127
        (number of seconds since 1970-01-01 00:00:00 UTC)
        
        Examples:
        
        // legacy mode: 4 is 0, 2 is -2 and 0 is -4 seconds to now.
          input/bulk.json?data=[[0,16,1137],[2,17,1437,3164],[4,19,1412,3077]]
        // offset mode: -6 is -16 seconds to now.
          input/bulk.json?data=[[-10,16,1137],[-8,17,1437,3164],[-6,19,1412,3077]]&offset=-10
        // time mode: -6 is 1387730121
          input/bulk.json?data=[[-10,16,1137],[-8,17,1437,3164],[-6,19,1412,3077]]&time=1387730127
        // sentat (sent at) mode:
          input/bulk.json?data=[[520,16,1137],[530,17,1437,3164],[535,19,1412,3077]]&offset=543
        
        See pull request for full discussion:
        https://github.com/emoncms/emoncms/pull/118
        */
        if ($route->action == 'bulk') {
            $valid = true;
            if (!isset($_GET['data']) && isset($_POST['data'])) {
                $data = json_decode(post('data'));
            } else {
                $data = json_decode(get('data'));
            }
            $userid = $session['userid'];
            $dbinputs = $input->get_inputs($userid);
            $len = count($data);
            if ($len > 0) {
                if (isset($data[$len - 1][0])) {
                    // Sent at mode: input/bulk.json?data=[[45,16,1137],[50,17,1437,3164],[55,19,1412,3077]]&sentat=60
                    if (isset($_GET['sentat'])) {
                        $time_ref = time() - (int) $_GET['sentat'];
                    } elseif (isset($_POST['sentat'])) {
                        $time_ref = time() - (int) $_POST['sentat'];
                    } elseif (isset($_GET['offset'])) {
                        $time_ref = time() - (int) $_GET['offset'];
                    } elseif (isset($_POST['offset'])) {
                        $time_ref = time() - (int) $_POST['offset'];
                    } elseif (isset($_GET['time'])) {
                        $time_ref = (int) $_GET['time'];
                    } elseif (isset($_POST['time'])) {
                        $time_ref = (int) $_POST['time'];
                    } else {
                        $time_ref = time() - (int) $data[$len - 1][0];
                    }
                    foreach ($data as $item) {
                        if (count($item) > 2) {
                            // check for correct time format
                            $itemtime = (int) $item[0];
                            $time = $time_ref + (int) $itemtime;
                            $nodeid = $item[1];
                            $inputs = array();
                            $name = 1;
                            for ($i = 2; $i < count($item); $i++) {
                                $value = (double) $item[$i];
                                $inputs[$name] = $value;
                                $name++;
                            }
                            $tmp = array();
                            foreach ($inputs as $name => $value) {
                                if ($input->check_node_id_valid($nodeid)) {
                                    if (!isset($dbinputs[$nodeid][$name])) {
                                        $inputid = $input->create_input($userid, $nodeid, $name);
                                        $dbinputs[$nodeid][$name] = true;
                                        $dbinputs[$nodeid][$name] = array('id' => $inputid, 'processList' => '');
                                        $input->set_timevalue($dbinputs[$nodeid][$name]['id'], $time, $value);
                                    } else {
                                        $inputid = $dbinputs[$nodeid][$name]['id'];
                                        $input->set_timevalue($dbinputs[$nodeid][$name]['id'], $time, $value);
                                        if ($dbinputs[$nodeid][$name]['processList']) {
                                            $tmp[] = array('value' => $value, 'processList' => $dbinputs[$nodeid][$name]['processList']);
                                        }
                                    }
                                } else {
                                    $valid = false;
                                    $error = "NodeID must be a positive integer between 0 and " . $max_node_id_limit . ", nodeid given was out of range";
                                }
                            }
                            foreach ($tmp as $i) {
                                $process->input($time, $i['value'], $i['processList']);
                            }
                        } else {
                            $valid = false;
                            $error = "Format error, bulk item needs at least 3 values";
                        }
                    }
                } else {
                    $valid = false;
                    $error = "Format error, last item in bulk data does not contain any data";
                }
            } else {
                $valid = false;
                $error = "Format error, json string supplied is not valid";
            }
            if ($valid) {
                $result = 'ok';
            } else {
                $result = "Error: {$error}\n";
            }
        }
        // input/post.json?node=10&json={power1:100,power2:200,power3:300}
        // input/post.json?node=10&csv=100,200,300
        if ($route->action == 'post') {
            $valid = true;
            $error = "";
            $nodeid = (int) get('node');
            $error = " old" . $max_node_id_limit;
            if (!isset($max_node_id_limit)) {
                $max_node_id_limit = 32;
            }
            $error .= " new" . $max_node_id_limit;
            if (!$input->check_node_id_valid($nodeid)) {
                $valid = false;
                $error = "NodeID must be a positive integer between 0 and " . $max_node_id_limit . ", nodeid given was out of range";
            }
            if (!$valid) {
                return array('content' => "{$error}");
            }
            $nodeid = (int) $nodeid;
            if (isset($_GET['time'])) {
                $time = (int) $_GET['time'];
            } else {
                $time = time();
            }
            $data = array();
            $datain = false;
            // code below processes input regardless of json or csv type
            if (isset($_GET['json'])) {
                $datain = get('json');
            }
            if (isset($_GET['csv'])) {
                $datain = get('csv');
            }
            if (isset($_GET['data'])) {
                $datain = get('data');
            }
            if (isset($_POST['data'])) {
                $datain = post('data');
            }
            if ($datain != "") {
                $json = preg_replace('/[^\\w\\s-.:,]/', '', $datain);
                $datapairs = explode(',', $json);
                $csvi = 0;
                for ($i = 0; $i < count($datapairs); $i++) {
                    $keyvalue = explode(':', $datapairs[$i]);
                    if (isset($keyvalue[1])) {
                        if ($keyvalue[0] == '') {
                            $valid = false;
                            $error = "Format error, json key missing or invalid character";
                        }
                        if (!is_numeric($keyvalue[1])) {
                            $valid = false;
                            $error = "Format error, json value is not numeric";
                        }
                        $data[$keyvalue[0]] = (double) $keyvalue[1];
                    } else {
                        if (!is_numeric($keyvalue[0])) {
                            $valid = false;
                            $error = "Format error: csv value is not numeric";
                        }
                        $data[$csvi + 1] = (double) $keyvalue[0];
                        $csvi++;
                    }
                }
                $userid = $session['userid'];
                $dbinputs = $input->get_inputs($userid);
                $tmp = array();
                foreach ($data as $name => $value) {
                    if (!isset($dbinputs[$nodeid][$name])) {
                        $inputid = $input->create_input($userid, $nodeid, $name);
                        $dbinputs[$nodeid][$name] = true;
                        $dbinputs[$nodeid][$name] = array('id' => $inputid);
                        $input->set_timevalue($dbinputs[$nodeid][$name]['id'], $time, $value);
                    } else {
                        $inputid = $dbinputs[$nodeid][$name]['id'];
                        $input->set_timevalue($dbinputs[$nodeid][$name]['id'], $time, $value);
                        if ($dbinputs[$nodeid][$name]['processList']) {
                            $tmp[] = array('value' => $value, 'processList' => $dbinputs[$nodeid][$name]['processList']);
                        }
                    }
                }
                foreach ($tmp as $i) {
                    $process->input($time, $i['value'], $i['processList']);
                }
            } else {
                $valid = false;
                $error = "Request contains no data via csv, json or data tag";
            }
            if ($valid) {
                $result = 'ok';
            } else {
                $result = "Error: {$error}\n";
            }
        }
        if ($route->action == "clean") {
            $result = $input->clean($session['userid']);
        }
        if ($route->action == "list") {
            $result = $input->getlist($session['userid']);
        }
        if ($route->action == "getinputs") {
            $result = $input->get_inputs($session['userid']);
        }
        if ($route->action == "getallprocesses") {
            $result = $process->get_process_list();
        }
        if (isset($_GET['inputid']) && $input->belongs_to_user($session['userid'], get("inputid"))) {
            if ($route->action == "delete") {
                $result = $input->delete($session['userid'], get("inputid"));
            }
            if ($route->action == 'set') {
                $result = $input->set_fields(get('inputid'), get('fields'));
            }
            if ($route->action == "process") {
                if ($route->subaction == "add") {
                    $result = $input->add_process($process, $session['userid'], get('inputid'), get('processid'), get('arg'), get('newfeedname'), get('newfeedinterval'), get('engine'));
                }
                if ($route->subaction == "list") {
                    $result = $input->get_processlist(get("inputid"));
                }
                if ($route->subaction == "delete") {
                    $result = $input->delete_process(get("inputid"), get('processid'));
                }
                if ($route->subaction == "move") {
                    $result = $input->move_process(get("inputid"), get('processid'), get('moveby'));
                }
                if ($route->subaction == "reset") {
                    $result = $input->reset_process(get("inputid"));
                }
            }
        }
    }
    return array('content' => $result);
}
示例#3
0
 private function convertTemplateProcessList($feedArray, $inputArray, $processArray)
 {
     $resultProcesslist = array();
     if (is_array($processArray)) {
         require_once "Modules/process/process_model.php";
         $process = new Process(null, null, null, null);
         $process_list = $process->get_process_list();
         // emoncms supported processes
         // create each processlist
         foreach ($processArray as $p) {
             $proc_name = $p->process;
             if (!isset($process_list[$proc_name])) {
                 $this->log->error("convertProcess() Process '{$proc_name}' not supported. Module missing?");
                 return array('success' => false, 'message' => "Process '{$proc_name}' not supported. Module missing?");
             }
             // Arguments
             if (isset($p->arguments)) {
                 if (isset($p->arguments->type)) {
                     $type = @constant($p->arguments->type);
                     // ProcessArg::
                     $process_type = $process_list[$proc_name][1];
                     // get emoncms process ProcessArg
                     if ($process_type != $type) {
                         $this->log->error("convertProcess() Bad device template. Missmatch ProcessArg type. Got '{$type}' expected '{$process_type}'. process='{$proc_name}' type='" . $p->arguments->type . "'");
                         return array('success' => false, 'message' => "Bad device template. Missmatch ProcessArg type. Got '{$type}' expected '{$process_type}'. process='{$proc_name}' type='" . $p->arguments->type . "'");
                     }
                     if (isset($p->arguments->value)) {
                         $value = $p->arguments->value;
                     } else {
                         $this->log->error("convertProcess() Bad device template. Undefined argument value. process='{$proc_name}' type='" . $p->arguments->type . "'");
                         return array('success' => false, 'message' => "Bad device template. Undefined argument value. process='{$proc_name}' type='" . $p->arguments->type . "'");
                     }
                     if ($type === ProcessArg::VALUE) {
                     } else {
                         if ($type === ProcessArg::INPUTID) {
                             $temp = $this->searchArray($inputArray, 'name', $value);
                             // return input array that matches $inputArray[]['name']=$value
                             if ($temp->inputId > 0) {
                                 $value = $temp->inputId;
                             } else {
                                 $this->log->error("convertProcess() Bad device template. Input name '{$value}' was not found. process='{$proc_name}' type='" . $p->arguments->type . "'");
                                 return array('success' => false, 'message' => "Bad device template. Input name '{$value}' was not found. process='{$proc_name}' type='" . $p->arguments->type . "'");
                             }
                         } else {
                             if ($type === ProcessArg::FEEDID) {
                                 $temp = $this->searchArray($feedArray, 'name', $value);
                                 // return feed array that matches $feedArray[]['name']=$value
                                 if ($temp->feedId > 0) {
                                     $value = $temp->feedId;
                                 } else {
                                     $this->log->error("convertProcess() Bad device template. Feed name '{$value}' was not found. process='{$proc_name}' type='" . $p->arguments->type . "'");
                                     return array('success' => false, 'message' => "Bad device template. Feed name '{$value}' was not found. process='{$proc_name}' type='" . $p->arguments->type . "'");
                                 }
                             } else {
                                 if ($type === ProcessArg::NONE) {
                                     $value = 0;
                                 } else {
                                     if ($type === ProcessArg::TEXT) {
                                         //                      } else if ($type === ProcessArg::SCHEDULEID) { //not supporte for now
                                     } else {
                                         $this->log->error("convertProcess() Bad device template. Unsuported argument type. process='{$proc_name}' type='" . $p->arguments->type . "'");
                                         return array('success' => false, 'message' => "Bad device template. Unsuported argument type. process='{$proc_name}' type='" . $p->arguments->type . "'");
                                     }
                                 }
                             }
                         }
                     }
                 } else {
                     $this->log->error("convertProcess() Bad device template. Argument type is missing, set to NONE if not required. process='{$proc_name}' type='" . $p->arguments->type . "'");
                     return array('success' => false, 'message' => "Bad device template. Argument type is missing, set to NONE if not required. process='{$proc_name}' type='" . $p->arguments->type . "'");
                 }
                 $this->log->info("convertProcess() process process='{$proc_name}' type='" . $p->arguments->type . "' value='" . $value . "'");
                 $resultProcesslist[] = $proc_name . ":" . $value;
             } else {
                 $this->log->error("convertProcess() Bad device template. Missing processlist arguments. process='{$proc_name}'");
                 return array('success' => false, 'message' => "Bad device template. Missing processlist arguments. process='{$proc_name}'");
             }
         }
     }
     return $resultProcesslist;
 }