added migrated 2.x add-ons

Signed-off-by: Kai Kreuzer <kai@openhab.org>
This commit is contained in:
Kai Kreuzer
2020-09-21 01:58:32 +02:00
parent bbf1a7fd29
commit 6df6783b60
11662 changed files with 1302875 additions and 11 deletions

View File

@@ -0,0 +1,75 @@
/**
* Copyright (c) 2010-2020 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.sensibo.internal;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.lang.reflect.Type;
import java.time.ZonedDateTime;
import org.apache.commons.io.IOUtils;
import org.openhab.binding.sensibo.internal.dto.AbstractRequest;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
/**
* @author Arne Seime - Initial contribution
*/
public class WireHelper {
private final Gson gson;
public WireHelper() {
gson = new GsonBuilder().registerTypeAdapter(ZonedDateTime.class, new TypeAdapter<ZonedDateTime>() {
@Override
public void write(final JsonWriter out, final ZonedDateTime value) throws IOException {
out.value(value.toString());
}
@Override
public ZonedDateTime read(final JsonReader in) throws IOException {
return ZonedDateTime.parse(in.nextString());
}
}).setPrettyPrinting().create();
}
public <T> T deSerializeResponse(final String jsonClasspathName, final Type type) throws IOException {
final String json = IOUtils.toString(WireHelper.class.getResourceAsStream(jsonClasspathName));
final JsonParser parser = new JsonParser();
final JsonObject o = parser.parse(json).getAsJsonObject();
assertEquals("success", o.get("status").getAsString());
return gson.fromJson(o.get("result"), type);
}
public <T> T deSerializeFromClasspathResource(final String jsonClasspathName, final Type type) throws IOException {
final String json = IOUtils.toString(WireHelper.class.getResourceAsStream(jsonClasspathName));
return deSerializeFromString(json, type);
}
public <T> T deSerializeFromString(final String json, final Type type) throws IOException {
return gson.fromJson(json, type);
}
public <T> String serialize(final AbstractRequest req) throws IOException {
return gson.toJson(req);
}
}

View File

@@ -0,0 +1,23 @@
/**
* Copyright (c) 2010-2020 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.sensibo.internal.dto;
import org.openhab.binding.sensibo.internal.WireHelper;
/**
* @author Arne Seime - Initial contribution
*/
public abstract class AbstractSerializationDeserializationTest {
protected WireHelper wireHelper = new WireHelper();
}

View File

@@ -0,0 +1,103 @@
/**
* Copyright (c) 2010-2020 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.sensibo.internal.dto;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.time.ZonedDateTime;
import java.util.Map;
import org.junit.Test;
import org.openhab.binding.sensibo.internal.dto.poddetails.AcStateDTO;
import org.openhab.binding.sensibo.internal.dto.poddetails.MeasurementDTO;
import org.openhab.binding.sensibo.internal.dto.poddetails.ModeCapabilityDTO;
import org.openhab.binding.sensibo.internal.dto.poddetails.PodDetailsDTO;
import org.openhab.binding.sensibo.internal.dto.poddetails.TemperatureDTO;
import org.openhab.binding.sensibo.internal.model.SensiboSky;
/**
* @author Arne Seime - Initial contribution
*/
public class GetPodDetailsResponseTest extends AbstractSerializationDeserializationTest {
@Test
public void testDeserializeWithSmartModeSetup() throws IOException {
final PodDetailsDTO rsp = wireHelper.deSerializeResponse("/get_pod_details_response_smartmode_settings.json",
PodDetailsDTO.class);
assertEquals("34:15:13:AA:AA:AA", rsp.macAddress);
}
@Test
public void testDeserializeNullpointerExample() throws IOException {
final PodDetailsDTO rsp = wireHelper.deSerializeResponse("/get_pod_details_response_nullpointer.json",
PodDetailsDTO.class);
SensiboSky internal = new SensiboSky(rsp);
assertEquals("50175457", internal.getSerialNumber());
}
@Test
public void testDeserialize() throws IOException {
final PodDetailsDTO rsp = wireHelper.deSerializeResponse("/get_pod_details_response.json", PodDetailsDTO.class);
assertEquals("MA:C:AD:DR:ES:S0", rsp.macAddress);
assertEquals("IN010056", rsp.firmwareVersion);
assertEquals("cc3100_stm32f0", rsp.firmwareType);
assertEquals("SERIALNUMASSTRING", rsp.serialNumber);
assertEquals("C", rsp.temperatureUnit);
assertEquals("skyv2", rsp.productModel);
assertAcState(rsp.acState);
assertMeasurement(rsp.lastMeasurement);
assertRemoteCapabilities(rsp.getRemoteCapabilities());
}
private void assertRemoteCapabilities(final Map<String, ModeCapabilityDTO> remoteCapabilities) {
assertNotNull(remoteCapabilities);
assertEquals(5, remoteCapabilities.size());
final ModeCapabilityDTO mode = remoteCapabilities.get("heat");
assertNotNull(mode.swingModes);
assertNotNull(mode.fanLevels);
assertNotNull(mode.temperatures);
final Map<String, TemperatureDTO> temperatures = mode.temperatures;
final TemperatureDTO temperature = temperatures.get("C");
assertNotNull(temperature);
assertNotNull(temperature.validValues);
}
private void assertMeasurement(final MeasurementDTO lastMeasurement) {
assertNotNull(lastMeasurement);
assertNull(lastMeasurement.batteryVoltage);
assertEquals(Double.valueOf("22.5"), lastMeasurement.temperature);
assertEquals(Double.valueOf("24.2"), lastMeasurement.humidity);
assertEquals(Integer.valueOf("-71"), lastMeasurement.wifiSignalStrength);
assertEquals(ZonedDateTime.parse("2019-05-05T07:52:11Z"), lastMeasurement.measurementTimestamp.time);
}
private void assertAcState(final AcStateDTO acState) {
assertNotNull(acState);
assertTrue(acState.on);
assertEquals("medium_high", acState.fanLevel);
assertEquals("C", acState.temperatureUnit);
assertEquals(21, acState.targetTemperature.intValue());
assertEquals("heat", acState.mode);
assertEquals("rangeFull", acState.swing);
}
}

