diff --git a/enervent-ctrl-go/coils.csv b/enervent-ctrl-go/coils.csv new file mode 100644 index 0000000..131794e --- /dev/null +++ b/enervent-ctrl-go/coils.csv @@ -0,0 +1,72 @@ +0,COIL_STOP,Stop the machine +1,COIL_AWAY,Set the machine to away mode +2,COIL_AWAYL,Set the machine to away long mode +3,-,- +4,-,- +5,-,- +6,COIL_MAX_H,Force the machine to heat at maximum effect. +7,COIL_MAX_C,Force the machine to cool at maximum effect. +8,COIL_CO2_BOOST_EN,CO2 boosting enabled +9,COIL_RH_BOOST_EN,Relative humidity boosting enabled +10,COIL_M_BOOST,Boost the fanspeeds to 100% for a period of time +11,COIL_TEMP_BOOST_EN,Temperature boosting enabled +12,COIL_SNC,Summer night cooling (SNC) function enabled. +13,-,- +14,-,- +15,-,- +16,-,- +17,-,- +18,COIL_AWAY_H,Heating enabled/disabled in AWAY mode +19,COIL_AWAY_C,Cooling enabled/disabled in AWAY mode +20,-,- +21,-,- +22,-,- +23,-,- +24,-,- +25,-,- +26,-,- +27,-,- +28,-,- +29,-,- +30,COIL_LTO_ON,Heat recycler state (running=1, stopped = 0) +31,-,- +32,COIL_HEAT_ON,After heater element state (On = 1, Off = 0) +33,-,- +34,-,- +35,-,- +36,COIL_TEMP_DECREASE,Temperature decrease function desc +37,COIL_OVERTIME,Programmatic equivalent of OVERTIME digital input. +38,-,Emergency stop switch type desc +39,-,- +40,COIL_ECO_MODE,Eco mode desc +41,COIL_ALARM_A,Alarm of class A active desc +42,COIL_ALARM_B,Alarm of class B active desc +43,COIL_CLK_PROG,A Clock program is currently active +44,-,- +45,-,- +46,-,- +47,COIL_SILENT_MODE,Silent mode desc +48,COIL_STOP_SLP_COOLING,Electrical heater cool-off function enabled when the machine has stopped. +49,COIL_SERVICE_EN,Service reminder enabled desc +50,-,- +51,-,- +52,COIL_COOLING_EN,Cooling function enabled +53,COIL_LTO_EN,Not used on MD. +54,COIL_HEATING_EN,Heating function enabled +55,COIL_LTO_DEFROST_EN,HRC defrosting function enabled during winter season +56,-,- +57,-,- +58,-,- +59,-,- +60,-,- +61,-,- +62,-,- +63,-,- +64,-,- +65,-,- +66,-,- +67,-,- +68,-,- +69,-,- +70,-,- +71,-,- diff --git a/enervent-ctrl-go/go.mod b/enervent-ctrl-go/go.mod new file mode 100644 index 0000000..f1eebbc --- /dev/null +++ b/enervent-ctrl-go/go.mod @@ -0,0 +1,3 @@ +module github.com/0ranki/enervent-ctrl/enervent-ctrl-go + +go 1.18 diff --git a/enervent-ctrl-go/main.go b/enervent-ctrl-go/main.go new file mode 100644 index 0000000..60b1ce9 --- /dev/null +++ b/enervent-ctrl-go/main.go @@ -0,0 +1,11 @@ +package main + +import ( + "github.com/0ranki/enervent-ctrl/enervent-ctrl-go/pingvinKL" +) + +func main() { + pingvin := pingvinKL.New() + // fmt.Println(pingvin.Coils) + print(pingvin.Coils[1].Description) +} diff --git a/enervent-ctrl-go/pingvinKL/pingvinKL.go b/enervent-ctrl-go/pingvinKL/pingvinKL.go new file mode 100644 index 0000000..9e72e2c --- /dev/null +++ b/enervent-ctrl-go/pingvinKL/pingvinKL.go @@ -0,0 +1,135 @@ +package pingvinKL + +import ( + "bufio" + "log" + "os" + "strings" +) + +// single coil data +type pingvinCoil struct { + Symbol string + Value bool + Description string + Reserved bool +} + +func newCoil(symbol string, description string) pingvinCoil { + reserved := symbol == "-" && description == "-" + coil := pingvinCoil{symbol, false, description, reserved} + return coil +} + +// unit modbus data +type PingvinKL struct { + Coils []pingvinCoil +} + +// read a CSV file containing data for coils or registers +func readCsvLines(file string) [][]string { + delim := "," + data := [][]string{} + csv, err := os.Open(file) + if err != nil { + log.Fatal(err) + } + defer csv.Close() + scanner := bufio.NewScanner(csv) + for scanner.Scan() { + elements := strings.Split(scanner.Text(), delim) + data = append(data, elements) + } + if err := scanner.Err(); err != nil { + log.Fatal(err) + } + return data +} + +// create a PingvinKL struct, read coils and registers from CSVs +func New() PingvinKL { + pingvin := PingvinKL{} + coilData := readCsvLines("coils.csv") + for i := 0; i < len(coilData); i++ { + pingvin.Coils = append(pingvin.Coils, newCoil(coilData[i][1], coilData[i][2])) + } + return pingvin +} + +// func New() PingvinKL { +// pingvin := PingvinKL{} +// // var Coils []pingvinCoil +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_STOP", "Stop")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_AWAY", "Away mode")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_AWAY_L", "Away Long mode")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_MAX_H", "Max Heating")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_MAX_C", "Max Cooling")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_CO_BOOST_EN", "CO2 boost")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_RH_BOOST_EN", "Relative humidity boost")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_M_BOOST", "Manual boost 100%")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_TEMP_BOOST_EN", "Temperature boost")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_SNC", "Summer night cooling")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_AWAY_H", "Heating enabled/disabled in AWAY mode")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_AWAY_C", "Cooling enabled/disabled in AWAY mode")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_LTO_ON", "Heat recycler state (running=1, stopped = 0)")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_HEAT_ON", "After heater element state (On = 1, Off = 0)")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_TEMP_DECREASE", "Temperature decrease function")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_OVERTIME", "Programmatic equivalent of OVERTIME digital input")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_ECO_MODE", "Eco mode")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_ALARM_A", "Alarm of class A active")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_ALARM_B", "Alarm of class B active")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_CLK_PROG", "Clock program is currently active")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_SILENT_MODE", "Silent mode")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_STOP_SLP_COOLING", "Electrical heater cool-off function enabled when the machine has stopped")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_SERVICE_EN", "Service reminder")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_COOLING_EN", "Active cooling function enabled")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_LTO_EN", "N/A")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_HEATING_EN", "Active heating function enabled")) +// pingvin.Coils = append(pingvin.Coils, newCoil("COIL_LTO_DEFROST_EN", "HRC defrosting function enabled during winter season")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// pingvin.Coils = append(pingvin.Coils, newCoil("-", "-")) +// return pingvin +// }