2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 16:56:54 +00:00

00_ZWDongle.pm: backupCreate/backupRestore (Forum #52914)

git-svn-id: https://svn.fhem.de/fhem/trunk@11370 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2016-05-02 20:04:31 +00:00
parent fc36069691
commit 078322ce54
2 changed files with 70 additions and 9 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- feature: 00_ZWDongle: add backupCreate / backupRestore
- bugfix: 49_SSCam: module will not load due to Unknown warnings category
'experimental' when using an older perl version
- feature: 71_PHILIPS_AUDIO : Added input support for AW9000

View File

@ -34,6 +34,8 @@ my %sets = (
# SERIAL_API_APPL_NODE_INFORMATION
"timeouts" => { cmd => "06%02x%02x" }, # SERIAL_API_SET_TIMEOUTS
"reopen" => { cmd => "" },
"backupCreate" => { cmd => "" },
"backupRestore" => { cmd => "" },
);
my %gets = (
@ -158,6 +160,50 @@ ZWDongle_Set($@)
return;
}
if($type eq "backupCreate") {
return "Creating a backup is not supported by this device"
if(ReadingsVal($name, "caps","") !~ m/NVM_EXT_READ_LONG_BUFFER/);
return "Usage: set $name backupCreate [64k|128k|256k]"
if(int(@a) != 1 || $a[0] !~ m/^(64|128|256)k$/);
my $l = $1 * 1024;
my $fName = "$attr{global}{modpath}/$name.bin";
open(OUT, ">$fName") || return "Cant open $fName: $!";
for(my $off = 0; $off < $l; $off += 64) {
ZWDongle_Write($hash, "", sprintf("002a%06x0040", $off));
my ($err, $ret) =
ZWDongle_ReadAnswer($hash, "NVM_EXT_READ_LONG_BUFFER", "^012a");
return $err if($err);
print OUT pack('H*', substr($ret, 4));
}
close(OUT);
return "Wrote $l bytes to $fName";
}
if($type eq "backupRestore") {
return "Restoring a backup is not supported by this device"
if(ReadingsVal($name, "caps","") !~ m/NVM_EXT_WRITE_LONG_BUFFER/);
return "Usage: set $name backupRestore" if(int(@a) != 0);
my $fName = "$attr{global}{modpath}/$name.bin";
my $l = -s $fName;
return "$fName does not exists, or is empty" if(!$l);
open(IN, $fName) || return "Cant open $fName: $!";
my $buf;
for(my $off = 0; $off < $l; $off += 64) {
if(sysread(IN, $buf, 64) != 64) {
return "Cant read 64 bytes from $fName";
}
ZWDongle_Write($hash,"",sprintf("002b%06x0040%s",$off,unpack('H*',$buf)));
my ($err, $ret) =
ZWDongle_ReadAnswer($hash, "NVM_EXT_WRITE_LONG_BUFFER", "^012b");
return $err if($err);
return "Unexpected NVM_EXT_WRITE_LONG_BUFFER return value $ret"
if($ret !~ m/^012b01/);
}
close(IN);
return "Restored $l bytes from $fName";
}
if($type eq "removeFailedNode" ||
$type eq "replaceFailedNode" ||
$type eq "sendNIF") {
@ -675,6 +721,7 @@ ZWDongle_Attr($$$$)
{
my ($cmd, $name, $attr, $value) = @_;
my $hash = $defs{$name};
$attr = "" if(!$attr);
if($attr eq "disable") {
if($cmd eq "set" && ($value || !defined($value))) {
@ -690,7 +737,7 @@ ZWDongle_Attr($$$$)
}
} elsif($attr eq "homeId") {
} elsif($attr eq "homeId" && $cmd eq "set") {
$hash->{homeId} = $value;
} elsif($attr eq "networkKey" && $cmd eq "set") {
@ -777,11 +824,18 @@ ZWDongle_Ready($)
device supports the SECURITY class, then a secure inclusion is attempted.
</li>
<li>removeNode [onNw|on|off]<br>
Activate (or deactivate) exclusion mode. "on" activates standard exclusion.
"onNw" activates network wide exclusion (only SDK 4.5-4.9, SDK 6.x and
above). Note: the corresponding fhem device have to be deleted
manually.</li>
<li>backupCreate [64k|128k|256k]<br>
read out the NVRAM of the ZWDongle, and store it in a file called
&lt;ZWDongle_Name&gt;.bin in the modpath folder. Since the size of the
NVRAM is currently unknown to FHEM, you have to specify the size. The ZWave
ZME Stick seems to have 256k of NVRAM. Note: writing the file takes some
time, usually about 10s for each 64k.
</li>
<li>backupRestore<br>
Restore the file created by backupCreate. Restoring the file takes about
the same time as saving it.
</li>
<li>createNode id<br>
Request the class information for the specified node, and create a fhem
@ -796,14 +850,20 @@ ZWDongle_Ready($)
the routing table in controller. Instead,always use removeNode if possible.
Note: the corresponding fhem device have to be deleted manually.</li>
<li>replaceFailedNode<br>
Replace a non-responding node with a new one. The non-responding node
must be on the failed Node list.</li>
<li>removeNode [onNw|on|off]<br>
Activate (or deactivate) exclusion mode. "on" activates standard exclusion.
"onNw" activates network wide exclusion (only SDK 4.5-4.9, SDK 6.x and
above). Note: the corresponding fhem device have to be deleted
manually.</li>
<li>reopen<br>
First close and then open the device. Used for debugging purposes.
</li>
<li>replaceFailedNode<br>
Replace a non-responding node with a new one. The non-responding node
must be on the failed Node list.</li>
</ul>
<br>