View File

@@ -0,0 +1,42 @@
/**
* Copyright (c) 2010-2020 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.sensibo.internal.dto;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.openhab.binding.sensibo.internal.dto.pods.PodDTO;
import com.google.gson.reflect.TypeToken;
/**
* @author Arne Seime - Initial contribution
*/
public class GetPodsResponseTest extends AbstractSerializationDeserializationTest {
@Test
public void testDeserialize() throws IOException {
final Type type = new TypeToken<ArrayList<PodDTO>>() {
}.getType();
final List<PodDTO> rsp = wireHelper.deSerializeResponse("/get_pods_response.json", type);
assertEquals(1, rsp.size());
assertEquals("PODID", rsp.get(0).id);
}
}

View File

@@ -0,0 +1,37 @@
/**
* Copyright (c) 2010-2020 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.sensibo.internal.dto;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import org.junit.Test;
import org.openhab.binding.sensibo.internal.dto.setacstateproperty.SetAcStatePropertyRequest;
/**
* @author Arne Seime - Initial contribution
*/
public class SetAcStatePropertyRequestTest extends AbstractSerializationDeserializationTest {
@Test
public void testSerializeDeserialize() throws IOException {
SetAcStatePropertyRequest req = new SetAcStatePropertyRequest("PODID", "targetTemperature", "mode");
String serializedJson = wireHelper.serialize(req);
final SetAcStatePropertyRequest deSerializedRequest = wireHelper.deSerializeFromString(serializedJson,
SetAcStatePropertyRequest.class);
assertEquals("mode", deSerializedRequest.newValue);
}
}

View File

@@ -0,0 +1,35 @@
/**
* Copyright (c) 2010-2020 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.sensibo.internal.dto;
import static org.junit.Assert.*;
import java.io.IOException;
import org.junit.Test;
import org.openhab.binding.sensibo.internal.dto.setacstateproperty.SetAcStatePropertyReponse;
/**
* @author Arne Seime - Initial contribution
*/
public class SetAcStatePropertyResponseTest extends AbstractSerializationDeserializationTest {
@Test
public void testDeserialize() throws IOException {
final SetAcStatePropertyReponse rsp = wireHelper.deSerializeResponse("/set_acstate_response.json",
SetAcStatePropertyReponse.class);
assertNotNull(rsp.acState);
assertTrue(rsp.acState.on);
}
}

View File

@@ -0,0 +1,42 @@
/**
* Copyright (c) 2010-2020 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.sensibo.internal.dto;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import java.io.IOException;
import org.junit.Test;
import org.openhab.binding.sensibo.internal.dto.poddetails.AcStateDTO;
import org.openhab.binding.sensibo.internal.dto.settimer.SetTimerRequest;
/**
* @author Arne Seime - Initial contribution
*/
public class SetTimerRequestTest extends AbstractSerializationDeserializationTest {
@Test
public void testSerializeDeserialize() throws IOException {
AcStateDTO acState = new AcStateDTO(false, "fanLevel", "C", 21, "mode", "swing");
SetTimerRequest req = new SetTimerRequest("PODID", 60, acState);
String serializedJson = wireHelper.serialize(req);
final SetTimerRequest deSerializedRequest = wireHelper.deSerializeFromString(serializedJson,
SetTimerRequest.class);
assertNotNull(deSerializedRequest.acState);
assertEquals(60, deSerializedRequest.minutesFromNow);
assertFalse(deSerializedRequest.acState.on);
}
}

View File

