Compare commits

..

4 Commits

Author SHA1 Message Date
da370c9050 room id
All checks were successful
ci/woodpecker/tag/build/5 Pipeline was successful
ci/woodpecker/tag/build/6 Pipeline was successful
ci/woodpecker/tag/build/4 Pipeline was successful
ci/woodpecker/tag/namespace Pipeline was successful
ci/woodpecker/tag/build/1 Pipeline was successful
ci/woodpecker/tag/config Pipeline was successful
ci/woodpecker/tag/build/7 Pipeline was successful
ci/woodpecker/tag/build/2 Pipeline was successful
ci/woodpecker/tag/build/3 Pipeline was successful
ci/woodpecker/tag/deploy/3 Pipeline was successful
ci/woodpecker/tag/deploy/2 Pipeline was successful
ci/woodpecker/tag/deploy/1 Pipeline was successful
ci/woodpecker/tag/deploy/5 Pipeline was successful
ci/woodpecker/tag/deploy/6 Pipeline was successful
ci/woodpecker/tag/deploy/4 Pipeline was successful
ci/woodpecker/tag/ingress Pipeline was successful
2025-12-09 17:13:51 +01:00
08294ca294 started 4
All checks were successful
ci/woodpecker/tag/build/5 Pipeline was successful
ci/woodpecker/tag/build/6 Pipeline was successful
ci/woodpecker/tag/namespace Pipeline was successful
ci/woodpecker/tag/build/4 Pipeline was successful
ci/woodpecker/tag/build/1 Pipeline was successful
ci/woodpecker/tag/build/3 Pipeline was successful
ci/woodpecker/tag/build/7 Pipeline was successful
ci/woodpecker/tag/config Pipeline was successful
ci/woodpecker/tag/build/2 Pipeline was successful
ci/woodpecker/tag/deploy/3 Pipeline was successful
ci/woodpecker/tag/deploy/5 Pipeline was successful
ci/woodpecker/tag/deploy/2 Pipeline was successful
ci/woodpecker/tag/deploy/6 Pipeline was successful
ci/woodpecker/tag/deploy/4 Pipeline was successful
ci/woodpecker/tag/deploy/1 Pipeline was successful
ci/woodpecker/tag/ingress Pipeline was successful
2025-12-09 13:34:41 +01:00
e5eb368dca started 3 2025-12-09 13:00:47 +01:00
169d0505cb started 2
All checks were successful
ci/woodpecker/tag/build/5 Pipeline was successful
ci/woodpecker/tag/build/6 Pipeline was successful
ci/woodpecker/tag/build/1 Pipeline was successful
ci/woodpecker/tag/namespace Pipeline was successful
ci/woodpecker/tag/build/4 Pipeline was successful
ci/woodpecker/tag/config Pipeline was successful
ci/woodpecker/tag/build/3 Pipeline was successful
ci/woodpecker/tag/build/7 Pipeline was successful
ci/woodpecker/tag/build/2 Pipeline was successful
ci/woodpecker/tag/deploy/4 Pipeline was successful
ci/woodpecker/tag/deploy/3 Pipeline was successful
ci/woodpecker/tag/deploy/5 Pipeline was successful
ci/woodpecker/tag/deploy/6 Pipeline was successful
ci/woodpecker/tag/deploy/1 Pipeline was successful
ci/woodpecker/tag/deploy/2 Pipeline was successful
ci/woodpecker/tag/ingress Pipeline was successful
2025-12-09 12:53:53 +01:00
5 changed files with 72 additions and 31 deletions

View File

@@ -8,9 +8,9 @@ ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
MQTT_BROKER=172.16.2.16 \
MQTT_PORT=1883 \
REDIS_HOST=localhost \
REDIS_HOST=172.23.1.116 \
REDIS_PORT=6379 \
REDIS_DB=0 \
REDIS_DB=8 \
REDIS_CHANNEL=ui:updates
# Create non-root user

View File

@@ -121,7 +121,10 @@ async def get_device_layout(device_id: str):
async def startup_event():
"""Include routers after app is initialized to avoid circular imports."""
from apps.api.routes.groups_scenes import router as groups_scenes_router
from apps.api.routes.rooms import router as rooms_router
app.include_router(groups_scenes_router, prefix="")
app.include_router(rooms_router, prefix="")
@app.get("/health")

View File

