124 lines
4.3 KiB
Bash
124 lines
4.3 KiB
Bash
#!/bin/bash
|
||
|
||
# 设置环境变量
|
||
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||
export LANG=en_US.UTF-8
|
||
export LC_ALL=en_US.UTF-8
|
||
|
||
# 设置PostgreSQL环境变量
|
||
export PGPASSWORD="你的密码" # 替换为实际的密码
|
||
|
||
# 设置数据库连接参数
|
||
DB_HOST="localhost"
|
||
DB_PORT="5432"
|
||
DB_NAME="weatherdb"
|
||
DB_USER="yarnom"
|
||
EXPORT_DIR="/home/yarnom/Archive/code/WeatherStation/exportData"
|
||
|
||
# 添加日志功能
|
||
LOG_FILE="$EXPORT_DIR/export.log"
|
||
|
||
# 记录开始时间
|
||
echo "=== 开始导出: $(date) ===" >> "$LOG_FILE"
|
||
|
||
# 确保导出目录存在
|
||
mkdir -p "$EXPORT_DIR/data"
|
||
|
||
# 获取当前时间和10分钟前的时间
|
||
CURRENT_DATE=$(date +"%Y-%m-%d")
|
||
END_TIME=$(date +"%Y-%m-%d %H:%M:00")
|
||
START_TIME=$(date -d "10 minutes ago" +"%Y-%m-%d %H:%M:00")
|
||
|
||
# 记录时间范围
|
||
echo "导出时间范围: $START_TIME 到 $END_TIME" >> "$LOG_FILE"
|
||
|
||
# 设置当天的数据文件
|
||
CURRENT_FILE="$EXPORT_DIR/data/weather_data_${CURRENT_DATE}.csv"
|
||
LAST_EXPORT_TIME_FILE="$EXPORT_DIR/last_export_time"
|
||
|
||
# 检查是否需要创建新文件(新的一天)
|
||
if [ -f "$LAST_EXPORT_TIME_FILE" ]; then
|
||
LAST_DATE=$(head -n 1 "$LAST_EXPORT_TIME_FILE" | cut -d' ' -f1)
|
||
if [ "$LAST_DATE" != "$CURRENT_DATE" ]; then
|
||
# 新的一天,将昨天的文件压缩存档
|
||
YESTERDAY=$(date -d "yesterday" +"%Y-%m-%d")
|
||
if [ -f "$EXPORT_DIR/data/weather_data_${YESTERDAY}.csv" ]; then
|
||
gzip "$EXPORT_DIR/data/weather_data_${YESTERDAY}.csv"
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
# 如果是新文件,创建表头
|
||
if [ ! -f "$CURRENT_FILE" ]; then
|
||
echo "创建新文件: $CURRENT_FILE" >> "$LOG_FILE"
|
||
echo "latitude,longitude,station_id,station_name,date_time,elevation,pressure,temperature,dewpoint,wind_speed,wind_direction,relative_humidity,ztd,pwv" > "$CURRENT_FILE"
|
||
fi
|
||
|
||
# 导出新数据并追加到当天的文件
|
||
psql -h "$DB_HOST" -p "$DB_PORT" -d "$DB_NAME" -U "$DB_USER" -A -F "," -t -c "
|
||
WITH avg_data AS (
|
||
SELECT
|
||
s.station_id,
|
||
COALESCE(s.password, s.station_id) as output_station_id, -- 如果password为空则使用station_id
|
||
'$END_TIME'::timestamp as date_time,
|
||
-- 气压、温度取平均
|
||
ROUND(AVG(r.pressure)::numeric, 2) as pressure,
|
||
ROUND(AVG(r.temperature)::numeric, 2) as temperature,
|
||
-- 风速取平均
|
||
ROUND(AVG(r.wind_speed)::numeric, 2) as wind_speed,
|
||
-- 风向使用矢量平均
|
||
ROUND(DEGREES(ATAN2(
|
||
AVG(SIN(RADIANS(r.wind_direction))),
|
||
AVG(COS(RADIANS(r.wind_direction)))
|
||
))::numeric + CASE
|
||
WHEN DEGREES(ATAN2(
|
||
AVG(SIN(RADIANS(r.wind_direction))),
|
||
AVG(COS(RADIANS(r.wind_direction)))
|
||
)) < 0 THEN 360
|
||
ELSE 0
|
||
END, 2) as wind_direction,
|
||
-- 湿度取平均
|
||
ROUND(AVG(r.humidity)::numeric, 2) as relative_humidity
|
||
FROM stations s
|
||
JOIN rs485_weather_data r ON s.station_id = r.station_id
|
||
WHERE r.timestamp >= '$START_TIME' AND r.timestamp < '$END_TIME'
|
||
GROUP BY s.station_id, s.password
|
||
)
|
||
SELECT
|
||
'0', -- latitude
|
||
'0', -- longitude
|
||
output_station_id, -- station_id (使用password字段)
|
||
'', -- station_name
|
||
date_time, -- date_time
|
||
'0', -- elevation
|
||
COALESCE(pressure::text, '0'),
|
||
COALESCE(temperature::text, '0'),
|
||
'0', -- dewpoint
|
||
COALESCE(wind_speed::text, '0'),
|
||
COALESCE(wind_direction::text, '0'),
|
||
COALESCE(relative_humidity::text, '0'),
|
||
'', -- ztd
|
||
'' -- pwv
|
||
FROM avg_data
|
||
ORDER BY output_station_id;" >> "$CURRENT_FILE" 2>> "$LOG_FILE"
|
||
|
||
# 检查psql执行状态
|
||
if [ $? -eq 0 ]; then
|
||
echo "数据导出成功" >> "$LOG_FILE"
|
||
else
|
||
echo "数据导出失败" >> "$LOG_FILE"
|
||
fi
|
||
|
||
# 更新最后导出时间
|
||
echo "$END_TIME" > "$LAST_EXPORT_TIME_FILE"
|
||
|
||
# 记录结束时间
|
||
echo "=== 结束导出: $(date) ===" >> "$LOG_FILE"
|
||
echo "" >> "$LOG_FILE"
|
||
|
||
# 保持日志文件大小合理(保留最后1000行)
|
||
tail -n 1000 "$LOG_FILE" > "${LOG_FILE}.tmp" && mv "${LOG_FILE}.tmp" "$LOG_FILE"
|
||
|
||
# 清除密码环境变量(安全考虑)
|
||
unset PGPASSWORD
|