@@ -0,0 +1,119 @@
/**
* Copyright (c) 2010-2020 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.sensibo.internal.handler;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.eclipse.jetty.client.HttpClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.openhab.binding.sensibo.internal.config.SensiboAccountConfiguration;
import org.openhab.binding.sensibo.internal.model.SensiboSky;
import org.openhab.core.config.core.Configuration;
import org.openhab.core.thing.Bridge;
import org.openhab.core.thing.ThingUID;
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
/**
* @author Arne Seime - Initial contribution
*/
public class SensiboAccountHandlerTest {
@Rule
public WireMockRule wireMockRule = new WireMockRule(WireMockConfiguration.options().dynamicPort());
@Mock
private Bridge sensiboAccountMock;
private HttpClient httpClient;
@Mock
private Configuration configuration;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
httpClient = new HttpClient();
httpClient.start();
SensiboAccountHandler.API_ENDPOINT = "http://localhost:" + wireMockRule.port() + "/api"; // https://home.sensibo.com/api/v2
}
@After
public void shutdown() throws Exception {
httpClient.stop();
}
@Test
public void testInitialize1() throws InterruptedException, IOException {
testInitialize("/get_pods_response.json", "/get_pod_details_response.json");
}
@Test
public void testInitializeMarco() throws InterruptedException, IOException {
testInitialize("/get_pods_response.json", "/get_pod_details_response_marco.json");
}
private void testInitialize(String podsResponse, String podDetailsResponse)
throws InterruptedException, IOException {
// Setup account
final SensiboAccountConfiguration accountConfig = new SensiboAccountConfiguration();
accountConfig.apiKey = "APIKEY";
when(configuration.as(eq(SensiboAccountConfiguration.class))).thenReturn(accountConfig);
// Setup initial response
final String getPodsResponse = IOUtils.toString(getClass().getResourceAsStream(podsResponse));
stubFor(get(urlEqualTo("/api/v2/users/me/pods?apiKey=APIKEY"))
.willReturn(aResponse().withStatus(200).withBody(getPodsResponse)));
// Setup 2nd response with details
final String getPodDetailsResponse = IOUtils.toString(getClass().getResourceAsStream(podDetailsResponse));
stubFor(get(urlEqualTo("/api/v2/pods/PODID?apiKey=APIKEY&fields=*"))
.willReturn(aResponse().withStatus(200).withBody(getPodDetailsResponse)));
when(sensiboAccountMock.getConfiguration()).thenReturn(configuration);
when(sensiboAccountMock.getUID()).thenReturn(new ThingUID("sensibo:account:thinguid"));
final SensiboAccountHandler subject = new SensiboAccountHandler(sensiboAccountMock, httpClient);
// Async, poll for status
subject.initialize();
// Verify num things found == 1
int numPods = 0;
for (int i = 0; i < 20; i++) {
final List<SensiboSky> things = subject.getModel().getPods();
numPods = things.size();
if (numPods == 1) {
break;
} else {
// Wait some more
Thread.sleep(200);
}
}
assertEquals(1, numPods);
}
}

View File

@@ -0,0 +1,138 @@
/**
* Copyright (c) 2010-2020 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.sensibo.internal.handler;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Mockito;
import org.openhab.binding.sensibo.internal.SensiboBindingConstants;
import org.openhab.binding.sensibo.internal.SensiboCommunicationException;
import org.openhab.binding.sensibo.internal.WireHelper;
import org.openhab.binding.sensibo.internal.dto.poddetails.PodDetailsDTO;
import org.openhab.binding.sensibo.internal.handler.SensiboSkyHandler.StateChange;
import org.openhab.binding.sensibo.internal.model.SensiboModel;
import org.openhab.binding.sensibo.internal.model.SensiboSky;
import org.openhab.core.config.core.Configuration;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.library.unit.ImperialUnits;
import org.openhab.core.library.unit.SIUnits;
import org.openhab.core.thing.Channel;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingUID;
/**
* @author Arne Seime - Initial contribution
*/
public class SensiboSkyHandlerTest {
private final WireHelper wireHelper = new WireHelper();
@Test
public void testStateChangeValidation() throws IOException, SensiboCommunicationException {
final PodDetailsDTO rsp = wireHelper.deSerializeResponse("/get_pod_details_response.json", PodDetailsDTO.class);
SensiboSky sky = new SensiboSky(rsp);
Thing thing = Mockito.mock(Thing.class);
SensiboSkyHandler handler = new SensiboSkyHandler(thing);
// Target temperature
StateChange stateChangeCheck = handler.checkStateChangeValid(sky, SensiboSkyHandler.TARGET_TEMPERATURE_PROPERTY,
new DecimalType(123));
assertFalse(stateChangeCheck.valid);
assertNotNull(stateChangeCheck.validationMessage);
assertTrue(handler.checkStateChangeValid(sky, SensiboSkyHandler.TARGET_TEMPERATURE_PROPERTY,
new DecimalType(10)).valid);
// Mode
StateChange stateChangeCheckMode = handler.checkStateChangeValid(sky, "mode", "invalid");
assertFalse(stateChangeCheckMode.valid);
assertNotNull(stateChangeCheckMode.validationMessage);
assertTrue(handler.checkStateChangeValid(sky, "mode", "auto").valid);
// Swing
StateChange stateChangeCheckSwing = handler.checkStateChangeValid(sky, "swing", "invalid");
assertFalse(stateChangeCheckSwing.valid);
assertNotNull(stateChangeCheckSwing.validationMessage);
assertTrue(handler.checkStateChangeValid(sky, "swing", "stopped").valid);
// FanLevel
StateChange stateChangeCheckFanLevel = handler.checkStateChangeValid(sky, "fanLevel", "invalid");
assertFalse(stateChangeCheckFanLevel.valid);
assertNotNull(stateChangeCheckFanLevel.validationMessage);
assertTrue(handler.checkStateChangeValid(sky, "fanLevel", "high").valid);
}
@Test
public void testTemperatureConversion() throws IOException {
final PodDetailsDTO rsp = wireHelper.deSerializeResponse("/get_pod_details_response.json", PodDetailsDTO.class);
SensiboSky sky = new SensiboSky(rsp);
Thing thing = Mockito.mock(Thing.class);
Mockito.when(thing.getUID()).thenReturn(new ThingUID("sensibo:account:thinguid"));
Map<String, Object> config = new HashMap<>();
config.put("macAddress", sky.getMacAddress());
Mockito.when(thing.getConfiguration()).thenReturn(new Configuration(config));
SensiboSkyHandler handler = Mockito.spy(new SensiboSkyHandler(thing));
handler.initialize();
SensiboModel model = new SensiboModel(0);
model.addPod(sky);
// Once with Celcius argument
handler.handleCommand(new ChannelUID(thing.getUID(), SensiboBindingConstants.CHANNEL_TARGET_TEMPERATURE),
new QuantityType<>(50, ImperialUnits.FAHRENHEIT), model);
// Once with Fahrenheit
handler.handleCommand(new ChannelUID(thing.getUID(), SensiboBindingConstants.CHANNEL_TARGET_TEMPERATURE),
new QuantityType<>(10, SIUnits.CELSIUS), model);
// Once with Decimal directly
handler.handleCommand(new ChannelUID(thing.getUID(), SensiboBindingConstants.CHANNEL_TARGET_TEMPERATURE),
new DecimalType(10), model);
ArgumentCaptor<DecimalType> valueCapture = ArgumentCaptor.forClass(DecimalType.class);
Mockito.verify(handler, Mockito.times(3)).updateAcState(ArgumentMatchers.eq(sky), ArgumentMatchers.anyString(),
valueCapture.capture());
assertEquals(new DecimalType(10), valueCapture.getValue());
}
@Test
public void testAddDynamicChannelsMarco() throws IOException, SensiboCommunicationException {
testAddDynamicChannels("/get_pod_details_response_marco.json");
}
@Test
public void testAddDynamicChannels() throws IOException, SensiboCommunicationException {
testAddDynamicChannels("/get_pod_details_response.json");
}
private void testAddDynamicChannels(String podDetailsResponse) throws IOException, SensiboCommunicationException {
final PodDetailsDTO rsp = wireHelper.deSerializeResponse(podDetailsResponse, PodDetailsDTO.class);
SensiboSky sky = new SensiboSky(rsp);
Thing thing = Mockito.mock(Thing.class);
Mockito.when(thing.getUID()).thenReturn(new ThingUID("sensibo:account:thinguid"));
SensiboSkyHandler handler = Mockito.spy(new SensiboSkyHandler(thing));
List<Channel> dynamicChannels = handler.createDynamicChannels(sky);
assertTrue(!dynamicChannels.isEmpty());
}
}

