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)
|
- [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`
|
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