From 0d83871ec07de3e08949e33c034d8b1a6728fcaf Mon Sep 17 00:00:00 2001 From: pimouss Date: Wed, 1 Jun 2016 19:16:21 +0200 Subject: [PATCH 1/7] Ajout du monitoring de l'humidite du sol --- controllers/soilMoisture.go | 25 ++++++++ models/soilMoisture/soilMoisture.go | 89 +++++++++++++++++++++++++++++ models/variables/variables.go | 1 + routers/router.go | 1 + 4 files changed, 116 insertions(+) create mode 100644 controllers/soilMoisture.go create mode 100644 models/soilMoisture/soilMoisture.go diff --git a/controllers/soilMoisture.go b/controllers/soilMoisture.go new file mode 100644 index 0000000..48b555d --- /dev/null +++ b/controllers/soilMoisture.go @@ -0,0 +1,25 @@ +package controllers + +import ( + "github.com/astaxie/beego" + + "git.kingpenguin.tk/chteufleur/datahouse.git/models/soilMoisture" +) + +type AddSoilMoistController struct { + beego.Controller +} + +func (c *AddSoilMoistController) Get() { + macArduino := c.GetString(soilMoisture.MacModuleWifiArduino) + pinArduino := c.GetString(soilMoisture.PinArduino) + valeurCapteur, _ := c.GetInt(soilMoisture.ValeurCapteur) + + soilMoisture.AddData(pinArduino, macArduino, int64(valeurCapteur)) + + cpt := soilMoisture.GetCapteurByAdresse(macArduino, pinArduino) + if cpt == nil || cpt.Id == 0 { + soilMoisture.AddCapteur(macArduino, pinArduino) + } + c.Ctx.Output.Body([]byte("")) +} diff --git a/models/soilMoisture/soilMoisture.go b/models/soilMoisture/soilMoisture.go new file mode 100644 index 0000000..e4ae21e --- /dev/null +++ b/models/soilMoisture/soilMoisture.go @@ -0,0 +1,89 @@ +package soilMoisture + +import ( + "github.com/astaxie/beego/logs" + "github.com/astaxie/beego/orm" + + "git.kingpenguin.tk/chteufleur/datahouse.git/models/database" + "git.kingpenguin.tk/chteufleur/datahouse.git/models/utils" + "git.kingpenguin.tk/chteufleur/datahouse.git/models/variables" + + "time" +) + +const ( + MacModuleWifiArduino = "MAC" + PinArduino = "PIN" + ValeurCapteur = "VAL" +) + +var ( + _, timezoneOffset = time.Now().Zone() + log = logs.NewLogger(10000) +) + +func init() { + log.SetLogger(variables.LogType, variables.LogParams) + orm.RegisterModel(new(SoilMoistureTable),new(CapteurSoilMoistureTable)) + orm.DefaultRowsLimit = 4500 +} + +//—————————————————————————————————————————————————————————————————————————————— +// SoilMoistureTable +//—————————————————————————————————————————————————————————————————————————————— + +type SoilMoistureTable struct { + Id int64 + HorodateGMT time.Time `orm:"auto_now;type(datetime)"` + CapteurPin string // Pin Arduino + MacId string // Id Bac à Fleur + ValeurCapteur int64 +} + +func AddData(pinCapteur string, macId string, valeur int64) { + log.Info("Add soilMoisture {BacMac: %s, pinArduino: %s, valeur: %d}", macId, pinCapteur, valeur) + o := orm.NewOrm() + o.Using(database.Alias) + + ti := new(SoilMoistureTable) + ti.CapteurPin = pinCapteur + ti.ValeurCapteur = valeur + ti.MacId = macId + o.Insert(ti) +} + +//—————————————————————————————————————————————————————————————————————————————— +// CapteurSoilMoistureTable +//—————————————————————————————————————————————————————————————————————————————— +type CapteurSoilMoistureTable struct { + Id int64 + MacArduino string + PinArduino string + Description string +} + +func GetCapteurByAdresse(mac string, pin string) *CapteurSoilMoistureTable { + o := orm.NewOrm() + o.Using(database.Alias) + + ret := new(CapteurSoilMoistureTable) + var maps []orm.Params + _, err := o.QueryTable(new(CapteurSoilMoistureTable)).Filter("MacArduino", mac).Filter("PinArduino", pin).Values(&maps) + if err == nil { + for _, m := range maps { + ret.Id = utils.GetInt(m, "Id") + ret.MacArduino = utils.GetString(m, "MacArduino") + ret.PinArduino = utils.GetString(m, "PinArduino") + ret.Description = utils.GetString(m, "Description") + break + } + } + + return ret +} + +func AddCapteur(mac string, pin string) { + o := orm.NewOrm() + o.Using(database.Alias) + _, _ = o.Insert(&CapteurSoilMoistureTable{MacArduino: mac, PinArduino: pin}) +} diff --git a/models/variables/variables.go b/models/variables/variables.go index 08157ea..46588ca 100644 --- a/models/variables/variables.go +++ b/models/variables/variables.go @@ -24,6 +24,7 @@ var ( AddTempRoute = "/add/temp/" + sensorMacRegex + "/:val([0-9]+)" AddRelayRoute = "/add/relay/" + sensorMacRegex TeleinfoAddRoute = "/teleinfo/add" + AddSoilMoistRoute = "/add/soil" /* Route for soil moisture sensors*/ ViewTempRoute = "/view/temp" ViewRelaysRoute = "/view/relay" diff --git a/routers/router.go b/routers/router.go index 6673652..421c170 100644 --- a/routers/router.go +++ b/routers/router.go @@ -12,6 +12,7 @@ func init() { beego.Router(variables.AddTempRoute, &controllers.AddTempController{}) beego.Router(variables.AddRelayRoute, &controllers.AddRelayController{}) beego.Router(variables.TeleinfoAddRoute, &controllers.AddTeleinfoController{}) + beego.Router(variables.AddSoilMoistRoute, &controllers.AddSoilMoistController{}) beego.Router(variables.ViewTempRoute, &controllers.ViewTempController{}) beego.Router(variables.ViewRelaysRoute, &controllers.ViewRelayController{}) From 75b320680f7aec09e1bad0667dc7c66d4928774e Mon Sep 17 00:00:00 2001 From: Chteufleur Date: Fri, 17 Jun 2016 19:34:09 +0200 Subject: [PATCH 2/7] XMPP modification because of lib modification --- xmpp/xmpp.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/xmpp/xmpp.go b/xmpp/xmpp.go index 1473e8c..dcde633 100644 --- a/xmpp/xmpp.go +++ b/xmpp/xmpp.go @@ -5,7 +5,7 @@ import ( "github.com/astaxie/beego" "github.com/astaxie/beego/logs" - "git.kingpenguin.tk/chteufleur/go-xmpp.git" + "git.kingpenguin.tk/chteufleur/go-xmpp.git/src/xmpp" "git.kingpenguin.tk/chteufleur/datahouse.git/models" "git.kingpenguin.tk/chteufleur/datahouse.git/models/relay" "git.kingpenguin.tk/chteufleur/datahouse.git/models/variables" @@ -79,7 +79,7 @@ func mainXMPP() { case *xmpp.Iq: // TODO check if the caller has privilege to ask switch v.PayloadName().Space { - case xmpp.NsDiscoItems: + case xmpp.NSDiscoItems: execDiscoCommand(v) case xmpp.NodeAdHocCommand: @@ -104,7 +104,7 @@ func SendPresence(status, tpye, message string) { func execDiscoCommand(iq *xmpp.Iq) { log.Info("Discovery item iq received") - reply := iq.Response(xmpp.IqTypeResult) + reply := iq.Response(xmpp.IQTypeResult) discoItem := &xmpp.DiscoItems{Node: xmpp.NodeAdHocCommand} relays := relay.GetAllRelay() @@ -133,11 +133,11 @@ func execCommandAdHoc(iq *xmpp.Iq) { if descriptionRelais == "" { descriptionRelais = relais.Mac } - if adHoc.SessionId == "" && adHoc.Action == xmpp.ActionAdHocExecute { + if adHoc.SessionID == "" && adHoc.Action == xmpp.ActionAdHocExecute { // First step in the command if relais.Id != 0 { - reply := iq.Response(xmpp.IqTypeResult) - cmd := &xmpp.AdHocCommand{Node: adHoc.Node, Status: xmpp.StatusAdHocExecute, SessionId: xmpp.SessionId()/*+";"+relais.Mac*/} + reply := iq.Response(xmpp.IQTypeResult) + cmd := &xmpp.AdHocCommand{Node: adHoc.Node, Status: xmpp.StatusAdHocExecute, SessionID: xmpp.SessionID()/*+";"+relais.Mac*/} cmdXForm := &xmpp.AdHocXForm{Type: xmpp.TypeAdHocForm, Title: "Commande relais "+descriptionRelais} field := &xmpp.AdHocField{Var: "command", Label: "Commande a executer", Type: "list-single"} @@ -156,8 +156,8 @@ func execCommandAdHoc(iq *xmpp.Iq) { err := relais.Toggle() - reply := iq.Response(xmpp.IqTypeResult) - cmd := &xmpp.AdHocCommand{Node: adHoc.Node, Status: xmpp.StatusAdHocCompleted, SessionId: adHoc.SessionId} + reply := iq.Response(xmpp.IQTypeResult) + cmd := &xmpp.AdHocCommand{Node: adHoc.Node, Status: xmpp.StatusAdHocCompleted, SessionID: adHoc.SessionID} cmdXForm := &xmpp.AdHocXForm{Type: xmpp.TypeAdHocResult, Title: "Commande relais "+descriptionRelais} cmd.XForm = *cmdXForm @@ -174,8 +174,8 @@ func execCommandAdHoc(iq *xmpp.Iq) { client.Out <- reply } else if adHoc.Action == xmpp.ActionAdHocCancel { // command canceled - reply := iq.Response(xmpp.IqTypeResult) - cmd := &xmpp.AdHocCommand{Node: adHoc.Node, Status: xmpp.StatusAdHocCanceled, SessionId: adHoc.SessionId} + reply := iq.Response(xmpp.IQTypeResult) + cmd := &xmpp.AdHocCommand{Node: adHoc.Node, Status: xmpp.StatusAdHocCanceled, SessionID: adHoc.SessionID} reply.PayloadEncode(cmd) client.Out <- reply } From 784ebdee22245d5b302e7e296fd4040e9dc9889f Mon Sep 17 00:00:00 2001 From: Chteufleur Date: Fri, 17 Jun 2016 19:35:02 +0200 Subject: [PATCH 3/7] Delete teleinfo data when deleting a teleinfo sensor --- controllers/sensors.go | 1 + 1 file changed, 1 insertion(+) diff --git a/controllers/sensors.go b/controllers/sensors.go index 19bd2c8..1fc0925 100644 --- a/controllers/sensors.go +++ b/controllers/sensors.go @@ -103,6 +103,7 @@ func (c *SensorsController) PostCompteur() { } else if isDelete != "" { cpt := teleinfo.GetCompteurByAdresse(adresse) teleinfo.DeleteCompteur(cpt.Id) + teleinfo.DeleteDataCompteur(cpt.AdresseCompteur) c.Redirect("/sensors", 302) } else { c.Redirect("/404", 404) From 3147a064dba8fcd8a12bbee915e6ced6dc7910d2 Mon Sep 17 00:00:00 2001 From: Chteufleur Date: Fri, 17 Jun 2016 19:36:26 +0200 Subject: [PATCH 4/7] Send info if their is a modification --- sensors/TeleInfo/TeleInfo.ino | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sensors/TeleInfo/TeleInfo.ino b/sensors/TeleInfo/TeleInfo.ino index c498f4e..804e86b 100644 --- a/sensors/TeleInfo/TeleInfo.ino +++ b/sensors/TeleInfo/TeleInfo.ino @@ -31,6 +31,7 @@ String OPTARIF = ""; String BASE = ""; String HCHP = ""; String HCHC = ""; +bool sendData = false; //---------------------------------------------------- // Wait for x second. @@ -82,6 +83,7 @@ void sendDataToServer() { nextInterval = DEFAULT_INTERVAL; } nextInterval = millis() + nextInterval; + sendData = false; } bool isDigitSelf(char c) { @@ -188,12 +190,15 @@ void loop() { } if (label == "HCHC" && isNumberSelf(value)) { HCHC = value; + sendData = true; } if (label == "HCHP" && isNumberSelf(value)) { HCHP = value; + sendData = true; } - if (millis() >= nextInterval) { +// if (millis() >= nextInterval) { + if (sendData && millis() >= nextInterval) { sendDataToServer(); } } From c221349a9ce6d551a1578ba807b25b0a4a296fbc Mon Sep 17 00:00:00 2001 From: chteufleur Date: Wed, 22 Jun 2016 19:44:10 +0200 Subject: [PATCH 5/7] Add XMPP auth --- controllers/login.go | 43 ++++++++++++++++++++++++++++++++++++++++--- main.go | 2 +- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/controllers/login.go b/controllers/login.go index 26d426b..cfef350 100644 --- a/controllers/login.go +++ b/controllers/login.go @@ -2,15 +2,32 @@ package controllers import ( "github.com/astaxie/beego" + "github.com/astaxie/beego/logs" "git.kingpenguin.tk/chteufleur/datahouse.git/models/user" "git.kingpenguin.tk/chteufleur/datahouse.git/models/variables" + + "net/http" + "strings" ) type LoginController struct { beego.Controller } +const ( + UrlXmppAuth = "http://auth.xmpp.kingpenguin.tk/auth" +) + +var ( + log = logs.NewLogger(10000) +) + +func init() { + log.SetLogger(variables.LogType, variables.LogParams) +} + + func (c *LoginController) Prepare() { } @@ -59,7 +76,27 @@ func (c *LoginController) Post() { } func isLoginOK(lgn, pwd string) bool { - ret := pwd != "" // Do not authorize empty password - usr := user.GetUserByLogin(lgn) - return ret && pwd == usr.Password + ret := false + if len(strings.Split(lgn, "@")) != 1 { + // JID inside + log.Info("Auth by JID") + usr := user.GetUserByLogin(strings.Split(lgn, "/")[0]) + if usr.Id == 0 { + // User is not in database + ret = false + } else { + resp, _ := http.Get(UrlXmppAuth+"?domain=datahouse.kingpenguin.tk&method=POST&jid="+lgn+"&transaction_id="+pwd) + httpStatusCode := resp.StatusCode + if resp != nil && httpStatusCode == 200 { + ret = true + } else { + ret = false + } + } + } else { + log.Info("Standard auth") + usr := user.GetUserByLogin(lgn) + ret = pwd != "" && pwd == usr.Password + } + return ret } diff --git a/main.go b/main.go index 3328c50..a3ca752 100644 --- a/main.go +++ b/main.go @@ -64,7 +64,7 @@ func main() { go reborn() time.Sleep(1 * time.Second) - models.ChanRuns <- xmpp_manager.EndRun +// models.ChanRuns <- xmpp_manager.EndRun time.Sleep(1 * time.Second) models.ChanRuns <- watchlog.EndRun From f53cae8980010ff2729cdc0903cb2ddbb9342aa2 Mon Sep 17 00:00:00 2001 From: chteufleur Date: Wed, 22 Jun 2016 19:47:46 +0200 Subject: [PATCH 6/7] Fix non compiling --- controllers/login.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/controllers/login.go b/controllers/login.go index cfef350..b349000 100644 --- a/controllers/login.go +++ b/controllers/login.go @@ -2,7 +2,6 @@ package controllers import ( "github.com/astaxie/beego" - "github.com/astaxie/beego/logs" "git.kingpenguin.tk/chteufleur/datahouse.git/models/user" "git.kingpenguin.tk/chteufleur/datahouse.git/models/variables" @@ -19,14 +18,6 @@ const ( UrlXmppAuth = "http://auth.xmpp.kingpenguin.tk/auth" ) -var ( - log = logs.NewLogger(10000) -) - -func init() { - log.SetLogger(variables.LogType, variables.LogParams) -} - func (c *LoginController) Prepare() { } From 9d55cf57592e90d247f5c3f95df60ee950c142d6 Mon Sep 17 00:00:00 2001 From: chteufleur Date: Fri, 15 Jul 2016 09:12:36 +0200 Subject: [PATCH 7/7] Fix xmpp link into readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fbd7d50..209bd4b 100644 --- a/README.md +++ b/README.md @@ -30,4 +30,4 @@ Sensors code and schemas can be found in the sensors file. It requires Arduino I More information on [ESP8266 Github](https://github.com/esp8266/Arduino). ## Help -To get any help, please visit the XMPP conference room at ``datahouse@muc.kingpenguin.tk`` with your prefered client, or [with your browser](https://jappix.kingpenguin.tk/?r=datahouse@muc.kingpenguin.tk). +To get any help, please visit the XMPP conference room at [datahouse@muc.kingpenguin.tk](xmpp://datahouse@muc.kingpenguin.tk?join) with your prefered client, or [with your browser](https://jappix.kingpenguin.tk/?r=datahouse@muc.kingpenguin.tk).