iobroker.gree-hvac
Version:
Adapter for Gree and C&H conditioners
351 lines (346 loc) • 10.8 kB
JavaScript
class PropertyMapItem {
name = '';
hvacName = '';
definition = '';
fromConverter = null;
toConverter = null;
constructor(name, hvacName, definition, fromConverter = null, toConverter = null) {
this.name = name;
this.hvacName = hvacName;
this.definition = definition;
this.fromConverter = fromConverter;
this.toConverter = toConverter;
}
isReadOnly() {
const definition = JSON.parse(this.definition);
return !definition.common.write;
}
}
const propertiesMap = [
new PropertyMapItem('power', 'Pow',
'{"type": "state", ' +
'"common": { ' +
'"name": "Power", ' +
'"desc": "Power state of conditioner", ' +
'"type": "number", ' +
'"role": "switch", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1,' +
'"states": {"0": "OFF", "1": "ON"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('mode', 'Mod',
'{"type": "state", ' +
'"common": { ' +
'"name": "Conditioner mode ", ' +
'"desc": "Conditioner mode(0: Auto, 1: Cooling, 4: Heating, 3: Ventilation, 2: Drying) ", ' +
'"type": "number", ' +
'"role": "level.mode.airconditioner", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 4, ' +
' "states": {"0": "Auto", "1": "Cooling", "4": "Heating", "3": "Ventilation", "2": "Drying"}' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('temperature-unit', 'TemUn',
'{"type": "state", ' +
'"common": { ' +
'"name": "Temperature unit",' +
'"desc": "Temperature unit: 0 - °C, 1 - °F",' +
'"type": "number", ' +
'"role": "state", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1, ' +
'"states": {"0": "°C", "1": "°F"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('target-temperature', 'SetTem',
'{"type": "state", ' +
'"common": { ' +
'"name": "Temperature",' +
'"type": "number", ' +
'"role": "value.temperature", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 16, ' +
'"max": 86' +
'}, ' +
'"native": {} ' +
'}',
temperatureConverter,
(payload) => {
if (payload['TemUn'] === 1) {
const celsius = Math.round((payload['SetTem'] - 32) * 5 / 9);
const tempRec = (((payload['SetTem'] - 32) * 5 / 9) - celsius) >= 0 ? 1 : 0;
payload['TemRec'] = tempRec;
payload['SetTem'] = celsius;
}
return payload;
}
),
new PropertyMapItem('temp-rec', 'TemRec',
'{"type": "state", ' +
'"common": { ' +
'"name": "TempRec", ' +
'"desc": "This bit is used to distinguish between two Fahrenheit values", ' +
'"type": "number", ' +
'"role": "state", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('fan-speed', 'WdSpd',
'{"type": "state", ' +
'"common": { ' +
'"name": "Fan speed", ' +
'"desc": "Fan speed, 0 - Auto, 1, 2, 3",' +
'"type": "number", ' +
'"role": "level.mode.fan", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 3, ' +
'"states": {"0": "Auto", "1": "1", "2": "2", "3": "3"} ' +
'}, ' +
'"native": {' +
'"valuesMap": [' +
'{"value": 0, "targetValue": 0},' +
'{"value": 1, "targetValue": 1},' +
'{"value": 2, "targetValue": 3},' +
'{"value": 3, "targetValue": 5}' +
']' +
'} ' +
'}'
),
new PropertyMapItem('air-mode', 'Air',
'{"type": "state", ' +
'"common": { ' +
'"name": "Fresh air valve state", ' +
'"desc": "Controls the state of the fresh air valve (not available on all units) On(1)/Off(0)",' +
'"type": "number", ' +
'"role": "switch", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1, ' +
'"states": {"0": "OFF", "1": "ON"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('x-fan-mode', 'Blo',
'{"type": "state", ' +
'"common": { ' +
'"name": "X-Fan mode", ' +
'"desc": "X-Fan mode, this function keeps the fan running for a while after shutting down. On(1)/Off(0)",' +
'"type": "number", ' +
'"role": "switch", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1, ' +
'"states": {"0": "OFF", "1": "ON"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('health-mode', 'Health',
'{"type": "state", ' +
'"common": { ' +
'"name": "Health (Cold plasma) mode", ' +
'"desc": "Health (Cold plasma) mode, only for devices equipped with anion generator. On(1)/Off(0)",' +
'"type": "number", ' +
'"role": "switch", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1, ' +
'"states": {"0": "OFF", "1": "ON"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('sleep-mode', 'SwhSlp',
'{"type": "state", ' +
'"common": { ' +
'"name": "Sleep mode", ' +
'"desc": "Sleep mode, which gradually changes the temperature. On(1)/Off(0)",' +
'"type": "number", ' +
'"role": "switch", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1, ' +
'"states": {"0": "OFF", "1": "ON"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('display-state', 'Lig',
'{"type": "state", ' +
'"common": { ' +
'"name": "Display state", ' +
'"desc": "Display On(1)/Off(0)",' +
'"type": "number", ' +
'"role": "switch", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1, ' +
'"states": {"0": "OFF", "1": "ON"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('swing-left-right', 'SwingLfRig',
'{"type": "state", ' +
'"common": { ' +
'"name": "Swing left/right", ' +
'"desc": "Swing left/right On(1)/Off(0), Fixed position(2-6) ",' +
'"type": "number", ' +
'"role": "level.mode.swing", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 6, ' +
'"states": {"0": "OFF", "1": "ON", "2": "2", "3": "3", "4": "4", "5": "5", "6": "6"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('swing-up-down', 'SwUpDn',
'{"type": "state", ' +
'"common": { ' +
'"name": "Swing up/down", ' +
'"desc": "Swing up/down On(1)/Off(0), Fixed position(2-6) ",' +
'"type": "number", ' +
'"role": "level.mode.swing", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 6, ' +
'"states": {"0": "OFF", "1": "ON", "2": "2", "3": "3", "4": "4", "5": "5", "6": "6"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('quiet', 'Quiet',
'{"type": "state", ' +
'"common": { ' +
'"name": "Quiet mode", ' +
'"desc": "Quiet mode On(1)/Off(0)",' +
'"type": "number", ' +
'"role": "switch", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1, ' +
'"states": {"0": "OFF", "1": "ON"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('turbo', 'Tur',
'{"type": "state", ' +
'"common": { ' +
'"name": "Turbo", ' +
'"desc": "Turbo On(1)/Off(0)",' +
'"type": "number", ' +
'"role": "switch", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1, ' +
'"states": {"0": "OFF", "1": "ON"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('maintain-room-temperature', 'StHt',
'{"type": "state", ' +
'"common": { ' +
'"name": "Maintain the room temperature", ' +
'"desc": "Maintain the room temperature steadily at 8°C and prevent the room from freezing by heating operation. On(1)/Off(0)",' +
'"type": "number", ' +
'"role": "switch", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1, ' +
'"states": {"0": "OFF", "1": "ON"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('room-temperature', 'TemSen',
'{"type": "state", ' +
'"common": { ' +
'"name": "Room temperature", ' +
'"type": "number", ' +
'"role": "value.temperature", ' +
'"read": true ' +
'}, ' +
'"native": {} ' +
'}',
temperatureConverter
),
new PropertyMapItem('energy-saving', 'SvSt',
'{"type": "state", ' +
'"common": { ' +
'"name": "Energy saving mode", ' +
'"desc": "Energy saving mode. On(1)/Off(0)",' +
'"type": "number", ' +
'"role": "switch", ' +
'"read": true, ' +
'"write": true, ' +
'"min": 0, ' +
'"max": 1, ' +
'"states": {"0": "OFF", "1": "ON"} ' +
'}, ' +
'"native": {} ' +
'}'
),
new PropertyMapItem('date-time', 'time',
'{"type": "state", ' +
'"common": { ' +
'"name": "Device date and time", ' +
'"desc": "Device date and time, format YYYY-MM-DD hh:mm",' +
'"type": "string", ' +
'"role": "date", ' +
'"read": true, ' +
'"write": true ' +
'}, ' +
'"native": {} ' +
'}'
)
];
function temperatureConverter(values, value) {
const tempUnit = values['TemUn'];
if (tempUnit === 0) {
return value;
}
let fahrenheitValue = value * 1.8 + 32;
const tempRec = values['TemRec'];
if (tempRec === 0) {
fahrenheitValue = Math.floor(fahrenheitValue);
} else {
fahrenheitValue = Math.ceil(fahrenheitValue);
}
return fahrenheitValue;
}
module.exports = propertiesMap, PropertyMapItem;