add set desired-temp

This commit is contained in:
Marko Oldenburg 2018-01-19 22:34:21 +01:00
parent 35a1be4699
commit 0ccec0f5ec

View File

@ -49,7 +49,7 @@ use JSON;
use Blocking; use Blocking;
my $version = "0.0.14"; my $version = "0.0.17";
@ -60,6 +60,12 @@ my %gatttChar = (
'payload' => '0x3d', 'payload' => '0x3d',
'firmware' => '0x18' 'firmware' => '0x18'
); );
my %winOpnSensitivity = (
12 => 'low',
8 => 'medium',
4 => 'high'
);
my %CallBatteryAge = ( '8h' => 28800, my %CallBatteryAge = ( '8h' => 28800,
'16h' => 57600, '16h' => 57600,
@ -95,6 +101,7 @@ sub CometBlueBTLE_CallBattery_IsUpdateTimeAgeToOld($$);
sub CometBlueBTLE_CallBattery_Timestamp($); sub CometBlueBTLE_CallBattery_Timestamp($);
sub CometBlueBTLE_CallBattery_UpdateTimeAge($); sub CometBlueBTLE_CallBattery_UpdateTimeAge($);
sub CometBlueBTLE_CreateDevicenameHEX($); sub CometBlueBTLE_CreateDevicenameHEX($);
sub CometBlueBTLE_CreatePayloadString($$$);
sub CometBlueBTLE_HandlePayload($$); sub CometBlueBTLE_HandlePayload($$);
sub CometBlueBTLE_HandleBattery($$); sub CometBlueBTLE_HandleBattery($$);
@ -105,8 +112,6 @@ sub CometBlueBTLE_HandleDevicename($$);
sub CometBlueBTLE_Initialize($) { sub CometBlueBTLE_Initialize($) {
my ($hash) = @_; my ($hash) = @_;
@ -339,24 +344,23 @@ sub CometBlueBTLE_Set($$@) {
my ($cmd, @args) = @aa; my ($cmd, @args) = @aa;
my $mod; my $mod = 'write';
my $handle; my $handle;
my $value = 'write'; my $value;
if( $cmd eq 'desired-temp' ) { if( $cmd eq 'desired-temp' ) {
return "usage: desired-temp <name>" if( @args < 1 ); return "usage: desired-temp <name>" if( @args < 1 );
#my $devicename = join( " ", @args);
$mod = 'write'; $handle = $gatttChar{'payload'}; $mod = 'write'; $handle = $gatttChar{'payload'};
#$value =; $value = join( " ", @args);
} else { } else {
my $list = ""; #desired-temp:on,off,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 my $list = "desired-temp:on,off,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30";
return "Unknown argument $cmd, choose one of $list"; return "Unknown argument $cmd, choose one of $list";
} }
CometBlueBTLE_CreateParamGatttool($hash,$mod,$handle,$value); CometBlueBTLE_CreateParamGatttool($hash,$mod,$handle,CometBlueBTLE_CreatePayloadString($hash,$cmd,$value));
return undef; return undef;
} }
@ -404,6 +408,7 @@ sub CometBlueBTLE_CreateParamGatttool($@) {
Log3 $name, 4, "CometBlueBTLE ($name) - Run CreateParamGatttool with mod: $mod"; Log3 $name, 4, "CometBlueBTLE ($name) - Run CreateParamGatttool with mod: $mod";
Log3 $name, 3, "CometBlueBTLE ($name) - Run CreateParamGatttool with mod: $mod : $handle : $value" if( defined($value) );
if( $hash->{helper}{writePin} == 0 ) { if( $hash->{helper}{writePin} == 0 ) {
@ -605,7 +610,9 @@ sub CometBlueBTLE_ProcessingNotification($@) {
$readings = CometBlueBTLE_HandleDevicename($hash,$notification); $readings = CometBlueBTLE_HandleDevicename($hash,$notification);
} }
readingsSingleUpdate($hash, "lastChangeBy", "FHEM", 1) if( $gattCmd eq 'write' );
CometBlueBTLE_WriteReadings($hash,$readings); CometBlueBTLE_WriteReadings($hash,$readings);
} }
@ -652,13 +659,13 @@ sub CometBlueBTLE_HandlePayload($$) {
# 0a= Zeit Fenster offen in Minuten # 0a= Zeit Fenster offen in Minuten
$readings{'measured-temp'} = hex("0x".$payload[0])/2; $readings{'measured-temp'} = hex("0x".$payload[0])/2;
$readings{'desired-temp'} = hex("0x".$payload[1])/2; $readings{'desired-temp'} = hex("0x".$payload[1])/2;
$readings{'tempEco'} = hex("0x".$payload[2])/2; $readings{'tempEco'} = hex("0x".$payload[2])/2;
$readings{'tempComfort'} = hex("0x".$payload[3])/2; $readings{'tempComfort'} = hex("0x".$payload[3])/2;
$readings{'tempOffset'} = hex("0x".$payload[4]); $readings{'tempOffset'} = hex("0x".$payload[4]);
$readings{'winOpnState'} = hex("0x".$payload[5]); $readings{'winOpnSensitivity'} = $winOpnSensitivity{hex("0x".$payload[5])};
$readings{'winOpnPeriod'} = hex("0x".$payload[6]); $readings{'winOpnPeriod'} = hex("0x".$payload[6]);
$hash->{helper}{CallBattery} = 0; $hash->{helper}{CallBattery} = 0;
return \%readings; return \%readings;
@ -707,7 +714,8 @@ sub CometBlueBTLE_WriteReadings($$) {
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
while( my ($r,$v) = each %{$readings} ) { while( my ($r,$v) = each %{$readings} ) {
readingsBulkUpdate($hash,$r,$v); readingsBulkUpdateIfChanged($hash,$r,$v) if( ReadingsVal($name, $r,"") ne $v);
readingsBulkUpdateIfChanged($hash, "lastChangeBy", "Thermostat") if( ReadingsVal($name, $r,"") ne $v and $r ne 'measured-temp');
} }
readingsBulkUpdateIfChanged($hash, "state", ($readings->{'lastGattError'}?'error':'active')); readingsBulkUpdateIfChanged($hash, "state", ($readings->{'lastGattError'}?'error':'active'));
@ -794,19 +802,26 @@ sub CometBlueBTLE_ConvertPintoHexLittleEndian($) {
#my $pinHexLittleEndian; #my $pinHexLittleEndian;
} }
sub CometBlueBTLE_CreatePayloadString($$) { sub CometBlueBTLE_CreatePayloadString($$$) {
# my ($setCmd,$value) = @_; my ($hash,$setCmd,$value) = @_;
# my $name = $hash->{NAME};
# sprintf('%.2x',ReadingsVal($name,'measured-temp',0)*2)
# sprintf('%.2x',$value*2)
# sprintf('%.2x',ReadingsVal($name,'tempEco',0)*2) $value = 00 if($value eq 'off');
# sprintf('%.2x',ReadingsVal($name,'tempComfort',0)*2) $value = 30 if($value eq 'on');
# sprintf('%.2x',ReadingsVal($name,'tempOffset',0))
# sprintf('%.2x',ReadingsVal($name,'winOpnState',0)) return '00' . sprintf('%.2x',$value*2) . sprintf('%.2x',ReadingsVal($name,'tempEco',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempComfort',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempOffset',0)) . sprintf('%.2x',ReadingsVal($name,'winOpnSensitivity',0)) . sprintf('%.2x',ReadingsVal($name,'winOpnPeriod',0)) if( $setCmd eq 'desired-temp' );
# sprintf('%.2x',ReadingsVal($name,'winOpnPeriod',0))
return '00' . sprintf('%.2x',ReadingsVal($name,'desired-temp',0)*2) . sprintf('%.2x',$value*2) . sprintf('%.2x',ReadingsVal($name,'tempComfort',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempOffset',0)) . sprintf('%.2x',ReadingsVal($name,'winOpnSensitivity',0)) . sprintf('%.2x',ReadingsVal($name,'winOpnPeriod',0)) if( $setCmd eq 'tempEco' );
return '00' . sprintf('%.2x',ReadingsVal($name,'desired-temp',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempEco',0)*2) . sprintf('%.2x',$value*2) . sprintf('%.2x',ReadingsVal($name,'tempOffset',0)) . sprintf('%.2x',ReadingsVal($name,'winOpnSensitivity',0)) . sprintf('%.2x',ReadingsVal($name,'winOpnPeriod',0)) if( $setCmd eq 'tempComfort' );
return '00' . sprintf('%.2x',ReadingsVal($name,'desired-temp',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempEco',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempComfort',0)*2) . sprintf('%.2x',$value) . sprintf('%.2x',ReadingsVal($name,'winOpnSensitivity',0)) . sprintf('%.2x',ReadingsVal($name,'winOpnPeriod',0)) if( $setCmd eq 'tempOffset' );
return '00' . sprintf('%.2x',ReadingsVal($name,'desired-temp',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempEco',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempComfort',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempOffset',0)) . sprintf('%.2x',$value) . sprintf('%.2x',ReadingsVal($name,'winOpnPeriod',0)) if( $setCmd eq 'winOpnSensitivity' );
return '00' . sprintf('%.2x',ReadingsVal($name,'desired-temp',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempEco',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempComfort',0)*2) . sprintf('%.2x',ReadingsVal($name,'tempOffset',0)) . sprintf('%.2x',ReadingsVal($name,'winOpnSensitivity',0)) . sprintf('%.2x',$value) if( $setCmd eq 'winOpnPeriod' );
} }