Add OpenHAB custom service

This commit is contained in:
Andrea Pierangeli 2024-02-07 18:09:48 +01:00 committed by Bastien Wirtz
parent bcebb3e67e
commit 9c537fb926
3 changed files with 179 additions and 0 deletions

View File

@ -35,6 +35,7 @@ within Homer:
- [Tdarr](#tdarr) - [Tdarr](#tdarr)
- [PiAlert](#pialert) - [PiAlert](#pialert)
- [Immich](#immich) - [Immich](#immich)
- [OpenHAB](#openhab)
If you experiencing any issue, please have a look to the [troubleshooting](troubleshooting.md) page. 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 apikey: "<--- Your api key --->" # administrator user
updateInterval: 5000 # (Optional) Interval (in ms) for updating the stats 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`

View 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
}
}

View 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>