View File

@@ -0,0 +1,352 @@
{
"status": "success",
"result": {
"configGroup": "stable1",
"macAddress": "MA:C:AD:DR:ES:S0",
"cleanFiltersNotificationEnabled": true,
"room": {
"name": "Basement",
"icon": "den"
},
"firmwareType": "cc3100_stm32f0",
"productModel": "skyv2",
"sensorsCalibration": {
"temperature": 0,
"humidity": 0
},
"temperatureUnit": "C",
"isGeofenceOnExitEnabled": false,
"connectionStatus": {
"isAlive": true,
"lastSeen": {
"secondsAgo": 80,
"time": "2019-05-05T07:52:11Z"
}
},
"id": "PODID",
"acState": {
"on": true,
"fanLevel": "medium_high",
"temperatureUnit": "C",
"targetTemperature": 21,
"mode": "heat",
"swing": "rangeFull"
},
"smartMode": null,
"shouldShowFilterCleaningNotification": true,
"location": {
"latLon": [
59.0000000,
10.0000000
],
"updateTime": null,
"country": "Norway",
"createTime": {
"secondsAgo": 17857639,
"time": "2018-10-10T15:26:12Z"
},
"address": [
"Streetname",
"zip city",
"Norway"
],
"id": "ADDRESSID"
},
"currentlyAvailableFirmwareVersion": "IN010056",
"isClimateReactGeofenceOnExitEnabled": false,
"remoteCapabilities": {
"modes": {
"dry": {
"swing": [
"stopped",
"fixedTop",
"fixedMiddleTop",
"fixedMiddle",
"fixedMiddleBottom",
"fixedBottom",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31
]
},
"F": {
"isNative": false,
"values": [
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86,
88
]
}
},
"fanLevels": [
"quiet",
"low",
"medium",
"medium_high",
"high",
"auto"
]
},
"auto": {
"swing": [
"stopped",
"fixedTop",
"fixedMiddleTop",
"fixedMiddle",
"fixedMiddleBottom",
"fixedBottom",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31
]
},
"F": {
"isNative": false,
"values": [
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86,
88
]
}
},
"fanLevels": [
"quiet",
"low",
"medium",
"medium_high",
"high",
"auto"
]
},
"heat": {
"swing": [
"stopped",
"fixedTop",
"fixedMiddleTop",
"fixedMiddle",
"fixedMiddleBottom",
"fixedBottom",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
10,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31
]
},
"F": {
"isNative": false,
"values": [
50,
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86,
88
]
}
},
"fanLevels": [
"quiet",
"low",
"medium",
"medium_high",
"high",
"auto"
]
},
"fan": {
"swing": [
"stopped",
"fixedTop",
"fixedMiddleTop",
"fixedMiddle",
"fixedMiddleBottom",
"fixedBottom",
"rangeFull"
],
"temperatures": {},
"fanLevels": [
"quiet",
"low",
"medium",
"medium_high",
"high",
"auto"
]
},
"cool": {
"swing": [
"stopped",
"fixedTop",
"fixedMiddleTop",
"fixedMiddle",
"fixedMiddleBottom",
"fixedBottom",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31
]
},
"F": {
"isNative": false,
"values": [
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86,
88
]
}
},
"fanLevels": [
"quiet",
"low",
"medium",
"medium_high",
"high",
"auto"
]
}
}
},
"serial": "SERIALNUMASSTRING",
"firmwareVersion": "IN010056",
"measurements": {
"batteryVoltage": null,
"temperature": 22.5,
"humidity": 24.2,
"time": {
"secondsAgo": 80,
"time": "2019-05-05T07:52:11Z"
},
"rssi": "-71",
"piezo": [
null,
null
]
}
}
}

