/** * 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.PercentType; import org.openhab.core.library.types.StringType; import org.openhab.core.types.State; /** * A message received from the Radiator Valves detailing their current state. On * the LAN the messages look like: !{ "trans":1232, "mac":"03:02:71", * "time":1423827547, "prod":"valve", "serial":"5A4F02", "signal":0, * "type":"temp", "batt":2.72, "ver":56, "state":"run", "cTemp":17.8, * "cTarg":19.0, "output":80, "nTarg":24.0, "nSlot":"06:00", "prof":5 } * * @author Neil Renaud * @since 1.7.0 */ public class LightwaveRfHeatingInfoResponse extends AbstractLightwaveRfJsonMessage implements LightwaveRfSerialMessage { 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 PROD_REG_EXP = Pattern.compile(".*\"prod\":\"([^\"}]*)\".*"); private static final Pattern SERIAL_ID_REG_EXP = Pattern.compile(".*\"serial\":\"([^\"}]*)\".*"); private static final Pattern SIGNAL_REG_EXP = Pattern.compile(".*\"signal\":([^,}]*).*"); private static final Pattern TYPE_REG_EXP = Pattern.compile(".*\"type\":\"([^\"}]*)\".*"); private static final Pattern BATTERY_REG_EXP = Pattern.compile(".*\"batt\":([^,}]*).*"); private static final Pattern VERSION_REG_EXP = Pattern.compile(".*\"ver\":([^,}]*).*"); private static final Pattern STATE_REG_EXP = Pattern.compile(".*\"state\":\"([^\"}]*)\".*"); private static final Pattern CURRENT_TEMP_REG_EXP = Pattern.compile(".*\"cTemp\":([^,}]*).*"); private static final Pattern TARGET_TEMP_REG_EXP = Pattern.compile(".*\"cTarg\":([^,}]*).*"); private static final Pattern OUTPUT_TEMP_REG_EXP = Pattern.compile(".*\"output\":([^,}]*).*"); private static final Pattern NEXT_TARGET_TEMP_REG_EXP = Pattern.compile(".*\"nTarg\":([^,}]*).*"); private static final Pattern NEXT_SLOT_REG_EXP = Pattern.compile(".*\"nSlot\":\"([^\"}]*)\".*"); private static final Pattern PROF_REG_EXP = Pattern.compile(".*\"prof\":([^,}]*).*"); private final String mac; private final Date time; private final String prod; private final String serial; private final String signal; private final String type; private final String batteryLevel; private final String version; private final String state; private final String currentTemperature; private final String currentTargetTemperature; private final String output; private final String nextTargetTeperature; private final String nextSlot; private final String prof; public LightwaveRfHeatingInfoResponse(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); serial = getStringFromText(SERIAL_ID_REG_EXP, message); signal = getStringFromText(SIGNAL_REG_EXP, message); type = getStringFromText(TYPE_REG_EXP, message); batteryLevel = getStringFromText(BATTERY_REG_EXP, message); version = getStringFromText(VERSION_REG_EXP, message); state = getStringFromText(STATE_REG_EXP, message); currentTemperature = getStringFromText(CURRENT_TEMP_REG_EXP, message); currentTargetTemperature = getStringFromText(TARGET_TEMP_REG_EXP, message); output = getStringFromText(OUTPUT_TEMP_REG_EXP, message); nextTargetTeperature = getStringFromText(NEXT_TARGET_TEMP_REG_EXP, message); nextSlot = getStringFromText(NEXT_SLOT_REG_EXP, message); prof = getStringFromText(PROF_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(",\"prod\":\"").append(prod).append("\",\"serial\":\"").append(serial).append("\",\"signal\":") .append(signal).append(",\"type\":\"").append(type).append("\",\"batt\":").append(batteryLevel) .append(",\"ver\":").append(version).append(",\"state\":\"").append(state).append("\",\"cTemp\":") .append(currentTemperature).append(",\"cTarg\":").append(currentTargetTemperature) .append(",\"output\":").append(output).append(",\"nTarg\":").append(nextTargetTeperature) .append(",\"nSlot\":\"").append(nextSlot).append("\",\"prof\":").append(prof).append("}").toString(); } @Override public State getState(LightwaveRfType type) { switch (type) { case HEATING_BATTERY: return new DecimalType(getBatteryLevel()); case SIGNAL: return new DecimalType(getSignal()); case HEATING_CURRENT_TEMP: return new DecimalType(getCurrentTemperature()); case HEATING_SET_TEMP: return new DecimalType(getCurrentTargetTemperature()); case HEATING_MODE: return new StringType(getState()); case HEATING_OUTPUT: return new PercentType(getOutput()); case UPDATETIME: Calendar cal = Calendar.getInstance(); cal.setTime(getTime()); return new DateTimeType(cal); case VERSION: return new StringType(getVersion()); default: return null; } } public String getState() { return state; } public static boolean matches(String message) { if (message.contains("cTemp")) { return true; } return false; } public Date getTime() { return time; } public String getSignal() { return signal; } public String getBatteryLevel() { return batteryLevel; } public String getCurrentTemperature() { return currentTemperature; } public String getCurrentTargetTemperature() { return currentTargetTemperature; } @Override public String getSerial() { return serial; } public String getMac() { return mac; } public String getNextSlot() { return nextSlot; } public String getNextTargetTeperature() { return nextTargetTeperature; } public String getOutput() { return output; } public String getProd() { return prod; } public String getProf() { return prof; } public String getType() { return type; } public String getVersion() { return version; } @Override public LightwaveRfMessageType getMessageType() { return LightwaveRfMessageType.SERIAL; } }