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 }