cay wrote:Ingen aning vad {'T', 127, 255, 24, 1, 0} innebär...
Läs under "T - Send command, extended".
http://developer.telldus.com/doxygen/TellStick.html
Dock är detta inte implementerat i TellStick Net. Från 
http://developer.telldus.com/doxygen/TellStickNet.html:
The command "Send extended" (T) is not implemented since a TellStick Net can handle packages over 255 pulses.
FYI, är är ett par bra att ha funktioner jag plockade från vårt arkiv. Kanske kan komma till nytta för er?
Generera codeswitch data (php):
Code: Select all
function getCodeSwitchTuple($intCode) {
  $strReturn = '';
  for( $i = 0; $i < 4; ++$i ) {
    if ($intCode & 1) { //Convert 1
      $strReturn .= '$kk$';
    } else { //Convert 0
      $strReturn .= '$k$k';
    }
    $intCode >>= 1;
  }
  return $strReturn;
}
// $house: 'A'-'P'
// $unit: 1-16
function getStringCodeSwitch($house, $unit, $method) {
  $strReturn = '';
  $house = $this->getStringParameter('house', 'A');
  $intHouse = ord(substr($house, 0, 1)) - ord('A');
  $strReturn .= $this->getCodeSwitchTuple($intHouse);
  $strReturn .= $this->getCodeSwitchTuple($unit-1);
  if ($method == TELLSTICK_TURNON) {
    $strReturn .= '$k$k$kk$$kk$$kk$$k';
  } else if ($method == TELLSTICK_TURNOFF) {
    $strReturn .= $this->getOffCode();
  } else {
    return '';
  }
  return $strReturn;
}
Generera selflearning data (php):
Code: Select all
function getStringSelflearningForCode($intHouse, $intCode, $method, $level) {
  $SHORT = chr(24);
  $LONG = chr(127);
  $ONE = $SHORT.$LONG.$SHORT.$SHORT;
  $ZERO = $SHORT.$SHORT.$SHORT.$LONG;
  $code = $SHORT.chr(255);
  for ($i = 25; $i >= 0; --$i) {
    $code .= ( $intHouse & 1 << $i ? $ONE : $ZERO);
  }
  $code .= $ZERO; //Group
  //On/off
  if ($method == TELLSTICK_DIM) {
    $code .= $SHORT.$SHORT.$SHORT.$SHORT;
  } else if ($method == TELLSTICK_TURNOFF) {
    $code .= $ZERO;
  } else if ($method == TELLSTICK_TURNON) {
    $code .= $ONE;
  } else if ($method == TELLSTICK_LEARN) {
    $code .= $ONE;
  } else {
    return '';
  }
  for ($i = 3; $i >= 0; --$i) {
    $code .= ( $intCode & 1 << $i ? $ONE : $ZERO);
  }
  if ($method == TELLSTICK_DIM) {
    $newLevel = $level/16;
    for ($i = 3; $i >= 0; --$i) {
      $code .= $newLevel & 1 << $i ? $ONE : $ZERO;
    }
  }
  $code .= $SHORT;
  return $code;
}
En klass för att konvertera till och från data till TellStick Net (python):
Code: Select all
class LiveMessageToken(object):
	TYPE_INVALID, TYPE_INT, TYPE_STRING, TYPE_BASE64, TYPE_LIST, TYPE_DICTIONARY = range(6)
	def __init__(self, value = None):
		self.valueType = LiveMessageToken.TYPE_INVALID
		self.stringVal = u''
		self.intVal = 0
		self.dictVal = {}
		self.listVal = []
		if (type(value) is int or type(value) is long):
			self.valueType = self.TYPE_INT
			self.intVal = value
		elif (type(value) is str or type(value) is unicode or type(value) == float):
			self.valueType = self.TYPE_STRING
			self.stringVal = value
		elif (type(value) is list):
			self.valueType = self.TYPE_LIST
			for v in value:
				self.listVal.append(LiveMessageToken(v))
		elif (type(value) is dict):
			self.valueType = self.TYPE_DICTIONARY
			for key in value:
				self.dictVal[key] = LiveMessageToken(value[key])
	def toInt(self):
		if self.valueType == LiveMessageToken.TYPE_INT:
			return self.intVal
		if self.valueType == LiveMessageToken.TYPE_STRING:
			return long(self.stringVal)
		return 0  # Could not convert
	def toJSON(self):
		if (self.valueType == LiveMessageToken.TYPE_INT):
			return '%d' % self.intVal
		if (self.valueType == LiveMessageToken.TYPE_LIST):
			retval = '['
			for token in self.listVal:
				if len(retval) > 1:
					retval = retval + ","
				retval = retval + token.toJSON()
			return retval + ']'
		if (self.valueType == LiveMessageToken.TYPE_DICTIONARY):
			retval = '{'
			for key in self.dictVal:
				if len(retval) > 1:
					retval = retval + ","
				retval = retval + LiveMessageToken(key).toJSON() + "=" + self.dictVal[key].toJSON()
			return retval + '}'
		return self.stringVal
	def toNative(self):
		if (self.valueType == LiveMessageToken.TYPE_INT):
			return self.intVal
		if (self.valueType == LiveMessageToken.TYPE_LIST):
			retval = []
			for token in self.listVal:
				retval.append(token.toNative())
			return retval
		if (self.valueType == LiveMessageToken.TYPE_DICTIONARY):
			retval = {}
			for key in self.dictVal:
				retval[key] = self.dictVal[key].toNative()
			return retval
		return self.stringVal
	def toByteArray(self):
		if (self.valueType == LiveMessageToken.TYPE_INT):
			return 'i%Xs' % self.intVal
		if (self.valueType == LiveMessageToken.TYPE_LIST):
			retval = 'l'
			for token in self.listVal:
				retval = retval + token.toByteArray()
			return retval + 's'
		if (self.valueType == LiveMessageToken.TYPE_DICTIONARY):
			retval = 'h'
			for key in self.dictVal:
				retval = retval + LiveMessageToken(key).toByteArray() + self.dictVal[key].toByteArray()
			return retval + 's'
		return '%X:%s' % (len(self.stringVal), str(self.stringVal),)
	@staticmethod
	def parseToken(string, start):
		token = LiveMessageToken()
		if (start >= len(string)):
			return (start, token)
		if (string[start] == 'i'):
			start+=1
			index = string.find('s', start)
			if (index < 0):
				return (start, token)
			try:
				token.intVal = int(string[start:index], 16)
				token.valueType = LiveMessageToken.TYPE_INT
				start = index + 1
			except:
				return (start, token)
		elif (string[start] == 'l'):
			start+=1
			token.valueType = LiveMessageToken.TYPE_LIST
			while (start < len(string) and string[start] != 's'):
				start, listToken = LiveMessageToken.parseToken(string, start)
				if (listToken.valueType == LiveMessageToken.TYPE_INVALID):
					break
				token.listVal.append(listToken)
			start+=1
		elif (string[start] == 'h'):
			start+=1
			token.valueType = LiveMessageToken.TYPE_DICTIONARY
			while (start < len(string) and string[start] != 's'):
				start, keyToken = LiveMessageToken.parseToken(string, start)
				if (keyToken.valueType == LiveMessageToken.TYPE_INVALID):
					break
				start, valueToken = LiveMessageToken.parseToken(string, start)
				if (valueToken.valueType == LiveMessageToken.TYPE_INVALID):
					break
				token.dictVal[keyToken.stringVal] = valueToken
			start+=1
		elif (string[start] == 'u'): #Base64
			start+=1
			start, token = LiveMessageToken.parseToken(string, start)
			token.valueType = LiveMessageToken.TYPE_BASE64
			token.stringVal = unicode(base64.decodestring(token.stringVal), 'utf-8')
		else: #String
			index = string.find(':', start)
			if (index < 0):
				return (start, token)
			try:
				length = int(string[start:index], 16)
			except:
				return (start, token)
			start = index + length + 1
			token.stringVal = string[index+1:start]
			token.valueType = LiveMessageToken.TYPE_STRING
		return (start, token)