Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
da370c9050
|
|||
|
08294ca294
|
|||
|
e5eb368dca
|
|||
|
169d0505cb
|
@@ -8,9 +8,9 @@ ENV PYTHONDONTWRITEBYTECODE=1 \
|
|||||||
PYTHONUNBUFFERED=1 \
|
PYTHONUNBUFFERED=1 \
|
||||||
MQTT_BROKER=172.16.2.16 \
|
MQTT_BROKER=172.16.2.16 \
|
||||||
MQTT_PORT=1883 \
|
MQTT_PORT=1883 \
|
||||||
REDIS_HOST=localhost \
|
REDIS_HOST=172.23.1.116 \
|
||||||
REDIS_PORT=6379 \
|
REDIS_PORT=6379 \
|
||||||
REDIS_DB=0 \
|
REDIS_DB=8 \
|
||||||
REDIS_CHANNEL=ui:updates
|
REDIS_CHANNEL=ui:updates
|
||||||
|
|
||||||
# Create non-root user
|
# Create non-root user
|
||||||
|
|||||||
@@ -121,7 +121,10 @@ async def get_device_layout(device_id: str):
|
|||||||
async def startup_event():
|
async def startup_event():
|
||||||
"""Include routers after app is initialized to avoid circular imports."""
|
"""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.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(groups_scenes_router, prefix="")
|
||||||
|
app.include_router(rooms_router, prefix="")
|
||||||
|
|
||||||
|
|
||||||
@app.get("/health")
|
@app.get("/health")
|
||||||
|
|||||||
@@ -416,6 +416,7 @@
|
|||||||
if (feedbackDevice) {
|
if (feedbackDevice) {
|
||||||
const feedbackSection = document.createElement('div');
|
const feedbackSection = document.createElement('div');
|
||||||
feedbackSection.className = 'device-section';
|
feedbackSection.className = 'device-section';
|
||||||
|
feedbackSection.dataset.deviceId = feedbackDevice.device_id;
|
||||||
renderFeedbackDisplay(feedbackSection, feedbackDevice);
|
renderFeedbackDisplay(feedbackSection, feedbackDevice);
|
||||||
container.appendChild(feedbackSection);
|
container.appendChild(feedbackSection);
|
||||||
}
|
}
|
||||||
@@ -463,19 +464,12 @@
|
|||||||
const label = document.createElement('div');
|
const label = document.createElement('div');
|
||||||
label.className = 'toggle-label';
|
label.className = 'toggle-label';
|
||||||
|
|
||||||
const values = Object.values(state || {});
|
console.log(`Rendering feedback for ${device.device_id}:`, state);
|
||||||
const isActive = values.some(v =>
|
|
||||||
v === true ||
|
|
||||||
v === 'on' ||
|
|
||||||
v === 1
|
|
||||||
);
|
|
||||||
|
|
||||||
if (values.length === 0) {
|
if (state.contact === 'closed') {
|
||||||
label.textContent = 'Kein Status verfügbar';
|
label.textContent = 'Schütz ✅ eingeschaltet';
|
||||||
} else {
|
} else {
|
||||||
label.textContent = isActive
|
label.textContent = 'Schütz 🅾️ ausgeschaltet';
|
||||||
? 'Fahrzeug verbunden'
|
|
||||||
: 'Kein Fahrzeug verbunden';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
controlGroup.appendChild(label);
|
controlGroup.appendChild(label);
|
||||||
@@ -614,12 +608,14 @@
|
|||||||
const state = deviceStates[deviceId];
|
const state = deviceStates[deviceId];
|
||||||
console.log(`Updating UI for ${deviceId}:`, state);
|
console.log(`Updating UI for ${deviceId}:`, state);
|
||||||
|
|
||||||
switch (device.type) {
|
switch (deviceId) {
|
||||||
case 'relay':
|
case 'power_relay_caroutlet':
|
||||||
case 'outlet':
|
|
||||||
updateOutletUI(deviceId, state);
|
updateOutletUI(deviceId, state);
|
||||||
break;
|
break;
|
||||||
case 'three_phase_powermeter':
|
case 'sensor_caroutlet':
|
||||||
|
updateFeedbackDisplay(deviceId, state);
|
||||||
|
break;
|
||||||
|
case 'powermeter_caroutlet':
|
||||||
updateThreePhasePowerUI(deviceId, state);
|
updateThreePhasePowerUI(deviceId, state);
|
||||||
break;
|
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) {
|
function updateThreePhasePowerUI(deviceId, state) {
|
||||||
// Update overview
|
// Update overview
|
||||||
const totalPower = document.getElementById(`total-power-${deviceId}`);
|
const totalPower = document.getElementById(`total-power-${deviceId}`);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
rooms:
|
rooms:
|
||||||
- name: Schlafzimmer
|
- id: Schlafzimmer
|
||||||
|
name: Schlafzimmer
|
||||||
devices:
|
devices:
|
||||||
- device_id: bettlicht_patty
|
- device_id: bettlicht_patty
|
||||||
title: Bettlicht Patty
|
title: Bettlicht Patty
|
||||||
@@ -33,7 +34,8 @@ rooms:
|
|||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
rank: 47
|
rank: 47
|
||||||
- name: Esszimmer
|
- id: Esszimmer
|
||||||
|
name: Esszimmer
|
||||||
devices:
|
devices:
|
||||||
- device_id: deckenlampe_esszimmer
|
- device_id: deckenlampe_esszimmer
|
||||||
title: Deckenlampe Esszimmer
|
title: Deckenlampe Esszimmer
|
||||||
@@ -79,7 +81,8 @@ rooms:
|
|||||||
title: Kontakt Straße links
|
title: Kontakt Straße links
|
||||||
icon: 🪟
|
icon: 🪟
|
||||||
rank: 97
|
rank: 97
|
||||||
- name: Wohnzimmer
|
- id: Wohnzimmer
|
||||||
|
name: Wohnzimmer
|
||||||
devices:
|
devices:
|
||||||
- device_id: lampe_naehtischchen_wohnzimmer
|
- device_id: lampe_naehtischchen_wohnzimmer
|
||||||
title: Lampe Naehtischchen Wohnzimmer
|
title: Lampe Naehtischchen Wohnzimmer
|
||||||
@@ -121,7 +124,8 @@ rooms:
|
|||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
rank: 138
|
rank: 138
|
||||||
- name: Küche
|
- id: Küche
|
||||||
|
name: Küche
|
||||||
devices:
|
devices:
|
||||||
- device_id: kueche_deckenlampe
|
- device_id: kueche_deckenlampe
|
||||||
title: Küche Deckenlampe
|
title: Küche Deckenlampe
|
||||||
@@ -163,7 +167,8 @@ rooms:
|
|||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
rank: 155
|
rank: 155
|
||||||
- name: Arbeitszimmer Patty
|
- id: Arbeitszimmer Patty
|
||||||
|
name: Arbeitszimmer Patty
|
||||||
devices:
|
devices:
|
||||||
- device_id: leselampe_patty
|
- device_id: leselampe_patty
|
||||||
title: Leselampe Patty
|
title: Leselampe Patty
|
||||||
@@ -205,7 +210,8 @@ rooms:
|
|||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
rank: 189
|
rank: 189
|
||||||
- name: Arbeitszimmer Wolfgang
|
- id: Arbeitszimmer Wolfgang
|
||||||
|
name: Arbeitszimmer Wolfgang
|
||||||
devices:
|
devices:
|
||||||
- device_id: thermostat_wolfgang
|
- device_id: thermostat_wolfgang
|
||||||
title: Wolfgang
|
title: Wolfgang
|
||||||
@@ -223,7 +229,8 @@ rooms:
|
|||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
rank: 202
|
rank: 202
|
||||||
- name: Flur
|
- id: Flur
|
||||||
|
name: Flur
|
||||||
devices:
|
devices:
|
||||||
- device_id: deckenlampe_flur_oben
|
- device_id: deckenlampe_flur_oben
|
||||||
title: Deckenlampe Flur oben
|
title: Deckenlampe Flur oben
|
||||||
@@ -249,7 +256,8 @@ rooms:
|
|||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
rank: 235
|
rank: 235
|
||||||
- name: Sportzimmer
|
- id: Sportzimmer
|
||||||
|
name: Sportzimmer
|
||||||
devices:
|
devices:
|
||||||
- device_id: sportlicht_regal
|
- device_id: sportlicht_regal
|
||||||
title: Sportlicht Regal
|
title: Sportlicht Regal
|
||||||
@@ -267,7 +275,8 @@ rooms:
|
|||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
rank: 265
|
rank: 265
|
||||||
- name: Bad Oben
|
- id: Bad Oben
|
||||||
|
name: Bad Oben
|
||||||
devices:
|
devices:
|
||||||
- device_id: thermostat_bad_oben
|
- device_id: thermostat_bad_oben
|
||||||
title: Thermostat Bad Oben
|
title: Thermostat Bad Oben
|
||||||
@@ -281,7 +290,8 @@ rooms:
|
|||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
rank: 272
|
rank: 272
|
||||||
- name: Bad Unten
|
- id: Bad Unten
|
||||||
|
name: Bad Unten
|
||||||
devices:
|
devices:
|
||||||
- device_id: thermostat_bad_unten
|
- device_id: thermostat_bad_unten
|
||||||
title: Thermostat Bad Unten
|
title: Thermostat Bad Unten
|
||||||
@@ -295,13 +305,15 @@ rooms:
|
|||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
rank: 282
|
rank: 282
|
||||||
- name: Waschküche
|
- id: Waschküche
|
||||||
|
name: Waschküche
|
||||||
devices:
|
devices:
|
||||||
- device_id: sensor_waschkueche
|
- device_id: sensor_waschkueche
|
||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
rank: 290
|
rank: 290
|
||||||
- name: Outdoor
|
- id: Outdoor
|
||||||
|
name: Outdoor
|
||||||
devices:
|
devices:
|
||||||
- device_id: licht_terasse
|
- device_id: licht_terasse
|
||||||
title: Licht Terasse
|
title: Licht Terasse
|
||||||
@@ -311,14 +323,15 @@ rooms:
|
|||||||
title: Gartenlicht vorne
|
title: Gartenlicht vorne
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 291
|
rank: 291
|
||||||
- name: Garage
|
- id: Garage
|
||||||
|
name: Garage
|
||||||
devices:
|
devices:
|
||||||
- device_id: power_relay_caroutlet
|
- device_id: power_relay_caroutlet
|
||||||
title: Ladestrom
|
title: Ladestrom
|
||||||
icon: ⚡
|
icon: ⚡
|
||||||
rank: 310
|
rank: 310
|
||||||
- device_id: sensor_caroutlet
|
- device_id: sensor_caroutlet
|
||||||
title: Kabelstatus
|
title: Schützzustand
|
||||||
icon: 🔌
|
icon: 🔌
|
||||||
rank: 315
|
rank: 315
|
||||||
- device_id: powermeter_caroutlet
|
- device_id: powermeter_caroutlet
|
||||||
|
|||||||
@@ -46,10 +46,16 @@ class Room(BaseModel):
|
|||||||
"""Represents a room containing devices.
|
"""Represents a room containing devices.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
id: Unique room identifier (used for API endpoints)
|
||||||
name: Room name (e.g., "Wohnzimmer", "Küche")
|
name: Room name (e.g., "Wohnzimmer", "Küche")
|
||||||
devices: List of device tiles in this room
|
devices: List of device tiles in this room
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
id: str = Field(
|
||||||
|
...,
|
||||||
|
description="Unique room identifier"
|
||||||
|
)
|
||||||
|
|
||||||
name: str = Field(
|
name: str = Field(
|
||||||
...,
|
...,
|
||||||
description="Room name"
|
description="Room name"
|
||||||
|
|||||||
Reference in New Issue
Block a user