UNPKG

@hakit/core

Version:

A collection of React hooks and helpers for Home Assistant to easily communicate with the Home Assistant WebSocket API.

3 lines (2 loc) 4.81 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("lodash");const _=require("../../../index-iGClY3ec.cjs"),p=require("../../utils/computeDomain.js");require("home-assistant-js-websocket");require("../../utils/date.js");require("react");require("@iconify/react");require("use-debounce");require("../useLocale/locales/index.js");const w=["climate","humidifier","water_heater"],A=["climate","humidifier","input_datetime","water_heater","person","device_tracker"],v=["temperature","current_temperature","target_temp_low","target_temp_high","hvac_action","humidity","mode","action","current_humidity"],O=e=>A.includes(p.computeDomain(e)),C=({connection:e,entityIds:s,callbackFunction:n,hoursToShow:i=24,minimalResponse:t=!0,significantChangesOnly:o=!0,noAttributes:u})=>{const r={type:"history/stream",entity_ids:s,start_time:new Date(new Date().getTime()-3600*i*1e3).toISOString(),minimal_response:t,significant_changes_only:o,no_attributes:u??!s.some(c=>O(c))},m=new k(i);return e.subscribeMessage(c=>n(m.processMessage(c)),r)};class k{hoursToShow;combinedHistory;constructor(s){this.hoursToShow=s,this.combinedHistory={}}processMessage(s){if(!this.combinedHistory||!Object.keys(this.combinedHistory).length)return this.combinedHistory=s.states,this.combinedHistory;if(!Object.keys(s.states).length)return this.combinedHistory;const n=this.hoursToShow?(new Date().getTime()-3600*this.hoursToShow*1e3)/1e3:void 0,i={};for(const t of Object.keys(this.combinedHistory))i[t]=[];for(const t of Object.keys(s.states))i[t]=[];for(const t of Object.keys(i)){if(t in this.combinedHistory&&t in s.states){const o=this.combinedHistory[t],u=o[o.length-1];i[t]=o.concat(s.states[t]),s.states[t][0].lu<u.lu&&(i[t]=i[t].sort((r,m)=>r.lu-m.lu))}else t in this.combinedHistory?i[t]=this.combinedHistory[t]:i[t]=s.states[t];if(n&&t in this.combinedHistory){const o=i[t].filter(r=>r.lu<n);if(!o.length||(i[t]=i[t].filter(r=>r.lu>=n),i[t].length&&i[t][0].lu===n))continue;const u=o[o.length-1];u.lu=n,delete u.lc,i[t].unshift(u)}}return this.combinedHistory=i,this.combinedHistory}}const S=(e,s)=>e.state===s.state&&(!e.attributes||!s.attributes||v.every(n=>e.attributes[n]===s.attributes[n])),q=(e,s,n)=>{const i=_.useHass.getState().entities,t=[];return Object.keys(n).forEach(o=>{const u=n[o],r=u[0],m=p.computeDomain(o),c=[];for(const a of u){let l;if(w.includes(m)){l={state:a.s,last_changed:a.lu*1e3,attributes:{}};for(const h of v)h in a.a&&(l.attributes[h]=a.a[h])}else l={state:a.s,last_changed:(a.lc?a.lc:a.lu)*1e3,attributes:{}};c.length>1&&S(l,c[c.length-1])&&S(l,c[c.length-2])||c.push(l)}const g=o in i?i[o].attributes:"friendly_name"in r.a?r.a:void 0;t.push({domain:m,name:_.computeStateNameFromEntityAttributes(o,g||{}),entity_id:o,states:c})}),{unit:e,device_class:s,identifier:Object.keys(n).join(""),data:t}},j=(e,s,n)=>{const i=[],t=s[0],o=_.useHass.getState().formatter,u=_.useHass.getState().entities;for(const r of s){if(i.length>0&&r.s===i[i.length-1].state)continue;const m={};n?.attributes.device_class&&(m.device_class=n?.attributes.device_class);const c=u[e];i.push({state_localize:o.attributeValue({...c,attributes:{...r.a||t.a,...m}},r.s),state:r.s,last_changed:(r.lc?r.lc:r.lu)*1e3})}return{name:_.computeStateNameFromEntityAttributes(e,n?.attributes||t.a),entity_id:e,data:i}},U=["counter","input_number","number"],D=e=>U.includes(e),E=e=>"unit_of_measurement"in e||"state_class"in e,F=(e,s)=>e.attributes.device_class!=null&&s.includes(e.attributes.device_class),L=(e,s,n,i,t=!1)=>t||D(e)||s!=null&&E(s.attributes)||s!=null&&e==="sensor"&&F(s,i)||n!=null,B=" ",K=(e,s,n)=>n?`${e}_${s||""}`:e,P=(e,s,n=!1,i=!1)=>{const t={},o=[],u={},r=_.useHass.getState().sensorNumericDeviceClasses,m=_.useHass.getState().config,c=_.useHass.getState().entities;return e.entity_id in s?u[e.entity_id]=s[e.entity_id]:c[e.entity_id]&&(u[e.entity_id]=[{s:c[e.entity_id].state,a:c[e.entity_id].attributes,lu:new Date(c[e.entity_id].last_updated).getTime()/1e3}]),u?(Object.keys(s).forEach(a=>{const l=u[a];if(l.length===0)return;const h=p.computeDomain(a),f=a in c?c[a]:void 0,y=f||D(h)?void 0:l.find(H=>H.a&&E(H.a)),T=L(h,f,y,r,n);let b;T?b=f?.attributes.unit_of_measurement||y?.a.unit_of_measurement||B:b={zone:_.localize("unit"),climate:m?.unit_system.temperature,humidifier:"%",water_heater:m?.unit_system.temperature}[h];const N={climate:"temperature",humidifier:"humidity",water_heater:"temperature"}[h]||(f?.attributes||y?.a)?.device_class,d=K(b,N,i);b?d&&d in t&&a in t[d]?t[d][a].push(...l):d&&(d in t||(t[d]={}),t[d][a]=l):o.push(j(a,l,f))}),{line:Object.keys(t).map(a=>{const l=a.split("_"),h=l[0],f=l.slice(1).join("_")||void 0;return q(h,f,t[a])}),timeline:o}):{line:[],timeline:[]}};exports.computeHistory=P;exports.subscribeHistory=C; //# sourceMappingURL=history.js.map