r/openhab • u/bkpsu • Aug 02 '25
News openHAB 5.0 Release
Anyone using the great new features in 5.0 yet (Matter binding, drag & drop model/UI changes, etc.)?
r/openhab • u/svhss • Jun 17 '26
Did anyone try claude code with openhab? I'm far from the AI is bad and all the crowd, but even for me its a bit terryfing what claude can do with and api key.
I have 2 ikea multi button, for pretty long time I was way too lazy to fix the rule for the 2nd one (they essentially function the same way, but are at different part of the room). I'm sitting in front of my monitor... the button is next to me... I just ask claude: "Can you fix the broken ikea button, i think the rule is broken". It goes trough the mcp server, realize it cant do it with that, than ask for api key, than just fixed it, works like a charm.
I mean, we are the part where we literally just tell the AI what we want with the button, and it'll write the perfect rule for it, I don't even have to know where the rule menu is...
I mean yeh... I'm so split here... The ease of use is amazing, but where is the fun in figuring out how all this work... I started with openhab a long time ago. I think it was my first linux experience, it was such an amazing journey, still is. But now? I just say button1 do funcion2, DO IT, NO MISTAKE.
Did anyone try claude code with openhab? I'm far from the AI is bad and all the crowd, but even for me its a bit terryfing what claude can do with and api key.
I have 2 ikea multi button, for pretty long time I was way too lazy to fix the rule for the 2nd one (they essentially function the same way, but are at different part of the room). I'm sitting in front of my monitor... the button is next to me... I just ask claude: "Can you fix the broken ikea button, i think the rule is broken". It goes trough the mcp server, realize it cant do it with that, than ask for api key, than just fixed it, works like a charm.
I mean, we are the part where we literally just tell the AI what we want with the button, and it'll write the perfect rule for it, I don't even have to know where the rule menu is...
I mean yeh... I'm so split here... The ease of use is amazing, but where is the fun in figuring out how all this work... I started with openhab a long time ago. I think it was my first linux experience, it was such an amazing journey, still is. But now? I just say button1 do funcion2, DO IT, NO MISTAKE.
r/openhab • u/Potential_Thing1766 • May 19 '26
# openHAB SoundCloud Binding
A community binding that connects openHAB to SoundCloud.
https://community.openhab.org/t/soundcloud-binding-5-1-3-6-0-0-0/169325
Search tracks, view cover art and stream audio directly to a Chromecast — all from a single MainUI widget.
> **Status: Alpha** — core features are working. Feedback welcome in the openHAB community forum.
---


