Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 4.56 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "encoding/json"
  5.     "fmt"
  6.     "log"
  7.     "net/http"
  8.     "net/url"
  9.     "strings"
  10.     "time"
  11.  
  12.     client "github.com/influxdata/influxdb1-client/v2"
  13. )
  14.  
  15. const (
  16.     database = "test"
  17.     username = "admin"
  18.     password = "wombats"
  19. )
  20.  
  21. var clusters = []string{"public", "private"}
  22.  
  23. type AlphaSession struct {
  24.     sessionID *http.Cookie
  25.     gAuth     *http.Cookie
  26.     Expiry    *http.Cookie
  27. }
  28.  
  29. type RTStats struct {
  30.     Status bool       `json:"IsSucceed"`
  31.     Data   RTStatData `json:"data"`
  32. }
  33.  
  34. type RTStatData struct {
  35.     Id            string  `json:"Id"`
  36.     StateOfCharge float32 `json:"Soc"`
  37.     BatteryDraw   float32 `json:"Pbat"`
  38.     LoadDraw      float32 `json:"Sva"`
  39.     GridDraw      float32 `json:"Ppv1"`
  40.     PanelDraw     float32 `json:"PmeterL1"`
  41. }
  42.  
  43. func main() {
  44.     c := influxDBClient()
  45.  
  46.     stats := new(RTStats)
  47.     s := new(AlphaSession)
  48.  
  49.     go s.apiPoller(c, stats)
  50.  
  51.     http.HandleFunc("/", handler)
  52.     http.ListenAndServe(":8080", nil)
  53.  
  54. }
  55.  
  56. func influxDBClient() client.Client {
  57.     c, err := client.NewHTTPClient(client.HTTPConfig{
  58.         Addr:     "http://149.28.176.130:8086",
  59.         Username: username,
  60.         Password: password,
  61.     })
  62.     if err != nil {
  63.         log.Fatalln("Error: ", err)
  64.     }
  65.     return c
  66. }
  67.  
  68. func (s *AlphaSession) getAuthToken() error {
  69.     client := &http.Client{
  70.         CheckRedirect: func(req *http.Request, via []*http.Request) error {
  71.             return http.ErrUseLastResponse
  72.         }}
  73.  
  74.     form := url.Values{"Username": {"garry_turner@me.com"}, "Userpwd": {""}}
  75.     req, err := http.NewRequest("POST", "http://www.alphaess.com", strings.NewReader(form.Encode()))
  76.     if err != nil {
  77.         return err
  78.     }
  79.     req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  80.  
  81.     resp, err := client.Do(req)
  82.     defer resp.Body.Close()
  83.  
  84.     // //debugging
  85.     // //fmt.Println(resp.Body)
  86.     // bodyBytes, _ := ioutil.ReadAll(resp.Body)
  87.     // bodyString := string(bodyBytes)
  88.     // fmt.Println(bodyString)
  89.  
  90.     for _, cookie := range resp.Cookies() {
  91.         switch cookie.Name {
  92.         case "alphacloudsessionid":
  93.             s.sessionID = cookie
  94.             fmt.Println(cookie.String())
  95.         case "alphacloudgauth":
  96.             s.gAuth = cookie
  97.             fmt.Println(cookie.String())
  98.         case "CURRENT_LANGUAGE_SESSION_KEY":
  99.             s.Expiry = cookie
  100.             fmt.Println(cookie.String())
  101.         }
  102.     }
  103.  
  104.     return err
  105. }
  106.  
  107. func (s *AlphaSession) getRTStats(target interface{}) error {
  108.  
  109.     log.Println("Calling RT stats API")
  110.  
  111.     client := &http.Client{}
  112.     form := url.Values{"SN": {"AL4001019010306"}, "amplifyGain": {"1"}}
  113.     req, err := http.NewRequest("POST", "https://www.alphaess.com/Monitoring/VtColdata/GetSecondDataBySn", strings.NewReader(form.Encode()))
  114.     if err != nil {
  115.         return err
  116.     }
  117.     req.PostForm = form
  118.  
  119.     asp := new(http.Cookie)
  120.     asp.Raw = "ASP.NET_SessionId=; path=/; domain=.www.alphaess.com;"
  121.  
  122.     req.AddCookie(s.gAuth)
  123.     req.AddCookie(s.sessionID)
  124.     req.AddCookie(asp)
  125.     req.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
  126.     req.Header.Add("X-Requested-With", "XMLHttpRequest")
  127.  
  128.     resp, err := client.Do(req)
  129.     defer resp.Body.Close()
  130.     //debugging
  131.  
  132.     // bodyBytes, _ := ioutil.ReadAll(resp.Body)
  133.     // bodyString := string(bodyBytes)
  134.     // fmt.Println(bodyString)
  135.     // fmt.Println()
  136.  
  137.     return json.NewDecoder(resp.Body).Decode(target)
  138.  
  139. }
  140.  
  141. func (s *AlphaSession) checkSession() (status bool) {
  142.     t := time.Now()
  143.     if s.Expiry == nil {
  144.         return true
  145.     }
  146.     return s.Expiry.Expires.Before(t)
  147. }
  148.  
  149. func (s *AlphaSession) apiPoller(client client.Client, stats *RTStats) error {
  150.     for {
  151.         time.Sleep(2 * time.Second)
  152.         if s.checkSession() {
  153.             log.Println("Session not valid, creating new session")
  154.             s.getAuthToken()
  155.         }
  156.         go s.getRTStats(stats)
  157.         go createMetrics(client, stats)
  158.         fmt.Printf("Battery power draw: %f watts\n", stats.Data.BatteryDraw)
  159.  
  160.     }
  161. }
  162.  
  163. func handler(w http.ResponseWriter, r *http.Request) {
  164.     fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
  165. }
  166.  
  167. func createMetrics(c client.Client, s *RTStats) {
  168.     bp, err := client.NewBatchPoints(client.BatchPointsConfig{
  169.         Database:  database,
  170.         Precision: "s",
  171.     })
  172.  
  173.     if err != nil {
  174.         log.Fatalln("Error: ", err)
  175.     }
  176.  
  177.     eventTime := time.Now().Add(time.Second * -20)
  178.  
  179.     tags := map[string]string{}
  180.  
  181.     fields := map[string]interface{}{
  182.         "StateOfCharge": s.Data.StateOfCharge,
  183.         "BatteryDraw":   s.Data.BatteryDraw,
  184.         "LoadDraw":      s.Data.LoadDraw,
  185.         "GridDraw":      s.Data.GridDraw,
  186.         "PanelDraw":     s.Data.PanelDraw,
  187.     }
  188.  
  189.     point, err := client.NewPoint(
  190.         "batt_stat",
  191.         tags,
  192.         fields,
  193.         eventTime.Add(time.Second*10),
  194.     )
  195.     if err != nil {
  196.         log.Fatalln("Error: ", err)
  197.     }
  198.  
  199.     bp.AddPoint(point)
  200.  
  201.     err = c.Write(bp)
  202.     if err != nil {
  203.         log.Fatal(err)
  204.     }
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement