Compare commits
2 commits
74a8db7d2b
...
5dacfd0dfe
Author | SHA1 | Date | |
---|---|---|---|
Bendodroid | 5dacfd0dfe | ||
Bendodroid | 68d0ec05db |
51
README.md
51
README.md
|
@ -3,7 +3,7 @@
|
|||
`spaceapid` serves a [SpaceAPI](https://spaceapi.io)-compatible JSON on port 8080:
|
||||
|
||||
```shell
|
||||
$ curl http://[::1]:8080 | jq
|
||||
$ curl http://localhost:8080 | jq
|
||||
{
|
||||
"api_compatibility": [
|
||||
"14"
|
||||
|
@ -28,26 +28,6 @@ The config consists of three parts:
|
|||
|
||||
See [Running](#Running) for details.
|
||||
|
||||
## Updating values
|
||||
|
||||
The state of the boolean `state->open` property can be modified via `/state/open`:
|
||||
|
||||
```shell
|
||||
curl -X PUT -u user:password -d true http://[::1]:8080/state/open
|
||||
```
|
||||
|
||||
The same is true for the endpoints for sensors configured under `"dynamic"`.
|
||||
Currently only the sensors with the `value/unit/location/name/description` schema are implemented.
|
||||
At the time of writing this includes `temperature`, `barometer`, `humidity`, `beverage_supply`, `power_consumption`, and `account_balance`.
|
||||
Out-of-spec sensors may be used as well, as long as they share the same schema.
|
||||
|
||||
```shell
|
||||
curl -X PUT -u user:password -d 23.42 http://[::1]:8080/sensors/{temperature,humidity,...}[/location[/name]]
|
||||
```
|
||||
|
||||
As can be seen in the example, the http urls are generated from sensor type and optionally `location` and `name`.
|
||||
Depending on sensor type, `location` might be required for your sensors, see the schema for details.
|
||||
|
||||
## Building
|
||||
|
||||
See the `go.mod` file for minimum required Go version.
|
||||
|
@ -62,3 +42,32 @@ env CONFIG_PATH=config-template.json go run .
|
|||
# OR
|
||||
go run . -c config-credentials.json,config-dynamic.json,config-response.json
|
||||
```
|
||||
|
||||
## Updating values
|
||||
|
||||
The state of the boolean `state->open` and `state->message` property can be modified via `/state/{open,message}`:
|
||||
|
||||
```shell
|
||||
curl -X PUT -u user:password -d true http://localhost:8080/state/open
|
||||
curl -X PUT -u user:password -d "Nur mit Passierschein A38 :3" http://localhost:8080/state/message
|
||||
```
|
||||
|
||||
As `state->message` is optional, its value can be deleted by using the `PUT` method with an empty payload, or by using `DELETE`:
|
||||
|
||||
```shell
|
||||
curl -X PUT -u user:password -d "" http://localhost:8080/state/message
|
||||
# OR
|
||||
curl -X DELETE -u user:password http://localhost:8080/state/message
|
||||
```
|
||||
|
||||
The same updating procedure applies for the endpoints for sensors configured under `"dynamic"`.
|
||||
Currently only the sensors with the `value/unit/location/name/description` schema are implemented.
|
||||
At the time of writing this includes `temperature`, `barometer`, `humidity`, `beverage_supply`, `power_consumption`, and `account_balance`.
|
||||
Out-of-spec sensors may be used as well, as long as they share the same schema.
|
||||
|
||||
```shell
|
||||
curl -X PUT -u user:password -d 23.42 http://localhost:8080/sensors/{temperature,humidity,...}[/location[/name]]
|
||||
```
|
||||
|
||||
As can be seen in the example, the http urls are generated from sensor type and optionally `location` and `name`.
|
||||
Depending on sensor type, `location` might be required for your sensors, see the schema for details.
|
||||
|
|
|
@ -34,3 +34,37 @@ func StateOpen(
|
|||
resp.LastChange = time.Now().Unix()
|
||||
}
|
||||
}
|
||||
|
||||
func StateMessagePUT(
|
||||
authDB config.HTTPBACredentials, validCredentials []config.HTTPBACredentialID,
|
||||
resp *types.SpaceState,
|
||||
) func(http.ResponseWriter, *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
body, err := updateEndpointValidator(authDB, validCredentials, w, r)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
// Set SpaceAPI response values
|
||||
resp.Message = string(body)
|
||||
resp.LastChange = time.Now().Unix()
|
||||
}
|
||||
}
|
||||
|
||||
func StateMessageDELETE(
|
||||
authDB config.HTTPBACredentials, validCredentials []config.HTTPBACredentialID,
|
||||
resp *types.SpaceState,
|
||||
) func(http.ResponseWriter, *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
_, err := updateEndpointValidator(authDB, validCredentials, w, r)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
// Set SpaceAPI response values
|
||||
resp.Message = ""
|
||||
resp.LastChange = time.Now().Unix()
|
||||
}
|
||||
}
|
||||
|
|
12
main.go
12
main.go
|
@ -50,14 +50,22 @@ func main() {
|
|||
os.Exit(0)
|
||||
}(&conf.Response)
|
||||
|
||||
// Register HTTP handlers
|
||||
// Root handler
|
||||
http.HandleFunc("GET /{$}",
|
||||
handlers.Root(&conf.Response),
|
||||
)
|
||||
// state->open
|
||||
http.HandleFunc("PUT /state/open",
|
||||
handlers.StateOpen(conf.Credentials, conf.Dynamic.State.Open.AllowedCredentials, &conf.Response.State),
|
||||
)
|
||||
// Register handler for environmental sensors
|
||||
// state->message
|
||||
http.HandleFunc("PUT /state/message",
|
||||
handlers.StateMessagePUT(conf.Credentials, conf.Dynamic.State.Open.AllowedCredentials, &conf.Response.State),
|
||||
)
|
||||
http.HandleFunc("DELETE /state/message",
|
||||
handlers.StateMessageDELETE(conf.Credentials, conf.Dynamic.State.Open.AllowedCredentials, &conf.Response.State),
|
||||
)
|
||||
// Register handlers for environmental sensors
|
||||
for sensorType, envSensorConfigs := range conf.Dynamic.Sensors {
|
||||
for i, envSensorConfig := range envSensorConfigs {
|
||||
urlPattern := "PUT " + util.GetSensorURLPath(
|
||||
|
|
|
@ -91,7 +91,8 @@ func SaveCurrentState(response types.SpaceAPIResponseV14) {
|
|||
State: struct {
|
||||
Open bool `json:"open"`
|
||||
LastChange int64 `json:"lastchange"`
|
||||
}{Open: response.State.Open, LastChange: response.State.LastChange},
|
||||
Message string `json:"message,omitempty"`
|
||||
}{Open: response.State.Open, LastChange: response.State.LastChange, Message: response.State.Message},
|
||||
}
|
||||
// Save sensor state
|
||||
persistentStateV14.Sensors = make(map[string][]types.PersistentEnvironmentSensor)
|
||||
|
|
|
@ -40,6 +40,7 @@ type SpaceAPIResponseV14 struct {
|
|||
type SpaceState struct {
|
||||
Open bool `json:"open"`
|
||||
LastChange int64 `json:"lastchange"`
|
||||
Message string `json:"message,omitempty"`
|
||||
}
|
||||
|
||||
type EnvironmentSensor struct {
|
||||
|
@ -55,6 +56,7 @@ type PersistentStateV14 struct {
|
|||
State struct {
|
||||
Open bool `json:"open"`
|
||||
LastChange int64 `json:"lastchange"`
|
||||
Message string `json:"message,omitempty"`
|
||||
} `json:"state"`
|
||||
Sensors map[string][]PersistentEnvironmentSensor `json:"sensors,omitempty"`
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue