- [Tdarr](#tdarr)
- [PiAlert](#pialert)
- [Immich](#immich)
+ - [OpenHAB](#openhab)
If you experiencing any issue, please have a look to the [troubleshooting](troubleshooting.md) page.
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`
\ No newline at end of file
--- /dev/null
+{\r
+ "systemInfo": {\r
+ "configFolder": "/etc/openhab",\r
+ "userdataFolder": "/var/lib/openhab",\r
+ "logFolder": "/var/log/openhab",\r
+ "javaVersion": "17.0.9",\r
+ "javaVendor": "Azul Systems, Inc.",\r
+ "javaVendorVersion": "Zulu17.46+19-CA",\r
+ "osName": "Linux",\r
+ "osVersion": "6.5.11-4-pve",\r
+ "osArchitecture": "amd64",\r
+ "availableProcessors": 2,\r
+ "freeMemory": 75885968,\r
+ "totalMemory": 494927872,\r
+ "uptime": 2150186,\r
+ "startLevel": 100\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+<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>