/** * * @param <type> $sensorDataByDatetime * @param <type> $f_station_code */ private function _buildInsertSensorDataQuery($sensorDataByDatetime, $f_station_code) { $f_date = $sensorDataByDatetime->f_date; $sensor = false; $sensorId = false; $lastSensorDataRetrieveInfoTable = ''; foreach ($sensorDataByDatetime as $key => $val) { if (preg_match("#sens_#i", $key)) { $fields = explode("_", $key); /* Cargar Sensor */ if (!$sensor || $sensor->getId() != $sensorId) { if (array_key_exists($f_station_code . '_' . $fields['3'] . '_' . $fields['2'], $this->_loadedSensors)) { $sensor = $this->_loadedSensors[$f_station_code . '_' . $fields['3'] . '_' . $fields['2']]; } else { $sensor = Sensor::load(false, false, $f_station_code, $fields['3'], $fields['2']); $this->_loadedSensors[$f_station_code . '_' . $fields['3'] . '_' . $fields['2']] = $sensor; } } /* Si no se puede cargar el sensor, saltar una iteracion */ if (!$sensor) { continue; } /** * IF NO DATA THEN CONTINUE */ if (check_null_val(process_plain_text($val)) == 'NULL') { continue; } /** * Value is out of range? */ $mixExpected = is_numeric($sensor->getMinExpected()) ? $sensor->getMinExpected() : false; $maxExpected = is_numeric($sensor->getMaxExpected()) ? $sensor->getMaxExpected() : false; if ($mixExpected !== false && $maxExpected !== false) { if ($val >= $mixExpected && $val <= $maxExpected) { $outOfRange = 0; } else { $outOfRange = 1; } } else { $outOfRange = 0; } /** * Update retrieved sensors data info */ $tableSuffix = date('Y_m', strtotime($f_date)); $currentSensorDataRetrieveInfoTable = DBT_PREFIX . "sensor_data_retrieve_info_{$tableSuffix}"; if ($lastSensorDataRetrieveInfoTable != $currentSensorDataRetrieveInfoTable) { $createTableQuery = "\n CREATE TABLE IF NOT EXISTS `{$currentSensorDataRetrieveInfoTable}` (\n `row_id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n `f_station_code` int(11) unsigned NOT NULL,\n `f_sensor_type` varchar(6) COLLATE utf8_unicode_ci NOT NULL,\n `f_sensor_code` int(11) unsigned NOT NULL,\n `f_sensor_ch` int(11) unsigned NOT NULL,\n `f_read_time` int(11) unsigned NOT NULL,\n `f_write_time` int(11) unsigned NOT NULL,\n `f_data_retrieved` decimal(15,4) NOT NULL,\n `f_unit` int(11) DEFAULT NULL,\n `out_of_range` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'si la lectura està fuera de los parametros asignados por el admin en los detalles del sensor',\n `wind_direction_vector` decimal(15,4) DEFAULT NULL,\n PRIMARY KEY (`row_id`),\n UNIQUE KEY `station_code_sensor_type_sensor_code_sensor_ch_read_time` (`f_station_code`,`f_sensor_type`,`f_sensor_code`,`f_sensor_ch`,`f_read_time`),\n KEY `f_station_code` (`f_station_code`),\n KEY `f_sensor_code` (`f_sensor_code`),\n KEY `f_read_time` (`f_read_time`),\n KEY `out_of_range` (`out_of_range`),\n KEY `f_sensor_type` (`f_sensor_type`),\n KEY `wind_direction_vector` (`wind_direction_vector`),\n KEY `f_read_time_combined` (`f_read_time`,`f_station_code`,`f_sensor_code`,`f_sensor_type`)\n ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci\n "; if (!sql_select($createTableQuery, $createTableQueryResults)) { return false; } usleep(50); } /** * Fix, ETo debe mostrarse como SUM y no como AVER como declara el server remoto */ $fields['1'] = $sensor->getSensorCode() == 1201 ? 'sum' : $fields['1']; $queryString = "\n INSERT IGNORE INTO\n `{$currentSensorDataRetrieveInfoTable}`\n SET\n `f_station_code` = {$sensor->getStationCode()},\n `f_sensor_type` = " . check_null_val(process_plain_text($fields['1'])) . ",\n `f_sensor_code` = {$sensor->getSensorCode()},\n `f_sensor_ch` = {$sensor->getSensorCh()},\n `f_read_time` = " . (int) strtotime($f_date) . ",\n `f_write_time` = UNIX_TIMESTAMP(),\n `f_data_retrieved` = " . check_null_val(process_plain_text($val)) . ",\n `f_unit` = '" . process_plain_text($sensor->getUnit()) . "',\n `out_of_range` = {$outOfRange},\n `wind_direction_vector` = " . ($sensor->isWindDirectionSensor() ? deg2cpd($val, true) : 'NULL') . "\n "; if (sql_select($queryString, $results)) { /** * Update retrieved info index */ $updateStationDataRetrieveInfo = "\n INSERT IGNORE INTO\n `" . DBT_PREFIX . "station_data_retrieve_info`\n SET\n `f_station_code` = " . process_plain_text($f_station_code) . ",\n `last_read_time` = " . strtotime($f_date) . ",\n `last_read_time_success` = 1\n "; sql_select($updateStationDataRetrieveInfo, $results); usleep(1000); } else { $this->_proccessOutput("something goes wrong with function _buildInsertSensorDataQuery()"); } } } unset($sensorDataByDatetime); }
/** * Convert degrees into cardinal point direction * * @param float $degrees Direction degrees * * @returns string html Cardinal coordinates * */ function deg2cpd2img($degrees) { $direction = trim(str_replace('°', '', deg2cpd($degrees))); $image = MAIN_DOMAIN . IMAGES_MAIN_FOLDER . THEMES_FOLDER . CURRENT_SEEDCLIMA_THEME . SENSOR_ICONS_FOLDER . 'wind_direction_' . strtolower($direction) . '.png'; return '<img src="' . $image . '" alt="' . $direction . '" border="0" class="center_img"> ' . $direction; }