@@ -416,6 +416,7 @@
if (feedbackDevice) {
const feedbackSection = document.createElement('div');
feedbackSection.className = 'device-section';
feedbackSection.dataset.deviceId = feedbackDevice.device_id;
renderFeedbackDisplay(feedbackSection, feedbackDevice);
container.appendChild(feedbackSection);
}
@@ -463,19 +464,12 @@
const label = document.createElement('div');
label.className = 'toggle-label';
const values = Object.values(state || {});
const isActive = values.some(v =>
v === true ||
v === 'on' ||
v === 1
);
console.log(`Rendering feedback for ${device.device_id}:`, state);
if (values.length === 0) {
label.textContent = 'Kein Status verfügbar';
if (state.contact === 'closed') {
label.textContent = 'Schütz ✅ eingeschaltet';
} else {
label.textContent = isActive
? 'Fahrzeug verbunden'
: 'Kein Fahrzeug verbunden';
label.textContent = 'Schütz 🅾️ ausgeschaltet';
}
controlGroup.appendChild(label);
@@ -614,12 +608,14 @@
const state = deviceStates[deviceId];
console.log(`Updating UI for ${deviceId}:`, state);
switch (device.type) {
case 'relay':
case 'outlet':
switch (deviceId) {
case 'power_relay_caroutlet':
updateOutletUI(deviceId, state);
break;
case 'three_phase_powermeter':
case 'sensor_caroutlet':
updateFeedbackDisplay(deviceId, state);
break;
case 'powermeter_caroutlet':
updateThreePhasePowerUI(deviceId, state);
break;
}
@@ -650,6 +646,29 @@
}
}
function updateFeedbackDisplay(deviceId, state) {
const section = document.querySelector(`[data-device-id="${deviceId}"]`);
if (!section) return;
const label = section.querySelector('.toggle-label');
if (label) {
const isOn = state.contact === 'closed';
label.textContent = isOn ? 'Schütz ✅ eingeschaltet' : 'Schütz 🅾️ ausgeschaltet';
// Update state display in separate card
const cards = section.querySelectorAll('.card');
if (cards.length >= 3) { // Header, Control, State
const stateCard = cards[2];
stateCard.innerHTML = `
<div style="font-size: 18px; font-weight: 600; color: ${isOn ? '#34c759' : '#666'};">
Status: ${isOn ? 'Eingeschaltet' : 'Ausgeschaltet'}
</div>
`;
}
}
}
function updateThreePhasePowerUI(deviceId, state) {
// Update overview
const totalPower = document.getElementById(`total-power-${deviceId}`);

View File

@@ -1,5 +1,6 @@
rooms:
- name: Schlafzimmer
- id: Schlafzimmer
name: Schlafzimmer
devices:
- device_id: bettlicht_patty
title: Bettlicht Patty
@@ -33,7 +34,8 @@ rooms:
title: Temperatur & Luftfeuchte
icon: 🌡️
rank: 47
- name: Esszimmer
- id: Esszimmer
name: Esszimmer
devices:
- device_id: deckenlampe_esszimmer
title: Deckenlampe Esszimmer
@@ -79,7 +81,8 @@ rooms:
title: Kontakt Straße links
icon: 🪟
rank: 97
- name: Wohnzimmer
- id: Wohnzimmer
name: Wohnzimmer
devices:
- device_id: lampe_naehtischchen_wohnzimmer
title: Lampe Naehtischchen Wohnzimmer
@@ -121,7 +124,8 @@ rooms:
title: Temperatur & Luftfeuchte
icon: 🌡️
rank: 138
- name: Küche
- id: Küche
name: Küche
devices:
- device_id: kueche_deckenlampe
title: Küche Deckenlampe
@@ -163,7 +167,8 @@ rooms:
title: Temperatur & Luftfeuchte
icon: 🌡️
rank: 155
- name: Arbeitszimmer Patty
- id: Arbeitszimmer Patty
name: Arbeitszimmer Patty
devices:
- device_id: leselampe_patty
title: Leselampe Patty
@@ -205,7 +210,8 @@ rooms:
title: Temperatur & Luftfeuchte
icon: 🌡️
rank: 189
- name: Arbeitszimmer Wolfgang
- id: Arbeitszimmer Wolfgang
name: Arbeitszimmer Wolfgang
devices:
- device_id: thermostat_wolfgang
title: Wolfgang
@@ -223,7 +229,8 @@ rooms:
title: Temperatur & Luftfeuchte
icon: 🌡️
rank: 202
- name: Flur
- id: Flur
name: Flur
devices:
- device_id: deckenlampe_flur_oben
title: Deckenlampe Flur oben
@@ -249,7 +256,8 @@ rooms:
title: Temperatur & Luftfeuchte
icon: 🌡️
rank: 235
- name: Sportzimmer
- id: Sportzimmer
name: Sportzimmer
devices:
- device_id: sportlicht_regal
title: Sportlicht Regal
@@ -267,7 +275,8 @@ rooms:
title: Temperatur & Luftfeuchte
icon: 🌡️
rank: 265
- name: Bad Oben
- id: Bad Oben
name: Bad Oben
devices:
- device_id: thermostat_bad_oben
title: Thermostat Bad Oben
@@ -281,7 +290,8 @@ rooms:
title: Temperatur & Luftfeuchte
icon: 🌡️
rank: 272
- name: Bad Unten
- id: Bad Unten
name: Bad Unten
devices:
- device_id: thermostat_bad_unten
title: Thermostat Bad Unten
@@ -295,13 +305,15 @@ rooms:
title: Temperatur & Luftfeuchte
icon: 🌡️
rank: 282
- name: Waschküche
- id: Waschküche
name: Waschküche
devices:
- device_id: sensor_waschkueche
title: Temperatur & Luftfeuchte
icon: 🌡️
rank: 290
- name: Outdoor
- id: Outdoor
name: Outdoor
devices:
- device_id: licht_terasse
title: Licht Terasse
@@ -311,14 +323,15 @@ rooms:
title: Gartenlicht vorne
icon: 💡
rank: 291
- name: Garage
- id: Garage
name: Garage
devices:
- device_id: power_relay_caroutlet
title: Ladestrom
icon:
rank: 310
- device_id: sensor_caroutlet
title: Kabelstatus
title: Schützzustand
icon: 🔌
rank: 315
- device_id: powermeter_caroutlet

View File

@@ -46,10 +46,16 @@ class Room(BaseModel):
"""Represents a room containing devices.
Attributes:
id: Unique room identifier (used for API endpoints)
name: Room name (e.g., "Wohnzimmer", "Küche")
devices: List of device tiles in this room
"""
id: str = Field(
...,
description="Unique room identifier"
)
name: str = Field(
...,
description="Room name"