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)