243 lines
7.3 KiB
Go
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, ×tamp,
|
|
&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
|
|
}
|