Compare commits

...

4 Commits

Author SHA1 Message Date
Paolo Asperti d32cdb11f2
ups fixes 2021-10-01 17:45:37 +02:00
Paolo Asperti 5c8960d8d2
mqtt status 2021-10-01 16:56:50 +02:00
Paolo Asperti d37b7d08e7
docs 2021-10-01 16:50:05 +02:00
Paolo Asperti 9c37677a99
don't wait for mqtt init 2021-10-01 15:01:41 +02:00
7 changed files with 51 additions and 11 deletions

View File

@ -3,3 +3,12 @@
OpenPDU is an OpenHardware and OpenSource project for a network-connected PDU.
We want to build the best firmware possible for a smart PDU, giving you the possibility to customize your own. You can build a custom PDU or retrofit an existing one. You can control as many outlet as you want, and manage a shared UPS.
## development tips
### start a local mqtt container
```bash
docker run --rm -d --name mqtt -p 1883:1883 docker.asperti.com/paspo/mqtt
docker logs -f mqtt
```

View File

@ -17,7 +17,7 @@ func main() {
CreateBoards()
CreateOutlets()
InitBoards()
MQTTSetup()
go MQTTSetup()
go MQTTRefreshLoop()
go ups.UpsConnect()
go displayLoop()

View File

@ -10,9 +10,11 @@ import (
var upsClient nut.Client
var ups nut.UPS
var Vars map[string]nut.Variable
var Connected bool
var defaults = map[string]interface{}{
"Ups.Host": "localhost",
"Ups.Port": 3493, // not yet implemented in github.com/robbiet480/go.nut, see this PR https://github.com/robbiet480/go.nut/pull/5
"Ups.Name": "ups",
"Ups.Username": "",
"Ups.Password": "",
@ -22,6 +24,7 @@ func init() {
for k, v := range defaults {
viper.SetDefault(k, v)
}
Connected = false
events.AddListener("config_changed", Reconfigure)
}
@ -30,7 +33,7 @@ func UpsConnect() {
var connectErr, authenticationError error
var u nut.UPS
upsClient, connectErr = nut.Connect(viper.GetString("Ups.Host"))
upsClient, connectErr = nut.Connect(viper.GetString("Ups.Host"), viper.GetInt("Ups.Port"))
if connectErr != nil {
syslog.Err(connectErr.Error())
return
@ -58,6 +61,7 @@ func UpsConnect() {
for _, u = range upsList {
if u.Name == viper.GetString("Ups.Name") {
ups = u
Connected = true
syslog.Notice("UPS connected")
events.FireEvent("ups_connected")
UpsReadVars()
@ -77,5 +81,10 @@ func Reconfigure() {
upsClient = nut.Client{}
syslog.Notice("UPS disconnected")
events.FireEvent("ups_disconnected")
Connected = false
for key, _ := range Vars {
delete(Vars, key)
}
// Vars = make(map[string]nut.Variable)
go UpsConnect()
}

View File

@ -3,6 +3,7 @@ package webui
import (
"strings"
"git.openpdu.org/OpenPDU/openpdu/mqtt"
"github.com/spf13/viper"
"gopkg.in/macaron.v1"
)
@ -25,6 +26,12 @@ func mqttPage(ctx *macaron.Context) {
ctx.Data["password"] = viper.GetString("Mqtt.Password")
ctx.Data["homeassistant"] = viper.GetString("Mqtt.homeassistant")
if mqtt.Connected() {
ctx.Data["mqttstatus"] = "Connected"
} else {
ctx.Data["mqttstatus"] = "Disconnected"
}
ctx.Data["schemas"] = []string{"tcp", "ssl", "ws"}
ctx.HTML(200, "mqtt")
}

View File

@ -10,15 +10,17 @@ import (
func upsPage(ctx *macaron.Context) {
ctx.Data["host"] = viper.GetString("Ups.Host")
ctx.Data["port"] = viper.GetInt("Ups.Port")
ctx.Data["upsname"] = viper.GetString("Ups.Name")
ctx.Data["username"] = viper.GetString("Ups.Username")
ctx.Data["password"] = viper.GetString("Ups.Password")
// if ups == nil {
// ctx.Data["serverstatus"] = "Disconnected"
// ctx.Data["upsstatus"] = "unknown"
// } else {
ctx.Data["serverstatus"] = "Connected"
if ups.Connected {
ctx.Data["serverstatus"] = "Connected"
} else {
ctx.Data["serverstatus"] = "Disconnected"
}
ctx.Data["upsstatus"] = ups.Vars["ups.status"].Value
ctx.Data["upsmfr"] = ups.Vars["device.mfr"].Value
ctx.Data["upsmodel"] = ups.Vars["device.model"].Value
@ -26,13 +28,12 @@ func upsPage(ctx *macaron.Context) {
ctx.Data["upsload"] = ups.Vars["ups.load"].Value
ctx.Data["upscharge"] = ups.Vars["battery.charge"].Value
// }
ctx.HTML(200, "ups")
}
type UPSPostForm struct {
Host string `form:"host" binding:"Required"`
Port int `form:"port" binding:"Required"`
UpsName string `form:"upsname" binding:"Required"`
Username string `form:"username" binding:"Required"`
Password string `form:"password" binding:"Required"`
@ -40,12 +41,11 @@ type UPSPostForm struct {
func upsPost(ctx *macaron.Context, f UPSPostForm) {
viper.Set("Ups.Host", strings.ToLower(strings.TrimSpace(f.Host)))
viper.Set("Ups.Port", f.Port)
viper.Set("Ups.Name", strings.TrimSpace(f.UpsName))
viper.Set("Ups.Username", strings.TrimSpace(f.Username))
viper.Set("Ups.Password", f.Password)
viper.WriteConfig()
ups.Reconfigure()
upsPage(ctx)
}

View File

@ -29,6 +29,13 @@
<form class="form-horizontal" method="post">
<div class="box-body">
<div class="form-group">
<label for="mqttstatus" class="col-sm-2 control-label">Status</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="mqttstatus" disabled="" value="{{ mqttstatus }}">
</div>
</div>
<div class="form-group">
<label for="schema" class="col-sm-2 control-label">Schema</label>
<div class="col-sm-10">

View File

@ -88,6 +88,14 @@
</div>
</div>
<div class="form-group">
<label for="port" class="col-sm-2 control-label">Port</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="port" name="port" placeholder="NUT port, default 3493"
value="{{ port }}">
</div>
</div>
<div class="form-group">
<label for="upsname" class="col-sm-2 control-label">UPS Name</label>
<div class="col-sm-10">