124 lines
4.3 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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