2025-07-12 17:41:49 +08:00

243 lines
7.3 KiB
Go

package em3395ty
import (
"database/sql"
"fmt"
"log"
"rain_monitor/models"
"time"
)
// SaveDeviceInfo 保存设备信息到数据库
func SaveDeviceInfo(db *sql.DB, info *models.EM3395TYDeviceInfo) (int64, error) {
result, err := db.Exec(models.InsertEM3395TYDeviceSQL,
info.Result.ID, info.Result.ActiveTime, info.Result.BindSpaceID,
info.Result.Category, info.Result.CreateTime, info.Result.CustomName,
info.Result.Icon, info.Result.IP, info.Result.IsOnline,
info.Result.Lat, info.Result.LocalKey, info.Result.Lon,
info.Result.Model, info.Result.Name, info.Result.ProductID,
info.Result.ProductName, info.Result.Sub, info.Result.TimeZone,
info.Result.UpdateTime, info.Result.UUID)
if err != nil {
return 0, fmt.Errorf("保存EM3395TY设备信息失败: %v", err)
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return 0, fmt.Errorf("获取受影响行数失败: %v", err)
}
return rowsAffected, nil
}
// SaveDeviceStatus 保存设备状态到数据库
func SaveDeviceStatus(db *sql.DB, deviceID string, status *models.EM3395TYDeviceStatus) (int64, error) {
now := time.Now()
result, err := db.Exec(models.InsertEM3395TYDataSQL,
deviceID, now,
status.Result.TempCurrent, status.Result.HumidityValue,
status.Result.BatteryPercentage, status.Result.TempUnitConvert,
status.Result.WindspeedUnitConvert, status.Result.PressureUnitConvert,
status.Result.RainUnitConvert, status.Result.BrightUnitConvert,
status.Result.TempCurrentExternal, status.Result.HumidityOutdoor,
status.Result.TempCurrentExternal1, status.Result.HumidityOutdoor1,
status.Result.TempCurrentExternal2, status.Result.HumidityOutdoor2,
status.Result.TempCurrentExternal3, status.Result.HumidityOutdoor3,
status.Result.AtmosphericPressure, status.Result.PressureDrop,
status.Result.WindspeedAvg, status.Result.WindspeedGust,
status.Result.Rain1h, status.Result.Rain24h, status.Result.RainRate,
status.Result.UVIndex, status.Result.DewPointTemp,
status.Result.FeellikeTemp, status.Result.HeatIndex,
status.Result.WindchillIndex)
if err != nil {
return 0, fmt.Errorf("保存EM3395TY设备状态失败: %v", err)
}
id, err := result.LastInsertId()
if err != nil {
return 0, fmt.Errorf("获取插入ID失败: %v", err)
}
return id, nil
}
// CheckDeviceExists 检查设备是否存在于数据库中
func CheckDeviceExists(db *sql.DB, deviceID string) (bool, error) {
var count int
err := db.QueryRow(models.QueryEM3395TYDeviceExistsSQL, deviceID).Scan(&count)
if err != nil {
return false, fmt.Errorf("检查设备是否存在失败: %v", err)
}
return count > 0, nil
}
// GetLatestDeviceData 获取最新的设备数据
func GetLatestDeviceData(db *sql.DB, deviceID string) (*models.EM3395TYStatusData, error) {
row := db.QueryRow(models.QueryLatestEM3395TYDataSQL, deviceID)
if row == nil {
return nil, fmt.Errorf("没有找到设备数据")
}
var (
id int64
timestamp time.Time
tempCurrent sql.NullInt64
humidityValue sql.NullInt64
batteryPercentage sql.NullInt64
tempUnitConvert sql.NullString
windspeedUnitConvert sql.NullString
pressureUnitConvert sql.NullString
rainUnitConvert sql.NullString
brightUnitConvert sql.NullString
tempCurrentExternal sql.NullInt64
humidityOutdoor sql.NullInt64
tempCurrentExternal1 sql.NullInt64
humidityOutdoor1 sql.NullInt64
tempCurrentExternal2 sql.NullInt64
humidityOutdoor2 sql.NullInt64
tempCurrentExternal3 sql.NullInt64
humidityOutdoor3 sql.NullInt64
atmosphericPressure sql.NullInt64
pressureDrop sql.NullInt64
windspeedAvg sql.NullInt64
windspeedGust sql.NullInt64
rain1h sql.NullInt64
rain24h sql.NullInt64
rainRate sql.NullInt64
uvIndex sql.NullInt64
dewPointTemp sql.NullInt64
feellikeTemp sql.NullInt64
heatIndex sql.NullInt64
windchillIndex sql.NullInt64
)
err := row.Scan(
&id, &deviceID, &timestamp,
&tempCurrent, &humidityValue, &batteryPercentage,
&tempUnitConvert, &windspeedUnitConvert, &pressureUnitConvert,
&rainUnitConvert, &brightUnitConvert, &tempCurrentExternal,
&humidityOutdoor, &tempCurrentExternal1, &humidityOutdoor1,
&tempCurrentExternal2, &humidityOutdoor2, &tempCurrentExternal3,
&humidityOutdoor3, &atmosphericPressure, &pressureDrop,
&windspeedAvg, &windspeedGust, &rain1h, &rain24h, &rainRate,
&uvIndex, &dewPointTemp, &feellikeTemp, &heatIndex, &windchillIndex,
)
if err == sql.ErrNoRows {
return nil, nil
} else if err != nil {
return nil, fmt.Errorf("获取最新设备数据失败: %v", err)
}
data := &models.EM3395TYStatusData{}
if tempCurrent.Valid {
data.TempCurrent = int(tempCurrent.Int64)
}
if humidityValue.Valid {
data.HumidityValue = int(humidityValue.Int64)
}
if batteryPercentage.Valid {
data.BatteryPercentage = int(batteryPercentage.Int64)
}
if tempUnitConvert.Valid {
data.TempUnitConvert = tempUnitConvert.String
}
if windspeedUnitConvert.Valid {
data.WindspeedUnitConvert = windspeedUnitConvert.String
}
if pressureUnitConvert.Valid {
data.PressureUnitConvert = pressureUnitConvert.String
}
if rainUnitConvert.Valid {
data.RainUnitConvert = rainUnitConvert.String
}
if brightUnitConvert.Valid {
data.BrightUnitConvert = brightUnitConvert.String
}
if tempCurrentExternal.Valid {
data.TempCurrentExternal = int(tempCurrentExternal.Int64)
}
if humidityOutdoor.Valid {
data.HumidityOutdoor = int(humidityOutdoor.Int64)
}
if tempCurrentExternal1.Valid {
data.TempCurrentExternal1 = int(tempCurrentExternal1.Int64)
}
if humidityOutdoor1.Valid {
data.HumidityOutdoor1 = int(humidityOutdoor1.Int64)
}
if tempCurrentExternal2.Valid {
data.TempCurrentExternal2 = int(tempCurrentExternal2.Int64)
}
if humidityOutdoor2.Valid {
data.HumidityOutdoor2 = int(humidityOutdoor2.Int64)
}
if tempCurrentExternal3.Valid {
data.TempCurrentExternal3 = int(tempCurrentExternal3.Int64)
}
if humidityOutdoor3.Valid {
data.HumidityOutdoor3 = int(humidityOutdoor3.Int64)
}
if atmosphericPressure.Valid {
data.AtmosphericPressure = int(atmosphericPressure.Int64)
}
if pressureDrop.Valid {
data.PressureDrop = int(pressureDrop.Int64)
}
if windspeedAvg.Valid {
data.WindspeedAvg = int(windspeedAvg.Int64)
}
if windspeedGust.Valid {
data.WindspeedGust = int(windspeedGust.Int64)
}
if rain1h.Valid {
data.Rain1h = int(rain1h.Int64)
}
if rain24h.Valid {
data.Rain24h = int(rain24h.Int64)
}
if rainRate.Valid {
data.RainRate = int(rainRate.Int64)
}
if uvIndex.Valid {
data.UVIndex = int(uvIndex.Int64)
}
if dewPointTemp.Valid {
data.DewPointTemp = int(dewPointTemp.Int64)
}
if feellikeTemp.Valid {
data.FeellikeTemp = int(feellikeTemp.Int64)
}
if heatIndex.Valid {
data.HeatIndex = int(heatIndex.Int64)
}
if windchillIndex.Valid {
data.WindchillIndex = int(windchillIndex.Int64)
}
return data, nil
}
// CreateTables 创建EM3395TY相关的数据库表
func CreateTables(db *sql.DB) error {
// 创建设备表
_, err := db.Exec(models.CreateEM3395TYDevicesTable)
if err != nil {
return fmt.Errorf("创建EM3395TY设备表失败: %v", err)
}
// 创建数据表
_, err = db.Exec(models.CreateEM3395TYDataTable)
if err != nil {
return fmt.Errorf("创建EM3395TY数据表失败: %v", err)
}
log.Println("EM3395TY数据库表创建成功")
return nil
}