diff --git a/controllers/addTemp.go b/controllers/addTemp.go index c6f1cb7..a5a7e62 100644 --- a/controllers/addTemp.go +++ b/controllers/addTemp.go @@ -2,11 +2,12 @@ package controllers import ( "strconv" - "fmt" + "time" "github.com/astaxie/beego" "datahouse/models/temperature" + temperatureTmp "datahouse/models/temperature/temp" "datahouse/models/sensor" ) @@ -18,14 +19,39 @@ func (c *AddTempController) Get() { mac := c.Ctx.Input.Param(":sensor") val, _ := strconv.Atoi(c.Ctx.Input.Param(":val")) - fmt.Println("MAC: ", mac) - s := sensor.GetSensorByMac(mac) - if s == nil { + if s == nil || s.Id == 0 { sensor.AddSensor(mac) s = sensor.GetSensorByMac(mac) } - temperature.AddData(s.Id, int64(val)) + addToTempBdd(s, val) + saveInBDD(s, val) + c.Ctx.Output.Body([]byte(strconv.FormatInt(s.Interval, 10))) } + +/** + * Save into temporaire database. + */ +func addToTempBdd(snsor *sensor.SensorTable, val int) { + nowUTC := time.Now().UTC() + tempTmp := temperatureTmp.GetTemp(snsor.Id) + if tempTmp == nil || tempTmp.Id == 0 { // Add new entry for sensor + temperatureTmp.AddData(snsor.Id, int64(val)) + } else { // Update entry for sensor + temperatureTmp.UpdateTemp(snsor.Id, int64(val), nowUTC) + } +} + +/** + * Save into database. + */ +func saveInBDD(snsor *sensor.SensorTable, val int) { + nowUTC := time.Now() + lastTempRecord := temperature.GetLastTempForSensor(snsor.Id) + intervalTmp := nowUTC.Unix() - lastTempRecord.HorodateGMT.Unix() - int64(timezoneOffset) + if intervalTmp >= snsor.Interval { + temperature.AddData(snsor.Id, int64(val)) + } +} diff --git a/controllers/default.go b/controllers/default.go index 8c57835..199eaad 100644 --- a/controllers/default.go +++ b/controllers/default.go @@ -4,7 +4,8 @@ import ( "github.com/astaxie/beego" "datahouse/models/sensor" - "datahouse/models/temperature" + // "datahouse/models/temperature" + temperatureTmp "datahouse/models/temperature/temp" "strconv" "time" @@ -43,7 +44,8 @@ func getLastTemps() ([]SensorPrint) { sens.Name = s.SensorMAC } - t := temperature.GetLastTempForSensor(s.Id) + // t := temperature.GetLastTempForSensor(s.Id) + t := temperatureTmp.GetTemp(s.Id) sens.Value = strconv.FormatInt(t.Value, 10) sens.Unit = "°C" diff --git a/models/temperature/temp/temp.go b/models/temperature/temp/temp.go new file mode 100644 index 0000000..e9ff92f --- /dev/null +++ b/models/temperature/temp/temp.go @@ -0,0 +1,72 @@ +package temp + +import ( + "github.com/astaxie/beego/orm" + + "datahouse/models/database" + "datahouse/models/utils" + + "time" +) + +/** + * Store last received data. + */ +type TempTableTmp struct { + Id int64 + HorodateGMT time.Time `orm:"auto_now;type(datetime)"` + SensorID int64 + Value int64 +} + + + +func init() { + orm.RegisterModel(new(TempTableTmp)) +} + + +/** + * Add the value into the database. + */ +func AddData(sensor, value int64) { + o := orm.NewOrm() + o.Using(database.Alias) + + tmpTable := new(TempTableTmp) + tmpTable.Value = value + tmpTable.SensorID = sensor + o.Insert(tmpTable) +} + + +func GetTemp(sensorId int64) (*TempTableTmp) { + o := orm.NewOrm() + o.Using(database.Alias) + + data := new(TempTableTmp) + var maps []orm.Params + _, err := o.QueryTable(new(TempTableTmp)).Filter("SensorID", sensorId).Values(&maps) + if err == nil { + for _, m := range maps { + data.Id = utils.GetInt(m, "Id") + data.HorodateGMT = utils.GetTime(m, "HorodateGMT") + data.SensorID = utils.GetInt(m, "SensorID") + data.Value = utils.GetInt(m, "Value") + } + } + return data +} + + +func UpdateTemp(sensorId, val int64, date time.Time) { + o := orm.NewOrm() + o.Using(database.Alias) + + temp := GetTemp(sensorId) + if o.Read(temp) == nil { + temp.HorodateGMT = date + temp.Value = val + o.Update(temp) + } +}