Skip to content

Commit

Permalink
add to list only on detail-all events and request detail-all json fro…
Browse files Browse the repository at this point in the history
…m esp
  • Loading branch information
RFDarter committed Oct 3, 2024
1 parent caff0f7 commit 05f6c81
Showing 1 changed file with 80 additions and 35 deletions.
115 changes: 80 additions & 35 deletions packages/v3/src/esp-entity-table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,46 +77,17 @@ export class EntityTable extends LitElement implements RestAction {
"Diagnostic",
];

private _unknown_state_events: {[key: string]: number} = {};

connectedCallback() {
super.connectedCallback();
window.source?.addEventListener("state", (e: Event) => {

window.source?.addEventListener('state', async (e: Event) => {
const messageEvent = e as MessageEvent;
const data = JSON.parse(messageEvent.data);
let idx = this.entities.findIndex((x) => x.unique_id === data.id);
if (idx === -1 && data.id) {
// Dynamically add discovered..
let parts = data.id.split("-");
let entity = {
...data,
domain: parts[0],
unique_id: data.id,
id: parts.slice(1).join("-"),
entity_category: data.entity_category,
value_numeric_history: [data.value],
} as entityConfig;
entity.has_action = this.hasAction(entity);
if (entity.has_action) {
this.has_controls = true;
}
this.entities.push(entity);
this.entities.sort((a, b) => {
const sortA = a.sorting_weight ?? a.name;
const sortB = b.sorting_weight ?? b.name;
return a.entity_category < b.entity_category
? -1
: a.entity_category == b.entity_category
? sortA === sortB
? a.name.toLowerCase() < b.name.toLowerCase()
? -1
: 1
: sortA < sortB
? -1
: 1
: 1
});
this.requestUpdate();
} else {
if (typeof data.value === "number") {
if (idx != -1 && data.id) {
if (typeof data.value === 'number') {
let history = [...this.entities[idx].value_numeric_history];
history.push(data.value);
this.entities[idx].value_numeric_history = history.splice(-50);
Expand All @@ -127,10 +98,84 @@ export class EntityTable extends LitElement implements RestAction {
delete data.unique_id;
Object.assign(this.entities[idx], data);
this.requestUpdate();
} else {
// is it a `detail_all` event already?
if (data?.name) {
this.addEntity(data);
} else {
if (this._unknown_state_events[data.id]) {
this._unknown_state_events[data.id]++;
} else {
this._unknown_state_events[data.id] = 1;
}

// ignore the first few events, maybe the esp will send a init_entity
// event soon
if (this._unknown_state_events[data.id] < 5) {
return;
}

let parts = data.id.split('-');
let domain = parts[0];
let id = parts.slice(1).join('-');

fetch(`${this._basePath}/${domain}/${id}?detail=all`, {
method: 'GET',
})
.then((r) => {
console.log(r);
if (!r.ok) {
throw new Error(`HTTP error! Status: ${r.status}`);
}
return r.json();
})
.then((data) => {
console.log(data);
this.addEntity(data);
this._unknown_state_events.delete(data.id);
})
.catch((error) => {
console.error('Fetch error:', error);
});
}
}
});
}

addEntity(data: any) {
let idx = this.entities.findIndex((x) => x.unique_id === data.id);
if (idx === -1 && data.id) {
// Dynamically add discovered..
let parts = data.id.split('-');
let entity = {
...data,
domain: parts[0],
unique_id: data.id,
id: parts.slice(1).join('-'),
entity_category: data.entity_category,
value_numeric_history: [data.value],
} as entityConfig;
entity.has_action = this.hasAction(entity);
if (entity.has_action) {
this.has_controls = true;
}
this.entities.push(entity);
this.entities.sort((a, b) => {
const sortA = a.sorting_weight ?? a.name;
const sortB = b.sorting_weight ?? b.name;
return a.entity_category < b.entity_category ?
-1 :
a.entity_category == b.entity_category ?
sortA === sortB ?
a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1 :
sortA < sortB ? -1 :
1 :
1
});
this.requestUpdate();
}
}

hasAction(entity: entityConfig): boolean {
return `render_${entity.domain}` in this._actionRenderer;
}
Expand Down

0 comments on commit 05f6c81

Please sign in to comment.