/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* 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.binding.lightwaverf.internal.command;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern;
import org.openhab.binding.lightwaverf.internal.LightwaveRfType;
import org.openhab.binding.lightwaverf.internal.exception.LightwaveRfMessageException;
import org.openhab.core.library.types.DateTimeType;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.types.State;
/**
* A message received from the Wifi Link with Status Info.
* On the LAN the messages look like:
* *!{"trans":452,"mac":"ab:cd:ef","time":1447712274,"type":"hub","prod":"wfl","fw":"U2.91Y",
* "uptime":1386309,"timeZone":0,"lat":52.48,"long":-87.89,"duskTime":1447690400,
* "dawnTime":1447659083,"tmrs":0,"evns":1,"run":0,"macs":8,"ip":"192.168.0.1","devs":0}
*
* @author Neil Renaud
* @since 1.8.0
*/
public class LightwaveRfWifiLinkStatusMessage extends AbstractLightwaveRfJsonMessage
implements LightwaveRfSerialMessage {
private static final String WIFI_LINK_SERIAL = "wifilink";
private static final Pattern MAC_ID_REG_EXP = Pattern.compile(".*\"mac\":\"([^\"}]*)\".*");
private static final Pattern TIME_ID_REG_EXP = Pattern.compile(".*\"time\":([^,}]*).*");
private static final Pattern TYPE_REG_EXP = Pattern.compile(".*\"type\":\"([^\"}]*)\".*");
private static final Pattern PROD_REG_EXP = Pattern.compile(".*\"prod\":\"([^\"}]*)\".*");
private static final Pattern FIRMWARE_REG_EXP = Pattern.compile(".*\"fw\":\"([^\"}]*)\".*");
private static final Pattern UPTIME_REG_EXP = Pattern.compile(".*\"uptime\":([^,}]*).*");
private static final Pattern TIMEZONE_REG_EXP = Pattern.compile(".*\"timeZone\":([^,}]*).*");
private static final Pattern LATITUDE_REG_EXP = Pattern.compile(".*\"lat\":([^,}]*).*");
private static final Pattern LONGITUDE_REG_EXP = Pattern.compile(".*\"long\":([^,}]*).*");
private static final Pattern DUSK_TIME_REG_EXP = Pattern.compile(".*\"duskTime\":([^,}]*).*");
private static final Pattern DAWN_TIME_REG_EXP = Pattern.compile(".*\"dawnTime\":([^,}]*).*");
private static final Pattern TMRS_REG_EXP = Pattern.compile(".*\"tmrs\":([^,}]*).*");
private static final Pattern ENVS_REG_EXP = Pattern.compile(".*\"evns\":([^,}]*).*");
private static final Pattern RUN_REG_EXP = Pattern.compile(".*\"run\":([^,}]*).*");
private static final Pattern MACS_REG_EXP = Pattern.compile(".*\"macs\":([^,}]*).*");
private static final Pattern IP_REG_EXP = Pattern.compile(".*\"ip\":\"([^\"}]*)\".*");
private static final Pattern DEVS_REG_EXP = Pattern.compile(".*\"devs\":([^,}]*).*");
private final String mac;
private final Date time;
private final String type;
private final String prod;
private final String firmware;
private final long uptime;
private final String timeZone;
private final String latitude;
private final String longitude;
private final Date duskTime;
private final Date dawnTime;
private final String tmrs;
private final String envs;
private final String run;
private final String macs;
private final String ip;
private final String devs;
public LightwaveRfWifiLinkStatusMessage(String message) throws LightwaveRfMessageException {
super(message);
mac = getStringFromText(MAC_ID_REG_EXP, message);
time = getDateFromText(TIME_ID_REG_EXP, message);
prod = getStringFromText(PROD_REG_EXP, message);
type = getStringFromText(TYPE_REG_EXP, message);
firmware = getStringFromText(FIRMWARE_REG_EXP, message);
uptime = getLongFromText(UPTIME_REG_EXP, message);
timeZone = getStringFromText(TIMEZONE_REG_EXP, message);
latitude = getStringFromText(LATITUDE_REG_EXP, message);
longitude = getStringFromText(LONGITUDE_REG_EXP, message);
duskTime = getDateFromText(DUSK_TIME_REG_EXP, message);
dawnTime = getDateFromText(DAWN_TIME_REG_EXP, message);
tmrs = getStringFromText(TMRS_REG_EXP, message);
envs = getStringFromText(ENVS_REG_EXP, message);
run = getStringFromText(RUN_REG_EXP, message);
macs = getStringFromText(MACS_REG_EXP, message);
ip = getStringFromText(IP_REG_EXP, message);
devs = getStringFromText(DEVS_REG_EXP, message);
}
@Override
public String getLightwaveRfCommandString() {
return new StringBuilder("*!{").append("\"trans\":").append(getMessageId().getMessageIdString())
.append(",\"mac\":\"").append(mac).append("\",\"time\":").append(getLightwaveDateFromJavaDate(time))
.append(",\"type\":\"").append(type).append(",\"prod\":\"").append(prod).append(",\"fw\":\"")
.append(firmware).append(",\"uptime\":\"").append(uptime).append(",\"timeZone\":\"").append(timeZone)
.append(",\"lat\":\"").append(latitude).append(",\"long\":\"").append(longitude)
.append(",\"duskTime\":\"").append(getLightwaveDateFromJavaDate(duskTime)).append(",\"dawnTime\":\"")
.append(getLightwaveDateFromJavaDate(dawnTime)).append(",\"tmrs\":\"").append(tmrs)
.append(",\"evns\":\"").append(envs).append(",\"run\":\"").append(run).append(",\"macs\":\"")
.append(macs).append(",\"ip\":\"").append(ip).append(",\"devs\":\"").append(devs).append("}")
.toString();
}
@Override
public State getState(LightwaveRfType type) {
switch (type) {
case WIFILINK_IP:
return new StringType(ip);
case WIFILINK_FIRMWARE:
return new StringType(firmware);
case WIFILINK_DUSK_TIME:
Calendar calDusk = Calendar.getInstance();
calDusk.setTime(duskTime);
return new DateTimeType(calDusk);
case WIFILINK_DAWN_TIME:
Calendar calDawn = Calendar.getInstance();
calDawn.setTime(dawnTime);
return new DateTimeType(calDawn);
case WIFILINK_UPTIME:
return new DecimalType(uptime);
case WIFILINK_LONGITUDE:
return new StringType(longitude);
case WIFILINK_LATITUDE:
return new StringType(latitude);
case UPDATETIME:
Calendar cal = Calendar.getInstance();
cal.setTime(getTime());
return new DateTimeType(cal);
default:
return null;
}
}
public static boolean matches(String message) {
if (message.contains("\"type\":\"hub\"") && message.contains("\"prod\":\"wfl\"") && message.contains("lat")
&& message.contains("long")) {
return true;
}
return false;
}
@Override
public LightwaveRfMessageType getMessageType() {
return LightwaveRfMessageType.SERIAL;
}
public String getMac() {
return mac;
}
public String getProd() {
return prod;
}
public Date getTime() {
return time;
}
public String getType() {
return type;
}
public String getFirmware() {
return firmware;
}
public long getUptime() {
return uptime;
}
public String getTimeZone() {
return timeZone;
}
public String getLatitude() {
return latitude;
}
public String getLongitude() {
return longitude;
}
public Date getDuskTime() {
return duskTime;
}
public Date getDawnTime() {
return dawnTime;
}
public String getTmrs() {
return tmrs;
}
public String getEnvs() {
return envs;
}
public String getRun() {
return run;
}
public String getMacs() {
return macs;
}
public String getIp() {
return ip;
}
public String getDevs() {
return devs;
}
@Override
public String getSerial() {
return WIFI_LINK_SERIAL;
}
}