Ik ben bezig met een programma om mijn thermostaat uit telezen om zo mijn temperatuur in huis te kunnen monitoren.
Hiervoor heb ik een perl script gevonden, graag wil ik dit omzetten naar Delphi zodat ik mijn eigen Windows programma hiervoor kan schrijven.
De perl code staat hier:
https://code.google.com/p/heatmiser-wifi/source/browse/trunk/bin/
Hierin zijn de volgende files van belang:
heatmiser.pl
heatmiser_wifi.pm
Nu loop ik stuk op de volgende code
Vanhuit het hoofdprogramma wordt de functie read_dcb aangeroepen.
Hierin vorden weer de functies/procedures command en respons aangeroepen.
Als ik kij naar de functie aanroep van command dan worden daar parameters aan door gegeven (de functie w2b is niets anders dan een omzetting van een word naar 2 bytes)
Ik de routine command zie ik echter niets terug van deze parameters. kan iemand mij uitleggen wat hier gebeurd (hoeft niet in Delphi mag ook in gewone mensen taal ;-) )
verder snap ik niet hoe de waarde voor de variabele cmd wordt berekend, ik kan geen definitie van deze variable vinden
Ik hoop dat iemand mij kan helpen met het omzetten van deze code
Hiervoor heb ik een perl script gevonden, graag wil ik dit omzetten naar Delphi zodat ik mijn eigen Windows programma hiervoor kan schrijven.
De perl code staat hier:
https://code.google.com/p/heatmiser-wifi/source/browse/trunk/bin/
Hierin zijn de volgende files van belang:
heatmiser.pl
heatmiser_wifi.pm
Nu loop ik stuk op de volgende code
Vanhuit het hoofdprogramma wordt de functie read_dcb aangeroepen.
Hierin vorden weer de functies/procedures command en respons aangeroepen.
Als ik kij naar de functie aanroep van command dan worden daar parameters aan door gegeven (de functie w2b is niets anders dan een omzetting van een word naar 2 bytes)
Ik de routine command zie ik echter niets terug van deze parameters. kan iemand mij uitleggen wat hier gebeurd (hoeft niet in Delphi mag ook in gewone mensen taal ;-) )
verder snap ik niet hoe de waarde voor de variabele cmd wordt berekend, ik kan geen definitie van deze variable vinden
Code:
sub read_dcb
{
my ($self, $start, $octets) = @_;
# Construct and issue the inquiry command
$start = 0x0000 unless defined $start;
$octets = 0xffff unless defined $octets;
return undef unless $self->command(0x93, w2b($start), w2b($octets));
# Read the response
my ($op, @data) = $self->response();
# Perform some basic sanity checks on the response
die "Unexpected opcode in thermostat response\n" unless $op == 0x94;
die "Start address mismatch in thermostat response\n" unless b2w(@data[0, 1]) == $start;
my $length = b2w(@data[2, 3]);
die "Incorrect PIN used\n" unless $length;
die "Incorrect length of thermostat response\n" unless scalar @data == $length + 4;
# Return the DCB portion of the response
return @data[4 .. $#data];
}
# LOW LEVEL THERMOSTAT COMMAND TRANSPORT
# Construct an arbitrary thermostat command
sub command
{
my ($self, $op, @data) = @_;
# Ensure that a socket is open
return undef unless $self->open();
# Construct the command
my $len = 7 + scalar @data;
my @cmd = ($op, w2b($len), w2b($self->{pin}), @data);
push @cmd, w2b(crc16(@cmd));
# Convert the command to binary
my $cmd = join('', map(chr, @cmd));
# Send the command to the thermostat
eval
{
$self->{socket}->send($cmd, 0) or die "Failed to send command to thermostat: $!\n";
};
if ($@)
{
# If there was any error then close the port and re-throw the error
my $error = $@;
eval { $self->close(); };
die $error;
}
return 1;
}
Ik hoop dat iemand mij kan helpen met het omzetten van deze code