@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.11 kB
JavaScript
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("lodash");require("../../utils/light/index.js");const f=require("../../utils/computeDomain.js"),g=require("../../../index-CUxh5LWn.cjs");require("../../HassConnect/HassContext.js");require("react");require("@iconify/react");require("use-debounce");require("deep-object-diff");require("home-assistant-js-websocket");require("../useLocale/locales/index.js");const S=["climate","humidifier","water_heater"],E=["climate","humidifier","input_datetime","thermostat","water_heater","person","device_tracker"],_=["temperature","current_temperature","target_temp_low","target_temp_high","hvac_action","humidity","mode","action","current_humidity"],y=s=>s.substr(s.indexOf(".")+1),b=(s,i)=>i?.friendly_name===void 0?y(s).replace(/_/g," "):i.friendly_name||"",p=s=>E.includes(f.computeDomain(s)),O=({connection:s,entityIds:i,callbackFunction:n,hoursToShow:e=24,minimalResponse:t=!0,significantChangesOnly:r=!0,noAttributes:o})=>{const a={type:"history/stream",entity_ids:i,start_time:new Date(new Date().getTime()-3600*e*1e3).toISOString(),minimal_response:t,significant_changes_only:r,no_attributes:o??!i.some(l=>p(l))},u=new T(s,e);return s.subscribeMessage(l=>n(u.processMessage(l)),a)};class T{connection;hoursToShow;combinedHistory;constructor(i,n){this.connection=i,this.hoursToShow=n,this.combinedHistory={}}processMessage(i){if(!this.combinedHistory||!Object.keys(this.combinedHistory).length)return this.combinedHistory=i.states,this.combinedHistory;if(!Object.keys(i.states).length)return this.combinedHistory;const n=this.hoursToShow?(new Date().getTime()-60*60*this.hoursToShow*1e3)/1e3:void 0,e={};for(const t of Object.keys(this.combinedHistory))e[t]=[];for(const t of Object.keys(i.states))e[t]=[];for(const t of Object.keys(e)){if(t in this.combinedHistory&&t in i.states){const r=this.combinedHistory[t],o=r[r.length-1];e[t]=r.concat(i.states[t]),i.states[t][0].lu<o.lu&&(e[t]=e[t].sort((a,u)=>a.lu-u.lu))}else t in this.combinedHistory?e[t]=this.combinedHistory[t]:e[t]=i.states[t];if(n&&t in this.combinedHistory){const r=e[t].filter(a=>a.lu<n);if(!r.length||(e[t]=e[t].filter(a=>a.lu>=n),e[t].length&&e[t][0].lu===n))continue;const o=r[r.length-1];o.lu=n,e[t].unshift(o)}}return this.combinedHistory=e,this.combinedHistory}}const d=(s,i)=>s.state===i.state&&(!s.attributes||!i.attributes||_.every(n=>s.attributes[n]===i.attributes[n])),D=(s,i,n)=>{const e=[];return Object.keys(i).forEach(t=>{const r=i[t],o=r[0],a=f.computeDomain(t),u=[];for(const c of r){let m;if(S.includes(a)){m={state:c.s,last_changed:c.lu*1e3,attributes:{}};for(const h of _)h in c.a&&(m.attributes[h]=c.a[h])}else m={state:c.s,last_changed:(c.lc?c.lc:c.lu)*1e3,attributes:{}};u.length>1&&d(m,u[u.length-1])&&d(m,u[u.length-2])||u.push(m)}const l=t in n?n[t].attributes:"friendly_name"in o.a?o.a:void 0;e.push({domain:a,name:b(t,l||{}),entity_id:t,states:u})}),{unit:s,identifier:Object.keys(n).join(""),data:e}},q=(s,i,n)=>{const e=[],t=i[0];for(const r of i)e.length>0&&r.s===e[e.length-1].state||(n?.attributes.device_class&&n?.attributes.device_class,e.push({state:r.s,last_changed:(r.lc?r.lc:r.lu)*1e3}));return{name:b(s,n?.attributes||t.a),entity_id:s,data:e}},w=s=>H(s.attributes),H=s=>"unit_of_measurement"in s||"state_class"in s,k=(s,i,n)=>{const e={},t=[];return n?(Object.keys(n).forEach(o=>{const a=n[o];if(a.length===0)return;const u=o in i?i[o]:void 0,l=!u&&a.find(m=>m.a&&H(m.a));let c;u&&w(u)?c=u.attributes.unit_of_measurement||" ":l?c=l.a.unit_of_measurement||" ":c={zone:g.localize("people_in_zone"),climate:s.unit_system.temperature,counter:"#",humidifier:"%",input_number:"#",number:"#",water_heater:s.unit_system.temperature}[f.computeDomain(o)],c?c in e&&o in e[c]?e[c][o].push(...a):(c in e||(e[c]={}),e[c][o]=a):t.push(q(o,a,u))}),{line:Object.keys(e).map(o=>D(o,e[o],i)),timeline:t}):{line:[],timeline:[]}};exports.computeHistory=k;exports.computeObjectId=y;exports.computeStateNameFromEntityAttributes=b;exports.entityIdHistoryNeedsAttributes=p;exports.subscribeHistory=O;
//# sourceMappingURL=history.js.map