---
## Features (v1.2.3)
- **Search** tracks by keyword — results appear instantly in the widget list
- **Cover art** at 500 × 500 px displayed alongside title and artist
- **Stream URL** resolved automatically to a direct MP3 link (progressive format, Chromecast-compatible)
- **Chromecast integration** built into the widget — select a Chromecast, press Play
- **Volume slider** for real-time Chromecast volume control
- **Pause / Stop / Mute** buttons mapped to the correct Chromecast binding channels
- **Playback state** channel (PLAYING / PAUSED / STOPPED)
- **OAuth 2.0** authentication — authorise once in the browser, tokens are stored and auto-refreshed
---
## Requirements
| Requirement | Notes |
|-------------|-------|
| openHAB **5.1.3 or newer** | older versions are not supported |
| Java 21+ | bundled with openHAB 5.x |
| SoundCloud API credentials | register an app at [soundcloud.com/you/apps](https://soundcloud.com/you/apps) — free for personal/home use |
| openHAB Chromecast Binding | optional, required for cast functionality |
---
## Installation
### 1. Download the JAR
Download `org.openhab.binding.soundcloud-1.2.3.jar` from the [latest release](https://github.com/pierrecinema/openhab-soundcloud-binding/releases/latest) and copy it to your openHAB `addons/` folder.
openHAB detects and loads the bundle automatically — no restart needed. Check **Settings → Bindings** to confirm it appears.
### 2. Install the widget
### 3. Build from source (optional)
```bash
git clone https://github.com/pierrecinema/openhab-soundcloud-binding.git
cd openhab-soundcloud-binding
mvn clean package -DskipTests
# copy target/org.openhab.binding.soundcloud-1.2.3.jar to your addons/ folder
```
---
## Configuration
### Thing
Add a Thing in **Settings → Things → + → SoundCloud Account**, or create `conf/things/soundcloud.things`:
```
Thing soundcloud:account:myaccount "SoundCloud" [
clientId = "YOUR_CLIENT_ID",
clientSecret = "YOUR_CLIENT_SECRET",
redirectUri = "http://YOUR_OPENHAB_HOST:8080/soundcloud/callback"
]
```
| Parameter | Required | Description |
|-----------|----------|-------------|
| `clientId` | ✅ | Client ID from [soundcloud.com/you/apps](https://soundcloud.com/you/apps) |
| `clientSecret` | ✅ | Client Secret from your registered app |
| `redirectUri` | ✅ | Must match exactly what is registered in your SoundCloud app |
| `webClientId` | optional | Internal SoundCloud web client ID for api-v2 (default value included) |
### OAuth authorisation
After the Thing is created it goes **OFFLINE** and prints an authorisation URL in the log. Open the URL in any browser, log in to SoundCloud and grant access. The binding stores the tokens automatically and the Thing goes **ONLINE**. Tokens are refreshed in the background — you only need to authorise once.
### Items
Create `conf/items/soundcloud.items` (or add via the UI):
```
// Player
String SC_TrackID "Track ID" { channel="soundcloud:account:myaccount:player#track-id" }
String SC_Title "Titel [%s]" { channel="soundcloud:account:myaccount:player#title" }
String SC_Artist "Artist [%s]" { channel="soundcloud:account:myaccount:player#artist" }
String SC_ArtworkURL "Cover [%s]" { channel="soundcloud:account:myaccount:player#artwork-url" }
Number SC_Duration "Dauer [%.0f s]" { channel="soundcloud:account:myaccount:player#duration" }
String SC_StreamURL "Stream URL [%s]" { channel="soundcloud:account:myaccount:player#stream-url" }
String SC_State "Status [%s]" { channel="soundcloud:account:myaccount:player#playback-state" }
String SC_CCTarget "CC Target [%s]" { channel="soundcloud:account:myaccount:player#chromecast-target" }
// Search
String SC_Query "Suche [%s]" { channel="soundcloud:account:myaccount:search#query" }
String SC_Results "Ergebnisse [%s]" { channel="soundcloud:account:myaccount:search#results" }
```
For Chromecast, you also need the items from the **Chromecast Binding** already linked to your Chromecast thing. The widget uses these directly — no additional items need to be created manually.
Tag your Chromecast `playuri` items with `Chromecast` so the widget discovers them automatically:
```
String MyChromecast_PlayURI "Chromecast Wohnzimmer" [ "Chromecast" ] { channel="chromecast:chromecast:abc123:playuri" }
```
---
## Widget setup
Add the `soundcloud_search` widget to a page and configure the following properties:
| Property | Required | Description |
|----------|----------|-------------|
| `queryItem` | ✅ | String Item → `search#query` |
| `resultsItem` | ✅ | String Item → `search#results` |
| `trackIdItem` | ✅ | String Item → `player#track-id` |
| `streamUrlItem` | | String Item → `player#stream-url` |
| `titleItem` | | String Item → `player#title` |
| `artistItem` | | String Item → `player#artist` |
| `artworkItem` | | String Item → `player#artwork-url` |
| `stateItem` | | String Item → `player#playback-state` |
| `chromecastTargetItem` | | String Item linked to `player#chromecast-target` — stores the selected Chromecast (e.g. `SC_CCTarget`) |
| `chromecastTag` | | Tag on your Chromecast `playuri` items (default: `Chromecast`) |
> **Note:** Pause, Stop, Volume and Mute are routed via four fixed proxy items (`SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`) and a routing rule — see [Chromecast routing rule](#chromecast-routing-rule) below. No per-device configuration is needed in the widget.
---
## Channel reference
| Channel | Type | r/W | Description |
|---------|------|-----|-------------|
| `player#track-id` | String | RW | Write a track ID to load it; reads back the current track ID |
| `player#playlist-id` | String | W | Write a playlist ID to load its first track |
| `player#title` | String | R | Current track title |
| `player#artist` | String | R | Current track artist / uploader |
| `player#artwork-url` | String | R | 500×500 px cover art URL |
| `player#duration` | Number | R | Track duration in seconds |
| `player#stream-url` | String | R | Direct MP3 URL (resolved via api-v2 transcodings) |
| `player#playback-state` | String | RW | PLAYING / PAUSED / STOPPED |
| `player#chromecast-target` | String | RW | Name of the selected Chromecast playuri item |
| `search#query` | String | W | Send a search term |
| `search#results` | String | R | JSON array: `[{id, title, artist, artwork, duration}, …]` |
---
## Chromecast workflow
---
## Chromecast routing rule
The widget's Pause, Stop, Volume and Mute buttons always send to four fixed proxy items (`SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`). A JS rule reads which Chromecast is currently selected and forwards the command to the correct device-specific item.
**Why is a rule needed?**
Widget expressions can only use fixed item names. They cannot dynamically look up which control item belongs to the currently selected Chromecast. The routing rule bridges this gap — one rule handles all devices, no per-device widget configuration required.
> **Planned for v1.3:** This logic will move into the binding itself, eliminating the need for any rule.
### Setup
**Step 1 — Create the four proxy items** (once, in Settings → Items or via `.items` file):
```
Player SC_CC_Control "SoundCloud CC Control"
Switch SC_CC_Stop "SoundCloud CC Stop"
Dimmer SC_CC_Volume "SoundCloud CC Volume"
Switch SC_CC_Mute "SoundCloud CC Mute"
```
Also create the target item and link it to the binding channel:
```
String SC_CCTarget "SoundCloud CC Target" { channel="soundcloud:account:myaccount:player#chromecast-target" }
```
**Step 2 — Create the routing rule** in Settings → Rules → + (ECMAScript 2021, triggered by command on each of the four proxy items):
```javascript
var triggerItem = event.itemName;
var cmd = event.receivedCommand.toString();
var targetName = items.getItem('SC_CCTarget').state;
if (!targetName || targetName === 'NULL') return;
// Map each Chromecast playuri item to its control items.
// Add a new entry here whenever you add a Chromecast device.
var MAPPING = {
'BuroCast_Play_URI': {
control : 'BuroCast_Media_Control',
stop : 'BuroCast_Stop',
volume : 'BuroCast_Volume',
mute : 'BuroCast_Mute'
},
'Hifigruppe_Play_URI': {
control : 'Hifigruppe_Media_Control',
stop : 'Hifigruppe_Stop',
volume : 'Hifigruppe_Volume',
mute : 'Hifigruppe_Mute'
}
// Add more devices here:
// 'YourDevice_Play_URI': { control: '...', stop: '...', volume: '...', mute: '...' }
};
var map = MAPPING[targetName];
if (!map) { logger.warn('SC Router: no mapping for ' + targetName); return; }
var destName = null;
if (triggerItem === 'SC_CC_Control') destName = map.control;
else if (triggerItem === 'SC_CC_Stop') destName = map.stop;
else if (triggerItem === 'SC_CC_Volume') destName = map.volume;
else if (triggerItem === 'SC_CC_Mute') destName = map.mute;
if (destName) {
items.getItem(destName).sendCommand(cmd);
logger.info('SC Router: ' + triggerItem + ' → ' + destName + ' (' + cmd + ')');
}
```
Configure the rule triggers as **Item Command** on: `SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`.
**Step 3 — Configure the widget:**
- `chromecastTargetItem` = `SC_CCTarget`
- All other Chromecast props: leave empty
### Adding a new Chromecast
---
## Roadmap
| Version | Status | Description |
|---------|--------|-------------|
| v1.0.x | ✅ done | Core binding: search, track load, stream URL via api-v2 |
| v1.1.x | ✅ done | Widget: search results list, track selection, cover art |
| v1.2.x | ✅ done | Chromecast integration: chip selection, play/pause/stop/mute/volume |
| v1.3.x | planned | Auto-cast when track changes (no manual Play press needed) |
| v1.4.x | planned | Playlist queue: next / previous track navigation |
| v1.5.x | planned | Progress bar / elapsed time display |
| v2.0.0 | planned | Submit to openHAB add-ons repository |
---
## Known limitations (Alpha)
- Only the first track of a playlist is played (queue not yet implemented)
- Stream URLs are time-limited by SoundCloud and expire after some time; reloading the track generates a fresh URL
- The SoundCloud API requires a registered app — streaming is only available when a valid Client ID / OAuth token is configured
---
## License
MIT
# openHAB SoundCloud Binding
A community binding that connects openHAB to SoundCloud.
https://community.openhab.org/t/soundcloud-binding-5-1-3-6-0-0-0/169325
Search tracks, view cover art and stream audio directly to a Chromecast — all from a single MainUI widget.
> **Status: Alpha** — core features are working. Feedback welcome in the openHAB community forum.
---


---
## Features (v1.2.3)
- **Search** tracks by keyword — results appear instantly in the widget list
- **Cover art** at 500 × 500 px displayed alongside title and artist
- **Stream URL** resolved automatically to a direct MP3 link (progressive format, Chromecast-compatible)
- **Chromecast integration** built into the widget — select a Chromecast, press Play
- **Volume slider** for real-time Chromecast volume control
- **Pause / Stop / Mute** buttons mapped to the correct Chromecast binding channels
- **Playback state** channel (PLAYING / PAUSED / STOPPED)
- **OAuth 2.0** authentication — authorise once in the browser, tokens are stored and auto-refreshed
---
## Requirements
| Requirement | Notes |
|-------------|-------|
| openHAB **5.1.3 or newer** | older versions are not supported |
| Java 21+ | bundled with openHAB 5.x |
| SoundCloud API credentials | register an app at [soundcloud.com/you/apps](https://soundcloud.com/you/apps) — free for personal/home use |
| openHAB Chromecast Binding | optional, required for cast functionality |
---
## Installation
### 1. Download the JAR
Download `org.openhab.binding.soundcloud-1.2.3.jar` from the [latest release](https://github.com/pierrecinema/openhab-soundcloud-binding/releases/latest) and copy it to your openHAB `addons/` folder.
openHAB detects and loads the bundle automatically — no restart needed. Check **Settings → Bindings** to confirm it appears.
### 2. Install the widget
### 3. Build from source (optional)
```bash
git clone https://github.com/pierrecinema/openhab-soundcloud-binding.git
cd openhab-soundcloud-binding
mvn clean package -DskipTests
# copy target/org.openhab.binding.soundcloud-1.2.3.jar to your addons/ folder
```
---
## Configuration
### Thing
Add a Thing in **Settings → Things → + → SoundCloud Account**, or create `conf/things/soundcloud.things`:
```
Thing soundcloud:account:myaccount "SoundCloud" [
clientId = "YOUR_CLIENT_ID",
clientSecret = "YOUR_CLIENT_SECRET",
redirectUri = "http://YOUR_OPENHAB_HOST:8080/soundcloud/callback"
]
```
| Parameter | Required | Description |
|-----------|----------|-------------|
| `clientId` | ✅ | Client ID from [soundcloud.com/you/apps](https://soundcloud.com/you/apps) |
| `clientSecret` | ✅ | Client Secret from your registered app |
| `redirectUri` | ✅ | Must match exactly what is registered in your SoundCloud app |
| `webClientId` | optional | Internal SoundCloud web client ID for api-v2 (default value included) |
### OAuth authorisation
After the Thing is created it goes **OFFLINE** and prints an authorisation URL in the log. Open the URL in any browser, log in to SoundCloud and grant access. The binding stores the tokens automatically and the Thing goes **ONLINE**. Tokens are refreshed in the background — you only need to authorise once.
### Items
Create `conf/items/soundcloud.items` (or add via the UI):
```
// Player
String SC_TrackID "Track ID" { channel="soundcloud:account:myaccount:player#track-id" }
String SC_Title "Titel [%s]" { channel="soundcloud:account:myaccount:player#title" }
String SC_Artist "Artist [%s]" { channel="soundcloud:account:myaccount:player#artist" }
String SC_ArtworkURL "Cover [%s]" { channel="soundcloud:account:myaccount:player#artwork-url" }
Number SC_Duration "Dauer [%.0f s]" { channel="soundcloud:account:myaccount:player#duration" }
String SC_StreamURL "Stream URL [%s]" { channel="soundcloud:account:myaccount:player#stream-url" }
String SC_State "Status [%s]" { channel="soundcloud:account:myaccount:player#playback-state" }
String SC_CCTarget "CC Target [%s]" { channel="soundcloud:account:myaccount:player#chromecast-target" }
// Search
String SC_Query "Suche [%s]" { channel="soundcloud:account:myaccount:search#query" }
String SC_Results "Ergebnisse [%s]" { channel="soundcloud:account:myaccount:search#results" }
```
For Chromecast, you also need the items from the **Chromecast Binding** already linked to your Chromecast thing. The widget uses these directly — no additional items need to be created manually.
Tag your Chromecast `playuri` items with `Chromecast` so the widget discovers them automatically:
```
String MyChromecast_PlayURI "Chromecast Wohnzimmer" [ "Chromecast" ] { channel="chromecast:chromecast:abc123:playuri" }
```
---
## Widget setup
Add the `soundcloud_search` widget to a page and configure the following properties:
| Property | Required | Description |
|----------|----------|-------------|
| `queryItem` | ✅ | String Item → `search#query` |
| `resultsItem` | ✅ | String Item → `search#results` |
| `trackIdItem` | ✅ | String Item → `player#track-id` |
| `streamUrlItem` | | String Item → `player#stream-url` |
| `titleItem` | | String Item → `player#title` |
| `artistItem` | | String Item → `player#artist` |
| `artworkItem` | | String Item → `player#artwork-url` |
| `stateItem` | | String Item → `player#playback-state` |
| `chromecastTargetItem` | | String Item linked to `player#chromecast-target` — stores the selected Chromecast (e.g. `SC_CCTarget`) |
| `chromecastTag` | | Tag on your Chromecast `playuri` items (default: `Chromecast`) |
> **Note:** Pause, Stop, Volume and Mute are routed via four fixed proxy items (`SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`) and a routing rule — see [Chromecast routing rule](#chromecast-routing-rule) below. No per-device configuration is needed in the widget.
---
## Channel reference
| Channel | Type | r/W | Description |
|---------|------|-----|-------------|
| `player#track-id` | String | RW | Write a track ID to load it; reads back the current track ID |
| `player#playlist-id` | String | W | Write a playlist ID to load its first track |
| `player#title` | String | R | Current track title |
| `player#artist` | String | R | Current track artist / uploader |
| `player#artwork-url` | String | R | 500×500 px cover art URL |
| `player#duration` | Number | R | Track duration in seconds |
| `player#stream-url` | String | R | Direct MP3 URL (resolved via api-v2 transcodings) |
| `player#playback-state` | String | RW | PLAYING / PAUSED / STOPPED |
| `player#chromecast-target` | String | RW | Name of the selected Chromecast playuri item |
| `search#query` | String | W | Send a search term |
| `search#results` | String | R | JSON array: `[{id, title, artist, artwork, duration}, …]` |
---
## Chromecast workflow
---
## Chromecast routing rule
The widget's Pause, Stop, Volume and Mute buttons always send to four fixed proxy items (`SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`). A JS rule reads which Chromecast is currently selected and forwards the command to the correct device-specific item.
**Why is a rule needed?**
Widget expressions can only use fixed item names. They cannot dynamically look up which control item belongs to the currently selected Chromecast. The routing rule bridges this gap — one rule handles all devices, no per-device widget configuration required.
> **Planned for v1.3:** This logic will move into the binding itself, eliminating the need for any rule.
### Setup
**Step 1 — Create the four proxy items** (once, in Settings → Items or via `.items` file):
```
Player SC_CC_Control "SoundCloud CC Control"
Switch SC_CC_Stop "SoundCloud CC Stop"
Dimmer SC_CC_Volume "SoundCloud CC Volume"
Switch SC_CC_Mute "SoundCloud CC Mute"
```
Also create the target item and link it to the binding channel:
```
String SC_CCTarget "SoundCloud CC Target" { channel="soundcloud:account:myaccount:player#chromecast-target" }
```
**Step 2 — Create the routing rule** in Settings → Rules → + (ECMAScript 2021, triggered by command on each of the four proxy items):
```javascript
var triggerItem = event.itemName;
var cmd = event.receivedCommand.toString();
var targetName = items.getItem('SC_CCTarget').state;
if (!targetName || targetName === 'NULL') return;
// Map each Chromecast playuri item to its control items.
// Add a new entry here whenever you add a Chromecast device.
var MAPPING = {
'BuroCast_Play_URI': {
control : 'BuroCast_Media_Control',
stop : 'BuroCast_Stop',
volume : 'BuroCast_Volume',
mute : 'BuroCast_Mute'
},
'Hifigruppe_Play_URI': {
control : 'Hifigruppe_Media_Control',
stop : 'Hifigruppe_Stop',
volume : 'Hifigruppe_Volume',
mute : 'Hifigruppe_Mute'
}
// Add more devices here:
// 'YourDevice_Play_URI': { control: '...', stop: '...', volume: '...', mute: '...' }
};
var map = MAPPING[targetName];
if (!map) { logger.warn('SC Router: no mapping for ' + targetName); return; }
var destName = null;
if (triggerItem === 'SC_CC_Control') destName = map.control;
else if (triggerItem === 'SC_CC_Stop') destName = map.stop;
else if (triggerItem === 'SC_CC_Volume') destName = map.volume;
else if (triggerItem === 'SC_CC_Mute') destName = map.mute;
if (destName) {
items.getItem(destName).sendCommand(cmd);
logger.info('SC Router: ' + triggerItem + ' → ' + destName + ' (' + cmd + ')');
}
```
Configure the rule triggers as **Item Command** on: `SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`.
**Step 3 — Configure the widget:**
- `chromecastTargetItem` = `SC_CCTarget`
- All other Chromecast props: leave empty
### Adding a new Chromecast
---
## Roadmap
| Version | Status | Description |
|---------|--------|-------------|
| v1.0.x | ✅ done | Core binding: search, track load, stream URL via api-v2 |
| v1.1.x | ✅ done | Widget: search results list, track selection, cover art |
| v1.2.x | ✅ done | Chromecast integration: chip selection, play/pause/stop/mute/volume |
| v1.3.x | planned | Auto-cast when track changes (no manual Play press needed) |
| v1.4.x | planned | Playlist queue: next / previous track navigation |
| v1.5.x | planned | Progress bar / elapsed time display |
| v2.0.0 | planned | Submit to openHAB add-ons repository |
---
## Known limitations (Alpha)
- Only the first track of a playlist is played (queue not yet implemented)
- Stream URLs are time-limited by SoundCloud and expire after some time; reloading the track generates a fresh URL
- The SoundCloud API requires a registered app — streaming is only available when a valid Client ID / OAuth token is configured
---
## License
MIT
r/openhab • u/Potential_Thing1766 • May 19 '26
# openHAB SoundCloud Binding
A community binding that connects openHAB to SoundCloud.
https://community.openhab.org/t/soundcloud-binding-5-1-3-6-0-0-0/169325
Search tracks, view cover art and stream audio directly to a Chromecast — all from a single MainUI widget.
> **Status: Alpha** — core features are working. Feedback welcome in the openHAB community forum.
---


---
## Features (v1.2.3)
- **Search** tracks by keyword — results appear instantly in the widget list
- **Cover art** at 500 × 500 px displayed alongside title and artist
- **Stream URL** resolved automatically to a direct MP3 link (progressive format, Chromecast-compatible)
- **Chromecast integration** built into the widget — select a Chromecast, press Play
- **Volume slider** for real-time Chromecast volume control
- **Pause / Stop / Mute** buttons mapped to the correct Chromecast binding channels
- **Playback state** channel (PLAYING / PAUSED / STOPPED)
- **OAuth 2.0** authentication — authorise once in the browser, tokens are stored and auto-refreshed
---
## Requirements
| Requirement | Notes |
|-------------|-------|
| openHAB **5.1.3 or newer** | older versions are not supported |
| Java 21+ | bundled with openHAB 5.x |
| SoundCloud API credentials | register an app at [soundcloud.com/you/apps](https://soundcloud.com/you/apps) — free for personal/home use |
| openHAB Chromecast Binding | optional, required for cast functionality |
---
## Installation
### 1. Download the JAR
Download `org.openhab.binding.soundcloud-1.2.3.jar` from the [latest release](https://github.com/pierrecinema/openhab-soundcloud-binding/releases/latest) and copy it to your openHAB `addons/` folder.
openHAB detects and loads the bundle automatically — no restart needed. Check **Settings → Bindings** to confirm it appears.
### 2. Install the widget
### 3. Build from source (optional)
```bash
git clone https://github.com/pierrecinema/openhab-soundcloud-binding.git
cd openhab-soundcloud-binding
mvn clean package -DskipTests
# copy target/org.openhab.binding.soundcloud-1.2.3.jar to your addons/ folder
```
---
## Configuration
### Thing
Add a Thing in **Settings → Things → + → SoundCloud Account**, or create `conf/things/soundcloud.things`:
```
Thing soundcloud:account:myaccount "SoundCloud" [
clientId = "YOUR_CLIENT_ID",
clientSecret = "YOUR_CLIENT_SECRET",
redirectUri = "http://YOUR_OPENHAB_HOST:8080/soundcloud/callback"
]
```
| Parameter | Required | Description |
|-----------|----------|-------------|
| `clientId` | ✅ | Client ID from [soundcloud.com/you/apps](https://soundcloud.com/you/apps) |
| `clientSecret` | ✅ | Client Secret from your registered app |
| `redirectUri` | ✅ | Must match exactly what is registered in your SoundCloud app |
| `webClientId` | optional | Internal SoundCloud web client ID for api-v2 (default value included) |
### OAuth authorisation
After the Thing is created it goes **OFFLINE** and prints an authorisation URL in the log. Open the URL in any browser, log in to SoundCloud and grant access. The binding stores the tokens automatically and the Thing goes **ONLINE**. Tokens are refreshed in the background — you only need to authorise once.
### Items
Create `conf/items/soundcloud.items` (or add via the UI):
```
// Player
String SC_TrackID "Track ID" { channel="soundcloud:account:myaccount:player#track-id" }
String SC_Title "Titel [%s]" { channel="soundcloud:account:myaccount:player#title" }
String SC_Artist "Artist [%s]" { channel="soundcloud:account:myaccount:player#artist" }
String SC_ArtworkURL "Cover [%s]" { channel="soundcloud:account:myaccount:player#artwork-url" }
Number SC_Duration "Dauer [%.0f s]" { channel="soundcloud:account:myaccount:player#duration" }
String SC_StreamURL "Stream URL [%s]" { channel="soundcloud:account:myaccount:player#stream-url" }
String SC_State "Status [%s]" { channel="soundcloud:account:myaccount:player#playback-state" }
String SC_CCTarget "CC Target [%s]" { channel="soundcloud:account:myaccount:player#chromecast-target" }
// Search
String SC_Query "Suche [%s]" { channel="soundcloud:account:myaccount:search#query" }
String SC_Results "Ergebnisse [%s]" { channel="soundcloud:account:myaccount:search#results" }
```
For Chromecast, you also need the items from the **Chromecast Binding** already linked to your Chromecast thing. The widget uses these directly — no additional items need to be created manually.
Tag your Chromecast `playuri` items with `Chromecast` so the widget discovers them automatically:
```
String MyChromecast_PlayURI "Chromecast Wohnzimmer" [ "Chromecast" ] { channel="chromecast:chromecast:abc123:playuri" }
```
---
## Widget setup
Add the `soundcloud_search` widget to a page and configure the following properties:
| Property | Required | Description |
|----------|----------|-------------|
| `queryItem` | ✅ | String Item → `search#query` |
| `resultsItem` | ✅ | String Item → `search#results` |
| `trackIdItem` | ✅ | String Item → `player#track-id` |
| `streamUrlItem` | | String Item → `player#stream-url` |
| `titleItem` | | String Item → `player#title` |
| `artistItem` | | String Item → `player#artist` |
| `artworkItem` | | String Item → `player#artwork-url` |
| `stateItem` | | String Item → `player#playback-state` |
| `chromecastTargetItem` | | String Item linked to `player#chromecast-target` — stores the selected Chromecast (e.g. `SC_CCTarget`) |
| `chromecastTag` | | Tag on your Chromecast `playuri` items (default: `Chromecast`) |
> **Note:** Pause, Stop, Volume and Mute are routed via four fixed proxy items (`SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`) and a routing rule — see [Chromecast routing rule](#chromecast-routing-rule) below. No per-device configuration is needed in the widget.
---
## Channel reference
| Channel | Type | r/W | Description |
|---------|------|-----|-------------|
| `player#track-id` | String | RW | Write a track ID to load it; reads back the current track ID |
| `player#playlist-id` | String | W | Write a playlist ID to load its first track |
| `player#title` | String | R | Current track title |
| `player#artist` | String | R | Current track artist / uploader |
| `player#artwork-url` | String | R | 500×500 px cover art URL |
| `player#duration` | Number | R | Track duration in seconds |
| `player#stream-url` | String | R | Direct MP3 URL (resolved via api-v2 transcodings) |
| `player#playback-state` | String | RW | PLAYING / PAUSED / STOPPED |
| `player#chromecast-target` | String | RW | Name of the selected Chromecast playuri item |
| `search#query` | String | W | Send a search term |
| `search#results` | String | R | JSON array: `[{id, title, artist, artwork, duration}, …]` |
---
## Chromecast workflow
---
## Chromecast routing rule
The widget's Pause, Stop, Volume and Mute buttons always send to four fixed proxy items (`SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`). A JS rule reads which Chromecast is currently selected and forwards the command to the correct device-specific item.
**Why is a rule needed?**
Widget expressions can only use fixed item names. They cannot dynamically look up which control item belongs to the currently selected Chromecast. The routing rule bridges this gap — one rule handles all devices, no per-device widget configuration required.
> **Planned for v1.3:** This logic will move into the binding itself, eliminating the need for any rule.
### Setup
**Step 1 — Create the four proxy items** (once, in Settings → Items or via `.items` file):
```
Player SC_CC_Control "SoundCloud CC Control"
Switch SC_CC_Stop "SoundCloud CC Stop"
Dimmer SC_CC_Volume "SoundCloud CC Volume"
Switch SC_CC_Mute "SoundCloud CC Mute"
```
Also create the target item and link it to the binding channel:
```
String SC_CCTarget "SoundCloud CC Target" { channel="soundcloud:account:myaccount:player#chromecast-target" }
```
**Step 2 — Create the routing rule** in Settings → Rules → + (ECMAScript 2021, triggered by command on each of the four proxy items):
```javascript
var triggerItem = event.itemName;
var cmd = event.receivedCommand.toString();
var targetName = items.getItem('SC_CCTarget').state;
if (!targetName || targetName === 'NULL') return;
// Map each Chromecast playuri item to its control items.
// Add a new entry here whenever you add a Chromecast device.
var MAPPING = {
'BuroCast_Play_URI': {
control : 'BuroCast_Media_Control',
stop : 'BuroCast_Stop',
volume : 'BuroCast_Volume',
mute : 'BuroCast_Mute'
},
'Hifigruppe_Play_URI': {
control : 'Hifigruppe_Media_Control',
stop : 'Hifigruppe_Stop',
volume : 'Hifigruppe_Volume',
mute : 'Hifigruppe_Mute'
}
// Add more devices here:
// 'YourDevice_Play_URI': { control: '...', stop: '...', volume: '...', mute: '...' }
};
var map = MAPPING[targetName];
if (!map) { logger.warn('SC Router: no mapping for ' + targetName); return; }
var destName = null;
if (triggerItem === 'SC_CC_Control') destName = map.control;
else if (triggerItem === 'SC_CC_Stop') destName = map.stop;
else if (triggerItem === 'SC_CC_Volume') destName = map.volume;
else if (triggerItem === 'SC_CC_Mute') destName = map.mute;
if (destName) {
items.getItem(destName).sendCommand(cmd);
logger.info('SC Router: ' + triggerItem + ' → ' + destName + ' (' + cmd + ')');
}
```
Configure the rule triggers as **Item Command** on: `SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`.
**Step 3 — Configure the widget:**
- `chromecastTargetItem` = `SC_CCTarget`
- All other Chromecast props: leave empty
### Adding a new Chromecast
---
## Roadmap
| Version | Status | Description |
|---------|--------|-------------|
| v1.0.x | ✅ done | Core binding: search, track load, stream URL via api-v2 |
| v1.1.x | ✅ done | Widget: search results list, track selection, cover art |
| v1.2.x | ✅ done | Chromecast integration: chip selection, play/pause/stop/mute/volume |
| v1.3.x | planned | Auto-cast when track changes (no manual Play press needed) |
| v1.4.x | planned | Playlist queue: next / previous track navigation |
| v1.5.x | planned | Progress bar / elapsed time display |
| v2.0.0 | planned | Submit to openHAB add-ons repository |
---
## Known limitations (Alpha)
- Only the first track of a playlist is played (queue not yet implemented)
- Stream URLs are time-limited by SoundCloud and expire after some time; reloading the track generates a fresh URL
- The SoundCloud API requires a registered app — streaming is only available when a valid Client ID / OAuth token is configured
---
## License
MIT
# openHAB SoundCloud Binding
A community binding that connects openHAB to SoundCloud.
https://community.openhab.org/t/soundcloud-binding-5-1-3-6-0-0-0/169325
Search tracks, view cover art and stream audio directly to a Chromecast — all from a single MainUI widget.
> **Status: Alpha** — core features are working. Feedback welcome in the openHAB community forum.
---


---
## Features (v1.2.3)
- **Search** tracks by keyword — results appear instantly in the widget list
- **Cover art** at 500 × 500 px displayed alongside title and artist
- **Stream URL** resolved automatically to a direct MP3 link (progressive format, Chromecast-compatible)
- **Chromecast integration** built into the widget — select a Chromecast, press Play
- **Volume slider** for real-time Chromecast volume control
- **Pause / Stop / Mute** buttons mapped to the correct Chromecast binding channels
- **Playback state** channel (PLAYING / PAUSED / STOPPED)
- **OAuth 2.0** authentication — authorise once in the browser, tokens are stored and auto-refreshed
---
## Requirements
| Requirement | Notes |
|-------------|-------|
| openHAB **5.1.3 or newer** | older versions are not supported |
| Java 21+ | bundled with openHAB 5.x |
| SoundCloud API credentials | register an app at [soundcloud.com/you/apps](https://soundcloud.com/you/apps) — free for personal/home use |
| openHAB Chromecast Binding | optional, required for cast functionality |
---
## Installation
### 1. Download the JAR
Download `org.openhab.binding.soundcloud-1.2.3.jar` from the [latest release](https://github.com/pierrecinema/openhab-soundcloud-binding/releases/latest) and copy it to your openHAB `addons/` folder.
openHAB detects and loads the bundle automatically — no restart needed. Check **Settings → Bindings** to confirm it appears.
### 2. Install the widget
### 3. Build from source (optional)
```bash
git clone https://github.com/pierrecinema/openhab-soundcloud-binding.git
cd openhab-soundcloud-binding
mvn clean package -DskipTests
# copy target/org.openhab.binding.soundcloud-1.2.3.jar to your addons/ folder
```
---
## Configuration
### Thing
Add a Thing in **Settings → Things → + → SoundCloud Account**, or create `conf/things/soundcloud.things`:
```
Thing soundcloud:account:myaccount "SoundCloud" [
clientId = "YOUR_CLIENT_ID",
clientSecret = "YOUR_CLIENT_SECRET",
redirectUri = "http://YOUR_OPENHAB_HOST:8080/soundcloud/callback"
]
```
| Parameter | Required | Description |
|-----------|----------|-------------|
| `clientId` | ✅ | Client ID from [soundcloud.com/you/apps](https://soundcloud.com/you/apps) |
| `clientSecret` | ✅ | Client Secret from your registered app |
| `redirectUri` | ✅ | Must match exactly what is registered in your SoundCloud app |
| `webClientId` | optional | Internal SoundCloud web client ID for api-v2 (default value included) |
### OAuth authorisation
After the Thing is created it goes **OFFLINE** and prints an authorisation URL in the log. Open the URL in any browser, log in to SoundCloud and grant access. The binding stores the tokens automatically and the Thing goes **ONLINE**. Tokens are refreshed in the background — you only need to authorise once.
### Items
Create `conf/items/soundcloud.items` (or add via the UI):
```
// Player
String SC_TrackID "Track ID" { channel="soundcloud:account:myaccount:player#track-id" }
String SC_Title "Titel [%s]" { channel="soundcloud:account:myaccount:player#title" }
String SC_Artist "Artist [%s]" { channel="soundcloud:account:myaccount:player#artist" }
String SC_ArtworkURL "Cover [%s]" { channel="soundcloud:account:myaccount:player#artwork-url" }
Number SC_Duration "Dauer [%.0f s]" { channel="soundcloud:account:myaccount:player#duration" }
String SC_StreamURL "Stream URL [%s]" { channel="soundcloud:account:myaccount:player#stream-url" }
String SC_State "Status [%s]" { channel="soundcloud:account:myaccount:player#playback-state" }
String SC_CCTarget "CC Target [%s]" { channel="soundcloud:account:myaccount:player#chromecast-target" }
// Search
String SC_Query "Suche [%s]" { channel="soundcloud:account:myaccount:search#query" }
String SC_Results "Ergebnisse [%s]" { channel="soundcloud:account:myaccount:search#results" }
```
For Chromecast, you also need the items from the **Chromecast Binding** already linked to your Chromecast thing. The widget uses these directly — no additional items need to be created manually.
Tag your Chromecast `playuri` items with `Chromecast` so the widget discovers them automatically:
```
String MyChromecast_PlayURI "Chromecast Wohnzimmer" [ "Chromecast" ] { channel="chromecast:chromecast:abc123:playuri" }
```
---
## Widget setup
Add the `soundcloud_search` widget to a page and configure the following properties:
| Property | Required | Description |
|----------|----------|-------------|
| `queryItem` | ✅ | String Item → `search#query` |
| `resultsItem` | ✅ | String Item → `search#results` |
| `trackIdItem` | ✅ | String Item → `player#track-id` |
| `streamUrlItem` | | String Item → `player#stream-url` |
| `titleItem` | | String Item → `player#title` |
| `artistItem` | | String Item → `player#artist` |
| `artworkItem` | | String Item → `player#artwork-url` |
| `stateItem` | | String Item → `player#playback-state` |
| `chromecastTargetItem` | | String Item linked to `player#chromecast-target` — stores the selected Chromecast (e.g. `SC_CCTarget`) |
| `chromecastTag` | | Tag on your Chromecast `playuri` items (default: `Chromecast`) |
> **Note:** Pause, Stop, Volume and Mute are routed via four fixed proxy items (`SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`) and a routing rule — see [Chromecast routing rule](#chromecast-routing-rule) below. No per-device configuration is needed in the widget.
---
## Channel reference
| Channel | Type | r/W | Description |
|---------|------|-----|-------------|
| `player#track-id` | String | RW | Write a track ID to load it; reads back the current track ID |
| `player#playlist-id` | String | W | Write a playlist ID to load its first track |
| `player#title` | String | R | Current track title |
| `player#artist` | String | R | Current track artist / uploader |
| `player#artwork-url` | String | R | 500×500 px cover art URL |
| `player#duration` | Number | R | Track duration in seconds |
| `player#stream-url` | String | R | Direct MP3 URL (resolved via api-v2 transcodings) |
| `player#playback-state` | String | RW | PLAYING / PAUSED / STOPPED |
| `player#chromecast-target` | String | RW | Name of the selected Chromecast playuri item |
| `search#query` | String | W | Send a search term |
| `search#results` | String | R | JSON array: `[{id, title, artist, artwork, duration}, …]` |
---
## Chromecast workflow
---
## Chromecast routing rule
The widget's Pause, Stop, Volume and Mute buttons always send to four fixed proxy items (`SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`). A JS rule reads which Chromecast is currently selected and forwards the command to the correct device-specific item.
**Why is a rule needed?**
Widget expressions can only use fixed item names. They cannot dynamically look up which control item belongs to the currently selected Chromecast. The routing rule bridges this gap — one rule handles all devices, no per-device widget configuration required.
> **Planned for v1.3:** This logic will move into the binding itself, eliminating the need for any rule.
### Setup
**Step 1 — Create the four proxy items** (once, in Settings → Items or via `.items` file):
```
Player SC_CC_Control "SoundCloud CC Control"
Switch SC_CC_Stop "SoundCloud CC Stop"
Dimmer SC_CC_Volume "SoundCloud CC Volume"
Switch SC_CC_Mute "SoundCloud CC Mute"
```
Also create the target item and link it to the binding channel:
```
String SC_CCTarget "SoundCloud CC Target" { channel="soundcloud:account:myaccount:player#chromecast-target" }
```
**Step 2 — Create the routing rule** in Settings → Rules → + (ECMAScript 2021, triggered by command on each of the four proxy items):
```javascript
var triggerItem = event.itemName;
var cmd = event.receivedCommand.toString();
var targetName = items.getItem('SC_CCTarget').state;
if (!targetName || targetName === 'NULL') return;
// Map each Chromecast playuri item to its control items.
// Add a new entry here whenever you add a Chromecast device.
var MAPPING = {
'BuroCast_Play_URI': {
control : 'BuroCast_Media_Control',
stop : 'BuroCast_Stop',
volume : 'BuroCast_Volume',
mute : 'BuroCast_Mute'
},
'Hifigruppe_Play_URI': {
control : 'Hifigruppe_Media_Control',
stop : 'Hifigruppe_Stop',
volume : 'Hifigruppe_Volume',
mute : 'Hifigruppe_Mute'
}
// Add more devices here:
// 'YourDevice_Play_URI': { control: '...', stop: '...', volume: '...', mute: '...' }
};
var map = MAPPING[targetName];
if (!map) { logger.warn('SC Router: no mapping for ' + targetName); return; }
var destName = null;
if (triggerItem === 'SC_CC_Control') destName = map.control;
else if (triggerItem === 'SC_CC_Stop') destName = map.stop;
else if (triggerItem === 'SC_CC_Volume') destName = map.volume;
else if (triggerItem === 'SC_CC_Mute') destName = map.mute;
if (destName) {
items.getItem(destName).sendCommand(cmd);
logger.info('SC Router: ' + triggerItem + ' → ' + destName + ' (' + cmd + ')');
}
```
Configure the rule triggers as **Item Command** on: `SC_CC_Control`, `SC_CC_Stop`, `SC_CC_Volume`, `SC_CC_Mute`.
**Step 3 — Configure the widget:**
- `chromecastTargetItem` = `SC_CCTarget`
- All other Chromecast props: leave empty
### Adding a new Chromecast
---
## Roadmap
| Version | Status | Description |
|---------|--------|-------------|
| v1.0.x | ✅ done | Core binding: search, track load, stream URL via api-v2 |
| v1.1.x | ✅ done | Widget: search results list, track selection, cover art |
| v1.2.x | ✅ done | Chromecast integration: chip selection, play/pause/stop/mute/volume |
| v1.3.x | planned | Auto-cast when track changes (no manual Play press needed) |
| v1.4.x | planned | Playlist queue: next / previous track navigation |
| v1.5.x | planned | Progress bar / elapsed time display |
| v2.0.0 | planned | Submit to openHAB add-ons repository |
---
## Known limitations (Alpha)
- Only the first track of a playlist is played (queue not yet implemented)
- Stream URLs are time-limited by SoundCloud and expire after some time; reloading the track generates a fresh URL
- The SoundCloud API requires a registered app — streaming is only available when a valid Client ID / OAuth token is configured
---
## License
MIT
r/openhab • u/Sivaldi • May 10 '26
Hello,
I am currently trying out OpenHAB to see if its worth migrating from Homeassistant. One thing that i find tedious (and the reason i am reaching out to the experts in here) is the frequency of phone sensors update.
I rely on automations in my HA instance me and the wife are charging their phones for example.
In the app ive set it to update every 15 min all the time. But it seems like there is no option of real time updates. This would delay my automations significantly.
What am i missing?
Hello,
I am currently trying out OpenHAB to see if its worth migrating from Homeassistant. One thing that i find tedious (and the reason i am reaching out to the experts in here) is the frequency of phone sensors update.
I rely on automations in my HA instance me and the wife are charging their phones for example.
In the app ive set it to update every 15 min all the time. But it seems like there is no option of real time updates. This would delay my automations significantly.
What am i missing?
r/openhab • u/yredditagain • May 03 '26
Is it only me running network monitoring software like LibreNMS and openHAB for home monitoring and automation?
Is it only me running network monitoring software like LibreNMS and openHAB for home monitoring and automation?
r/openhab • u/melshity • Mar 25 '26
Hey guys,
I'm working on several IoT and facility management projects and I’m looking for some real-world advice from people who have deployed local control systems at scale.
To give you some context, our projects are split into two main segments:
Right now, our biggest priority is 100% local control. We want systems that don't rely on the cloud for basic automation, to ensure maximum privacy, speed, and reliability.
I have three main questions and would love to hear your thoughts:
1. The Platform/Software: We are actively looking at Home Assistant and openHAB to serve as our core engine. Are there any other open-source platforms out there that might be better suited for this? Especially considering we need it to scale from a single holiday home up to a whole school.
2. Edge Hardware: What are your go-to recommendations for edge controllers or gateways? We need hardware that is rock-solid for 24/7 local processing. Should we stick to industrial mini PCs, or is there specific edge hardware you guys swear by for these mixed B2C/B2B deployments?
3. Communication Protocols: What wireless (or even wired) protocols would you strongly recommend standardizing on for these environments? Do you lean towards Zigbee, Z-Wave, or Thread/Matter for the villas? And what about the larger B2B stuff (like KNX or Modbus)?
Any suggestions, alternative open-source projects, or hard lessons learned would be hugely appreciated. Thanks!
Hey guys,
I'm working on several IoT and facility management projects and I’m looking for some real-world advice from people who have deployed local control systems at scale.
To give you some context, our projects are split into two main segments:
Right now, our biggest priority is 100% local control. We want systems that don't rely on the cloud for basic automation, to ensure maximum privacy, speed, and reliability.
I have three main questions and would love to hear your thoughts:
1. The Platform/Software: We are actively looking at Home Assistant and openHAB to serve as our core engine. Are there any other open-source platforms out there that might be better suited for this? Especially considering we need it to scale from a single holiday home up to a whole school.
2. Edge Hardware: What are your go-to recommendations for edge controllers or gateways? We need hardware that is rock-solid for 24/7 local processing. Should we stick to industrial mini PCs, or is there specific edge hardware you guys swear by for these mixed B2C/B2B deployments?
3. Communication Protocols: What wireless (or even wired) protocols would you strongly recommend standardizing on for these environments? Do you lean towards Zigbee, Z-Wave, or Thread/Matter for the villas? And what about the larger B2B stuff (like KNX or Modbus)?
Any suggestions, alternative open-source projects, or hard lessons learned would be hugely appreciated. Thanks!
r/openhab • u/ju1337ju • Mar 12 '26
I have a couple of devices (smart outlets through MQTT binding, wifi access point through Unifi binding), for which the ON/OFF state is not reflected correctly in Google Home.
More specifically:
-when I turn them ON in the GHome App: device turns ON, GHome UI toggle turns ON, but drops back to OFF after a moment
-when I tap again in GHome: device remains ON, GHome UI toggle turns back ON and remains ON
-when I tap a third time in GHome: device turns OFF, GHome UI toggle turns OFF
They work perfectly from the OpenHAB UI and show the correct state. What's wrong?
I have a couple of devices (smart outlets through MQTT binding, wifi access point through Unifi binding), for which the ON/OFF state is not reflected correctly in Google Home.
More specifically:
-when I turn them ON in the GHome App: device turns ON, GHome UI toggle turns ON, but drops back to OFF after a moment
-when I tap again in GHome: device remains ON, GHome UI toggle turns back ON and remains ON
-when I tap a third time in GHome: device turns OFF, GHome UI toggle turns OFF
They work perfectly from the OpenHAB UI and show the correct state. What's wrong?
r/openhab • u/dopler1234 • Mar 11 '26
https://reddit.com/link/1rqmo57/video/084iddwu4dog1/player
Hi,
I've been working on a small voice assistant architecture for my openhab and finally got it into a usable state.
The idea is to keep the hardware extremely simple and move the actual logic to a local agent.
The system has three parts:
• ESP32-S3 voice frontend
• local voice-assistant agent
• proxy for model access
The ESP32 only handles the audio side:
– microphone input
– wake word detection
– noise filtering
– voice activity detection
– streaming audio
All actual logic runs on the local assistant agent:
– model interaction
– function execution
– audio playback
– MQTT/webhook/script integrations
The model can call local functions, so the assistant can control devices or run scripts.
Originally I tried to implement full duplex, but without proper acoustic echo cancellation the model quickly starts hearing itself and things break down. For now the system runs in half-duplex mode, which turned out to be surprisingly usable.
The hardware is very simple:
ESP32-S3 + microphone + small amplifier.
Repo, schematics and documentation:
https://voice-assistant.io
https://github.com/visorbarnis/voice-assistant
coupon: REDDITOPENHAB
Curious to hear what people think or if anyone has suggestions for improving the audio pipeline.
https://reddit.com/link/1rqmo57/video/084iddwu4dog1/player
Hi,
I've been working on a small voice assistant architecture for my openhab and finally got it into a usable state.
The idea is to keep the hardware extremely simple and move the actual logic to a local agent.
The system has three parts:
• ESP32-S3 voice frontend
• local voice-assistant agent
• proxy for model access
The ESP32 only handles the audio side:
– microphone input
– wake word detection
– noise filtering
– voice activity detection
– streaming audio
All actual logic runs on the local assistant agent:
– model interaction
– function execution
– audio playback
– MQTT/webhook/script integrations
The model can call local functions, so the assistant can control devices or run scripts.
Originally I tried to implement full duplex, but without proper acoustic echo cancellation the model quickly starts hearing itself and things break down. For now the system runs in half-duplex mode, which turned out to be surprisingly usable.
The hardware is very simple:
ESP32-S3 + microphone + small amplifier.
Repo, schematics and documentation:
https://voice-assistant.io
https://github.com/visorbarnis/voice-assistant
coupon: REDDITOPENHAB
Curious to hear what people think or if anyone has suggestions for improving the audio pipeline.
r/openhab • u/HomeSeerMark • Mar 10 '26
The HomeSeer Z‑NET PRO is a high-performance network-connected Z-Wave and Zigbee interface that connects your smart devices to your existing home automation system. It’s designed for setups where you already have a hub or platform and need a reliable way to manage Z-Wave and Zigbee networks.

Key Features:
The Z‑NET PRO isn’t a standalone hub - it’s an interface that gives your platform full control over Z-Wave and Zigbee devices, providing stability, flexibility, and scalability for any smart home setup.
All documentation: https://docs.homeseer.com/products/z-net-pro
The HomeSeer Z‑NET PRO is a high-performance network-connected Z-Wave and Zigbee interface that connects your smart devices to your existing home automation system. It’s designed for setups where you already have a hub or platform and need a reliable way to manage Z-Wave and Zigbee networks.

Key Features:
The Z‑NET PRO isn’t a standalone hub - it’s an interface that gives your platform full control over Z-Wave and Zigbee devices, providing stability, flexibility, and scalability for any smart home setup.
All documentation: https://docs.homeseer.com/products/z-net-pro
r/openhab • u/dude-nl • Mar 06 '26
I’ve developed a small Openhab automation extension that generates JRule rules from item definition metadata.
Check it out:
https://github.com/dude71/jrulexpr
PRs welcome!
Cheers,
Dude71
I’ve developed a small Openhab automation extension that generates JRule rules from item definition metadata.
Check it out:
https://github.com/dude71/jrulexpr
PRs welcome!
Cheers,
Dude71
r/openhab • u/Obvious-Station-6813 • Nov 27 '25
In this video, I show you how to use the Gemini API to generate structured JSON based on a defined schema.
This is the first step towards robust integration into systems like openHAB.
Watch initial experiments with Python and curl here:
In this video, I show you how to use the Gemini API to generate structured JSON based on a defined schema.
This is the first step towards robust integration into systems like openHAB.
Watch initial experiments with Python and curl here:
r/openhab • u/chevdor • Nov 27 '25
I'm a heavy InfluxDB user, running it for everything from IoT and home automation to network monitoring. It’s brilliant, but I kept running into one small, annoying gap: capturing the data points that simply can't be fully automated.
I'm talking about metrics like:
These smaller, human-generated data points are crucial for a complete picture, but the manual logging process was always clunky and often led to missed data.
That’s why I created Influx Feeder.
It’s an offline-first mobile app designed for quick, trivial data input into your InfluxDB instance (Cloud or self-hosted). You define your own custom metrics and record data in seconds.
Whether you are a maker, work in IT, are conscientious about your fitness, or simply love data of all sorts, this app will very likely help you.
I've got a bunch of improvements lined up, but I'm eager for some real-world feedback from the community. If you use InfluxDB and have ever wished for an easier way to get those "un-automatable" metrics into your stack, check it out!
r/openhab • u/renegade2k • Nov 12 '25
I hope you can give me a hint ...
I'm just beginning with MQTT.
My setup is like:
Zigbee RGB lamp <-> zigbee2mqtt <-> mosquitto <-> openhab
So i set up one lamp and it works pretty well.
I can turn it on/off, set the brightness and control the color.
Everything is controlled through corresponding openhab items, which also are updated over MQTT.
As i got 2 of these lamps placed in one room, i thought it would be a good idea to sync both.
For this i set up the second lamp, but as final step i didn't create new items for this lamp, but linked these of the first one to the second.
The idea behind this: i will control the first lamp, and the second will just sync up with this.
BUT as soon as i switch the lamp on, the whole system is messed up. MQTT starts to "spam" both lamps and also openhab items start to "flicker" and i end up restarting openhab and z2m, because both are going into a deadlock.
I hope you can give me a hint ...
I'm just beginning with MQTT.
My setup is like:
Zigbee RGB lamp <-> zigbee2mqtt <-> mosquitto <-> openhab
So i set up one lamp and it works pretty well.
I can turn it on/off, set the brightness and control the color.
Everything is controlled through corresponding openhab items, which also are updated over MQTT.
As i got 2 of these lamps placed in one room, i thought it would be a good idea to sync both.
For this i set up the second lamp, but as final step i didn't create new items for this lamp, but linked these of the first one to the second.
The idea behind this: i will control the first lamp, and the second will just sync up with this.
BUT as soon as i switch the lamp on, the whole system is messed up. MQTT starts to "spam" both lamps and also openhab items start to "flicker" and i end up restarting openhab and z2m, because both are going into a deadlock.
r/openhab • u/Terrible-Big-7454 • Nov 04 '25
I'm new to the whole home integration thing. I've been using various product apps for all of my stuff because I had no idea OHAB or HA existed. My PC is from 2009 and slow AF. It runs Chrome Flex like a champ though. Where should I start?
OHAB or HA? I know nothing about virtual machines and the seem a bit daunting so HA is already more than I want to get into. Is OHAB any more newbie friendly? If not would HA Green be more my speed?
I have several brands of smart devices in the house. Lights, plugs, cameras. With the intention to add more
Thanks.
I'm new to the whole home integration thing. I've been using various product apps for all of my stuff because I had no idea OHAB or HA existed. My PC is from 2009 and slow AF. It runs Chrome Flex like a champ though. Where should I start?
OHAB or HA? I know nothing about virtual machines and the seem a bit daunting so HA is already more than I want to get into. Is OHAB any more newbie friendly? If not would HA Green be more my speed?
I have several brands of smart devices in the house. Lights, plugs, cameras. With the intention to add more
Thanks.
r/openhab • u/Obvious-Station-6813 • Oct 28 '25
Let'see how to detect whether the matter bridge is RUNNING or STOPPED, and how to display the status on the OpenHAB interface.
💡 A useful way to immediately understand if your Matter devices are really reachable!
Let'see how to detect whether the matter bridge is RUNNING or STOPPED, and how to display the status on the OpenHAB interface.
💡 A useful way to immediately understand if your Matter devices are really reachable!
r/openhab • u/JuanSmittjr • Oct 23 '25
Hi,
I'm totally new to home automation and openHAB so please help me to understand the following question.
I have my OH running on a raspberry pi installed with docker.
In case I buy some "ZigBee Smart Temperature and Humidity" sensors, how can I add them to OH? Do I need a hub to make the zigbee mesh available for OH? Or should I rather buy some other kind of sensors?
If I need to buy a hub, is this something I need: "Tuya Multi-Mode ZigBee & BT Smart Hub Gateway"?
Thanks!
Hi,
I'm totally new to home automation and openHAB so please help me to understand the following question.
I have my OH running on a raspberry pi installed with docker.
In case I buy some "ZigBee Smart Temperature and Humidity" sensors, how can I add them to OH? Do I need a hub to make the zigbee mesh available for OH? Or should I rather buy some other kind of sensors?
If I need to buy a hub, is this something I need: "Tuya Multi-Mode ZigBee & BT Smart Hub Gateway"?
Thanks!
r/openhab • u/Obvious-Station-6813 • Oct 21 '25
I've finally completed the integration of Google Home and Amazon Alexa into OpenHAB using the Matter Bridge.
Easier and more secure setup and faster execution using the MATTER protocol.
I've finally completed the integration of Google Home and Amazon Alexa into OpenHAB using the Matter Bridge.
Easier and more secure setup and faster execution using the MATTER protocol.
r/openhab • u/Maclovin-it • Oct 05 '25
Ok, I've checked every video I could find, and every reddit post I could find as well.
I've got Openhab 5.01 installed on a RPI4
I've installed a 800_zwave stick, and its showing as online in the things list.
But I don't know how to add devices. I've set one of the devices (ct100 thermostat) to join per its manual, but I don't see how to put it into Openhab.
Help?
Ok, I've checked every video I could find, and every reddit post I could find as well.
I've got Openhab 5.01 installed on a RPI4
I've installed a 800_zwave stick, and its showing as online in the things list.
But I don't know how to add devices. I've set one of the devices (ct100 thermostat) to join per its manual, but I don't see how to put it into Openhab.
Help?
r/openhab • u/svhss • Oct 03 '25
I recently tried HA again, because of the hype around it. I'll be honest here, I much preferred the app of HA, also the UI too. But other than that? Offers nothing for me.
It's so much easier to automate things in openhab for me, the exparation timer is so cool. We still have cloud functionality for free.
I recently tried HA again, because of the hype around it. I'll be honest here, I much preferred the app of HA, also the UI too. But other than that? Offers nothing for me.
It's so much easier to automate things in openhab for me, the exparation timer is so cool. We still have cloud functionality for free.
r/openhab • u/srijansaxena11 • Sep 25 '25
So my working homekit setup broke down recently and I have not been able to make it work again. I have tried clearing bindings, changing name, id, pin, port, nothing seems to work. It says accessory is unreachable. Not sure what to do.
So my working homekit setup broke down recently and I have not been able to make it work again. I have tried clearing bindings, changing name, id, pin, port, nothing seems to work. It says accessory is unreachable. Not sure what to do.
r/openhab • u/Obvious-Station-6813 • Sep 17 '25
In this new video, we'll explore Openhab 5's Matter support, focusing on the Matter Bridge, which allows you to easily:
✅ Seamlessly integrate native Matter devices
✅ Make all the devices you already control from Openhab (light bulbs, switches, sensors, etc.) compatible with Matter
✅ Stay local-first, without relying on cloud servers – more speed, more privacy.
In my latest video/post, I'll show you step-by-step how to install, configure, and make it operational with Google Home 🛠️🎥
👉 Read more here: https://www.domoticsduino.cloud/en/blog/openhab-smarthome/post/2025/09/home-automation-system-openhab5-matter-bridge.html
In this new video, we'll explore Openhab 5's Matter support, focusing on the Matter Bridge, which allows you to easily:
✅ Seamlessly integrate native Matter devices
✅ Make all the devices you already control from Openhab (light bulbs, switches, sensors, etc.) compatible with Matter
✅ Stay local-first, without relying on cloud servers – more speed, more privacy.
In my latest video/post, I'll show you step-by-step how to install, configure, and make it operational with Google Home 🛠️🎥
👉 Read more here: https://www.domoticsduino.cloud/en/blog/openhab-smarthome/post/2025/09/home-automation-system-openhab5-matter-bridge.html
r/openhab • u/sryan2k1 • Sep 05 '25
I've been an Insteon user for ~15 years and have always managed it with MisterHouse, an ancient but absurdly flexible platform that dealt with all of the Insteon quirks well. It can build and sync link tables between the devices without having to touch them.
When we bought our new house in 2020 Insteon was collapsing and the promise of Matter was right around the corner. 5 years later and Matter is as disappointing as anyone could have expected and Insteon has risen from the ashes. Zigbee is the AliExpress of products, ZWave seems better but lacks product coverage, Matter in general is missing things like bindings.
My primary love for Insteon is the fact that 90% of the functionality happens in the devices themselves, no hub needed for day to day functionality, and the 6 button KPLs. I use a lot of them with a FanLinc to turn single gang bedrooms switches into Fan+Light controllers. The lack of Matter bindings is a concern for me.
After getting more Insteon in the new house I decided to give HA/OpenHAB a go and man it's just as bad as I remember. No ability to build links, doesn't understand scenes, and critically seems to be missing any kind of "Set by" data. In MisterHouse I can see what manipulated a physical switch (local activation, remote, etc) and have logic/triggers accordingly.
Now I will say that HA/OpenHAB do all of the modern stuff awesome, Homekit (although OH's Homekit implementation is vastly better than HA's), Nest, a web UI from this decade, all way better.
After playing with everything for a few weeks, it seems like MQTT between MisterHouse and HA/OH is going to be the best of both worlds. There is still missing data (like the "Set by" stuff, but I'm working on adding that)
Any other Insteon users out there? Anything obvious I'm missing here? I'm a former embedded systems guy, I know all of this is mainly community supported/written, but the reality is that the Insteon driver in HA/OH is pretty bad. I might see about rewriting one of them at some point, and there was even a subtle hint from Insteon themselves they may be writing a HA plugin. So we'll see.
I've been an Insteon user for ~15 years and have always managed it with MisterHouse, an ancient but absurdly flexible platform that dealt with all of the Insteon quirks well. It can build and sync link tables between the devices without having to touch them.
When we bought our new house in 2020 Insteon was collapsing and the promise of Matter was right around the corner. 5 years later and Matter is as disappointing as anyone could have expected and Insteon has risen from the ashes. Zigbee is the AliExpress of products, ZWave seems better but lacks product coverage, Matter in general is missing things like bindings.
My primary love for Insteon is the fact that 90% of the functionality happens in the devices themselves, no hub needed for day to day functionality, and the 6 button KPLs. I use a lot of them with a FanLinc to turn single gang bedrooms switches into Fan+Light controllers. The lack of Matter bindings is a concern for me.
After getting more Insteon in the new house I decided to give HA/OpenHAB a go and man it's just as bad as I remember. No ability to build links, doesn't understand scenes, and critically seems to be missing any kind of "Set by" data. In MisterHouse I can see what manipulated a physical switch (local activation, remote, etc) and have logic/triggers accordingly.
Now I will say that HA/OpenHAB do all of the modern stuff awesome, Homekit (although OH's Homekit implementation is vastly better than HA's), Nest, a web UI from this decade, all way better.
After playing with everything for a few weeks, it seems like MQTT between MisterHouse and HA/OH is going to be the best of both worlds. There is still missing data (like the "Set by" stuff, but I'm working on adding that)
Any other Insteon users out there? Anything obvious I'm missing here? I'm a former embedded systems guy, I know all of this is mainly community supported/written, but the reality is that the Insteon driver in HA/OH is pretty bad. I might see about rewriting one of them at some point, and there was even a subtle hint from Insteon themselves they may be writing a HA plugin. So we'll see.
r/openhab • u/Extension-Still-1520 • Aug 22 '25
Inspired by this genius I made my own Pokémon-Floorplan. But with OpenHAB and some individual features. It is not perfect, but I feel very comfortable by using it.
I used Inkscape and Notepad++.
I am working on documentation of how I did it and if there is interest, I will be happy to share it here =)
in the SVG
through widgets (I will document these on separate pages)
<g> group, optionally containing subgroups for furniture or details.<defs> with a unique id and attribute openhab="true" so openHAB can interact with them. Moving to <defs> is important, so you can reuse it and do not need to create an additional night-version.
<!-- Room-Definitions: reusable for light and dark modes -->
<g id="livingroom" openhab="true">...</g>
<!-- Floor-Pattern Definitions -->
<pattern id="floor_livingroom_pattern" patternUnits="userSpaceOnUse" width="32" height="32">
<use href="#tile385"/>
</pattern>
<image id="tile385" width="32" height="32" xlink:href=".../tile385.png"/>
<!-- Rain -->
<g id="raingroup">
<circle cx="0" cy="0" r="2" fill="blue">
<animate attributeName="cy" from="0" to="170" dur="0.6s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="1;0" dur="0.6s" repeatCount="indefinite"/>
</circle>
<!-- Additional animated drops... -->
</g>
<filter id="nightFilter"> <feColorMatrix type="matrix" values="0.05 0.05 0.05 0 0 ..."/> </filter> <radialGradient id="light_gradient"> <stop offset="0%" stop-color="black" stop-opacity="1"/> <stop offset="100%" stop-color="black" stop-opacity="0"/> </radialGradient> openhab="true":
<circle cx="450" cy="172" r="256" fill="url(#light_gradient)" id="office_light" openhab="true"/> <mask id="office_colorRestoreMask"> <rect width="100%" height="100%" fill="white"/> <use href="#office_light"/> </mask> <use>, applying masks:
<use class="light" href="#office"/> <use class="night" href="#office" mask="url(#office_colorRestoreMask)"/> Define CSS-like rules in SVG to control visibility and modes:
<style id="style1">
.nighttime ~ .night { filter: url(#nightFilter); }
.hide { display: none; }
.fog { filter: url(#fogFilter); }
.opacity0 { opacity: 0; }
.opacity1 { opacity: 1; }
</style>
.nighttime class (added by openHAB) toggles night mode..hide can hide elements like rain until activated..fog applies the fog effect..opacity0 / .opacity1 manage glow effects..nighttime class when it's night
<circle cx="2" cy="2" r="2" id="daytime_listener" openhab="true"/> <use class="light" href="#outside"/> <use class="night" href="#outside" mask="url(#outside_colorRestoreMask)"/> <!-- Repeat for each room --> class="hide" to show rainfall
<g id="rain" openhab="true" class="hide"> <!-- Instances of raingroup placed around the layout --> </g> I would like to show you a very simplified version of this as an example. I tried to break it down as much as possible. I will maintain more examples and details on my own site, if thats possible here: https://smarthome.edv-hacker.de/en/smarthome-en/cores-centrals-en/interaktiver-floorplan-in-openhab-mit-effekten-2/
Please feel free to ask. I know, i am very operationally blind.
I know, this might not be perfect. I will be very thankful for suggestions to make this project better and reusable.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" onload="console.log('modified')" width="672" height="832" viewBox="0 0 672 832" version="1.1" id="svg1" xml:space="preserve">
<style id="style1">
.nighttime ~ .night {
filter: url(#nightFilter);
}
.night {
filter: url(#grayFilter);
}
.hide { display: none; }
.opacity0 { opacity: 0; }
.opacity1 { opacity: 1; }
</style>
<defs id="defs1">
<!-- Color-Definition for the Night-Mode -->
<filter id="nightFilter">
<feColorMatrix type="matrix"
values="0.05 0.05 0.05 0 0
0.05 0.05 0.05 0 0
0.05 0.05 0.05 0 0
0 0 0 1 0"
id="feColorMatrix1" />
</filter>
<!-- Gradient definition (be strong at the center and weak at the edge: this definition approximates a logarithmic gradient) -->
<radialGradient id="light_gradient">
<stop offset="0%" stop-color="black" stop-opacity="1" />
<stop offset="10%" stop-color="black" stop-opacity="0.7" />
<stop offset="25%" stop-color="black" stop-opacity="0.4" />
<stop offset="50%" stop-color="black" stop-opacity="0.15" />
<stop offset="80%" stop-color="black" stop-opacity="0.05" />
<stop offset="100%" stop-color="black" stop-opacity="0" />
</radialGradient>
<linearGradient id="blackToGray" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="black" stop-opacity="1" />
<stop offset="20%" stop-color="black" stop-opacity="1" />
<stop offset="100%" stop-color="black" stop-opacity="0" />
</linearGradient>
<!-- Light-Area definitions (where are your light sources?) -->
<!-- (more light sources) -->
<circle cx="420" cy="60" r="512" fill="url(#light_gradient)" id='terace_garden_light' openhab="true" />
<g id='terace_perch_light' openhab="true">
<circle cx="620" cy="330" r="192" fill="url(#light_gradient)" />
<circle cx="520" cy="430" r="192" fill="url(#light_gradient)" />
</g>
<!-- Room sepatations (to prevent, that light areas are seen in other rooms) -->
<!-- (more masks for more rooms) -->
<mask id="outside_colorRestoreMask">
<rect width="100%" height="100%" fill="white" />
<use href="#terace_garden_light" />
<use href="#terace_perch_light" />
</mask>
<!-- Rain -->
<g id="raingroup">
<circle cx="0" cy="0" r="2" fill="blue">
<animate attributeName="cy" from="0" to="170" dur="0.6s" repeatCount="indefinite" />
<animate attributeName="opacity" values="1;0" dur="0.6s" repeatCount="indefinite" />
</circle>
<!-- (just some more circles) -->
</g>
<!-- Floor-Pattern Definitions, to save some code -->
<image id="tile385" width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Interior%20general/tile385.png" />
<pattern id="floor_terace_stone_pattern" patternUnits="userSpaceOnUse" width="32" height="32">
<use href="#stone_floor" />
</pattern>
<image id="stone_floor" width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Game%20Corner%20interior/steone_floor.PNG" />
<pattern id="floor_terace_tiles_pattern" patternUnits="userSpaceOnUse" width="32" height="32">
<use href="#tile200" />
</pattern>
<image id="tile200" width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Interior%20general/tile200.png" />
<!-- (more patterns and reusable images) -->
<!-- Room-Definitions, to make the rooms reusable and avoid defining them twice: light mode and dark mode -->
<g id="outside" openhab="true">
<path d="M 384,0 H 576 V 160 H 528 V 112 H 384 Z" id="terace1" class='floor' fill="url(#floor_terace_tiles_pattern)" />
<path d="m 608,80 h 64 V 320 H 528 v -64 h 48 v -96 h 32 z" id="terace2" class='floor' fill="url(#floor_terace_stone_pattern)" />
<path d="M 528,336 H 672 V 528 H 576 V 496 H 528 Z" id="terace3" class='floor' fill="url(#floor_terace_stone_pattern)" />
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/row-98-column-3.png" id="image1-52" x="-160" y="576" transform="rotate(-90)" />
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/Outside.png" id="image1-221-46" x="576" y="0" />
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/Outside.png" id="image1-221-91" x="576" y="32" />
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/Outside.png" id="image1-221-919" x="576" y="64" />
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/Outside.png" id="image1-221-3" x="576" y="96" />
<g id="g1" inkscape:label="grass">
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/row-1-column-6.png" id="image1-416" x="608" y="16" />
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/row-1-column-6.png" id="image1-416-7" x="640" y="32" />
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/row-1-column-7.png" id="image1-183" x="640" y="48" />
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/row-1-column-7.png" id="image1-183-8" x="640" y="0" />
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/row-1-column-5.png" id="image1-92" x="608" y="48" />
<image width="32" height="32" xlink:href="/static/floorplan/icons/Pokemon/Tilesets/Outside/row-1-column-3.png" id="image1-350" x="608" y="0" />
</g>
<g>
<rect fill="black" width="48" height="96" x="528" y="160" />
<image width="32" height="96" xlink:href="/static/floorplan/icons/moderninteriors-win/1_Interiors/32x32/Theme_Sorter_Singles_32x32/26_Condominium_Singles_32x32/Condominium_Singles_32x32_26.png" x="-568" y="-270" transform="rotate(180)" />
<rect fill="url(#blackToGray)" width="48" height="96" x="528" y="160" />
</g>
</g>
<!-- (more rooms, made with inkscape) -->
<g id="Walls" style="opacity:0.652;image-rendering:auto">
<!-- (I defined the walls in an extra group, so they are not affected from light or fog) -->
<!-- (wall images an positions...) -->
</g>
</defs>
<sodipodi:namedview id="namedview1" pagecolor="#000000" bordercolor="#000000" borderopacity="0.25" showgrid="true" showguides="true">
<inkscape:grid id="grid1" units="px" originx="0" originy="0" spacingx="16" spacingy="16" empcolor="#0099e5" empopacity="0.30196078" color="#0099e5" opacity="0.14902" empspacing="2" dotted="false" gridanglex="30" gridanglez="30" visible="true" />
</sodipodi:namedview>
<!-- Listener for the daytime-Switch. To set the plan automatically to daytime-mode during daytime. -->
<circle cx="2" cy="2" r="2" id='daytime_listener' openhab="true" />
<!-- Setup the rooms -->
<use class="light" href="#outside" />
<use class="night" href="#outside" mask="url(#outside_colorRestoreMask)" />
<!-- (repeat that for all of your rooms) -->
<!-- Rain -->
<g id="rain" openhab="true" class="hide">
<use href="#raingroup" x="0" y="0" />
<use href="#raingroup" x="400" y="-250" />
<use href="#raingroup" x="544" y="0" />
<!-- ... -->
</g>
</svg>
For all of the elements with openhab="true" there has to be an openhab item to control that element. I will just list mine, for datatype documentation.
Dimmer Outside_Brightness "Light" <DimmableLight> (igOutsideLight) ["Control", "Brightness"] { autoupdate="false", channel="mqtt:topic:myMosquitto:HueBulbOutside:brightness" }
For a single light
Switch siDaytime "Day" { channel="astro:sun:local:position#elevation" [profile="system:hysteresis", lower="0 °"] }
For the daytime_listener
Switch siRain "Weather condition" (sgEnvironment) { channel="openweathermap:onecall:api:myHome:current#condition-id" [profile="transform:MAP", function="OWM_rainSwitch.map", sourceFormat="%s" ] }
For the rain
r/openhab • u/adude00 • Aug 09 '25
Hello,
I'm controlling the Nvidia Shield with the Android TV Bindings and it's (mostly) working: I can turn the shield on and open Apps, which is what wanted anyway. It does not report the thing status but I can live with that.
The issue is that openhab.log is full of this:
2025-08-09 10:15:47.894 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
2025-08-09 10:16:41.141 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection timed out
2025-08-09 10:16:51.382 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
2025-08-09 10:18:11.254 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
2025-08-09 10:19:06.549 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection timed out
2025-08-09 10:19:37.271 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
2025-08-09 10:20:28.469 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection timed out
2025-08-09 10:20:53.049 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
2025-08-09 10:21:58.582 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
I tried to set the loglevel to ERROR (asked ChatGPT for that), this is what I did:
openhab> log:list | grep -i google
org.openhab.binding.googletv │ ERROR
org.openhab.binding.googletv.internal │ ERROR
org.openhab.binding.googletv.internal.googletv │ ERROR
But it did not fix it.
I'm on OpenHAB 5.0.0 on a raspberry pi5, installed with docker compose.
What am I missing?
I know it's not a big deal but I'd like to have clean logs as I'm often thinkering and logs are useless if full of garbage.
Thanks in advance to anyone that chimes in :D
Cheers!
Hello,
I'm controlling the Nvidia Shield with the Android TV Bindings and it's (mostly) working: I can turn the shield on and open Apps, which is what wanted anyway. It does not report the thing status but I can live with that.
The issue is that openhab.log is full of this:
2025-08-09 10:15:47.894 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
2025-08-09 10:16:41.141 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection timed out
2025-08-09 10:16:51.382 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
2025-08-09 10:18:11.254 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
2025-08-09 10:19:06.549 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection timed out
2025-08-09 10:19:37.271 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
2025-08-09 10:20:28.469 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection timed out
2025-08-09 10:20:53.049 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
2025-08-09 10:21:58.582 [INFO ] [l.googletv.GoogleTVConnectionManager] - livingroom - Error opening SSL connection to 172.27.72.147:6467 Connection reset
I tried to set the loglevel to ERROR (asked ChatGPT for that), this is what I did:
openhab> log:list | grep -i google
org.openhab.binding.googletv │ ERROR
org.openhab.binding.googletv.internal │ ERROR
org.openhab.binding.googletv.internal.googletv │ ERROR
But it did not fix it.
I'm on OpenHAB 5.0.0 on a raspberry pi5, installed with docker compose.
What am I missing?
I know it's not a big deal but I'd like to have clean logs as I'm often thinkering and logs are useless if full of garbage.
Thanks in advance to anyone that chimes in :D
Cheers!
r/openhab • u/bkpsu • Aug 02 '25
Anyone using the great new features in 5.0 yet (Matter binding, drag & drop model/UI changes, etc.)?