diff --git a/fhem/FHEM/95_YAAHM.pm b/fhem/FHEM/95_YAAHM.pm index 3d1bd04cd..cb9a29aef 100644 --- a/fhem/FHEM/95_YAAHM.pm +++ b/fhem/FHEM/95_YAAHM.pm @@ -48,7 +48,7 @@ my $yaahmname; my $yaahmlinkname = "Profile"; # link text my $yaahmhiddenroom = "ProfileRoom"; # hidden room my $yaahmpublicroom = "Unsorted"; # public room -my $yaahmversion = "1.10"; +my $yaahmversion = "1.12"; my $firstcall=1; my %yaahm_transtable_EN = ( @@ -307,6 +307,9 @@ my @seasons = ( my @profmode = ("party","absence"); my @profday = ("vacation","holiday"); +#-- temporary fix for update purpose +sub YAAHM_restore($$){}; + ######################################################################################### # # YAAHM_Initialize @@ -391,20 +394,29 @@ sub YAAHM_Define ($$) { $data{FWEXT}{YAAHMx}{NAME} = $yaahmlinkname; $attr{$name}{"room"} = $yaahmhiddenroom; - #-- clone daily default profile - $hash->{DATA}{"DT"} = {%defaultdailytable}; + my $date = YAAHM_restore($hash,0); + #-- data seems to be ok, restore + if( defined($date) ){ + YAAHM_restore($hash,1); + Log3 $name,1,"[YAAHM_Define] data hash restored from save file with date $date"; + #-- intialization + }else{ + Log3 $name,1,"[YAAHM_Define] data hash is initialized"; + #-- clone daily default profile + $hash->{DATA}{"DT"} = {%defaultdailytable}; - #-- clone weekly default profile - $hash->{DATA}{"WT"} = (); - push(@{$hash->{DATA}{"WT"}},{%defaultwakeuptable}); - $hash->{DATA}{"WT"}[0]{"name"} = $yaahm_tt->{"wakeup"}; - push(@{$hash->{DATA}{"WT"}},{%defaultsleeptable}); - $hash->{DATA}{"WT"}[1]{"name"} = $yaahm_tt->{"sleep"}; + #-- clone weekly default profile + $hash->{DATA}{"WT"} = (); + push(@{$hash->{DATA}{"WT"}},{%defaultwakeuptable}); + $hash->{DATA}{"WT"}[0]{"name"} = $yaahm_tt->{"wakeup"}; + push(@{$hash->{DATA}{"WT"}},{%defaultsleeptable}); + $hash->{DATA}{"WT"}[1]{"name"} = $yaahm_tt->{"sleep"}; - #-- clone days for today and tomorrow - $hash->{DATA}{"DD"} = (); - push(@{$hash->{DATA}{"DD"}},{%defaultdayproperties}); - push(@{$hash->{DATA}{"DD"}},{%defaultdayproperties}); + #-- clone days for today and tomorrow + $hash->{DATA}{"DD"} = (); + push(@{$hash->{DATA}{"DD"}},{%defaultdayproperties}); + push(@{$hash->{DATA}{"DD"}},{%defaultdayproperties}); + } #-- determine Astro device if( !exists($modules{Astro}{defptr}) ){ @@ -682,7 +694,7 @@ sub YAAHM_Set($@) { #----------------------------------------------------------- } elsif ( $cmd =~ /^restore/ ) { - return YAAHM_restore($hash); + return YAAHM_restore($hash,1); #----------------------------------------------------------- } elsif ( $cmd =~ /^initialize/ ) { @@ -813,9 +825,12 @@ sub YAAHM_Get($@) { sub YAAHM_save($) { my ($hash) = @_; + $hash->{DATA}{"savedate"} = localtime(time); + readingsSingleUpdate( $hash, "savedate", $hash->{DATA}{"savedate"}, 1 ); my $json = JSON->new->utf8; my $jhash0 = eval{ $json->encode( $hash->{DATA} ) }; my $error = FileWrite("YAAHMFILE",$jhash0); + #Log 1,"[YAAHM_save] error=$error"; return; } @@ -827,13 +842,28 @@ sub YAAHM_save($) { # ######################################################################################### -sub YAAHM_restore($) { - my ($hash) = @_; +sub YAAHM_restore($$) { + my ($hash,$doit) = @_; + my $name = $hash->{NAME}; my ($error,$jhash0) = FileRead("YAAHMFILE"); - my $json = JSON->new->utf8; + if( defined($error) ){ + Log3 $name,1,"[YAAHM_restore] read error=$error"; + return undef; + } + my $json = JSON->new->utf8; my $jhash1 = eval{ $json->decode( $jhash0 ) }; - $hash->{DATA} = {%{$jhash1}}; - return; + my $date = $jhash1->{"savedate"}; + #-- just for the first time, reading an old savefile + $date = localtime(time) + if( !defined($date)); + readingsSingleUpdate( $hash, "savedate", $date, 0 ); + if( $doit==1 ){ + $hash->{DATA} = {%{$jhash1}}; + Log3 $name,5,"[YAAHM_restore] Data hash restored from save file with date ".$date; + return 1; + }else{ + return $date; + } } ######################################################################################### @@ -873,12 +903,10 @@ sub YAAHM_setParm($@) { } } $hash->{DATA}{"DT"}{$key}[$i-1]=$val; - #Log 1, "=============> $key $i ".$a[$i+1]; } return $msg; #-- weekly profile }elsif ($cmd eq "wt") { - #Log 1,"=================> ".Dumper(@a); #-- action $hash->{DATA}{"WT"}[$a[1]]{"action"} = $a[2]; #-- next time @@ -1271,7 +1299,6 @@ sub YAAHM_checkstate($) { if( defined($devs) && ($devs ne "") ){ $devh = Value($dev); if( $devs ne $devh ){ - #Log 1,"==============> Device $dev SOLL $devs IST $devh"; $isf = 1; push(@devf,"
set <name> save|restore
+
+