diff --git a/export/export_daily.sh b/export/export_daily.sh new file mode 100644 index 0000000..2590c4c --- /dev/null +++ b/export/export_daily.sh @@ -0,0 +1,135 @@ +#!/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="root" # 替换为实际的密码 + +# 设置数据库连接参数 +DB_HOST="8.134.185.53" +DB_PORT="5432" +DB_NAME="weatherdb" +DB_USER="yarnom" +EXPORT_DIR="/home/yarnom/Archive/code/WeatherStation/exportData" + +# 添加日志功能 +LOG_FILE="$EXPORT_DIR/export_daily.log" + +# 检查是否提供了日期参数 +if [ $# -ne 1 ]; then + echo "使用方法: $0 YYYY-MM-DD" + echo "示例: $0 2024-02-20" + exit 1 +fi + +# 获取输入的日期 +TARGET_DATE="$1" + +# 验证日期格式 +if ! date -d "$TARGET_DATE" >/dev/null 2>&1; then + echo "错误:无效的日期格式。请使用 YYYY-MM-DD 格式。" + exit 1 +fi + +# 记录开始时间 +echo "=== 开始导出日期 $TARGET_DATE 的数据: $(date) ===" >> "$LOG_FILE" + +# 确保导出目录存在 +mkdir -p "$EXPORT_DIR/daily_exports" + +# 设置输出文件 +OUTPUT_FILE="$EXPORT_DIR/daily_exports/weather_data_${TARGET_DATE}.csv" + +# 创建表头 +echo "latitude,longitude,station_id,station_name,date_time,elevation,pressure,temperature,dewpoint,wind_speed,wind_direction,relative_humidity,ztd,pwv" > "$OUTPUT_FILE" + +# 导出数据 +psql -h "$DB_HOST" -p "$DB_PORT" -d "$DB_NAME" -U "$DB_USER" -A -F "," -t -c " + WITH time_series AS ( + SELECT generate_series( + '$TARGET_DATE 00:00:00'::timestamp, + '$TARGET_DATE 23:59:59'::timestamp, + '10 minutes'::interval + ) as interval_start + ), + avg_data AS ( + SELECT + s.station_id, + COALESCE(s.password, s.station_id) as output_station_id, + ts.interval_start as date_time, + s.latitude, + s.longitude, + s.altitude as elevation, + -- 气压、温度取平均 + 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 time_series ts + CROSS JOIN stations s + LEFT JOIN rs485_weather_data r ON s.station_id = r.station_id + AND r.timestamp >= ts.interval_start + AND r.timestamp < ts.interval_start + '10 minutes'::interval + GROUP BY s.station_id, s.password, ts.interval_start, s.latitude, s.longitude, s.altitude + ) + SELECT + COALESCE(latitude::text, '0'), -- latitude + COALESCE(longitude::text, '0'), -- longitude + output_station_id, -- station_id + '', -- station_name + date_time, -- date_time + COALESCE(elevation::text, '0'), -- elevation + COALESCE(pressure::text, '0'), -- pressure + COALESCE(temperature::text, '0'), -- temperature + '0', -- dewpoint + COALESCE(wind_speed::text, '0'), -- wind_speed + COALESCE(wind_direction::text, '0'), -- wind_direction + COALESCE(relative_humidity::text, '0'), -- relative_humidity + '', -- ztd + '' -- pwv + FROM avg_data + ORDER BY date_time, output_station_id;" >> "$OUTPUT_FILE" 2>> "$LOG_FILE" + +# 检查psql执行状态 +if [ $? -eq 0 ]; then + echo "数据导出成功到文件: $OUTPUT_FILE" + echo "数据导出成功" >> "$LOG_FILE" +else + echo "数据导出失败" + echo "数据导出失败" >> "$LOG_FILE" +fi + +# 记录结束时间 +echo "=== 结束导出: $(date) ===" >> "$LOG_FILE" +echo "" >> "$LOG_FILE" + +# 保持日志文件大小合理(保留最后1000行) +tail -n 1000 "$LOG_FILE" > "${LOG_FILE}.tmp" && mv "${LOG_FILE}.tmp" "$LOG_FILE" + +# 清除密码环境变量(安全考虑) +unset PGPASSWORD + +# 如果导出成功,显示一些统计信息 +if [ $? -eq 0 ]; then + echo "统计信息:" + echo "----------------------------------------" + echo "总记录数:$(tail -n +2 "$OUTPUT_FILE" | wc -l)" + echo "文件大小:$(du -h "$OUTPUT_FILE" | cut -f1)" + echo "文件位置:$OUTPUT_FILE" +fi