/*
* Copyright (c) 2010-2016, openHAB.org and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.habdroid.model;
import android.graphics.Color;
import android.util.Log;
import com.crittercism.app.Crittercism;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* This is a class to hold basic information about openHAB Item.
*/
public class OpenHABItem {
private String name;
private String type;
private String groupType;
private String state = "";
private String link;
private final static String TAG = OpenHABItem.class.getSimpleName();
private final static Pattern HSB_PATTERN = Pattern.compile("^\\d+,\\d+,(\\d+)$");
public OpenHABItem(Node startNode) {
if (startNode.hasChildNodes()) {
NodeList childNodes = startNode.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i ++) {
Node childNode = childNodes.item(i);
if (childNode.getNodeName().equals("type")) {
this.setType(childNode.getTextContent());
} else if (childNode.getNodeName().equals("groupType")) {
this.setGroupType(childNode.getTextContent());
} else if (childNode.getNodeName().equals("name")) {
this.setName(childNode.getTextContent());
} else if (childNode.getNodeName().equals("state")) {
if (childNode.getTextContent().equals("Uninitialized")) {
this.setState(null);
} else {
this.setState(childNode.getTextContent());
}
} else if (childNode.getNodeName().equals("link")) {
this.setLink(childNode.getTextContent());
}
}
}
}
public OpenHABItem(JSONObject jsonObject) {
try {
if (jsonObject.has("type"))
this.setType(jsonObject.getString("type"));
if (jsonObject.has("groupType"))
this.setGroupType(jsonObject.getString("groupType"));
if (jsonObject.has("name"))
this.setName(jsonObject.getString("name"));
if (jsonObject.has("state")) {
if (jsonObject.getString("state").equals("NULL") ||
jsonObject.getString("state").equals("UNDEF") ||
jsonObject.getString("state").equalsIgnoreCase("undefined")) {
this.setState(null);
} else {
this.setState(jsonObject.getString("state"));
}
}
if (jsonObject.has("link"))
this.setLink(jsonObject.getString("link"));
} catch (JSONException e) {
e.printStackTrace();
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getGroupType() {
return groupType;
}
public void setGroupType(String groupType) {
this.groupType = groupType;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public boolean getStateAsBoolean() {
// For uninitialized/null state return false
if (state == null) {
return false;
}
// If state is ON for switches return True
if (state.equals("ON")) {
return true;
}
Matcher hsbMatcher = HSB_PATTERN.matcher(state);
if(hsbMatcher.find()) {
String brightness = hsbMatcher.group(1);
return isValueDecimalIntegerAndGreaterThanZero(brightness);
}
return isValueDecimalIntegerAndGreaterThanZero(state);
}
private Boolean isValueDecimalIntegerAndGreaterThanZero(String value) {
try {
int decimalValue = Integer.valueOf(value);
return decimalValue > 0;
} catch (NumberFormatException e) {
return false;
}
}
public Float getStateAsFloat() {
Float result;
// For uninitialized/null state return zero
if (state == null) {
result = 0f;
} else if ("ON".equals(state)) {
result = 100f;
} else if ("OFF".equals(state)) {
result = 0f;
} else {
try {
result = Float.parseFloat(state);
} catch (NumberFormatException e) {
if (e != null) {
Crittercism.logHandledException(e);
Log.e(TAG, e.getMessage());
}
result = new Float(0);
}
}
return result;
}
public float[] getStateAsHSV() {
if (state == null) {
float[] result = {0, 0, 0};
return result;
}
String[] stateSplit = state.split(",");
if (stateSplit.length == 3) { // We need exactly 3 numbers to operate this
float[] result = {Float.parseFloat(stateSplit[0]), Float.parseFloat(stateSplit[1])/100, Float.parseFloat(stateSplit[2])/100};
return result;
} else {
float[] result = {0, 0, 0};
return result;
}
}
public int getStateAsColor() {
return Color.HSVToColor(getStateAsHSV());
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}