View File

@@ -0,0 +1,416 @@
{
"status": "success",
"result": {
"configGroup": "stable",
"macAddress": "MA:C:AD:DR:ES:S0",
"isGeofenceOnExitEnabled": false,
"sensorsCalibration": {
"temperature": 0.0,
"humidity": 0.0
},
"cleanFiltersNotificationEnabled": true,
"connectionStatus": {
"isAlive": true,
"lastSeen": {
"secondsAgo": 51,
"time": "2019-10-08T04:40:03Z"
}
},
"acState": {
"on": false,
"mode": "dry",
"swing": "stopped"
},
"serial": "serial",
"id": "PODID",
"firmwareVersion": "IN010056",
"firmwareType": "cc3100_stm32f0",
"measurements": {
"batteryVoltage": null,
"temperature": 23.2,
"humidity": 59.5,
"time": {
"secondsAgo": 51,
"time": "2019-10-08T04:40:03Z"
},
"rssi": "-63",
"piezo": [
null,
null
]
},
"remoteFlavor": "Enormous Stegosaurus",
"smartMode": null,
"shouldShowFilterCleaningNotification": false,
"location": {
"latLon": [
41.9279707,
12.4625373
],
"updateTime": {
"secondsAgo": 75125215,
"time": "2017-05-21T16:33:59Z"
},
"name": "Casa di Marco",
"country": "Italia",
"createTime": {
"secondsAgo": 129385606,
"time": "2015-09-01T16:14:08Z"
},
"address": [
"XXX",
"XX",
"XXX"
],
"id": "XX"
},
"currentlyAvailableFirmwareVersion": "IN010056",
"tags": [],
"productModel": "skyv2",
"schedules": [
{
"nextTime": null,
"podUid": "PODUID",
"recurringDays": [],
"createTimeSecondsAgo": 67070291,
"isEnabled": false,
"createTime": "2017-08-22T22:02:43",
"acState": {
"on": true,
"fanLevel": "quiet",
"temperatureUnit": "C",
"targetTemperature": 26,
"mode": "cool"
},
"targetTimeLocal": "03:00",
"timezone": "Europe/Rome",
"nextTimeSecondsFromNow": null,
"causedBy": {
"username": "XX",
"firstName": "XX",
"lastName": "XX",
"email": "XXX@domain.it"
},
"id": "XXXXX"
},
{
"nextTime": null,
"podUid": "PODUID",
"recurringDays": [],
"createTimeSecondsAgo": 4605564,
"isEnabled": false,
"createTime": "2019-08-15T21:21:30",
"acState": {
"on": false
},
"targetTimeLocal": "05:30",
"timezone": "Europe/Rome",
"nextTimeSecondsFromNow": null,
"causedBy": {
"username": "XX",
"firstName": "XX",
"lastName": "XX",
"email": "XXX@domain.it"
},
"id": "QwNtU5zq2D"
},
{
"nextTime": null,
"podUid": "E69jFpsP",
"recurringDays": [],
"createTimeSecondsAgo": 67070257,
"isEnabled": false,
"createTime": "2017-08-22T22:03:17",
"acState": {
"on": false
},
"targetTimeLocal": "03:30",
"timezone": "Europe/Rome",
"nextTimeSecondsFromNow": null,
"causedBy": {
"username": "XX",
"firstName": "XX",
"lastName": "XX",
"email": "XXX@domain.it"
},
"id": "RwVeW8U3Hw"
},
{
"nextTime": null,
"podUid": "E69jFpsP",
"recurringDays": [],
"createTimeSecondsAgo": 4605590,
"isEnabled": false,
"createTime": "2019-08-15T21:21:04",
"acState": {
"on": true,
"fanLevel": "quiet",
"temperatureUnit": "C",
"targetTemperature": 26,
"mode": "cool"
},
"targetTimeLocal": "05:00",
"timezone": "Europe/Rome",
"nextTimeSecondsFromNow": null,
"causedBy": {
"username": "XX",
"firstName": "XX",
"lastName": "XX",
"email": "XXX@domain.it"
},
"id": "ruzhJCVBeW"
}
],
"isClimateReactGeofenceOnExitEnabled": false,
"remoteCapabilities": {
"modes": {
"dry": {
"temperatures": {
},
"swing": [
"stopped",
"rangeFull"
]
},
"auto": {
"swing": [
"stopped",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
]
},
"F": {
"isNative": false,
"values": [
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86
]
}
},
"fanLevels": [
"quiet",
"low",
"medium_low",
"medium",
"medium_high",
"high",
"auto",
"strong"
]
},
"heat": {
"swing": [
"stopped",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
]
},
"F": {
"isNative": false,
"values": [
50,
52,
54,
55,
57,
59,
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86
]
}
},
"fanLevels": [
"quiet",
"low",
"medium_low",
"medium",
"medium_high",
"high",
"auto",
"strong"
]
},
"fan": {
"swing": [
"stopped",
"rangeFull"
],
"temperatures": {
},
"fanLevels": [
"quiet",
"low",
"medium_low",
"medium",
"medium_high",
"high",
"auto",
"strong"
]
},
"cool": {
"swing": [
"stopped",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
]
},
"F": {
"isNative": false,
"values": [
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86
]
}
},
"fanLevels": [
"quiet",
"low",
"medium_low",
"medium",
"medium_high",
"high",
"auto",
"strong"
]
}
}
},
"remote": {
"window": false,
"toggle": false
},
"room": {
"name": "Camera da letto",
"icon": "Bedroom"
},
"temperatureUnit": "C",
"timer": {
"acState": {
"on": false,
"mode": "dry",
"swing": "stopped"
},
"targetTimeSecondsFromNow": -5275495,
"createTimeSecondsAgo": 5277295,
"isEnabled": false,
"causedBy": {
"username": "XX",
"firstName": "XX",
"lastName": "XX",
"email": "XXX@domain.it"
},
"id": "KWcppTmrbb",
"targetTime": "2019-08-08T03:15:59",
"createTime": "2019-08-08T02:45:59"
},
"motionSensors": [],
"remoteAlternatives": [
"_daikin2b_comfort",
"_daikin2f_33",
"_daikin2b_33",
"_daikin2b_33_comfort_horizontal_swinging",
"_daikin2b",
"_daikin2c",
"_daikin2bf_comfort",
"_daikin2_33",
"_daikin2f"
]
}
}

View File

@@ -0,0 +1,599 @@
{
"status": "success",
"result": {
"configGroup": "stable",
"macAddress": "xxxxxxxx",
"isGeofenceOnExitEnabled": false,
"sensorsCalibration": {
"temperature": 0.0,
"humidity": 0.0
},
"cleanFiltersNotificationEnabled": true,
"connectionStatus": {
"isAlive": true,
"lastSeen": {
"secondsAgo": 14,
"time": "2019-08-15T11:44:00Z"
}
},
"acState": {
"on": true,
"targetTemperature": 25,
"temperatureUnit": "C",
"mode": "cool",
"fanLevel": "auto"
},
"motionSensors": [],
"id": "aGbsMfYn",
"firmwareVersion": "IN010056",
"firmwareType": "cc3100_stm32f0",
"measurements": {
"temperature": 29.1,
"humidity": 71.5,
"time": {
"secondsAgo": 14,
"time": "2019-08-15T11:44:00Z"
},
"rssi": "-52",
"piezo": [
null,
null
]
},
"smartMode": {
"deviceUid": "aGbsMfYn",
"highTemperatureThreshold": 30.0,
"type": "temperature",
"lowTemperatureState": {
"on": false,
"fanLevel": "low",
"temperatureUnit": "C",
"targetTemperature": 24,
"mode": "cool"
},
"enabled": false,
"highTemperatureState": {
"on": true,
"fanLevel": "low",
"temperatureUnit": "C",
"targetTemperature": 24,
"mode": "cool"
},
"lowTemperatureThreshold": 25.0
},
"shouldShowFilterCleaningNotification": false,
"location": {
"latLon": [
12.9331702,
100.9190772
],
"updateTime": {
"secondsAgo": 11618978,
"time": "2019-04-03T00:14:36Z"
},
"name": "Karel\u0027s place",
"country": "Thailand",
"createTime": {
"secondsAgo": 48921206,
"time": "2018-01-26T06:30:48Z"
},
"address": [
"xxx",
"xxx",
"xxx"
],
"id": "2Cr6zmCY5W"
},
"currentlyAvailableFirmwareVersion": "IN010056",
"tags": [],
"productModel": "skyv2",
"isClimateReactGeofenceOnExitEnabled": false,
"remoteCapabilities": {
"modes": {
"dry": {
"temperatures": {
"C": {
"isNative": true,
"values": [
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
]
},
"F": {
"isNative": false,
"values": [
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86
]
}
},
"fanLevels": [
"low",
"medium",
"high",
"auto"
]
},
"heat": {
"temperatures": {
"C": {
"isNative": true,
"values": [
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
]
},
"F": {
"isNative": false,
"values": [
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86
]
}
},
"fanLevels": [
"low",
"medium",
"high",
"auto"
]
},
"fan": {
"temperatures": {
"C": {
"isNative": true,
"values": [
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
]
},
"F": {
"isNative": false,
"values": [
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86
]
}
},
"fanLevels": [
"low",
"medium",
"high",
"auto"
]
},
"cool": {
"temperatures": {
"C": {
"isNative": true,
"values": [
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
]
},
"F": {
"isNative": false,
"values": [
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86
]
}
},
"fanLevels": [
"low",
"medium",
"high",
"auto"
]
}
}
},
"serial": "50175457",
"remote": {
"window": false,
"toggle": false
},
"room": {
"name": "AC_bedroom",
"icon": "bedroom"
},
"temperatureUnit": "C",
"remoteFlavor": "Unofficial Cobra",
"remoteAlternatives": []
}
}

View File

@@ -0,0 +1,428 @@
{
"status": "success",
"result": {
"configGroup": "stable",
"macAddress": "00:11:22:33:44:55",
"isGeofenceOnExitEnabled": false,
"sensorsCalibration": {
"temperature": 0.0,
"humidity": 0.0
},
"cleanFiltersNotificationEnabled": true,
"connectionStatus": {
"isAlive": true,
"lastSeen": {
"secondsAgo": 12,
"time": "2019-10-05T15:26:45.199202Z"
}
},
"acState": {
"on": true,
"fanLevel": "auto",
"temperatureUnit": "C",
"targetTemperature": 10,
"mode": "heat",
"swing": "rangeFull"
},
"serial": "000000000",
"id": "PODID",
"firmwareVersion": "SKY30043",
"firmwareType": "esp8266ex",
"measurements": {
"temperature": 19.1,
"humidity": 34.8,
"time": {
"secondsAgo": 12,
"time": "2019-10-05T15:26:45.199202Z"
},
"rssi": "-68",
"piezo": [
null,
null
]
},
"remoteFlavor": "Enthusiastic Triceratops",
"shouldShowFilterCleaningNotification": false,
"location": {
"latLon": [
59.924477,
10.5884129
],
"name": "Home",
"country": "Fantasyland",
"createTime": {
"secondsAgo": 31104046,
"time": "2018-10-10T15:26:12Z"
},
"address": [
"Street",
"Zip post",
"ENgland"
],
"id": "XXXXXXXX"
},
"currentlyAvailableFirmwareVersion": "SKY30043",
"tags": [],
"productModel": "skyv2",
"schedules": [
{
"nextTime": "2019-10-06T11:00:00",
"podUid": "XXXXXX",
"recurringDays": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
],
"createTimeSecondsAgo": 51,
"isEnabled": true,
"createTime": "2019-10-05T15:26:07",
"acState": {
"on": true,
"fanLevel": "auto",
"temperatureUnit": "C",
"targetTemperature": 10,
"mode": "heat"
},
"targetTimeLocal": "13:00",
"timezone": "Europe/Oslo",
"nextTimeSecondsFromNow": 70381,
"causedBy": {
"username": "username",
"firstName": "FIrst",
"lastName": "Last",
"email": "mail@gmail.com"
},
"id": "scheduleid"
}
],
"isClimateReactGeofenceOnExitEnabled": false,
"remoteCapabilities": {
"modes": {
"dry": {
"swing": [
"stopped",
"fixedTop",
"fixedMiddleTop",
"fixedMiddle",
"fixedMiddleBottom",
"fixedBottom",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31
]
},
"F": {
"isNative": false,
"values": [
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86,
88
]
}
},
"fanLevels": [
"quiet",
"low",
"medium",
"medium_high",
"high",
"auto"
]
},
"auto": {
"swing": [
"stopped",
"fixedTop",
"fixedMiddleTop",
"fixedMiddle",
"fixedMiddleBottom",
"fixedBottom",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31
]
},
"F": {
"isNative": false,
"values": [
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86,
88
]
}
},
"fanLevels": [
"quiet",
"low",
"medium",
"medium_high",
"high",
"auto"
]
},
"heat": {
"swing": [
"stopped",
"fixedTop",
"fixedMiddleTop",
"fixedMiddle",
"fixedMiddleBottom",
"fixedBottom",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
10,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31
]
},
"F": {
"isNative": false,
"values": [
50,
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86,
88
]
}
},
"fanLevels": [
"quiet",
"low",
"medium",
"medium_high",
"high",
"auto"
]
},
"fan": {
"swing": [
"stopped",
"fixedTop",
"fixedMiddleTop",
"fixedMiddle",
"fixedMiddleBottom",
"fixedBottom",
"rangeFull"
],
"temperatures": {
},
"fanLevels": [
"quiet",
"low",
"medium",
"medium_high",
"high",
"auto"
]
},
"cool": {
"swing": [
"stopped",
"fixedTop",
"fixedMiddleTop",
"fixedMiddle",
"fixedMiddleBottom",
"fixedBottom",
"rangeFull"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31
]
},
"F": {
"isNative": false,
"values": [
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86,
88
]
}
},
"fanLevels": [
"quiet",
"low",
"medium",
"medium_high",
"high",
"auto"
]
}
}
},
"remote": {
"window": false,
"toggle": false
},
"room": {
"name": "Stue",
"icon": "Livingroom"
},
"temperatureUnit": "C",
"timer": {
"acState": {
"on": false,
"fanLevel": "auto",
"temperatureUnit": "C",
"targetTemperature": 10,
"mode": "heat",
"swing": "rangeFull"
},
"targetTimeSecondsFromNow": 3142,
"createTimeSecondsAgo": 38,
"isEnabled": true,
"causedBy": {
"username": "arneseime",
"firstName": "Arne",
"lastName": "Seime",
"email": "arne.seime@gmail.com"
},
"id": "7AZN7A9amL",
"targetTime": "2019-10-05T16:42:11",
"createTime": "2019-10-05T15:49:11"
},
"motionSensors": [],
"remoteAlternatives": [
"_mitsubishi1f_horizontal_rangeful",
"_mitsubishi1_for_ben_ho",
"_mitsubishi1_plasma_on",
"_mitsubishi1f_fixed_left",
"_mitsubishi1_plasma_on_clean_on",
"mitsubishi1f",
"_mitsubishi1f_fixed_right",
"_mitsubishi1_left_swing_fixed_bottom",
"_mitsubishi1_fixed_center",
"_mitsubishi1f"
]
}
}

View File

@@ -0,0 +1,307 @@
{
"status": "success",
"result": {
"configGroup": "stable",
"macAddress": "34:15:13:AA:AA:AA",
"cleanFiltersNotificationEnabled": true,
"room": {
"name": "Living Room",
"icon": "Den"
},
"firmwareType": "cc3100_stm32f0",
"productModel": "skyv2",
"sensorsCalibration": {
"temperature": 0.0,
"humidity": 0.0
},
"temperatureUnit": "C",
"isGeofenceOnExitEnabled": true,
"connectionStatus": {
"isAlive": true,
"lastSeen": {
"secondsAgo": 17,
"time": "2019-05-12T22:24:36Z"
}
},
"id": "PODID",
"acState": {
"on": false,
"fanLevel": "high",
"temperatureUnit": "C",
"targetTemperature": 21,
"mode": "cool",
"swing": "rangeFull"
},
"smartMode": {
"deviceUid": "PODID",
"highTemperatureThreshold": 28.0,
"type": "temperature",
"lowTemperatureState": {
"on": false,
"fanLevel": "auto",
"temperatureUnit": "C",
"targetTemperature": 26,
"mode": "cool"
},
"enabled": false,
"highTemperatureState": {
"on": true,
"fanLevel": "auto",
"temperatureUnit": "C",
"targetTemperature": 26,
"mode": "cool"
},
"lowTemperatureThreshold": 20.0
},
"shouldShowFilterCleaningNotification": false,
"location": {
"latLon": [
47.5274799,
19.1127283
],
"country": "Hungary",
"createTime": {
"secondsAgo": 2519470,
"time": "2019-04-13T18:33:43Z"
},
"address": [
"B",
"u",
"d"
],
"id": "w9s6KMRrhR"
},
"currentlyAvailableFirmwareVersion": "IN010056",
"isClimateReactGeofenceOnExitEnabled": false,
"remoteCapabilities": {
"modes": {
"dry": {
"swing": [
"stopped",
"rangeFull",
"fixedBottom",
"fixedMiddleBottom",
"fixedMiddle",
"fixedMiddleTop",
"fixedTop"
],
"temperatures": {},
"fanLevels": [
"low"
]
},
"auto": {
"swing": [
"stopped",
"rangeFull",
"fixedBottom",
"fixedMiddleBottom",
"fixedMiddle",
"fixedMiddleTop",
"fixedTop"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
]
},
"F": {
"isNative": false,
"values": [
59,
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86
]
}
},
"fanLevels": [
"auto"
]
},
"heat": {
"swing": [
"stopped",
"rangeFull",
"fixedBottom",
"fixedMiddleBottom",
"fixedMiddle",
"fixedMiddleTop",
"fixedTop"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
]
},
"F": {
"isNative": false,
"values": [
61,
63,
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86
]
}
},
"fanLevels": [
"low",
"medium_low",
"medium",
"medium_high",
"high",
"auto"
]
},
"fan": {
"swing": [
"stopped",
"rangeFull",
"fixedBottom",
"fixedMiddleBottom",
"fixedMiddle",
"fixedMiddleTop",
"fixedTop"
],
"temperatures": {},
"fanLevels": [
"low",
"medium_low",
"medium",
"medium_high",
"high",
"auto"
]
},
"cool": {
"swing": [
"stopped",
"rangeFull",
"fixedBottom",
"fixedMiddleBottom",
"fixedMiddle",
"fixedMiddleTop",
"fixedTop"
],
"temperatures": {
"C": {
"isNative": true,
"values": [
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
]
},
"F": {
"isNative": false,
"values": [
64,
66,
68,
70,
72,
73,
75,
77,
79,
81,
82,
84,
86
]
}
},
"fanLevels": [
"low",
"medium_low",
"medium",
"medium_high",
"high",
"auto"
]
}
}
},
"serial": "11184989",
"firmwareVersion": "IN010056",
"measurements": {
"temperature": 23.8,
"humidity": 58.9,
"time": {
"secondsAgo": 17,
"time": "2019-05-12T22:24:36Z"
},
"rssi": "-40",
"piezo": [
null,
null
]
}
}
}

View File

@@ -0,0 +1,8 @@
{
"status": "success",
"result": [
{
"id": "PODID"
}
]
}

View File

@@ -0,0 +1,10 @@
{ "acState": {
"on": true,
"fanLevel": "medium_high",
"temperatureUnit": "C",
"targetTemperature": 21,
"mode": "heat",
"swing": "rangeFull"
}
}

View File

@@ -0,0 +1,18 @@
{
"status": "success",
"result": {
"status": "Success",
"reason": "UserRequest",
"acState": {
"on": true,
"fanLevel": "medium_high",
"temperatureUnit": "C",
"targetTemperature": 21,
"mode": "heat",
"swing": "rangeFull"
},
"changedProperties": [],
"id": "RESULTID",
"failureReason": null
}
}