mirror of
https://github.com/bastienwirtz/homer.git
synced 2024-11-07 08:44:00 +01:00
Add OpenHAB custom service
This commit is contained in:
parent
bcebb3e67e
commit
9c537fb926
@ -35,6 +35,7 @@ within Homer:
|
||||
- [Tdarr](#tdarr)
|
||||
- [PiAlert](#pialert)
|
||||
- [Immich](#immich)
|
||||
- [OpenHAB](#openhab)
|
||||
|
||||
If you experiencing any issue, please have a look to the [troubleshooting](troubleshooting.md) page.
|
||||
|
||||
@ -446,3 +447,19 @@ The Immich server must be running at least version 1.85.0 for the correct api en
|
||||
apikey: "<--- Your api key --->" # administrator user
|
||||
updateInterval: 5000 # (Optional) Interval (in ms) for updating the stats
|
||||
```
|
||||
|
||||
## OpenHAB
|
||||
|
||||
You need to set the type to OpenHAB, provide an api key and enable cors on OpenHAB.
|
||||
|
||||
```yaml
|
||||
- name: "OpenHAB"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: "http://192.168.0.151/"
|
||||
type: "OpenHAB"
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
things: true # true will query the things API and report total and online things count. false will skip the call
|
||||
items: true # true will query the items API and report total items count. false will skip the call
|
||||
```
|
||||
To create an API token on OpenHAB, follow the [official documentation here](https://www.openhab.org/docs/configuration/apitokens.html).
|
||||
To enable cors on OpenHAB, edit your services/runtime.cfg and uncomment or add this line: `org.openhab.cors:enable=true`
|
18
dummy-data/openHAB/rest/systeminfo
Normal file
18
dummy-data/openHAB/rest/systeminfo
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"systemInfo": {
|
||||
"configFolder": "/etc/openhab",
|
||||
"userdataFolder": "/var/lib/openhab",
|
||||
"logFolder": "/var/log/openhab",
|
||||
"javaVersion": "17.0.9",
|
||||
"javaVendor": "Azul Systems, Inc.",
|
||||
"javaVendorVersion": "Zulu17.46+19-CA",
|
||||
"osName": "Linux",
|
||||
"osVersion": "6.5.11-4-pve",
|
||||
"osArchitecture": "amd64",
|
||||
"availableProcessors": 2,
|
||||
"freeMemory": 75885968,
|
||||
"totalMemory": 494927872,
|
||||
"uptime": 2150186,
|
||||
"startLevel": 100
|
||||
}
|
||||
}
|
144
src/components/services/OpenHAB.vue
Normal file
144
src/components/services/OpenHAB.vue
Normal file
@ -0,0 +1,144 @@
|
||||
<template>
|
||||
<Generic :item="item">
|
||||
<template #content>
|
||||
<p class="title is-4">{{ item.name }}</p>
|
||||
<p class="subtitle is-6">
|
||||
<template v-if="item.subtitle">
|
||||
{{ item.subtitle }}
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ details }}
|
||||
</template>
|
||||
</p>
|
||||
</template>
|
||||
<template #indicator>
|
||||
<div v-if="status" class="status" :class="status">
|
||||
{{ status }}
|
||||
</div>
|
||||
</template>
|
||||
</Generic>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import service from "@/mixins/service.js";
|
||||
import Generic from "./Generic.vue";
|
||||
|
||||
export default {
|
||||
name: "OpenHAB",
|
||||
mixins: [service],
|
||||
props: {
|
||||
item: Object,
|
||||
},
|
||||
components: {
|
||||
Generic,
|
||||
},
|
||||
data: () => ({
|
||||
status: "",
|
||||
things: {
|
||||
count: 0,
|
||||
online: 0,
|
||||
},
|
||||
items: {
|
||||
count: 0,
|
||||
},
|
||||
}),
|
||||
computed: {
|
||||
headers: function () {
|
||||
const basicAuth = `${this.item.apikey}:`;
|
||||
|
||||
return {
|
||||
Authorization: `Basic ${btoa(basicAuth)}`,
|
||||
};
|
||||
},
|
||||
details: function () {
|
||||
const details = [];
|
||||
|
||||
if (this.item.things) {
|
||||
details.push(
|
||||
`${this.things.count} things (${this.things.online} Online)`,
|
||||
);
|
||||
}
|
||||
|
||||
if (this.item.items) {
|
||||
details.push(`${this.items.count} items`);
|
||||
}
|
||||
|
||||
return details.join(", ");
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.fetchServerStatus();
|
||||
|
||||
if (!this.item.subtitle && this.status !== "dead") {
|
||||
this.fetchServerStats();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
fetchServerStatus: async function () {
|
||||
const headers = this.headers;
|
||||
this.fetch("/rest/systeminfo", { headers })
|
||||
.then((response) => {
|
||||
if (response && response.systemInfo) this.status = "running";
|
||||
else throw new Error();
|
||||
})
|
||||
.catch((e) => {
|
||||
console.log(e);
|
||||
this.status = "dead";
|
||||
});
|
||||
},
|
||||
fetchServerStats: async function () {
|
||||
const headers = this.headers;
|
||||
|
||||
if (this.item.things) {
|
||||
const data = await this.fetch("/rest/things?summary=true", {
|
||||
headers,
|
||||
}).catch((e) => {
|
||||
console.log(e);
|
||||
});
|
||||
|
||||
this.things.count = data.length;
|
||||
this.things.online = data.filter(
|
||||
(e) => e.statusInfo.status === "ONLINE",
|
||||
).length;
|
||||
}
|
||||
|
||||
if (this.item.items) {
|
||||
const data = await this.fetch("/rest/items", { headers }).catch((e) => {
|
||||
console.log(e);
|
||||
});
|
||||
|
||||
this.items.count = data.length;
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.status {
|
||||
font-size: 0.8rem;
|
||||
color: var(--text-title);
|
||||
|
||||
&.running:before {
|
||||
background-color: #94e185;
|
||||
border-color: #78d965;
|
||||
box-shadow: 0 0 5px 1px #94e185;
|
||||
}
|
||||
|
||||
&.dead:before {
|
||||
background-color: #c9404d;
|
||||
border-color: #c42c3b;
|
||||
box-shadow: 0 0 5px 1px #c9404d;
|
||||
}
|
||||
|
||||
&:before {
|
||||
content: " ";
|
||||
display: inline-block;
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
margin-right: 10px;
|
||||
border: 1px solid #000;
|
||||
border-radius: 7px;
|
||||
}
|
||||
}
|
||||
</style>
|
Loading…
Reference in New Issue
Block a user