[miio] handle invalid rssi response (#10601)
Signed-off-by: Marcel Verpaalen <marcel@verpaalen.com>
This commit is contained in:
parent
7d13795380
commit
52b05085aa
@ -0,0 +1,83 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2010-2021 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.miio.internal;
|
||||||
|
|
||||||
|
import com.google.gson.JsonPrimitive;
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapping network properties from json for miio info response
|
||||||
|
*
|
||||||
|
* @author Marcel Verpaalen - Initial contribution
|
||||||
|
*/
|
||||||
|
public class MiIoInfoApDTO {
|
||||||
|
@SerializedName("ssid")
|
||||||
|
@Expose
|
||||||
|
private String ssid;
|
||||||
|
@SerializedName("bssid")
|
||||||
|
@Expose
|
||||||
|
private String bssid;
|
||||||
|
@SerializedName("rssi")
|
||||||
|
@Expose
|
||||||
|
private JsonPrimitive rssi;
|
||||||
|
@SerializedName("wifi_rssi")
|
||||||
|
@Expose
|
||||||
|
private Long wifiRssi;
|
||||||
|
@SerializedName("freq")
|
||||||
|
@Expose
|
||||||
|
private Long freq;
|
||||||
|
|
||||||
|
public String getSsid() {
|
||||||
|
return ssid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSsid(String ssid) {
|
||||||
|
this.ssid = ssid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBssid() {
|
||||||
|
return bssid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBssid(String bssid) {
|
||||||
|
this.bssid = bssid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getRssi() {
|
||||||
|
if (rssi.isNumber()) {
|
||||||
|
return rssi.getAsLong();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRssi(Long rssi) {
|
||||||
|
this.rssi = new JsonPrimitive(rssi);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getWifiRssi() {
|
||||||
|
return wifiRssi;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWifiRssi(Long wifiRssi) {
|
||||||
|
this.wifiRssi = wifiRssi;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getFreq() {
|
||||||
|
return freq;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFreq(Long freq) {
|
||||||
|
this.freq = freq;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -45,6 +45,9 @@ public class MiIoInfoDTO {
|
|||||||
@SerializedName("model")
|
@SerializedName("model")
|
||||||
@Expose
|
@Expose
|
||||||
public String model;
|
public String model;
|
||||||
|
@SerializedName("ap")
|
||||||
|
@Expose
|
||||||
|
public MiIoInfoApDTO ap;
|
||||||
@SerializedName("wifi_fw_ver")
|
@SerializedName("wifi_fw_ver")
|
||||||
@Expose
|
@Expose
|
||||||
public String wifiFwVer;
|
public String wifiFwVer;
|
||||||
|
|||||||
@ -32,6 +32,7 @@ import org.openhab.binding.miio.internal.MiIoCommand;
|
|||||||
import org.openhab.binding.miio.internal.MiIoCrypto;
|
import org.openhab.binding.miio.internal.MiIoCrypto;
|
||||||
import org.openhab.binding.miio.internal.MiIoCryptoException;
|
import org.openhab.binding.miio.internal.MiIoCryptoException;
|
||||||
import org.openhab.binding.miio.internal.MiIoDevices;
|
import org.openhab.binding.miio.internal.MiIoDevices;
|
||||||
|
import org.openhab.binding.miio.internal.MiIoInfoApDTO;
|
||||||
import org.openhab.binding.miio.internal.MiIoInfoDTO;
|
import org.openhab.binding.miio.internal.MiIoInfoDTO;
|
||||||
import org.openhab.binding.miio.internal.MiIoMessageListener;
|
import org.openhab.binding.miio.internal.MiIoMessageListener;
|
||||||
import org.openhab.binding.miio.internal.MiIoSendCommand;
|
import org.openhab.binding.miio.internal.MiIoSendCommand;
|
||||||
@ -58,6 +59,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link MiIoAbstractHandler} is responsible for handling commands, which are
|
* The {@link MiIoAbstractHandler} is responsible for handling commands, which are
|
||||||
@ -292,19 +294,30 @@ public abstract class MiIoAbstractHandler extends BaseThingHandler implements Mi
|
|||||||
|
|
||||||
protected boolean updateNetwork(JsonObject networkData) {
|
protected boolean updateNetwork(JsonObject networkData) {
|
||||||
try {
|
try {
|
||||||
updateState(CHANNEL_SSID, new StringType(networkData.getAsJsonObject("ap").get("ssid").getAsString()));
|
final MiIoInfoDTO miioInfo = GSON.fromJson(networkData, MiIoInfoDTO.class);
|
||||||
updateState(CHANNEL_BSSID, new StringType(networkData.getAsJsonObject("ap").get("bssid").getAsString()));
|
final MiIoInfoApDTO ap = miioInfo != null ? miioInfo.ap : null;
|
||||||
if (networkData.getAsJsonObject("ap").get("rssi") != null) {
|
if (miioInfo != null && ap != null) {
|
||||||
updateState(CHANNEL_RSSI, new DecimalType(networkData.getAsJsonObject("ap").get("rssi").getAsLong()));
|
if (ap.getSsid() != null) {
|
||||||
} else if (networkData.getAsJsonObject("ap").get("wifi_rssi") != null) {
|
updateState(CHANNEL_SSID, new StringType(ap.getSsid()));
|
||||||
updateState(CHANNEL_RSSI,
|
}
|
||||||
new DecimalType(networkData.getAsJsonObject("ap").get("wifi_rssi").getAsLong()));
|
if (ap.getBssid() != null) {
|
||||||
} else {
|
updateState(CHANNEL_BSSID, new StringType(ap.getBssid()));
|
||||||
logger.debug("No RSSI info in response");
|
}
|
||||||
|
if (ap.getRssi() != null) {
|
||||||
|
updateState(CHANNEL_RSSI, new DecimalType(ap.getRssi()));
|
||||||
|
} else if (ap.getWifiRssi() != null) {
|
||||||
|
updateState(CHANNEL_RSSI, new DecimalType(ap.getWifiRssi()));
|
||||||
|
} else {
|
||||||
|
logger.debug("No RSSI info in response");
|
||||||
|
}
|
||||||
|
if (miioInfo.life != null) {
|
||||||
|
updateState(CHANNEL_LIFE, new DecimalType(miioInfo.life));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
updateState(CHANNEL_LIFE, new DecimalType(networkData.get("life").getAsLong()));
|
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (NumberFormatException e) {
|
||||||
|
logger.debug("Could not parse number in network response: {}", networkData);
|
||||||
|
} catch (JsonSyntaxException e) {
|
||||||
logger.debug("Could not parse network response: {}", networkData, e);
|
logger.debug("Could not parse network response: {}", networkData, e);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -420,6 +433,9 @@ public abstract class MiIoAbstractHandler extends BaseThingHandler implements Mi
|
|||||||
|
|
||||||
private void updateProperties(JsonObject miioInfo) {
|
private void updateProperties(JsonObject miioInfo) {
|
||||||
final MiIoInfoDTO info = GSON.fromJson(miioInfo, MiIoInfoDTO.class);
|
final MiIoInfoDTO info = GSON.fromJson(miioInfo, MiIoInfoDTO.class);
|
||||||
|
if (info == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
Map<String, String> properties = editProperties();
|
Map<String, String> properties = editProperties();
|
||||||
if (info.model != null) {
|
if (info.model != null) {
|
||||||
properties.put(Thing.PROPERTY_MODEL_ID, info.model);
|
properties.put(Thing.PROPERTY_MODEL_ID, info.model);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user