Skip to content
Snippets Groups Projects
Commit 573335db authored by Odin Aas's avatar Odin Aas :cry:
Browse files

Merge branch 'overview' into 'dev-branch'

Overview

See merge request !58
parents 6a68bedc ec685b4e
No related branches found
No related tags found
2 merge requests!59Dev branch,!58Overview
Pipeline #26041 passed
......@@ -52,13 +52,14 @@ func OverviewHandler(w http.ResponseWriter, r *http.Request) {
}
overviewData, err = sortData(overviewData, interval, since, start)
datasets := setIntoDatasets(overviewData)
if err != nil {
log.Println(err.Error())
w.WriteHeader(http.StatusInternalServerError)
return
}
// Encode and write JSON response
err = json.NewEncoder(w).Encode(overviewData)
err = json.NewEncoder(w).Encode(datasets)
if err != nil {
// Log the error or handle it appropriately
log.Printf("Error encoding JSON: %v", err)
......@@ -192,3 +193,118 @@ func partion(arr []other.SensorData, low int, high int) int {
arr[i+1], arr[high] = arr[high], arr[i+1]
return i + 1
}
// function to transform machinedetails struct into data for frontend
func setIntoDatasets(Machines []other.MachineDetails) other.OverviewData {
oData := other.OverviewData{}
doneOnce := false
for _, machine := range Machines {
dataset := createDataset(machine)
if !containsBuilding(machine.Building.Name, oData.Buildings) {
oData.Buildings = append(oData.Buildings, other.OBuilding{Name: machine.Building.Name})
}
for idx, building := range oData.Buildings {
if machine.Building.Name == building.Name {
if !containsDepartment(machine.Department.Name, building.Departments) {
if machine.Department.Name == "" {
oData.Buildings[idx].Departments = append(building.Departments, other.ODepartment{Name: "No department"})
} else {
oData.Buildings[idx].Departments = append(building.Departments, other.ODepartment{Name: machine.Department.Name})
}
}
}
}
for idx, building := range oData.Buildings {
for dIdx, department := range building.Departments {
if department.Name == machine.Department.Name || (department.Name == "No department" && machine.Department.Name == "") {
oData.Buildings[idx].Departments[dIdx].Machines = append(department.Machines, other.OMachine{Name: machine.Machine.Name, EUI: machine.Machine.EUI, Dataset: dataset})
if !doneOnce {
var timeList []time.Time
for _, data := range machine.SensorDataList {
timeList = append(timeList, data.DateTime)
}
oData.Labels = timeList
doneOnce = true
}
}
}
}
}
for bIdx, building := range oData.Buildings {
buildingDataset := other.Dataset{Label: building.Name}
var allDepartments []other.Dataset
for dIdx, department := range building.Departments {
var allMachines []other.Dataset
for _, machine := range department.Machines {
allMachines = append(allMachines, machine.Dataset)
}
oData.Buildings[bIdx].Departments[dIdx].Dataset = avgDatasets(allMachines)
oData.Buildings[bIdx].Departments[dIdx].Dataset.Label = department.Name
allDepartments = append(allDepartments, oData.Buildings[bIdx].Departments[dIdx].Dataset)
}
buildingDataset = avgDatasets(allDepartments)
buildingDataset.Label = building.Name
oData.Buildings[bIdx].Dataset = buildingDataset
}
return oData
}
// turns a "MachineDetails" into a dataset
func createDataset(details other.MachineDetails) other.Dataset {
dataset := other.Dataset{Label: details.Machine.Name}
for _, data := range details.SensorDataList {
dataset.Data = append(dataset.Data, data.AVGCurrent*220)
}
return dataset
}
// averages a list of datasets
func avgDatasets(datasets []other.Dataset) other.Dataset {
retDataset := other.Dataset{}
total := 0
for _, dataset := range datasets {
for idx, data := range dataset.Data {
if len(retDataset.Data) < idx+1 {
retDataset.Data = append(retDataset.Data, data)
} else {
retDataset.Data[idx] += data
}
}
total++
}
for _, data := range retDataset.Data {
data = data / float64(total)
}
return retDataset
}
func containsBuilding(name string, buildings []other.OBuilding) bool {
for _, building := range buildings {
if building.Name == name {
return true
}
}
return false
}
func containsDepartment(name string, departments []other.ODepartment) bool {
for _, building := range departments {
if building.Name == name {
return true
}
}
return false
}
func containsProcess(name string, processes []other.OProcess) bool {
for _, building := range processes {
if building.Name == name {
return true
}
}
return false
}
......@@ -151,3 +151,39 @@ type Gateway struct {
Name *string `json:"name"`
CompanyID int `json:"comp_id"`
}
// structure of dataset on frontend
type Dataset struct {
Label string `json:"label"`
Data []float64 `json:"data"`
}
type OverviewData struct {
Buildings []OBuilding `json:"buildings"`
Processes []OProcess `json:"processes"`
Labels []time.Time `json:"labels"`
}
type OBuilding struct {
Name string `json:"name"`
Departments []ODepartment `json:"departments"`
Dataset Dataset `json:"dataset"`
}
type ODepartment struct {
Name string `json:"name"`
Machines []OMachine `json:"machines"`
Dataset Dataset `json:"dataset"`
}
type OMachine struct {
Name string `json:"name"`
EUI string `json:"eui"`
Dataset Dataset `json:"dataset"`
}
type OProcess struct {
Name string `json:"name"`
Machines []OMachine `json:"machines"`
Dataset Dataset `json:"dataset"`
}
......@@ -98,3 +98,15 @@ main{
padding: 20px;
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
}
/* Chrome, Safari, Edge, Opera */
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
/* Firefox */
input[type=number] {
-moz-appearance: textfield;
}
\ No newline at end of file
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment