= 3 && $argv[1] == "test" && isset($argv[2]) ) { sendMessage($argv[2] . ": Testmessage"); exit(); } queryMonitors(); function checkCondition($value, $condition) { switch($condition[0]) { case "e": // equal if($value == $condition[1]) return ' equals ' . $condition[1]; break; case "gt": // greater than if( floatval($value) > floatval($condition[1]) ) return ' = ' . $value . ' and greater than ' . $condition[1]; break; case "gte": // greater than or equal if( floatval($value) >= floatval($condition[1]) ) return ' = ' . $value . ' and greater than or equal ' . $condition[1]; break; case "lt": // lower than if( floatval($value) < floatval($condition[1]) ) return ' = ' . $value . ' and lower than ' . $condition[1]; break; case "lte": // lower than or equal if( floatval($value) <= floatval($condition[1]) ) return ' = ' . $value . ' and lower than or equal ' . $condition[1]; break; case "ne": // not equal if($value != $condition[1]) return ' = ' . $value . ' and not equal to ' . $condition[1]; break; } return false; } function queryMonitors() { global $config; // establish database connection $dbPath = (str_starts_with($config->database, '/')) ? $config->database : dirname(__FILE__) . '/' . $config->database; try { $db = new SQLite3($dbPath, SQLITE3_OPEN_READONLY); } catch (Exception $e) { print ('error detected: ' . $e->getMessage() . "\r\n"); return false; } // query devices from database $sql = "SELECT name FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%' AND name <> 'meta' ORDER BY name ASC;"; $data = $db->query($sql); // process every device found on database while( $device = $data->fetchArray(SQLITE3_ASSOC) ) { // query device data from database $sql = "SELECT * FROM '" . $device['name'] . "' ORDER BY date DESC, time DESC LIMIT 1;"; $res = $db->query($sql)->fetchArray(SQLITE3_NUM); $dataset = json_decode($res[2]); // read last status of warnings and errors for comparison to avoid double sending of notifications $statusFile = __DIR__ . '/status/' . $device['name']; $lastStatus = []; if( is_file($statusFile) ) $lastStatus = json_decode( file_get_contents( $statusFile ), true ); $checksum = hash( 'sha256', json_encode($lastStatus) ); // process configured monitors foreach($config->monitors as $monitor) { if( !empty($monitor->warning) ) { if( !isset( $lastStatus[$monitor->parameter]['warning'] ) ) $lastStatus[$monitor->parameter]['warning'] = 0; $status = checkCondition($dataset->{$monitor->parameter}, $monitor->warning); if( $status && $lastStatus[$monitor->parameter]['warning'] == 0 ) { // new warning sendMessage('Warning from ' . $device['name'] . ': ' . $monitor->parameter . $status); $lastStatus[$monitor->parameter]['warning'] = 1; } else if( !$status && $lastStatus[$monitor->parameter]['warning'] == 1) { // warning cleared sendMessage( 'Warning cleared on ' . $device['name'] . '. ' . $monitor->parameter . ' = ' . $dataset->{$monitor->parameter} . ' and back to normal.'); $lastStatus[$monitor->parameter]['warning'] = 0; } } if( !empty($monitor->error) ) { if( !isset( $lastStatus[$monitor->parameter]['error'] ) ) $lastStatus[$monitor->parameter]['error'] = 0; $status = checkCondition($dataset->{$monitor->parameter}, $monitor->error); if( $status && $lastStatus[$monitor->parameter]['error'] == 0 ) { // new error! sendMessage('Error from ' . $device['name'] . ': ' . $monitor->parameter . $status); $lastStatus[$monitor->parameter]['error'] = 1; } else if( !$status && $lastStatus[$monitor->parameter]['error'] == 1 ) { // error cleared sendMessage('Error cleared on ' . $device['name'] . '. ' . $monitor->parameter . ' = ' . $dataset->{$monitor->parameter} . ' and out of critical range.'); $lastStatus[$monitor->parameter]['error'] = 0; } } } if( hash( 'sha256', json_encode($lastStatus) ) !== $checksum) file_put_contents( $statusFile, json_encode($lastStatus) ); } } function readConfig() { return json_decode( file_get_contents(__DIR__ . '/config.json') ); } function sendMessage($message) { global $config; $authorization = "Authorization: "; if( !empty($config->service->username) && !empty($config->service->password) ) $authorization .= 'Basic ' . base64_encode($config->service->username . ':' . $config->service->password); elseif( !empty($config->service->auth_token) ) $authorization .= 'Bearer ' . $config->service->auth_token; else $authorization = ''; $result = file_get_contents( $config->service->url . '/' . $config->service->topic, false, stream_context_create([ 'http' => [ 'method' => 'POST', 'header' => "Content-Type: text/plain\r\n" . $authorization, 'content' => $message ] ])); return true; } ?>