@@ -9081,31 +9081,63 @@ class FastSearchCard extends HTMLElement {
90819081
90829082 // NEU: Timer by ID laden
90839083 async getTimerById(timerId) {
9084- // Implementierung je nach Ihrem Backend
9085- // Beispiel für Home Assistant Scheduler:
90869084 try {
9085+ // Korrekte WebSocket-Anfrage für Home Assistant Scheduler
90879086 const schedules = await this._hass.callWS({
9088- type: 'scheduler/items'
9087+ type: 'call_service',
9088+ domain: 'scheduler',
9089+ service: 'list',
9090+ service_data: {}
90899091 });
9092+
9093+ // Alternative: Falls das nicht funktioniert, versuchen Sie:
9094+ // const schedules = this._hass.states;
9095+ // return Object.values(schedules).find(s => s.entity_id.includes(timerId));
9096+
90909097 return schedules.find(s => s.schedule_id === timerId);
90919098 } catch (error) {
90929099 console.error('Fehler beim Laden des Timers:', error);
9093- return null;
9100+
9101+ // Fallback: Timer-Daten aus der aktuellen Liste holen
9102+ return this.getCurrentTimerFromList(timerId);
90949103 }
90959104 }
9105+
9106+ // FALLBACK: Timer aus der aktuellen Anzeige holen
9107+ getCurrentTimerFromList(timerId) {
9108+ // Vereinfachter Ansatz: Nimm die ursprüngliche Aktion vom Button
9109+ if (this.lastLoadedTimers) {
9110+ return this.lastLoadedTimers.find(t => t.schedule_id === timerId);
9111+ }
9112+
9113+ // Minimal-Timer-Objekt für Edit-Zwecke
9114+ return {
9115+ schedule_id: timerId,
9116+ action: 'turn_off', // Default-Aktion
9117+ name: 'Timer'
9118+ };
9119+ }
90969120
90979121 // NEU: Timer-Zeit aktualisieren
90989122 async updateTimerTime(timerId, newTotalMinutes) {
9099- const future = new Date(Date.now() + newTotalMinutes * 60 * 1000);
9100- const timeString = future.toTimeString().slice(0, 5);
9101-
9102- await this._hass.callService('scheduler', 'edit', {
9103- entity_id: `schedule.${timerId}`,
9104- timeslots: [{
9105- start: timeString,
9106- // Weitere Timer-Daten beibehalten...
9107- }]
9108- });
9123+ try {
9124+ const future = new Date(Date.now() + newTotalMinutes * 60 * 1000);
9125+ const timeString = future.toTimeString().slice(0, 5);
9126+
9127+ // Korrekte Service-Calls für Scheduler
9128+ await this._hass.callService('scheduler', 'edit', {
9129+ entity_id: timerId,
9130+ timeslots: [{
9131+ start: timeString
9132+ }]
9133+ });
9134+
9135+ console.log(`✅ Timer ${timerId} erfolgreich auf ${newTotalMinutes} Minuten aktualisiert`);
9136+
9137+ } catch (error) {
9138+ console.error('❌ Fehler beim Aktualisieren des Timers:', error);
9139+ throw error;
9140+ }
91099141 }
91109142
91119143 closeMinimalTimePicker(parentContainer) {
@@ -9541,7 +9573,7 @@ class FastSearchCard extends HTMLElement {
95419573 console.error('❌ Timer Fehler:', error);
95429574 // TODO: Error Toast (später)
95439575 }
9544-
9576+
95459577 async loadActiveTimers(entityId) {
95469578 const container = this.shadowRoot.getElementById(`active-timers-${entityId}`);
95479579 if (!container) return;
@@ -9562,14 +9594,12 @@ class FastSearchCard extends HTMLElement {
95629594 const belongsToEntity = schedule.timeslots && schedule.timeslots.some(slot =>
95639595 slot.actions && slot.actions.some(action => action.entity_id === entityId)
95649596 );
9565-
95669597 // Timer = einmalige Ausführung (erkennt man am Namen oder fehlendem repeat_type)
95679598 const isTimer = !schedule.weekdays ||
95689599 schedule.weekdays.length === 0 ||
95699600 (schedule.name && schedule.name.includes('min)')) || // Timer haben oft "(30min)" im Namen
95709601 schedule.repeat_type === 'once' ||
95719602 !schedule.repeat_type;
9572-
95739603 // DEBUG: Zeige alle relevanten Schedules
95749604 if (belongsToEntity) {
95759605 console.log(`🔍 TIMER DEBUG - Schedule: ${schedule.name}, weekdays: ${JSON.stringify(schedule.weekdays)}, isTimer: ${isTimer}`);
@@ -9580,7 +9610,11 @@ class FastSearchCard extends HTMLElement {
95809610
95819611 console.log(`🎯 Timer für ${entityId}:`, entityTimers);
95829612
9583- this.renderActiveTimers(entityTimers, entityId);
9613+ // NEU: Timer zwischenspeichern für Edit-Fallback
9614+ this.lastLoadedTimers = entityTimers;
9615+
9616+ // NEU: Verwende displayActiveTimers statt renderActiveTimers
9617+ this.displayActiveTimers(container, entityTimers, entityId);
95849618
95859619 } catch (error) {
95869620 console.error('❌ Fehler beim Laden der Timer:', error);
@@ -9745,18 +9779,22 @@ class FastSearchCard extends HTMLElement {
97459779
97469780 async deleteTimer(timerId, entityId) {
97479781 try {
9748- // KORRIGIERT: Verwende callApi statt callService
9749- await this._hass.callApi('POST', 'scheduler/remove', {
9750- schedule_id: timerId
9782+ console.log(`🗑️ Timer löschen: ${timerId}`);
9783+
9784+ // Korrekte Service-Call für Timer-Löschung
9785+ await this._hass.callService('scheduler', 'remove', {
9786+ entity_id: timerId
97519787 });
97529788
9753- console.log(`🗑️ Timer ${timerId} gelöscht` );
9789+ console.log('✅ Timer erfolgreich gelöscht' );
97549790
9755- // Timer Liste neu laden
9756- this.loadActiveTimers(entityId);
9791+ // Timer-Liste neu laden
9792+ setTimeout(() => {
9793+ this.loadActiveTimers(entityId);
9794+ }, 500);
97579795
97589796 } catch (error) {
9759- console.error('❌ Fehler beim Löschen:', error);
9797+ console.error('❌ Fehler beim Löschen des Timers :', error);
97609798 }
97619799 }
97629800
0 commit comments