Skip to content

Instantly share code, notes, and snippets.

@mmackh
Created February 17, 2014 11:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mmackh/9049038 to your computer and use it in GitHub Desktop.
Save mmackh/9049038 to your computer and use it in GitHub Desktop.
KNX Write Protocol
- (void)changeStatusOfObject:(PCHousemasterObject *)object toValue:(float)value
{
NSArray *groupAddressArray = [object.groupAddress componentsSeparatedByString:@"/"];
NSString *groupAddressBaseTwo = [NSString stringWithFormat:@"%@%@%@",[self convertToBinary:[groupAddressArray[0] integerValue] padding:5],[self convertToBinary:[groupAddressArray[1] integerValue] padding:3],[self convertToBinary:[groupAddressArray[2] integerValue] padding:8]];
NSString *groupAddressDecimal = [NSString stringWithFormat:@"%ld",strtol([groupAddressBaseTwo UTF8String], NULL, 2)];
NSString *message = [NSString stringWithFormat:@"1|%@|%i\0",groupAddressDecimal,(int)(value * 100)];
NSLog(@"%@",message);
NSData *data = [message dataUsingEncoding:NSASCIIStringEncoding];
[_socket writeData:data withTimeout:10 tag:0];
}
- (NSString *)convertToBinary:(NSInteger)number padding:(int)padding
{
NSMutableString *str = @"".mutableCopy;
for(NSInteger numberCopy = number; numberCopy > 0; numberCopy >>= 1)
{
[str insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0];
}
NSString *variablePadding = [NSString stringWithFormat:@"%%0%id",padding];
return [NSString stringWithFormat:variablePadding,str.integerValue];
}
@end
@mmackh
Copy link
Author

mmackh commented Sep 12, 2023

PHP

function convertToBinary($number, $padding) {
    $str = '';
    for ($numberCopy = $number; $numberCopy > 0; $numberCopy >>= 1) {
        $str = (($numberCopy & 1) ? '1' : '0') . $str;
    }
    $variablePadding = sprintf("%%0%dd", $padding);
    return sprintf($variablePadding, intval($str));
}

// Function to generate a KNX command from a group address and a value
function generateKnxCommand($groupAddress, $value) {
    $groupAddressArray = explode('/', $groupAddress);
    
    $groupAddressBaseTwo = convertToBinary($groupAddressArray[0], 5) .
    convertToBinary($groupAddressArray[1], 3) .
    convertToBinary($groupAddressArray[2], 8);
    
    $groupAddressDecimal = bindec($groupAddressBaseTwo);
    
    $message = sprintf("1|%d|%d\0", $groupAddressDecimal, intval($value * 100));
    
    return $message;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment