From 9d2250128d1e7b65750921d7c46216c43d166fe9 Mon Sep 17 00:00:00 2001 From: StefanStrobel <> Date: Tue, 4 Sep 2018 16:40:46 +0000 Subject: [PATCH] =?UTF-8?q?98=5FArducounter.pm:=20neue=20Version=20f=C3=BC?= =?UTF-8?q?r=20Arduino=20oder=20ESP8266=20inkl.=20Sketch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.fhem.de/fhem/trunk@17270 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_ArduCounter.pm | 1254 ++++++++++++------- fhem/FHEM/firmware/ArduCounter.bin | Bin 0 -> 273744 bytes fhem/FHEM/firmware/ArduCounter.hex | 1325 +++++++++++--------- fhem/contrib/arduino/ArduCounter2.36.ino | 1409 ++++++++++++++++++++++ 4 files changed, 2977 insertions(+), 1011 deletions(-) create mode 100755 fhem/FHEM/firmware/ArduCounter.bin create mode 100755 fhem/contrib/arduino/ArduCounter2.36.ino diff --git a/fhem/FHEM/98_ArduCounter.pm b/fhem/FHEM/98_ArduCounter.pm index 07e46ff31..b4230d98f 100755 --- a/fhem/FHEM/98_ArduCounter.pm +++ b/fhem/FHEM/98_ArduCounter.pm @@ -55,13 +55,27 @@ # 2018-01-01 little fixes # 2018-01-02 extend reporting line with history H.*, create new reading pinHistory if received from device and verboseReadings is set to 1 # create long count readings always, not only if attr verboseReadings is set to 1 -# 2018-01-03 little docu fix -# 2018-01-13 little docu addon +# 2018-01-03 little docu fix +# 2018-01-13 little docu addon +# 2018-02-04 modifications for ArduCounter on ESP8266 connected via TCP +# remove "change" as option (only rising and falling allowed now) +# TCP connection handling, keepalive, +# many changes more ... +# 2018-03-07 fix pinHistory when verboseReadings is not set +# 2018-03-08 parse board name in setup / hello message +# 2018-04-10 many smaller fixes, new interpolation based on real boot time, counter etc. +# 2018-05-13 send keepalive delay with k command, don't reset k timer when parsing a message +# 2018-07-17 modify define / notify so connection is opened after Event Defined # # ideas / todo: -# - parse error messages from sketch and show it in a message box? async output? +# - OTA Flashing for ESP +# +# - parse sequence num of history entries -> reconstruct long history list in perl mem +# and display with get history instead of readings incl. individual time +# # - timeMissed # +# package main; @@ -71,16 +85,21 @@ use warnings; use Time::HiRes qw(gettimeofday); my %ArduCounter_sets = ( - "raw" => "", - "reset" => "", - "flash" => "" + "disable" => "", + "enable" => "", + "raw" => "", + "reset" => "", + "flash" => "", + "devVerbose" => "", + "saveConfig" => "", + "reconnect" => "" ); my %ArduCounter_gets = ( - "info" => "" + "info" => "" ); -my $ArduCounter_Version = '5.7 - 2.1.2018'; +my $ArduCounter_Version = '5.94 - 13.5.2018'; # # FHEM module intitialisation @@ -113,7 +132,13 @@ sub ArduCounter_Initialize($) "verboseReadings[0-9]+ " . "flashCommand " . "helloSendDelay " . - "helloWaitTime " . + "helloWaitTime " . + "keepAliveDelay " . + "keepAliveTimeout " . + "nextOpenDelay " . + "silentReconnect " . + "openTimeout " . + "disable:0,1 " . "do_not_notify:1,0 " . $readingFnAttributes; @@ -134,51 +159,39 @@ sub ArduCounter_Define($$) my $name = $a[0]; my $dev = $a[2]; - if ($dev !~ /.+@([0-9]+)/) { - $dev .= '@38400'; + if ($dev =~ m/^(.+):([0-9]+)$/) { + # tcp conection + $hash->{TCP} = 1; } else { - Log3 $name, 3, "$name: Warning: connection speed $1 is not the default for the ArduCounter firmware" - if ($1 != 38400); + if ($dev !~ /.+@([0-9]+)/) { + $dev .= '@38400'; + } else { + Log3 $name, 3, "$name: Warning: connection speed $1 is not the default for the ArduCounter firmware" + if ($1 != 38400); + } } - $hash->{buffer} = ""; $hash->{DeviceName} = $dev; $hash->{VersionModule} = $ArduCounter_Version; $hash->{NOTIFYDEV} = "global"; # NotifyFn nur aufrufen wenn global events (INITIALIZED) $hash->{STATE} = "disconnected"; - delete $hash->{Initialized}; + delete $hash->{Initialized}; # device might not be initialized - wait for hello / setup before cmds if(!defined($attr{$name}{'flashCommand'})) { - #$attr{$name}{'flashCommand'} = 'avrdude -p atmega328P -b 57600 -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]'; # for nano - $attr{$name}{'flashCommand'} = 'avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]'; # for uno + #$attr{$name}{'flashCommand'} = 'avrdude -p atmega328P -b 57600 -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]'; # for nano + $attr{$name}{'flashCommand'} = 'avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]'; # for uno } - if ($init_done) { - ArduCounter_Open($hash); - } + Log3 $name, 5, "$name: defined with $dev, Module version $ArduCounter_Version"; + #if ($init_done) { + # ArduCounter_Open($hash); + #} + # do open in notify + return; } -# -# Send config commands after Board reported it is ready or still counting -########################################################################## -sub ArduCounter_ConfigureDevice($) -{ - my ($hash) = @_; - my $name = $hash->{NAME}; - - # send attributes to arduino device. Just call ArduCounter_Attr again - #Log3 $name, 3, "$name: sending configuration from attributes to device"; - while (my ($attr, $val) = each(%{$attr{$name}})) { - if ($attr =~ "pin|interval") { - Log3 $name, 3, "$name: ConfigureDevice calls Attr with $attr $val"; - ArduCounter_Attr("set", $name, $attr, $val); - } - } -} - - # # undefine command when device is deleted ######################################################################### @@ -189,21 +202,139 @@ sub ArduCounter_Undef($$) } +# remove timers, call DevIo_Disconnected +# to set state and add to readyFnList +##################################################### +sub ArduCounter_Disconnected($) +{ + my $hash = shift; + my $name = $hash->{NAME}; + + RemoveInternalTimer ("alive:$name"); # no timeout if waiting for keepalive response + RemoveInternalTimer ("keepAlive:$name"); # don't send keepalive messages anymore + RemoveInternalTimer ("sendHello:$name"); + DevIo_Disconnected($hash); # close, add to readyFnList so _Ready is called to reopen + delete $hash->{WaitForAlive}; +} + + +##################################### +sub ArduCounter_OpenCB($$) +{ + my ($hash, $msg) = @_; + my $name = $hash->{NAME}; + my $now = gettimeofday(); + if ($msg) { + Log3 $name, 5, "$name: Open callback: $msg" if ($msg); + } + delete $hash->{BUSY_OPENDEV}; + if ($hash->{FD}) { + Log3 $name, 5, "$name: ArduCounter_Open succeeded in callback"; + my $hdl = AttrVal($name, "helloSendDelay", 15); + # send hello if device doesn't say "Started" withing $hdl seconds + RemoveInternalTimer ("sendHello:$name"); + InternalTimer($now+$hdl, "ArduCounter_AskForHello", "sendHello:$name", 0); + + if ($hash->{TCP}) { + # send first keepalive immediately to turn on tcp mode in device + ArduCounter_KeepAlive("keepAlive:$name"); + } + } else { + #Log3 $name, 5, "$name: ArduCounter_Open failed - open callback called from DevIO without FD"; + } + + return; +} + + ######################################################## # Open Device -sub ArduCounter_Open($) +sub ArduCounter_Open($;$) +{ + my ($hash, $reopen) = @_; + my $name = $hash->{NAME}; + my $now = gettimeofday(); + $reopen = 0 if (!$reopen); + + if ($hash->{BUSY_OPENDEV}) { # still waiting for callback to last open + if ($hash->{LASTOPEN} && $now > $hash->{LASTOPEN} + (AttrVal($name, "openTimeout", 3) * 2) + && $now > $hash->{LASTOPEN} + 15) { + Log3 $name, 5, "$name: _Open - still waiting for open callback, timeout is over twice - this should never happen"; + Log3 $name, 5, "$name: _Open - stop waiting and reset the flag."; + $hash->{BUSY_OPENDEV} = 0; + } else { + Log3 $name, 5, "$name: _Open - still waiting for open callback"; + return; + } + } + + if (!$reopen) { # not called from _Ready + DevIo_CloseDev($hash); + delete $hash->{NEXT_OPEN}; + delete $hash->{DevIoJustClosed}; + } + + Log3 $name, 4, "$name: trying to open connection to $hash->{DeviceName}" if (!$reopen); + + $hash->{BUSY_OPENDEV} = 1; + $hash->{LASTOPEN} = $now; + $hash->{nextOpenDelay} = AttrVal($name, "nextOpenDelay", 60); + $hash->{devioLoglevel} = (AttrVal($name, "silentReconnect", 0) ? 4 : 3); + $hash->{TIMEOUT} = AttrVal($name, "openTimeout", 3); + $hash->{buffer} = ""; # clear Buffer for reception + + DevIo_OpenDev($hash, $reopen, 0, \&ArduCounter_OpenCB); + delete $hash->{TIMEOUT}; + if ($hash->{FD}) { + Log3 $name, 5, "$name: ArduCounter_Open succeeded immediatelay" if (!$reopen); + } else { + Log3 $name, 5, "$name: ArduCounter_Open waiting for callback" if (!$reopen); + } + +} + + +######################################################################### +sub ArduCounter_Ready($) { my ($hash) = @_; my $name = $hash->{NAME}; - - DevIo_OpenDev($hash, 0, 0); - if ($hash->{FD}) { - my $now = gettimeofday(); - my $hdl = AttrVal($name, "helloSendDelay", 3); - # send hello if device doesn't say "Started" withing $hdl seconds - RemoveInternalTimer ("sendHello:$name"); - InternalTimer($now+$hdl, "ArduCounter_SendHello", "sendHello:$name", 0); + + if($hash->{STATE} eq "disconnected") { + RemoveInternalTimer ("alive:$name"); # no timeout if waiting for keepalive response + RemoveInternalTimer ("keepAlive:$name"); # don't send keepalive messages anymore + delete $hash->{WaitForAlive}; + delete $hash->{Initialized}; # when reconnecting wait for setup / hello before further action + if (IsDisabled($name)) { + Log3 $name, 3, "$name: _Ready: $name is disabled - don't try to reconnect"; + DevIo_CloseDev($hash); # close, remove from readyfnlist so _ready is not called again + return; + } + ArduCounter_Open($hash, 1); # reopen, don't call DevIoClose before reopening + return; # a return value triggers direct read for win } + # This is relevant for windows/USB only + my $po = $hash->{USBDev}; + if ($po) { + my ($BlockingFlags, $InBytes, $OutBytes, $ErrorFlags) = $po->status; + return ($InBytes>0); # tell fhem.pl to read when we return + } + return; +} + + +####################################### +# Aufruf aus InternalTimer +sub ArduCounter_DelayedOpen($) +{ + my $param = shift; + my (undef,$name) = split(':',$param); + my $hash = $defs{$name}; + + Log3 $name, 4, "$name: try to reopen connection after delay"; + RemoveInternalTimer ("delayedopen:$name"); + delete $hash->{DevIoJustClosed}; # otherwise open returns without doing anything this time and we are not on the readyFnList ... + ArduCounter_Open($hash, 1); # reopen } @@ -221,14 +352,14 @@ sub ArduCounter_Notify($$) my $name = $hash->{NAME}; # Log3 $name, 5, "$name: Notify called for source $source->{NAME} with events: @{$events}"; - return if (!grep(m/^INITIALIZED|REREADCFG|(MODIFIED $name)$/, @{$source->{CHANGED}})); + return if (!grep(m/^INITIALIZED|REREADCFG|(MODIFIED $name)|(DEFINED $name)$/, @{$source->{CHANGED}})); - if (AttrVal($name, "disable", undef)) { - Log3 $name, 4, "$name: device is disabled - don't set timer to send hello"; + if (IsDisabled($name)) { + Log3 $name, 3, "$name: Notify / Init: device is disabled"; return; } - Log3 $name, 5, "$name: Notify called with events: @{$events}, open device and set timer to send hello to device"; + Log3 $name, 3, "$name: Notify called with events: @{$events}, open device and set timer to send hello to device"; ArduCounter_Open($hash); } @@ -240,23 +371,25 @@ sub ArduCounter_Write ($$) my ($hash, $line) = @_; my $name = $hash->{NAME}; if ($hash->{STATE} eq "disconnected" || !$hash->{FD}) { - Log3 $name, 4, "$name: Write: device is disconnected, dropping line to write"; + Log3 $name, 5, "$name: Write: device is disconnected, dropping line to write"; return 0; } - if (AttrVal($name, "disable", undef)) { - Log3 $name, 4, "$name: Write called but device is disabled, dropping line to send"; + if (IsDisabled($name)) { + Log3 $name, 5, "$name: Write called but device is disabled, dropping line to send"; return 0; } - Log3 $name, 4, "$name: Write: $line"; - DevIo_SimpleWrite( $hash, "$line\n", 2); + #Log3 $name, 5, "$name: Write: $line"; # devio will already log the write + #DevIo_SimpleWrite($hash, "\n", 2); + DevIo_SimpleWrite($hash, "$line.", 2); return 1; } ####################################### # Aufruf aus InternalTimer -# send "h" to ask for "Hello" since device didn't say "Started" so fae - maybe it's still counting ... -sub ArduCounter_SendHello($) +# send "h" to ask for "Hello" since device didn't say "Started" so far - maybe it's still counting ... +# called with timer from _open, _Ready and if count is read in _Parse +sub ArduCounter_AskForHello($) { my $param = shift; my (undef,$name) = split(':',$param); @@ -266,7 +399,7 @@ sub ArduCounter_SendHello($) return if (!ArduCounter_Write( $hash, "h")); my $now = gettimeofday(); - my $hwt = AttrVal($name, "helloWaitTime ", 3); + my $hwt = AttrVal($name, "helloWaitTime", 3); RemoveInternalTimer ("hwait:$name"); InternalTimer($now+$hwt, "ArduCounter_HelloTimeout", "hwait:$name", 0); $hash->{WaitForHello} = 1; @@ -282,6 +415,127 @@ sub ArduCounter_HelloTimeout($) my $hash = $defs{$name}; Log3 $name, 3, "$name: device didn't reply to h(ello). Is the right sketch flashed? Is speed set to 38400?"; delete $hash->{WaitForHello}; + RemoveInternalTimer ("hwait:$name"); +} + + +############################################ +# Aufruf aus Open / Ready und InternalTimer +# send "1k" to ask for "alive" +sub ArduCounter_KeepAlive($) +{ + my $param = shift; + my (undef,$name) = split(':',$param); + my $hash = $defs{$name}; + my $now = gettimeofday(); + + if (IsDisabled($name)) { + return; + } + + my $kdl = AttrVal($name, "keepAliveDelay", 10); # next keepalive as timer + my $kto = AttrVal($name, "keepAliveTimeout", 2); # timeout waiting for response + + Log3 $name, 5, "$name: sending k(eepAlive) to device"; + ArduCounter_Write( $hash, "1,${kdl}k"); + + RemoveInternalTimer ("alive:$name"); + InternalTimer($now+$kto, "ArduCounter_AliveTimeout", "alive:$name", 0); + $hash->{WaitForAlive} = 1; + + if ($hash->{TCP}) { + RemoveInternalTimer ("keepAlive:$name"); + InternalTimer($now+$kdl, "ArduCounter_KeepAlive", "keepAlive:$name", 0); # next keepalive + } +} + + +####################################### +# Aufruf aus InternalTimer +sub ArduCounter_AliveTimeout($) +{ + my $param = shift; + my (undef,$name) = split(':',$param); + my $hash = $defs{$name}; + Log3 $name, 3, "$name: device didn't reply to k(eeepAlive), setting to disconnected and try to reopen"; + delete $hash->{WaitForAlive}; + + $hash->{KeepAliveRetries} = 0 if (!$hash->{KeepAliveRetries}); + + if (++$hash->{KeepAliveRetries} > AttrVal($name, "keepAliveRetries", 1)) { + Log3 $name, 3, "$name: no retries left, setting device to disconnected"; + ArduCounter_Disconnected($hash); # set to Disconnected but let _Ready try to Reopen + } +} + + +# +# Send config commands after Board reported it is ready or still counting +# called from internal timer to give device the time to report its config first +########################################################################## +sub ArduCounter_ConfigureDevice($) +{ + my $param = shift; + my (undef,$name) = split(':',$param); + my $hash = $defs{$name}; + + # todo: check if device got disconnected in the meantime! + + # first check if device did send its config, then compare and send config if necessary + if ($hash->{runningCfg}) { + Log3 $name, 5, "$name: ConfigureDevice: got running config - comparing"; + my $iAttr = AttrVal($name, "interval", ""); + if (!$iAttr) { + $iAttr = "30 60 2 2"; + Log3 $name, 5, "$name: ConfigureDevice: interval attr not set - take default $iAttr"; + } + if ($iAttr =~ /^(\d+) (\d+) ?(\d+)? ?(\d+)?$/) { + #Log3 $name, 5, "$name: ConfigureDevice: comparing interval"; + my $iACfg = "$1 $2 " . ($3 ? $3 : "0") . " " . ($4 ? $4 : "0"); + if ($hash->{runningCfg}{I} eq $iACfg) { + #Log3 $name, 5, "$name: ConfigureDevice: interval matches - now compare pins"; + # interval config matches - now check pins as well + my @runningPins = sort grep (/[\d]/, keys %{$hash->{runningCfg}}); + #Log3 $name, 5, "$name: ConfigureDevice: pins in running config: @runningPins"; + my @attrPins = sort grep (/pin([dD])?[\d]/, keys %{$attr{$name}}); + #Log3 $name, 5, "$name: ConfigureDevice: pins from attrs: @attrPins"; + if (@runningPins == @attrPins) { + my $match = 1; + for (my $i = 0; $i < @attrPins; $i++) { + #Log3 $name, 5, "$name: ConfigureDevice: compare pin $attrPins[$i] to $runningPins[$i]"; + $attrPins[$i] =~ /pin[dD]?([\d+]+)/; + my $pinNum = $1; + $runningPins[$i] =~ /pin[dD]?([\d]+)/; + $match = 0 if (!$1 || $1 ne $pinNum); + #Log3 $name, 5, "$name: ConfigureDevice: now compare pin $attrPins[$i] $attr{$name}{$attrPins[$i]} to $hash->{runningCfg}{$pinNum}"; + $match = 0 if (($attr{$name}{$attrPins[$i]}) ne $hash->{runningCfg}{$pinNum}); + } + if ($match) { # Config matches -> leave + Log3 $name, 5, "$name: ConfigureDevice: running config matches attributes"; + return; + } + Log3 $name, 5, "$name: ConfigureDevice: no match -> send config"; + } else { + Log3 $name, 5, "$name: ConfigureDevice: pin numbers don't match (@runningPins vs. @attrPins)"; + } + } else { + Log3 $name, 5, "$name: ConfigureDevice: interval does not match (>$hash->{runningCfg}{I}< vs >$iACfg< from attr)"; + } + } else { + Log3 $name, 5, "$name: ConfigureDevice: can not compare against interval attr"; + } + } else { + Log3 $name, 5, "$name: ConfigureDevice: no running config received"; + } + + # send attributes to arduino device. Just call ArduCounter_Attr again + Log3 $name, 3, "$name: sending configuration from attributes to device"; + while (my ($aName, $val) = each(%{$attr{$name}})) { + if ($aName =~ "pin|interval") { + Log3 $name, 3, "$name: ConfigureDevice calls Attr with $aName $val"; + ArduCounter_Attr("set", $name, $aName, $val); + } + } } @@ -300,22 +554,25 @@ sub ArduCounter_Attr(@) #Log3 $name, 5, "$name: Attr called with @_"; if ($cmd eq "set") { - if ($aName =~ 'pin.*') { - if ($aName !~ 'pin[dD]?(\d+)') { - Log3 $name, 3, "$name: Invalid pin name in attr $name $aName $aVal"; - return "Invalid pin name $aName"; - } + if ($aName =~ /^pin[dD]?(\d+)/) { my $pin = $1; - if ($aVal =~ /^(rising|falling|change) ?(pullup)? ?([0-9]+)?/) { + my %pins; + if ($hash->{allowedPins}) { + %pins = map { $_ => 1 } split (",", $hash->{allowedPins}); + } + if ($init_done && $hash->{allowedPins} && %pins && !$pins{$pin}) { + Log3 $name, 3, "$name: Invalid pin in attr $name $aName $aVal"; + return "Invalid / disallowed pin specification $aName"; + } + if ($aVal =~ /^(rising|falling) ?(pullup)? ?([0-9]+)?/) { my $opt = ""; if ($1 eq 'rising') {$opt = "3"} elsif ($1 eq 'falling') {$opt = "2"} - elsif ($1 eq 'change') {$opt = "1"} $opt .= ($2 ? ",1" : ",0"); # pullup $opt .= ($3 ? ",$3" : ""); # min length - if ($hash->{Initialized}) { - ArduCounter_Write( $hash, "${pin},${opt}a"); + if ($hash->{Initialized}) { + ArduCounter_Write($hash, "${pin},${opt}a"); } else { Log3 $name, 5, "$name: communication postponed until device is initialized"; } @@ -325,7 +582,7 @@ sub ArduCounter_Attr(@) return "Invalid Value $aVal"; } } elsif ($aName eq "interval") { - if ($aVal =~ '^(\d+) (\d+) ?(\d+)? ?(\d+)?$') { + if ($aVal =~ /^(\d+) (\d+) ?(\d+)? ?(\d+)?$/) { my $min = $1; my $max = $2; my $sml = $3; @@ -351,10 +608,21 @@ sub ArduCounter_Attr(@) Log3 $name, 3, "$name: Invalid value in attr $name $aName $aVal"; return "Invalid Value $aVal"; } + } elsif ($aName eq "keepAliveDelay") { + if ($aVal =~ '^(\d+)$') { + if ($aVal > 300) { + Log3 $name, 3, "$name: value too big in attr $name $aName $aVal"; + return "Value too big: $aVal"; + } + } else { + Log3 $name, 3, "$name: Invalid value in attr $name $aName $aVal"; + return "Invalid Value $aVal"; + } } elsif ($aName eq 'disable') { if ($aVal) { - Log3 $name, 5, "$name: disable attribute set"; - DevIo_CloseDev($hash); + Log3 $name, 5, "$name: disable attribute set"; + ArduCounter_Disconnected($hash); # set to disconnected and remove timers + DevIo_CloseDev($hash); # really close and remove from readyFnList again return; } else { Log3 $name, 3, "$name: disable attribute cleared"; @@ -414,18 +682,82 @@ sub ArduCounter_Attr(@) } elsif ($aName eq 'disable') { Log3 $name, 3, "$name: disable attribute removed"; - ArduCounter_Open($hash) if ($hash->{$init_done}); # if fhem is initialized + ArduCounter_Open($hash) if ($init_done); # if fhem is initialized } } return undef; } +# SET command +######################################################################### +sub ArduCounter_Flash($$) +{ + my ($hash, @args) = @_; + my $name = $hash->{NAME}; + my $log = ""; + my @deviceName = split('@', $hash->{DeviceName}); + my $port = $deviceName[0]; + my $firmwareFolder = "./FHEM/firmware/"; + my $logFile = AttrVal("global", "logdir", "./log") . "/ArduCounterFlash.log"; + + return "Flashing ESP8266 not supported yet" if ($hash->{Board} =~ /ESP8266/); + + my $hexFile = $firmwareFolder . "ArduCounter.hex"; + return "The file '$hexFile' does not exist" if(!-e $hexFile); + + Log3 $name, 3, "$name: Flashing Aduino at $port with $hexFile. See $logFile for details"; + + $log .= "flashing device as ArduCounter for $name\n"; + $log .= "hex file: $hexFile\n"; + + $log .= "port: $port\n"; + $log .= "log file: $logFile\n"; + + my $flashCommand = AttrVal($name, "flashCommand", ""); + + if($flashCommand ne "") { + if (-e $logFile) { + unlink $logFile; + } + + ArduCounter_Disconnected($hash); + DevIo_CloseDev($hash); + $log .= "$name closed\n"; + + my $avrdude = $flashCommand; + $avrdude =~ s/\Q[PORT]\E/$port/g; + $avrdude =~ s/\Q[HEXFILE]\E/$hexFile/g; + $avrdude =~ s/\Q[LOGFILE]\E/$logFile/g; + + $log .= "command: $avrdude\n\n"; + `$avrdude`; + + local $/=undef; + if (-e $logFile) { + open FILE, $logFile; + my $logText = ; + close FILE; + $log .= "--- AVRDUDE ---------------------------------------------------------------------------------\n"; + $log .= $logText; + $log .= "--- AVRDUDE ---------------------------------------------------------------------------------\n\n"; + } + else { + $log .= "WARNING: avrdude created no log file\n\n"; + } + ArduCounter_Open($hash, 0); # new open + $log .= "$name open called.\n"; + delete $hash->{Initialized}; + } + return $log; +} + + # SET command ######################################################################### sub ArduCounter_Set($@) { - my ( $hash, @a ) = @_; + my ($hash, @a) = @_; return "\"set ArduCounter\" needs at least one argument" if ( @a < 2 ); # @a is an array with DeviceName, SetName, Rest of Set Line @@ -438,84 +770,59 @@ sub ArduCounter_Set($@) return "Unknown argument $attr, choose one of " . join(" ", @cList); } - if(!$hash->{FD}) { - Log3 $name, 4, "$name: Set called but device is disconnected"; - return ("Set called but device is disconnected", undef); + if ($attr eq "disable") { + Log3 $name, 4, "$name: set disable called"; + CommandAttr(undef, "$name disable 1"); + return; + + } elsif ($attr eq "enable") { + Log3 $name, 4, "$name: set enable called"; + CommandAttr(undef, "$name disable 0"); + return; + + } elsif ($attr eq "reconnect") { + Log3 $name, 4, "$name: set reconnect called"; + DevIo_CloseDev($hash); + ArduCounter_Open($hash); + return; + + } elsif ($attr eq "flash") { + return ArduCounter_Flash($hash, @a); } - if (AttrVal($name, "disable", undef)) { - Log3 $name, 4, "$name: set called but device is disabled"; + if(!$hash->{FD}) { + Log3 $name, 4, "$name: Set $attr $arg called but device is disconnected"; + return ("Set called but device is disconnected", undef); + } + if (IsDisabled($name)) { + Log3 $name, 4, "$name: set $attr $arg called but device is disabled"; return; } - if ($attr eq "raw") { + Log3 $name, 4, "$name: set raw $arg called"; ArduCounter_Write($hash, "$arg"); + + } elsif ($attr eq "saveConfig") { + Log3 $name, 4, "$name: set saveConfig called"; + ArduCounter_Write($hash, "e"); } elsif ($attr eq "reset") { - DevIo_CloseDev($hash); - $hash->{buffer} = ""; - DevIo_OpenDev( $hash, 0, 0); + Log3 $name, 4, "$name: set reset called"; + DevIo_CloseDev($hash); + ArduCounter_Open($hash); if (ArduCounter_Write($hash, "r")) { delete $hash->{Initialized}; return "sent (r)eset command to device - waiting for its setup message"; } - } elsif ($attr eq "flash") { - my @args = split(' ', $arg); - my $log = ""; - my @deviceName = split('@', $hash->{DeviceName}); - my $port = $deviceName[0]; - my $firmwareFolder = "./FHEM/firmware/"; - my $logFile = AttrVal("global", "logdir", "./log") . "/ArduCounterFlash.log"; - my $hexFile = $firmwareFolder . "ArduCounter.hex"; - - return "The file '$hexFile' does not exist" if(!-e $hexFile); - - Log3 $name, 4, "$name: Flashing Aduino at $port with $hexFile. See $logFile for details"; - - $log .= "flashing device as ArduCounter for $name\n"; - $log .= "hex file: $hexFile\n"; - - $log .= "port: $port\n"; - $log .= "log file: $logFile\n"; - - my $flashCommand = AttrVal($name, "flashCommand", ""); - - if($flashCommand ne "") { - if (-e $logFile) { - unlink $logFile; - } - - DevIo_CloseDev($hash); - readingsSingleUpdate($hash, "state", "disconnected", 1); - $log .= "$name closed\n"; - - my $avrdude = $flashCommand; - $avrdude =~ s/\Q[PORT]\E/$port/g; - $avrdude =~ s/\Q[HEXFILE]\E/$hexFile/g; - $avrdude =~ s/\Q[LOGFILE]\E/$logFile/g; - - $log .= "command: $avrdude\n\n"; - `$avrdude`; - - local $/=undef; - if (-e $logFile) { - open FILE, $logFile; - my $logText = ; - close FILE; - $log .= "--- AVRDUDE ---------------------------------------------------------------------------------\n"; - $log .= $logText; - $log .= "--- AVRDUDE ---------------------------------------------------------------------------------\n\n"; - } - else { - $log .= "WARNING: avrdude created no log file\n\n"; - } - DevIo_OpenDev($hash, 0, 0); - $log .= "$name opened\n"; - delete $hash->{Initialized}; - } - return $log; + } elsif ($attr eq "devVerbose") { + if ($arg =~ /^\d$/) { + Log3 $name, 4, "$name: set devVerbose $arg called"; + ArduCounter_Write($hash, "$arg"."v"); + } else { + Log3 $name, 4, "$name: set devVerbose called with illegal value $arg"; + } } return undef; } @@ -540,7 +847,7 @@ sub ArduCounter_Get($@) return ("Get called but device is disconnected", undef); } - if (AttrVal($name, "disable", undef)) { + if (IsDisabled($name)) { Log3 $name, 4, "$name: get called but device is disabled"; return; } @@ -548,8 +855,7 @@ sub ArduCounter_Get($@) if ($attr eq "info") { Log3 $name, 3, "$name: Sending info command to device"; ArduCounter_Write( $hash, "s"); - my ($err, $msg) = ArduCounter_ReadAnswer($hash, 'Next report in [0-9]+ Milliseconds'); - # todo: test adding \n to regex to make sure we got the whole respose string + my ($err, $msg) = ArduCounter_ReadAnswer($hash, 'Next report in.*seconds'); return ($err ? $err : $msg); } @@ -559,21 +865,256 @@ sub ArduCounter_Get($@) ###################################### -sub ArduCounter_HandleVersion($$) +sub ArduCounter_HandleDeviceTime($$$$) { - my ($hash, $line) = @_; + my ($hash, $deTi, $deTiW, $now) = @_; my $name = $hash->{NAME}; - if ($line =~ / V([\d\.]+)/) { - my $version = $1; - if ($version < "1.9") { - $version .= " - not compatible with this Module version - please flash new sketch"; - Log3 $name, 3, "$name: device reported outdated Arducounter Firmware - please update!"; + + my $deviceNowSecs = ($deTi/1000) + ((0xFFFFFFFF / 1000) * $deTiW); + Log3 $name, 5, "$name: Device Time $deviceNowSecs"; + + if (defined ($hash->{'.DeTOff'}) && $hash->{'.LastDeT'}) { + if ($deviceNowSecs >= $hash->{'.LastDeT'}) { + $hash->{'.Drift2'} = ($now - $hash->{'.DeTOff'}) - $deviceNowSecs; + } else { + $hash->{'.DeTOff'} = $now - $deviceNowSecs; + Log3 $name, 4, "$name: device did reset (now $deviceNowSecs, before $hash->{'.LastDeT'}). New offset is $hash->{'.DeTOff'}"; + } + } else { + $hash->{'.DeTOff'} = $now - $deviceNowSecs; + $hash->{'.Drift2'} = 0; + $hash->{'.DriftStart'} = $now; + Log3 $name, 5, "$name: Initialize device clock offset to $hash->{'.DeTOff'}"; + } + $hash->{'.LastDeT'} = $deviceNowSecs; + + my $drTime = ($now - $hash->{'.DriftStart'}); + #Log3 $name, 5, "$name: Device Time $deviceNowSecs" . + #", Offset " . sprintf("%.3f", $hash->{'.DeTOff'}/1000) . + ", Drift " . sprintf("%.3f", $hash->{'.Drift2'}) . + "s in " . sprintf("%.3f", $drTime) . "s" . + ($drTime > 0 ? ", " . sprintf("%.2f", $hash->{'.Drift2'} / $drTime * 100) . "%" : ""); +} + + +###################################### +sub ArduCounter_ParseHello($$$) +{ + my ($hash, $line, $now) = @_; + my $name = $hash->{NAME}; + + if ($line =~ /^ArduCounter V([\d\.]+) on ([^\ ]+ ?[^\ ]*) compiled (.*) Hello(, pins ([0-9\,]+) available)? ?(T([\d]+),([\d]+) B([\d]+),([\d]+))?/) { # setup / hello message + $hash->{VersionFirmware} = ($1 ? $1 : "unknown"); + $hash->{Board} = ($2 ? $2 : "unknown"); + $hash->{SketchCompile} = ($3 ? $3 : "unknown"); + $hash->{allowedPins} = $5 if ($5); + my $mNow = ($7 ? $7 : 0); + my $mNowW = ($8 ? $8 : 0); + my $mBoot = ($9 ? $9 : 0); + my $mBootW = ($10 ? $10 : 0); + if ($hash->{VersionFirmware} < "2.36") { + $hash->{VersionFirmware} .= " - not compatible with this Module version - please flash new sketch"; + Log3 $name, 3, "$name: device reported outdated Arducounter Firmware ($hash->{VersionFirmware}) - please update!"; delete $hash->{Initialized}; } else { - $hash->{Initialized} = 1; # now device is initialized + Log3 $name, 3, "$name: device sent hello: $line"; + $hash->{Initialized} = 1; # now device has finished its boot and reported its version + delete $hash->{runningCfg}; + + my $cft = AttrVal($name, "ConfigDelay", 1); # wait for device to send cfg before reconf. + RemoveInternalTimer ("cmpCfg:$name"); + InternalTimer($now+$cft, "ArduCounter_ConfigureDevice", "cmpCfg:$name", 0); + + my $deviceNowSecs = ($mNow/1000) + ((0xFFFFFFFF / 1000) * $mNowW); + my $deviceBootSecs = ($mBoot/1000) + ((0xFFFFFFFF / 1000) * $mBootW); + my $bootTime = $now - ($deviceNowSecs - $deviceBootSecs); + $hash->{deviceBooted} = $bootTime; # for estimation of missed pulses up to now + } + delete $hash->{WaitForHello}; + RemoveInternalTimer ("hwait:$name"); # dont wait for hello reply if already sent + RemoveInternalTimer ("sendHello:$name"); # Hello not needed anymore if not sent yet + } else { + Log3 $name, 4, "$name: probably wrong firmware version - cannot parse line $line"; + } +} + + +######################################################################### +sub ArduCounter_HandleCounters($$$$$$$$) +{ + my ($hash, $pin, $sequence, $count, $time, $diff, $rDiff, $now) = @_; + my $name = $hash->{NAME}; + + my $rcname = AttrVal($name, "readingNameCount$pin", "pin$pin"); # internal count reading + my $rlname = AttrVal($name, "readingNameLongCount$pin", "long$pin"); # long count + my $riname = AttrVal($name, "readingNameInterpolatedCount$pin", "interpolatedLong$pin"); + my $lName = AttrVal($name, "readingNamePower$pin", AttrVal($name, "readingNameCount$pin", "pin$pin")); # for logging + + my $longCount = ReadingsVal($name, $rlname, 0); # alter long count Wert + my $intpCount = ReadingsVal($name, $riname, 0); # alter interpolated count Wert + my $lastCount = ReadingsVal($name, $rcname, 0); + my $lastSeq = ReadingsVal($name, "seq".$pin, 0); + + my $lastCountTS = ReadingsTimestamp ($name, $rlname, 0); # last time long count reading was set + my $lastCountTNum = time_str2num($lastCountTS); + my $fBootTim = ($hash->{deviceBooted} ? FmtTime($hash->{deviceBooted}) : "never"); # time device booted + my $fLastCTim = FmtTime($lastCountTNum); + my $pulseGap = $count - $lastCount - $rDiff; + my $seqGap = $sequence - ($lastSeq + 1); + + if (!$lastCountTS && !$longCount && !$intpCount) { + # new defined or deletereading done ... + Log3 $name, 3, "$name: pin $pin ($lName) first report, initializing counters to " . ($count - $rDiff); + $longCount = $count - $rDiff; + $intpCount = $count - $rDiff; + } + if ($lastCountTS && $hash->{deviceBooted} && $hash->{deviceBooted} > $lastCountTNum) { + # first report for this pin after a restart + # -> do interpolation for period between last report before boot and boot time. count after boot has to be added later + Log3 $name, 5, "$name: pin $pin ($lName) device restarted at $fBootTim, last reported at $fLastCTim, sequence for pin $pin changed from $lastSeq to $sequence and count from $lastCount to $count"; + $lastSeq = 0; + $seqGap = $sequence - 1; # $sequence should be 1 after restart + $pulseGap = $count - $rDiff; # + + my $lastInterval = ReadingsVal ($name, "timeDiff$pin", 0); + my $lastCDiff = ReadingsVal ($name, "countDiff$pin", 0); + my $offlTime = sprintf ("%.2f", $hash->{deviceBooted} - $lastCountTNum); + + if ($lastCountTS && $lastInterval && ($offlTime > 0) && ($offlTime < 12*60*60)) { # > 0 and < 12h + my $lastRatio = $lastCDiff / $lastInterval; + my $curRatio = $diff / $time; + my $intRatio = 1000 * ($lastRatio + $curRatio) / 2; + my $intrCount = int(($offlTime * $intRatio)+0.5); + + Log3 $name, 3, "$name: pin $pin ($lName) interpolating for $offlTime secs until boot, $intrCount estimated pulses (before $lastCDiff in $lastInterval ms, now $diff in $time ms, avg ratio $intRatio p/s)"; + Log3 $name, 5, "$name: pin $pin ($lName) adding interpolated $intrCount to interpolated count $intpCount"; + $intpCount += $intrCount; + + } else { + Log3 $name, 4, "$name: interpolation of missed pulses for pin $pin ($lName) not possible - no valid historic data."; + } + } elsif ($lastCountTS && $seqGap < 0) { + # new sequence number is smaller than last and we have old readings + # and this is not after a reboot of the device + $seqGap += 256; # correct seq gap + Log3 $name, 5, "$name: pin $pin ($lName) sequence wrapped from $lastSeq to $sequence, set seqGap to $seqGap"; + } + + if ($lastCountTS && $seqGap > 0) { + # probably missed a report. Maybe even the first ones after a reboot (until reconnect) + # take last count, delta to new reported count as missed pulses to correct long counter + my $timeGap = ($now - $time/1000 - $lastCountTNum); + if ($pulseGap > 0) { + $longCount += $pulseGap; + $intpCount += $pulseGap; + Log3 $name, 3, "$name: pin $pin ($lName) missed $seqGap reports in $timeGap seconds. Last reported sequence was $lastSeq, now $sequence. Device count before was $lastCount, now $count with rDiff $rDiff. Adding $pulseGap to long count and intpolated count readings"; + } elsif ($pulseGap == 0) { + # outdated sketch? + Log3 $name, 5, "$name: pin $pin ($lName) missed $seqGap sequence numbers in $timeGap seconds. Last reported sequence was $lastSeq, now $sequence. Device count before was $lastCount, now $count with rDiff $rDiff. Nothing is missing - ignore"; + } else { + # strange ... + Log3 $name, 3, "$name: Pin $pin ($lName) missed $seqGap reports in $timeGap seconds. " . + "Last reported sequence was $lastSeq, now $sequence. " . + "Device count before was $lastCount, now $count with rDiff $rDiff " . + "but pulseGap is $pulseGap. this is wrong and should not happen"; + } + } + + Log3 $name, 5, "$name: pin $pin ($lName) adding rDiff $rDiff to long count $longCount and interpolated count $intpCount"; + + $intpCount += $rDiff; + $longCount += $rDiff; + + readingsBulkUpdate($hash, $rcname, $count); + readingsBulkUpdate($hash, $rlname, $longCount); + readingsBulkUpdate($hash, $riname, $intpCount); + readingsBulkUpdate($hash, "seq".$pin, $sequence); +} + + +######################################################################### +sub ArduCounter_ParseReport($$) +{ + my ($hash, $line) = @_; + my $name = $hash->{NAME}; + my $now = gettimeofday(); + if ($line =~ '^R([\d]+) C([\d]+) D([\d]+) ?[\/R]([\d]+) T([\d]+) N([\d]+),([\d]+) X([\d]+)( S[\d]+)?( A[\d]+)?') + { + # new count is beeing reported + my $pin = $1; + my $count = $2; # internal counter at device + my $diff = $3; # delta during interval + my $rDiff = $4; # real delta including the first pulse after a restart + my $time = $5; # interval + my $deTime = $6; + my $deTiW = $7; + my $reject = $8; + my $seq = ($9 ? substr($9, 2) : ""); + my $avgLen = ($10 ? substr($10, 2) : ""); + + my $factor = AttrVal($name, "readingFactor$pin", AttrVal($name, "factor", 1000)); + my $rpname = AttrVal($name, "readingNamePower$pin", "power$pin"); # power reading name + my $lName = AttrVal($name, "readingNamePower$pin", AttrVal($name, "readingNameCount$pin", "pin$pin")); # for logging + + my $sTime = $now - $time/1000; # start of observation interval (~first pulse) + my $fSTime = FmtDateTime($sTime); # formatted + my $fSdTim = FmtTime($sTime); # only time formatted for logging + my $fEdTim = FmtTime($now); # end of Interval - only time formatted for logging + + ArduCounter_HandleDeviceTime($hash, $deTime, $deTiW, $now); + + if (!$time || !$factor) { + Log3 $name, 3, "$name: Pin $pin ($lName) skip line because time or factor is 0: $line"; + return; + } + my $power = sprintf ("%.3f", ($time ? $diff/$time/1000*3600*$factor : 0)); + Log3 $name, 4, "$name: Pin $pin ($lName) Cnt $count " . + "(diff $diff/$rDiff) in " . sprintf("%.3f", $time/1000) . "s" . + " from $fSdTim until $fEdTim" . + ", seq $seq" . + ((defined($reject) && $reject ne "") ? ", Rej $reject" : "") . + (defined($avgLen) ? ", Avg ${avgLen}ms" : "") . + ", result $power"; + + if (AttrVal($name, "readingStartTime$pin", 0)) { + readingsBeginUpdate($hash); # special block with potentially manipulates times + # special way to set readings: use time of interval start as reading time + Log3 $name, 5, "$name: readingStartTime$pin specified: setting timestamp to $fSdTim"; + my $chIdx = 0; + $hash->{".updateTime"} = $sTime; + $hash->{".updateTimestamp"} = $fSTime; + readingsBulkUpdate($hash, $rpname, $power) if ($time); + $hash->{CHANGETIME}[$chIdx++] = $fSTime; # Intervall start + readingsEndUpdate($hash, 1); # end of special block + readingsBeginUpdate($hash); # start regular update block + } else { + # normal way to set readings + readingsBeginUpdate($hash); # start regular update block + readingsBulkUpdate($hash, $rpname, $power) if ($time); + } + + + if (defined($reject) && $reject ne "") { + my $rejCount = ReadingsVal($name, "reject$pin", 0); # alter reject count Wert + readingsBulkUpdate($hash, "reject$pin", $reject + $rejCount); + } + readingsBulkUpdate($hash, "timeDiff$pin", $time); + readingsBulkUpdate($hash, "countDiff$pin", $diff); + + if (AttrVal($name, "verboseReadings$pin", 0)) { + readingsBulkUpdate($hash, "lastMsg$pin", $line); + } + + ArduCounter_HandleCounters($hash, $pin, $seq, $count, $time, $diff, $rDiff, $now); + readingsEndUpdate($hash, 1); + + if (!$hash->{Initialized}) { # device has sent count but not Started / hello after reconnect + Log3 $name, 3, "$name: device is still counting"; + if (!$hash->{WaitForHello}) { # if hello not already sent, send it now + ArduCounter_AskForHello("direct:$name"); + } + RemoveInternalTimer ("sendHello:$name"); # don't send hello again } - $hash->{VersionFirmware} = $version; - Log3 $name, 4, "$name: device reported firmware $version"; } } @@ -590,231 +1131,62 @@ sub ArduCounter_Parse($) foreach my $line (@lines) { #Log3 $name, 5, "$name: Parse line: $line"; - if ($line =~ 'R([\d]+) C([\d]+) D([\d]+) R([\d]+) T([\d]+)( N[\d]+)?( X[\d]+)?( F[\d]+)?( L[\d]+)?( A[\d]+)?( H.*)?') + if ($line =~ /^R([\d]+)/) { - # new count is beeing reported - my $pin = $1; - my $count = $2; - my $diff = $3; - my $rDiff = $4; - my $time = $5; - my $deTime = ($6 ? substr($6, 2) / 1000 : ""); - my $reject = ($7 ? substr($7, 2) : ""); - my $first = ($8 ? substr($8, 2) : ""); - my $last = ($9 ? substr($9, 2) : ""); - my $avgLen = ($10 ? substr($10, 2) : ""); - my $hist = ($11 ? substr($11, 2) : ""); + ArduCounter_ParseReport($hash, $line); - my $factor = AttrVal($name, "readingFactor$pin", AttrVal($name, "factor", 1000)); - my $rcname = AttrVal($name, "readingNameCount$pin", "pin$pin"); # internal count reading name - my $rlname = AttrVal($name, "readingNameLongCount$pin", "long$pin"); # long count - continues after reset - my $riname = AttrVal($name, "readingNameInterpolatedCount$pin", "interpolatedLong$pin"); # interpol. count - continues after reset, interpolates - my $rpname = AttrVal($name, "readingNamePower$pin", "power$pin"); # power reading name - my $lName = AttrVal($name, "readingNamePower$pin", AttrVal($name, "readingNameCount$pin", "pin$pin")); # for logging - - my $chIdx = 0; - my $sTime = $now - $time/1000; # start of observation interval (~first pulse) - my $fSTime = FmtDateTime($sTime); # formatted - my $fSdTim = FmtTime($sTime); # only time formatted - - my $eTime = $now; # now / end of observation interval - my $fETime = FmtDateTime($eTime); # formatted - my $fEdTim = FmtTime($eTime); # only time formatted - - if (!$time || !$factor) { - Log3 $name, 3, "$name: Pin $pin ($lName) skip line because time or factor is 0: $line"; - next; - } - my $power = sprintf ("%.3f", ($time ? $diff/$time/1000*3600*$factor : 0)); - - my $intrCount = 0; - my $offlTime = 0; - my $longCount = ReadingsVal($name, $rlname, 0); # alter long count Wert im Reading - my $intpCount = ReadingsVal($name, $riname, 0); # alter interpolated count Wert im Reading - if (!$hash->{CounterInterpolated}{$pin} && $hash->{CounterResetTime}) { - # arduino reboot -> try to interpolate - my $lastCountTime = ReadingsTimestamp ($name, $rlname, 0); # last time long count reading was set as string - my $lastCountTNum = time_str2num($lastCountTime); # ... as number - - my $lastInterval = ReadingsVal ($name, "timeDiff$pin", 0); - my $lastCDiff = ReadingsVal ($name, "countDiff$pin", 0); - - Log3 $name, 4, "$name: arduino was restarted so some impulses might have got lost for $pin ($lName)"; - $offlTime = sprintf ("%.2f", $hash->{CounterResetTime} - $lastCountTNum); - if ($lastCountTime && $lastInterval && ($offlTime > 0) && ($offlTime < 1000*60*60*12)) { - # > 0 and < 12h - my $lastRatio = $lastCDiff / $lastInterval; - my $curRatio = $diff / $time; - my $intRatio = 1000 * ($lastRatio + $curRatio) / 2; - $intrCount = int(($offlTime * $intRatio)+0.5); - - Log3 $name, 3, "$name: pin $pin ($lName): interpolation after counter reset, offline $offlTime secs, $intrCount estimated pulses (before $lastCDiff in $lastInterval ms, now $diff in $time ms, avg ratio $intRatio p/s)"; - Log3 $name, 5, "$name: pin $pin ($lName): adding interpolated $intrCount to interpolated count $intpCount"; - $intpCount += $intrCount; - - } else { - Log3 $name, 4, "$name: interpolation of missed pulses for pin $pin ($lName) not possible - no valid historic data."; - } - $hash->{CounterInterpolated}{$pin} = 1; - } - Log3 $name, 5, "$name: Pin $pin debug: adding $rDiff to long count $longCount and interpolated count $intpCount"; - $intpCount += $rDiff; - $longCount += $rDiff; - - Log3 $name, 4, "$name: Pin $pin ($lName) count $count " . - ($longCount ? "longCount $longCount " : "") . - ($intpCount ? "interpCount $intpCount " : "") . - "(diff $diff) in " . sprintf("%.3f", $time/1000) . "s" . - ((defined($reject) && $reject ne "") ? ", reject $reject" : "") . - (defined($avgLen) ? ", Avg Len ${avgLen}ms" : "") . - ", result $power"; - Log3 $name, 4, "$name: interval $fSdTim until $fEdTim" . - (defined($first) ? ", First at $first" : "") . - (defined($last) ? ", Last at $last" : ""); - - - readingsBeginUpdate($hash); - if (AttrVal($name, "readingStartTime$pin", 0)) { - # special way to set readings: use time of interval start as reading time - Log3 $name, 5, "$name: readingStartTime$pin specified: setting reading timestamp to $fSdTim"; - Log3 $name, 5, "$name: set readings $rpname to $power, timeDiff$pin to $time and countDiff$pin to $diff"; - - $hash->{".updateTime"} = $sTime; - $hash->{".updateTimestamp"} = $fSTime; - readingsBulkUpdate($hash, $rpname, $power) if ($time); - $hash->{CHANGETIME}[$chIdx++] = $fSTime; # Intervall start - - $hash->{".updateTime"} = $eTime; - $hash->{".updateTimestamp"} = $fETime; - readingsBulkUpdate($hash, $rcname, $count); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - readingsBulkUpdate($hash, $rlname, $longCount); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - readingsBulkUpdate($hash, $riname, $intpCount); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - if (defined($reject)) { - my $rejCount = ReadingsVal($name, "reject$pin", 0); # alter reject count Wert im Reading - readingsBulkUpdate($hash, "reject$pin", $reject + $rejCount); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - } - if (AttrVal($name, "verboseReadings$pin", 0)) { - - readingsBulkUpdate($hash, "timeDiff$pin", $time); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - readingsBulkUpdate($hash, "countDiff$pin", $diff); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - readingsBulkUpdate($hash, "lastMsg$pin", $line); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - if ($hist) { - readingsBulkUpdate($hash, "pinHistory$pin", $hist); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - } - } - } else { - # normal way to set readings - Log3 $name, 5, "$name: set readings $rpname to $power, timeDiff$pin to $time and countDiff$pin to $diff"; - readingsBulkUpdate($hash, $rpname, $power) if ($time); - #$eTime = time_str2num(ReadingsTimestamp ($name, $rpname, 0)); - readingsBulkUpdate($hash, $rcname, $count); - readingsBulkUpdate($hash, $rlname, $longCount); - readingsBulkUpdate($hash, $riname, $intpCount); - if (defined($reject)) { - my $rejCount = ReadingsVal($name, "reject$pin", 0); # alter reject count Wert im Reading - readingsBulkUpdate($hash, "reject$pin", $reject + $rejCount); - } - if (AttrVal($name, "verboseReadings$pin", 0)) { - readingsBulkUpdate($hash, "timeDiff$pin", $time); - readingsBulkUpdate($hash, "countDiff$pin", $diff); - readingsBulkUpdate($hash, "lastMsg$pin", $line); - readingsBulkUpdate($hash, "pinHistory$pin", $hist) if ($hist); - } - } - readingsEndUpdate($hash, 1); - - if ($deTime) { - if (defined ($hash->{'.DeTOff'}) && $hash->{'.LastDeT'}) { - if ($deTime >= $hash->{'.LastDeT'}) { - $hash->{'.Drift2'} = ($now - $hash->{'.DeTOff'}) - $deTime; - } else { - $hash->{'.DeTOff'} = $now - $deTime; - Log3 $name, 4, "$name: device clock wrapped or reset (now $deTime, before $hash->{'.LastDeT'}). New offset is $hash->{'.DeTOff'}"; - } - } else { - $hash->{'.DeTOff'} = $now - $deTime; - $hash->{'.Drift2'} = 0; - $hash->{'.DriftStart'} = $now; - Log3 $name, 5, "$name: Initialize clock offset to $hash->{'.DeTOff'}"; - } - $hash->{'.LastDeT'} = $deTime; + } elsif ($line =~ /^H([\d+]) (.+)/) { # pin pulse history as separate line + my $pin = $1; + my $hist = $2; + if (AttrVal($name, "verboseReadings$pin", 0)) { + readingsBeginUpdate($hash); + readingsBulkUpdate($hash, "pinHistory$pin", $hist); + readingsEndUpdate($hash, 1); } - my $drTime = ($now - $hash->{'.DriftStart'}); - Log3 $name, 5, "$name: Device Time $deTime" . - #", Offset " . sprintf("%.3f", $hash->{'.DeTOff'}/1000) . - ", Drift " . sprintf("%.3f", $hash->{'.Drift2'}) . - "s in " . sprintf("%.3f", $drTime) . "s" . - ($drTime > 0 ? ", " . sprintf("%.2f", $hash->{'.Drift2'} / $drTime * 100) . "%" : ""); - - if (!$hash->{Initialized}) { # device has not sent Started / hello yet - Log3 $name, 3, "$name: device is still counting"; - if (!$hash->{WaitForHello}) { # if hello has not already been sent, send it now - ArduCounter_SendHello("direct:$name"); - } - RemoveInternalTimer ("sendHello:$name"); # don't send hello again - } - - } elsif ($line =~ /ArduCounter V([\d\.]+).?Hello/) { # response to h(ello) - Log3 $name, 3, "$name: device replied to hello, V$1"; - ArduCounter_HandleVersion($hash, $line); - if ($hash->{Initialized}) { - ArduCounter_ConfigureDevice($hash) # send pin configuration - } - delete $hash->{WaitForHello}; - RemoveInternalTimer ("hwait:$name"); - RemoveInternalTimer ("sendHello:$name"); - - } elsif ($line =~ /Status: ArduCounter V([\d\.]+)/) { # response to s(how) - $retStr .= "\n" if ($retStr); - $retStr .= $line; - ArduCounter_HandleVersion($hash, $line); - - delete $hash->{WaitForHello}; - RemoveInternalTimer ("hwait:$name"); # dont wait for hello reply if already sent - RemoveInternalTimer ("sendHello:$name"); # Hello not needed anymore if not sent yet - - - } elsif ($line =~ /ArduCounter V([\d\.]+).?Started/) { # setup message - Log3 $name, 3, "$name: device sent setup message, V$1"; - ArduCounter_HandleVersion($hash, $line); - if ($hash->{Initialized}) { - ArduCounter_ConfigureDevice($hash) # send pin configuration - } - delete $hash->{WaitForHello}; - RemoveInternalTimer ("hwait:$name"); # dont wait for hello reply if already sent - RemoveInternalTimer ("sendHello:$name"); # Hello not needed anymore if not sent yet + } elsif ($line =~ /^M Next report in ([\d]+)/) { # end of report tells when next + $retStr .= ($retStr ? "\n" : "") . $line; + Log3 $name, 4, "$name: device: $line"; - $hash->{CounterResetTime} = $now; - delete $hash->{CounterInterpolated}; - - } elsif ($line =~ /V([\d\.]+).?Setup done/) { # old setup message - Log3 $name, 3, "$name: device is flashed with an old and incompatible firmware : $1"; - Log3 $name, 3, "$name: please use set $name flash to update"; - ArduCounter_HandleVersion($hash, $line); + } elsif ($line =~ /^I(.*)/) { # interval config report after show/hello + $hash->{runningCfg}{I} = $1; # save for later compare + $hash->{runningCfg}{I} =~ s/\s+$//; # remove spaces at end + $retStr .= ($retStr ? "\n" : "") . $line; + + } elsif ($line =~ /^P([\d]+) (falling|rising|-) ?(pullup)? ?min ([\d]+)/) { # pin configuration at device + $hash->{runningCfg}{$1} = "$2 $3 $4"; # save for later compare + + $retStr .= ($retStr ? "\n" : "") . $line; + Log3 $name, 4, "$name: device sent config for pin $1: $1 $2 min $3"; + + } elsif ($line =~ /^alive/) { # alive response + RemoveInternalTimer ("alive:$name"); + $hash->{WaitForAlive} = 0; + delete $hash->{KeepAliveRetries}; + + } elsif ($line =~ /^ArduCounter V([\d\.]+).*(Started|Hello)/) { # setup message + ArduCounter_ParseHello($hash, $line, $now); + + } elsif ($line =~ /^Status: ArduCounter V([\d\.]+)/) { # response to s(how) + $retStr .= ($retStr ? "\n" : "") . $line; + + } elsif ($line =~ /connection already busy/) { + my $now = gettimeofday(); + my $delay = AttrVal($name, "nextOpenDelay", 60); + Log3 $name, 4, "$name: _Parse: primary tcp connection seems busy - delay next open"; + ArduCounter_Disconnected($hash); # set to disconnected (state), remove timers + DevIo_CloseDev($hash); # close, remove from readyfnlist so _ready is not called again + RemoveInternalTimer ("delayedopen:$name"); + InternalTimer($now+$delay, "ArduCounter_DelayedOpen", "delayedopen:$name", 0); } elsif ($line =~ /^D (.*)/) { # debug / info Message from device - $retStr .= "\n" if ($retStr); - $retStr .= $1; + $retStr .= ($retStr ? "\n" : "") . $line; Log3 $name, 4, "$name: device: $1"; + } elsif ($line =~ /^M (.*)/) { # other Message from device - $retStr .= "\n" if ($retStr); - $retStr .= $1; + $retStr .= ($retStr ? "\n" : "") . $line; Log3 $name, 3, "$name: device: $1"; + } elsif ($line =~ /^[\s\n]*$/) { # blank line - ignore } else { @@ -853,8 +1225,7 @@ sub ArduCounter_Read($) ##################################### # Called from get / set to get a direct answer # called with logical device hash -sub -ArduCounter_ReadAnswer($$) +sub ArduCounter_ReadAnswer($$) { my ($hash, $expect) = @_; my $name = $hash->{NAME}; @@ -885,7 +1256,7 @@ ArduCounter_ReadAnswer($$) if($nfound < 0) { next if ($! == EAGAIN() || $! == EINTR() || $! == 0); my $err = $!; - DevIo_Disconnected($hash); + ArduCounter_Disconnected($hash); # set to disconnected, remove timers, let _ready try to reopen Log3 $name, 3, "$name: ReadAnswer error: $err"; return("ReadAnswer error: $err", undef); } @@ -925,67 +1296,31 @@ ArduCounter_ReadAnswer($$) -# -# copied from other FHEM modules -######################################################################### -sub ArduCounter_Ready($) -{ - my ($hash) = @_; - my $name = $hash->{NAME}; - - if (AttrVal($name, "disable", undef)) { - return; - } - - # try to reopen if state is disconnected - if ( $hash->{STATE} eq "disconnected" ) { - #Log3 $name, 3, "$name: ReadyFN tries to open"; # debug - delete $hash->{Initialized}; - DevIo_OpenDev( $hash, 1, undef ); - if ($hash->{FD}) { - Log3 $name, 3, "$name: device maybe not initialized yet, set timer to send h(ello"; - my $now = gettimeofday(); - my $hdl = AttrVal($name, "helloSendDelay", 3); - RemoveInternalTimer ("sendHello:$name"); - InternalTimer($now+$hdl, "ArduCounter_SendHello", "sendHello:$name", 0); - } - return; - } - - # This is relevant for windows/USB only - my $po = $hash->{USBDev}; - if ($po) { - my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po->status; - return ( $InBytes > 0 ); - } -} - - 1; =pod =item device -=item summary Module for consumption counter based on an arduino with the ArduCounter sketch -=item summary_DE Modul für Strom / Wasserzähler auf Arduino-Basis mit ArduCounter Sketch +=item summary Module for counters based on arduino / ESP8266 board +=item summary_DE Modul für Strom / Wasserzähler mit Arduino- oder ESP8266 =begin html

ArduCounter


Readings / Events
@@ -1131,19 +1495,25 @@ sub ArduCounter_Ready($) The module creates at least the following readings and events for each defined pin:
  • pin.*
  • the current count at this pin -
  • long.*
  • - long count which keeps on counting up after fhem restarts whereas the pin.* count is only a temporary internal count that starts at 0 when the arduino board starts. -
  • interpolatedLong.*
  • - like long.* but when the Arduino restarts the potentially missed pulses are interpolated based on the pulse rate before the restart and after the restart. -
  • reject.*
  • - counts rejected pulses that are shorter than the specified minimal pulse length. +
  • long.*
  • + long count which keeps on counting up after fhem restarts whereas the pin.* count is only a temporary internal count that starts at 0 when the arduino board starts. +
  • interpolatedLong.*
  • + like long.* but when the Arduino restarts the potentially missed pulses are interpolated based on the pulse rate before the restart and after the restart. +
  • reject.*
  • + counts rejected pulses that are shorter than the specified minimal pulse length.
  • power.*
  • the current calculated power at this pin -
  • pinHistory.*
  • - shows detailed information of the last pulses. This is only available when a minimal pulse length is specified for this pin. Also the total number of impulses recorded here is limited to 20 for all pins together. The output looks like -36/7:0C, -29/7:1G, -22/8:0C, -14/7:1G, -7/7:0C, 0/7:1G
    - The first number is the relative time in milliseconds when the input level changed, followed by the length in milliseconds, the level and the internal action.
    - -36/7:0C for example means that 36 milliseconds before the reporting started, the input changed to 0V, stayed there for 7 milliseconds and this was counted.
    - +
  • pinHistory.*
  • + shows detailed information of the last pulses. This is only available when a minimal pulse length is specified for this pin. Also the total number of impulses recorded here is limited to 20 for all pins together. The output looks like -36/7:0C, -29/7:1G, -22/8:0C, -14/7:1G, -7/7:0C, 0/7:1G
    + The first number is the relative time in milliseconds when the input level changed, followed by the length in milliseconds, the level and the internal action.
    + -36/7:0C for example means that 36 milliseconds before the reporting started, the input changed to 0V, stayed there for 7 milliseconds and this was counted.
    +
  • countDiff.*
  • + delta of the current count to the last reported one. This is used together with timeDiff.* to calculate the power consumption. +
  • timeDiff.*
  • + time difference between the first pulse in the current observation interval and the last one. Used togehter with countDiff to calculate the power consumption. +
  • seq.*
  • + internal sequence number of the last report from the board to fhem. +
    diff --git a/fhem/FHEM/firmware/ArduCounter.bin b/fhem/FHEM/firmware/ArduCounter.bin new file mode 100755 index 0000000000000000000000000000000000000000..ac33fd1777f2d9d0f3feabff9bf9accb64328ce5 GIT binary patch literal 273744 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�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 literal 0 HcmV?d00001 diff --git a/fhem/FHEM/firmware/ArduCounter.hex b/fhem/FHEM/firmware/ArduCounter.hex index 8a2f858da..9fc321541 100755 --- a/fhem/FHEM/firmware/ArduCounter.hex +++ b/fhem/FHEM/firmware/ArduCounter.hex @@ -1,570 +1,757 @@ -:100000000C9479010C94A1010C94A1010C94C607E5 -:100010000C94A1070C947C070C94A1010C94A101F1 -:100020000C94A1010C94A1010C94A1010C94A101C8 -:100030000C94A1010C94A1010C94A1010C94A101B8 -:100040000C9432070C94A1010C9400070C94DA066E -:100050000C94A1010C94A1010C94A1010C94A10198 -:100060000C94A1010C94A1014572726F723A2000A8 -:1000700041726475436F756E7465722056322E300E -:1000800035002C20617667206C656E20002C206C7A -:1000900061737420617420004D20202066697273A2 -:1000A0007420617420002052656A2000206D730066 -:1000B0002920696E200020282B002C20636F756E8C -:1000C0007420002C206E6F206D696E206C656E00B0 -:1000D0002066616C6C696E670020726973696E6777 -:1000E00000206D73002C206D696E206C656E200001 -:1000F0006368616E67650066616C6C696E6700724B -:100100006973696E67002C20694D6F64652000502B -:1001100043496E742070696E2000205374617274BC -:1001200065640000000008000201000003040700ED -:100130000000000000000000000000250028002B47 -:100140000000000000240027002A0020004D206449 -:100150006566696E65642070696E200000000000AD -:10016000230026002900416464496E7400496C6CC8 -:100170006567616C206D6F646520666F72207069C1 -:100180006E2073706563696669636174696F6E2060 -:1001900000496C6C6567616C2070696E20737065D6 -:1001A00063696669636174696F6E20000404040406 -:1001B0000404040402020202020203030303030311 -:1001C00001020408102040800102040810200102EE -:1001D000040810204D2072656D6F76656420005212 -:1001E000656D496E7400496C6C6567616C2070695F -:1001F0006E2073706563696669636174696F6E20F0 -:10020000002000200020004D20696E746572766128 -:100210006C732073657420746F200073697A6500B5 -:1002200020002061742000206C656E200020737413 -:100230006172742000442070696E20004420707543 -:100240006C736520686973746F72793A2000204D71 -:10025000696C6C697365636F6E6473004D204E65E5 -:100260007874207265706F727420696E20002000AF -:100270004D2070696E20004D206D696E20636F7592 -:100280006E7420004D206D696E20696E7465727603 -:10029000616C20004D206D617820696E7465727606 -:1002A000616C20004D206E6F726D616C20696E7400 -:1002B000657276616C20004D205374617475733AD9 -:1002C000200048656C6C6F003A002F002C20002045 -:1002D0004800204100204C00204600205800204EBD -:1002E000002054002052002044002043005200000F -:1002F000111111241FBECFEFD8E0DEBFCDBF11E03A -:10030000A0E0B1E0E8E4F3E202C005900D92A03471 -:10031000B107D9F726E0A0E4B1E001C01D92AD3FDE -:10032000B207E1F711E0C9E7D1E004C02197FE016F -:100330000E949711C837D107C9F70E94D6080C94BC -:10034000A2110C940000CF92DF92EF92FF920F93D4 -:100350001F93CF93DF936C017A018B01C0E0D0E053 -:10036000CE15DF0589F0D8016D918D01D601ED9193 -:10037000FC910190F081E02DC6010995892B11F4C3 -:100380007E0102C02196ECCFC701DF91CF911F9172 -:100390000F91FF90EF90DF90CF900895FC01918D29 -:1003A000828D981761F0828DDF01A80FB11D5D96D7 -:1003B0008C91928D9F5F9F73928F90E008958FEF45 -:1003C0009FEF0895FC01918D828D981731F0828DF9 -:1003D000E80FF11D858D90E008958FEF9FEF089550 -:1003E000FC01918D228D892F90E0805C9F4F821BB4 -:1003F00091098F739927089580E696E00E94F00195 -:1004000021E0892B09F420E0822F0895FC01848DDE -:10041000DF01A80FB11DA35ABF4F2C91848D90E02E -:1004200001968F739927848FA689B7892C93A08909 -:10043000B1898C9180648C93938D848D981306C0C0 -:100440000288F389E02D80818F7D80830895EF926B -:10045000FF920F931F93CF93DF93EC0181E0888F7E -:100460009B8D8C8D981305C0E889F989808185FD65 -:1004700024C0F62E0B8D10E00F5F1F4F0F73112756 -:10048000E02E8C8DE8120CC00FB607FCFACFE8897D -:10049000F989808185FFF5CFCE010E940602F1CF58 -:1004A0008B8DFE01E80FF11DE35AFF4FF0820B8F99 -:1004B000EA89FB898081806207C0EE89FF896083B9 -:1004C000E889F98980818064808381E090E0DF9110 -:1004D000CF911F910F91FF90EF900895CF93DF93ED -:1004E000EC01888D8823C9F0EA89FB89808185FD2C -:1004F00005C0A889B9898C9186FD0FC00FB607FC8D -:10050000F5CF808185FFF2CFA889B9898C9185FFCD -:10051000EDCFCE010E940602E7CFDF91CF91089583 -:1005200080E090E0892B29F00E94FC0181110C945D -:10053000000008953FB7F89480915D0190915E01AD -:10054000A0915F01B091600126B5A89B05C02F3F27 -:1005500019F00196A11DB11D3FBFBA2FA92F982FE9 -:100560008827820F911DA11DB11DBC01CD0142E064 -:10057000660F771F881F991F4A95D1F708952FB7E7 -:10058000F8946091590170915A0180915B019091AA -:100590005C012FBF08952F923F924F925F926F920E -:1005A0007F928F929F92AF92BF92CF92DF92EF9203 -:1005B000FF920F931F93CF93DF9300D000D0CDB75E -:1005C000DEB7882E0E94BF02AB01BC01282D30E0AF -:1005D000F901EE0FFF1FE05AFE4FA591B4914C9028 -:1005E0004C82F901EF53FE4F908094244082220FF9 -:1005F000331FF901E25EFE4F0190F081E02D808112 -:10060000982209F460C1880C880C880C212C312CAC -:10061000AA24A39487E4B82E81E090E0022C01C0C4 -:10062000880F0A94EAF7292D282309F444C1182DCC -:10063000120D5C808521E1E009F4E0E0212F30E03B -:10064000D901A452BE4FF1E08C91833009F0F0E063 -:10065000C901880F991F880F991FDC01AF59BE4F40 -:10066000CD90DD90ED90FC902A013B014C185D0887 -:100670006E087F0873016201A091FB02AF5FA09337 -:10068000FB02A091FB02A43110F01092FB02A0919A -:10069000FB02B0E0A951BD4F1C931091FB02DC019D -:1006A000AF59BE4F4D905D906D907C9004E0109FCF -:1006B000D0011124A956BD4F4D925D926D927C924E -:1006C0001397A091FB0214E0A19FD0011124A95B14 -:1006D000BD4FCD92DD92ED92FC921397A091FB025B -:1006E0006A2E712CAE2FAA25A98383010D5C1D4FA4 -:1006F0004A2ED8014C92A091FB02B0E0A15EBD4F02 -:1007000010E2512E5C92D901AC53BE4FAC91A13096 -:1007100011F0EF13C9C03901660C771C7B826A8225 -:100720008301045E1B4FD8014D905C90411451042D -:1007300009F4BAC0612C712CC414D504E604F70482 -:1007400040F59C012F593E4FD9014D935D936D9318 -:100750007C931397EF17A1F0AA81BB81A451BC4FE2 -:100760002D913C9111972F5F3F4F11963C932E9303 -:10077000E091FB02F0E0E15EFD4FB2E5B08394C092 -:10078000E091FB02F0E0E15EFD4FA8E54A2E4082D9 -:100790008BC0D901A05CBE4FEF1308C02C91E09133 -:1007A000FB02F0E0E15EFD4FB0827CC0EC91EF1700 -:1007B00009F461C0FC01EC5DFA4F40835183628310 -:1007C0007383FC01E45AFC4F408051806280738047 -:1007D00045284628472821F4408351836283738348 -:1007E00089010C501E4F1B830A83F8011081FC0104 -:1007F000EC53FB4F4080518062807380112351F095 -:100800000FEF401A500A600A700A408251826282D9 -:10081000738219C01FEF411A510A610A710A40829E -:10082000518262827382F901E455FB4F20812F5F70 -:100830002083FC01EC57FA4F40835183628373831A -:10084000EA81FB81A082FC01E450FD4F4080518091 -:1008500062807380C40CD51CE61CF71CC082D18258 -:10086000E282F382E091FB02F0E0E15EFD4F33E4CF -:10087000432E408217C0FC01E450FD4F4080518060 -:1008800062807380C40CD51CE61CF71CC082D18228 -:10089000E282F382E091FB02F0E0E15EFD4F20E5B1 -:1008A000522E508269806C92FC01EF59FE4F4083BA -:1008B0005183628373830FEF201A300A18E02116E8 -:1008C000310409F0A9CE0F900F900F900F90DF9197 -:1008D000CF911F910F91FF90EF90DF90CF90BF903D -:1008E000AF909F908F907F906F905F904F903F90D0 -:1008F0002F900895E82FF0E0E455FE4FE491E25088 -:10090000E13011F4865005C0877098E0E99F800DB2 -:10091000112490E00895CF93DF93C0E7D0E0F0E09A -:10092000C138DF0731F0FE0184910E94EB07219668 -:10093000F6CFDF91CF910895CF93DF93C8E6D0E053 -:10094000F0E0CF36DF0731F0FE0184910E94EB0723 -:100950002196F6CFDF91CF9108952F923F924F923B -:100960005F926F927F928F929F92AF92BF92CF923F -:10097000DF92EF92FF920F931F93CF93DF93CDB748 -:10098000DEB727970FB6F894DEBF0FBECDBF8983C1 -:10099000282E312CC101880F991F880F991F9F8322 -:1009A0008E83FC01EC5DFA4FC080D180E280F38041 -:1009B0008C010C571A4FF80180819181A281B3817B -:1009C000C81AD90AEA0AFB0AEE81FF81EC53FB4FF1 -:1009D0004080518062807380F101E455FB4F80813B -:1009E00053014201881A9108A108B108EE81FF81E4 -:1009F000E45BFB4F80819181A281B381881A990ABF -:100A0000AA0ABB0AC114D104E104F10469F40E94EA -:100A1000BF02F80100811181228133816B017C01C9 -:100A2000C01AD10AE20AF30A8FE091E00E9462083C -:100A30002981622F70E080E090E04AE00E94FE078A -:100A400086E091E00E946208F101EC53FE4F808144 -:100A5000823051F0833029F0813051F480EF90E002 -:100A600005C08FEF90E002C087EF90E00E9462081F -:100A70008101000F111F9801245E3B4FF901808115 -:100A80009181892B11F185EE90E02C833D830E94AA -:100A900062082C813D81F9016081718180E090E0E4 -:100AA0004AE00E94FE0781EE90E00E946208F10198 -:100AB000E452FE4F8081823029F0833051F489ED79 -:100AC00090E005C080ED90E002C083EC90E00E94D1 -:100AD00062088AEB90E00E946208C301B2010E94A2 -:100AE0004F0886EB90E00E946208C501B4010E94A5 -:100AF0004F0880EB90E00E946208C701B6010E9497 -:100B00004F088CEA90E00E946208F801E45EFB4F17 -:100B100080819181892BA9F086EA90E00E94620889 -:100B2000F801E451FC4F60817181F801E454FC4FFD -:100B300080819181681B790B80E090E04AE00E94FF -:100B4000FE0781149104A104B10409F46EC00E944F -:100B5000F60788E990E00E946208EE81FF81E45A7E -:100B6000FC4F80819181A281B3810E811F810C5144 -:100B70001A4FF801C080D180E280F380BC01CD0122 -:100B80006C197D098E099F090E944F088DE890E03D -:100B90000E946208EE81FF81EC5DFA4F80819181B5 -:100BA000A281B381F8010081118122813381BC01CE -:100BB000CD01601B710B820B930B0E944F08F894C0 -:100BC000EE81FF81E450FD4F6081718182819381CC -:100BD000A50194010E945211789482E890E02C8340 -:100BE0003D834A835B830E9462082C813D814A8158 -:100BF0005B81CA01B90127960FB6F894DEBF0FBE1C -:100C0000CDBFDF91CF911F910F91FF90EF90DF90BB -:100C1000CF90BF90AF909F908F907F906F905F909C -:100C20004F903F902F900C944F0827960FB6F89452 -:100C3000DEBF0FBECDBFDF91CF911F910F91FF900F -:100C4000EF90DF90CF90BF90AF909F908F907F906C -:100C50006F905F904F903F902F900895AF92BF920A -:100C6000CF92DF92EF92FF920F931F93CF93DF9378 -:100C70000E94BF026B017C010E94F6070E948B0458 -:100C80008AE191E00E94AD0844E456E0CCE4D4E06F -:100C9000ACE1B4E0ECEBAE2EE3E0BE2E04EE15E0EA -:100CA00080E090E0FA011192AF019C012C503E4F80 -:100CB000F90110829C01220F331F220F331FB9014B -:100CC0006C537B4FFB011082118212821382BC0194 -:100CD00064557B4FFB011082199219921992199257 -:100CE000B9016C577A4FFB01C082D182E282F38254 -:100CF000B9016C5D7A4FFB01C082D182E282F3823E -:100D00002F593E4FF901C082D182E282F3821D92B7 -:100D10001D929C01220F331F24513C4FF901118277 -:100D20001082F501119211925F01F801C192D192E6 -:100D3000E192F1928F0101968831910509F0B2CFCD -:100D4000E0E6F1E0A591B4918C918093C101E2E6D7 -:100D5000F1E0A591B4918C918093C201E4E6F1E0B9 -:100D6000A591B4918C918093C3010E94BF02009120 -:100D70000601109107012091080130910901DC0161 -:100D8000CB01800F911FA21FB31F80935C0690932D -:100D90005D06A0935E06B0935F06DF91CF911F9131 -:100DA0000F91FF90EF90DF90CF90BF90AF9008959C -:100DB0000E949D111F920F920FB60F9211242F9334 -:100DC0003F934F935F936F937F938F939F93AF93D3 -:100DD000BF93EF93FF9380E696E00E940602FF9197 -:100DE000EF91BF91AF919F918F917F916F915F91A3 -:100DF0004F913F912F910F900FBE0F901F9018951C -:100E00001F920F920FB60F9211242F938F939F93DF -:100E1000EF93FF93E0917006F09171068081E0916D -:100E20007606F091770682FD12C090818091790656 -:100E30008F5F8F7320917A06821751F0E0917906C7 -:100E4000F0E0E05AF94F958F8093790601C08081D8 -:100E5000FF91EF919F918F912F910F900FBE0F9067 -:100E60001F9018951F920F920FB60F9211242F9377 -:100E70003F938F939F93AF93BF938091590190912C -:100E80005A01A0915B01B0915C013091580123E0BF -:100E9000230F2D3720F40196A11DB11D05C026E8B2 -:100EA000230F0296A11DB11D209358018093590173 -:100EB00090935A01A0935B01B0935C0180915D0116 -:100EC00090915E01A0915F01B09160010196A11D1A -:100ED000B11D80935D0190935E01A0935F01B0937B -:100EE0006001BF91AF919F918F913F912F910F9092 -:100EF0000FBE0F901F9018951F920F920FB60F9272 -:100F000011242F933F934F935F936F937F938F930E -:100F10009F93AF93BF93EF93FF9382E00E94CB0226 -:100F2000FF91EF91BF91AF919F918F917F916F91C1 -:100F30005F914F913F912F910F900FBE0F901F9097 -:100F400018951F920F920FB60F9211242F933F9373 -:100F50004F935F936F937F938F939F93AF93BF93C1 -:100F6000EF93FF9381E00E94CB02FF91EF91BF913D -:100F7000AF919F918F917F916F915F914F913F9131 -:100F80002F910F900FBE0F901F9018951F920F92E8 -:100F90000FB60F9211242F933F934F935F936F934C -:100FA0007F938F939F93AF93BF93EF93FF9380E0D3 -:100FB0000E94CB02FF91EF91BF91AF919F918F91D2 -:100FC0007F916F915F914F913F912F910F900FBE45 -:100FD0000F901F901895E0916006F09161060190C6 -:100FE000F081E02D682F80E696E0099442E050E021 -:100FF0006CE371E080E696E00C94A3018F929F92DF -:10100000AF92BF920F931F93CF93DF93CDB7DEB70D -:10101000A1970FB6F894DEBF0FBECDBF19A2423024 -:1010200008F44AE08E010F5D1F4F842E912CA12CF5 -:10103000B12CA50194010E945211E62FB901CA01F9 -:1010400001501109EA3014F4E05D01C0E95CD801F7 -:10105000EC93232B242B252B61F70115110571F03F -:10106000F80101900020E9F73197AF01401B510BC7 -:10107000B80180E696E00E94A30102C080E090E003 -:10108000A1960FB6F894DEBF0FBECDBFDF91CF9112 -:101090001F910F91BF90AF909F908F9008954AE05D -:1010A0000C94FE07CF93DF93BC0180E090E04AE010 -:1010B0000E94FE07EC010E94F6078C0F9D1FDF9136 -:1010C000CF9108950F931F93CF93DF938C01C0E0CE -:1010D000D0E0F801EC0FFD1F6491662371F0E09100 -:1010E0006006F09161060190F081E02D80E696E0C7 -:1010F0000995892B11F02196ECCFCE01DF91CF918C -:101100001F910F910895CF92DF92EF92FF92CF93AC -:10111000DF9397FF19C06B017C018DE20E94EB0702 -:10112000EC0166277727CB016C197D098E099F0991 -:101130004AE00E94FE078C0F9D1FDF91CF91FF9028 -:10114000EF90DF90CF9008954AE0DF91CF91FF902C -:10115000EF90DF90CF900C94FE07CF93DF930E9427 -:101160006208EC010E94F6078C0F9D1FDF91CF9162 -:101170000895CF93DF934AE00E94FE07EC010E949E -:10118000F6078C0F9D1FDF91CF910895CF93DF93CA -:10119000BC01990F880B990B0E948308EC010E94F7 -:1011A000F6078C0F9D1FDF91CF910895CF93DF93AA -:1011B000CDB7DEB7E2970FB6F894DEBF0FBECDBF56 -:1011C000789484B5826084BD84B5816084BD85B522 -:1011D000826085BD85B5816085BD80916E0081602E -:1011E00080936E00109281008091810082608093D4 -:1011F00081008091810081608093810080918000D6 -:101200008160809380008091B10084608093B10000 -:101210008091B00081608093B00080917A008460FA -:1012200080937A0080917A00826080937A00809126 -:101230007A00816080937A0080917A008068809340 -:101240007A001092C100E0917006F091710682E080 -:101250008083E0916C06F0916D061082E0916E063D -:10126000F0916F0683E3808310927806E091740614 -:10127000F091750686E08083E0917206F091730626 -:10128000808180618083E0917206F0917306808195 -:1012900088608083E0917206F09173068081806897 -:1012A0008083E0917206F091730680818F7D808348 -:1012B0000E949A024B015C01F4EFCF2EDD24D394FF -:1012C000E12CF12C0E949A02DC01CB0188199909CA -:1012D000AA09BB09883E9340A105B10558F001E079 -:1012E000C01AD108E108F10818EE810E13E0911E32 -:1012F000A11CB11CC114D104E104F10419F77894C4 -:101300000E942E0684E496E0E8E1CE2EC80EC8A620 -:101310000E94BF026D877E878F87988B80E696E05C -:101320000E94F001892B09F4D4C380E696E00E9464 -:10133000CE018C32C9F480911E02873008F0C9C3F7 -:10134000E82FF0E0EE0FFF1FE45FFD4F20911C023D -:1013500030911D02318320838F5F80931E02109293 -:101360001D0210921C02B5C390ED980F9A30B0F494 -:1013700040911C0250911D029AE0949F9001959F0C -:10138000300D1124205331097901E80EF11C87FD3D -:10139000FA94F0921D02E0921C029BC39FE9980F01 -:1013A0009A3108F096C3883609F47DC334F4813647 -:1013B00071F0843609F483C17EC3823709F4A9C26F -:1013C000833709F4A9C2893609F075C3CFC1C0902B -:1013D0001E02EC2DF0E0EE0FFF1FE45FFD4F809149 -:1013E0001C0290911D0291838083C394C0921E02BF -:1013F0000E94BF024B015C0100910C0210910D0292 -:10140000802F0E947A047C01C8010197479748F415 -:10141000F801EC5DFE4F8081882319F028E12E153C -:1014200040F40E949C0481E991E00E946208C80196 -:10143000A8C6A80144555E4F3A01FA0124915EEF17 -:10144000D52ED20E80910E0290910F02823091051E -:1014500079F08330910599F00197D9F00E949C04AE -:101460008DE691E00E946208C8010E94C6080FC084 -:10147000F701FF27E452FE4F82E0808308C0F701A6 -:10148000FF27E452FE4F83E0808363E003C062E005 -:1014900001C061E0C80180549E4FFC017491F301CA -:1014A00024912223C1F030E0220F331FF901EF5BBA -:1014B000FE4FA591B491F901E95CFE4F459154911D -:1014C0003FB7F8942C91709527232C93DA012C9137 -:1014D00072237C933FBFB2E0BC1508F054C020914A -:1014E000100230911102232B09F441C0F801ED5D87 -:1014F000FE4F3491FC012491F30144914423B9F14E -:10150000332339F1333091F038F43130A9F03230EF -:1015100001F534B53F7D12C0373091F03830A1F07D -:101520003430B9F4309180003F7D03C030918000A9 -:101530003F77309380000DC034B53F7734BD09C08C -:101540003091B0003F7703C03091B0003F7D3093C1 -:10155000B000E42FF0E0EE0FFF1FE95CFE4FA59115 -:10156000B4913FB7F8944C91242B2C933FBFF3E0F8 -:10157000CF1649F020911202309113022115310546 -:1015800021F061E002C020E030E0FC018491F30131 -:101590006490662009F4B4C56A946A94E62DF0E07C -:1015A000EE0FFF1FE25EFE4F0190F081E02D908173 -:1015B000892B80834091680081E090E001C0880F12 -:1015C0006A94EAF7842B80936800A7015527FA01F3 -:1015D000EC53FE4F6083CA01880F991FFC01E45E43 -:1015E000FB4F31832083DA01AC5BB94F2C9130E0A3 -:1015F0002017310709F451C02D2D30E0F901EE0F0D -:10160000FF1FE05AFE4F65917491FB016081F90163 -:10161000EF53FE4F60830C93FA01EC50FE4F1082A3 -:101620009A01220F331F220F331FF901EC53FB4F96 -:101630001082118212821382FA01E455FB4F10824C -:10164000F901E45BFB4F1082118212821382F901CF -:10165000EC57FA4F80829182A282B382F901EC5D4D -:10166000FA4F80829182A282B382F901EC51FA4F43 -:1016700080829182A282B382F901EF59FE4F80826B -:101680009182A282B382FC01E451FC4F118210824C -:10169000FC01E454FC4F118210828DE491E00E9421 -:1016A0006208B801110F880B990B0E9483088BE424 -:1016B00091E00E9462088E2D0E94AD0427C1109116 -:1016C0001E02E12FF0E0EE0FFF1FE45FFD4F80915F -:1016D0001C0290911D02918380831F5F10931E0254 -:1016E000E0900C02F0900D028E2D0E947A041123DE -:1016F00071F09701215031092731310540F4F7018C -:10170000EC5DFE4F2081222311F0893128F00E94E8 -:101710009C0486EE91E032C5F701E054FE4F24911F -:10172000F701E455FE4FE491EE2309F4EEC4E250D4 -:10173000AE2FB0E0AA0FBB1FA25EBE4F0D90BC91B2 -:10174000A02D3C91209523232C932C912111E2C4B0 -:101750003091680041E050E001C0440FEA95EAF79B -:10176000242F2095232320936800D4C480911E0247 -:10177000E82FF0E0EE0FFF1FE45FFD4F20911C0209 -:1017800030911D02318320838F5F80931E0284304D -:1017900038F40E949C048BE192E00E946208B6C07B -:1017A00020910C0230910D02C901019780319E40B9 -:1017B00038F00E949C0480910C0290910D025BC055 -:1017C000A8EEB3E00E9474116B017C0160930601E6 -:1017D0007093070180930801909309010E94BF0252 -:1017E000DC01CB018C0D9D1DAE1DBF1D00915C0663 -:1017F00010915D0620915E0630915F06801791077B -:10180000A207B30770F40E94BF02C60ED71EE81EDF -:10181000F91EC0925C06D0925D06E0925E06F092E0 -:101820005F0620910E0230910F02C90101978031AD -:101830009E4038F00E949C0480910E0290910F020D -:101840001AC0A8EEB3E00E94741160930A0170936D -:101850000B0180930C0190930D01209110023091A7 -:10186000110221311EE0310748F00E949C04809152 -:101870001002909111020E9452081DC1A8EEB3E01F -:101880000E94741160930001709301018093020122 -:10189000909303018091120290911302909305019D -:1018A0008093040187E092E00E94620860910C023C -:1018B00070910D0280E090E04AE00E94FE0785E012 -:1018C00092E00E94620860910E0270910F0280E027 -:1018D00090E04AE00E94FE0783E092E00E946208E6 -:1018E000609110027091110280E090E04AE00E9445 -:1018F000FE0781E092E00E946208609112027091FE -:10190000130280E090E04AE00E94FE070E94F60782 -:10191000D2C00E942E06CFC087EB92E00E946208E0 -:101920000E948B040E94F60784EA92E00E946208FB -:101930006091060170910701809108019091090161 -:101940000E94B90884E992E00E94620860910A014D -:1019500070910B0180910C0190910D010E94B908CA -:1019600084E892E00E946208609100017091010198 -:1019700080910201909103010E94B90887E792E0EB -:101980000E94620880910401909105010E94520812 -:1019900004E416E0F12CD801ED908D01EE2099F0D1 -:1019A00080E792E00E9462086E2D70E080E090E097 -:1019B0000E9483088EE692E00E9462088F2D0E94AA -:1019C000AD040E94F607F394B8E1FB12E4CF8CE576 -:1019D00092E00E946208C0905C06D0905D06E090A4 -:1019E0005E06F0905F060E94BF0297018601061B0B -:1019F000170B280B390BC901B8010E944F088EE460 -:101A000092E00E9462080E94F6078CE392E00E9436 -:101A1000AD080E94BF022B013C018091FB0290E0C7 -:101A2000029664E170E00E943E116C01812C912CC1 -:101A30005401E12CF12CC7018C0D9D1D64E170E077 -:101A40000E943E118C011C01220C331C220C331C01 -:101A5000E114F10409F498C3F101E956FD4F8081C6 -:101A60009181A281B381F101E95BFD4F40815181F8 -:101A700062817381840F951FA61FB71F8815990572 -:101A8000AA05BB0508F080C3F101E956FD4F80802F -:101A90009180A280B3801FEFE11AF10A24E1E216DF -:101AA000F10449F608C00E94F6070E948B0482ECFC -:101AB00092E00E94AD0810921E0210921D02109238 -:101AC0001C02ECE0F2E01192119232E0EC31F307EB -:101AD000D1F780915C0690915D06A0915E06B09171 -:101AE0005F06CD84DE84EF84F888C81AD90AEA0A32 -:101AF000FB0AF7FE2CC080910A0190910B01A09186 -:101B00000C01B0910D014D855E856F857889481B6C -:101B1000590B6A0B7B0BA4EEB5E0E4E4F6E080E041 -:101B20009191992369F00D911D912D913C911397FD -:101B30006A017B01C01AD10AE20AF30AF7FE81E0CA -:101B40001496D8A4DE12ECCF882309F4D6C20E94E2 -:101B5000BF022B013C0104E416E01A8F098F04EE4A -:101B600015E01C870B870CE114E01A8709870CEB42 -:101B700013E018870F830CE414E01A8309831D8A8D -:101B80001E8A1F8A188E212C312CA98DBA8DCD90DA -:101B9000BA8FA98FCB8ECC2009F477C2F89471014B -:101BA000EE0CFF1CEE0CFF1CFEA6EDA687010C57E9 -:101BB0001A4F18AB0FA7D8012D913D914D915C9113 -:101BC000298B3A8B4B8B5C8BF701EC5DFA4F408194 -:101BD000518162817381F701EC53FB4F80809180CA -:101BE000A280B380F101E455FB4FFAABE9AB208151 -:101BF00078946A017B0189899A89AB89BC89C81A62 -:101C0000D90AEA0AFB0ACB82DC82ED82FE82A98134 -:101C1000BA81CD90DD90ED90FC90CC8EDD8EEE8E75 -:101C2000FF8E75016401C21AD108E108F1080C8D1C -:101C30001D8D2E8D3F8DC01AD10AE20AF30AD501FF -:101C4000C401801B910BA20BB30B8C8F9D8FAE8FA9 -:101C5000BF8FAB85BC850D911D912D913C9108A343 -:101C600019A32AA33BA300910A0110910B01209113 -:101C70000C0130910D010CA31DA32EA33FA3D30192 -:101C8000C201801B910BA20BB30B08A119A12AA1C1 -:101C90003BA1801B910BA20BB30BB7FD55C08091EC -:101CA000040190910501A0E0B0E0C816D906EA064B -:101CB000FB0618F18091000190910101A0910201B1 -:101CC000B09103010B811C812D813E81801791070A -:101CD000A207B30790F48091060190910701A091AB -:101CE0000801B09109010CA11DA12EA13FA18017EF -:101CF0009107A207B30709F05FC0F894EDA5FEA510 -:101D0000EC5DFA4F4082518262827382EDA5FEA59E -:101D1000EC57FA4F4082518262827382F101E4559E -:101D2000FB4F10827894E981FA8180829182A282AD -:101D3000B382A301920189899A89AB89BC89281B46 -:101D4000390B4A0B5B0B4EC0809106019091070145 -:101D5000A0910801B091090193018201081B190BA0 -:101D60002A0B3B0BD901C80108A119A12AA13BA14B -:101D7000801B910BA20BB30BB7FD87C180910401AF -:101D800090910501A0E0B0E0C816D906EA06FB066E -:101D900008F47BC18091000190910101A0910201A2 -:101DA000B09103010B811C812D813E818017910729 -:101DB000A207B30708F069C1A981BA818D929D92EB -:101DC000AD92BC921397F894EFA5F8A94083518384 -:101DD00062837383A9A9BAA91C9278942B813C8150 -:101DE0004D815E818DEE92E029A73AA74BA75CA7B3 -:101DF0000E9462080B8D602F70E080E090E00E94EE -:101E000083088AEE92E00E946208C501B4010E9434 -:101E10004F0887EE92E00E946208C701B6010E9457 -:101E20004F0884EE92E00E9462086C8D7D8D8E8D4D -:101E30009F8D0E944F0881EE92E00E94620829A5C2 -:101E40003AA54BA55CA5CA01B9010E944F088EEDC9 -:101E500092E00E946208C301B2010E948308A98532 -:101E6000BA858D919C91892B09F18BED92E00E94AE -:101E70006208C101880F991F8C0104511C4FF801A1 -:101E800060817181AF81B8858D919C91681B790BC0 -:101E900080E090E04AE00E94FE07F894F80180811B -:101EA0009181AF81B8858D939C9378942C8D3D8DD5 -:101EB0004E8D5F8D232B242B252B09F453C088EDE9 -:101EC00092E00E9462080DA51EA5045A1C4FF8015D -:101ED00080819181A281B381BC01CD0129893A8998 -:101EE0004B895C89621B730B840B950B0E944F0816 -:101EF00085ED92E00E9462086B817C818D819E81DC -:101F00000E944F08D8011D921D921D921C9213979A -:101F1000E985FA8580819181892B21F1F8940DA5BD -:101F20001EA504501D4FD8016D917D918D919C91FE -:101F3000A70196010E945211F801108211821282AB -:101F40001382789482ED92E029A73AA74BA75CA769 -:101F50000E94620829A53AA54BA55CA5CA01B90152 -:101F60000E944F088091FB0290E0029664E170E0CD -:101F70000E943E116C018FEC92E00E946208E12CFD -:101F8000F12C21E0C7018C0D9D1D64E170E00E94E1 -:101F90003E115C01FC01E951FD4F808190E082150A -:101FA000930509F062C08501000F111F000F111F7A -:101FB00021111FC0F801E956FD4F80819181A28156 -:101FC000B381F801E95BFD4F4081518162817381EA -:101FD000840F951FA61FB71F2D893E894F89588DE5 -:101FE00082179307A407B507A0F18CEC92E00E943A -:101FF0006208F801E956FD4F80819181A281B38189 -:10200000BC01CD0164197509860997090E948308EE -:102010008AEC92E00E946208F801E95BFD4F608162 -:102020007181828193810E944F0888EC92E00E9426 -:102030006208F501ED5CFD4F608170E080E090E0AA -:102040004AE00E94FE07F501E15EFD4F80810E949B -:10205000EB07F801E956FD4F80819181A281B381A0 -:102060008D8B9E8BAF8BB88F20E09FEFE91AF90A1A -:10207000A4E1EA16F10409F085CF0E94F607EB858A -:10208000FC854082518262827382FFEF2F1A3F0AE1 -:102090000B851C850C5F1F4F1C870B8709851A85D4 -:1020A0000E5F1F4F1A8709870F8118850E5F1F4F1C -:1020B00018870F8309811A810C5F1F4F1A830983C8 -:1020C00018E12116310409F060CD8091060190914C -:1020D0000701A0910801B0910901CD84DE84EF844D -:1020E000F8888C0D9D1DAE1DBF1D80935C069093DE -:1020F0005D06A0935E06B0935F060E94900208C939 -:102100000E949C0486E691E0D4CC0E949C048FED52 -:1021100091E0CFCC9C013327F901EC5BF94F1082A1 -:10212000F901EC50FE4F1082C901880F991F880FEA -:10213000991FFC01EC53FB4F108211821282138213 -:10214000F901E455FB4F1082FC01E45BFB4F108268 -:10215000118212821382220F331FF901E45EFB4FBA -:1021600011821082F901E454FC4F11821082F901AE -:10217000E451FC4F1182108284ED91E00E946208CC -:10218000C7010E94C60897CC85E392E00E946208CE -:10219000F801E951FD4FE081F0E0EC5BF94F60811F -:1021A00070E080E090E04AE00E94FE078DE292E05D -:1021B0000E946208F101E956FD4F80819181A28160 -:1021C000B381BC01CD0164197509860997090E9484 -:1021D000830887E292E00E946208F101E95BFD4F0B -:1021E00060817181828193810E944F0882E292E036 -:1021F0000E946208F801ED5CFD4F608170E080E0B4 -:1022000090E04AE00E94FE0780E292E00E946208AD -:10221000F801E15EFD4F80810E94EB070E94F60706 -:1022200033CCE0E6F6E01382128288EE93E0A0E081 -:10223000B0E084839583A683B78382E191E09183A4 -:10224000808385EC90E09587848784EC90E0978785 -:10225000868780EC90E0918B808B81EC90E0938B73 -:10226000828B82EC90E0958B848B86EC90E0978B50 -:10227000868B118E128E138E148E089597FB072E67 -:1022800016F4009407D077FD09D00E94831107FC53 -:1022900005D03EF4909581959F4F08957095619576 -:1022A0007F4F0895A1E21A2EAA1BBB1BFD010DC092 -:1022B000AA1FBB1FEE1FFF1FA217B307E407F507F6 -:1022C00020F0A21BB30BE40BF50B661F771F881FD2 -:1022D000991F1A9469F760957095809590959B0168 -:1022E000AC01BD01CF010895A29FB001B39FC00111 -:1022F000A39F700D811D1124911DB29F700D811D32 -:102300001124911D0895AA1BBB1B51E107C0AA1FF0 -:10231000BB1FA617B70710F0A61BB70B881F991F86 -:102320005A95A9F780959095BC01CD010895EE0FBF -:10233000FF1F0590F491E02D099481E090E0F8945E -:082340000C94A211F894FFCFE8 -:10234800D007000001003075000060EA00000000BE -:1023580000002702A301F001CE01E2016E026B002A -:102368006C006D00000000030405060708090A0B4D -:102378000C0D0E0F10110000000000000D0A0000E7 +:100000000C94E5010C940D020C940D020C94960DC9 +:100010000C94710D0C944C0D0C940D020C940D026B +:100020000C940D020C940D020C940D020C940D0214 +:100030000C940D020C940D020C940D020C940D0204 +:100040000C9496050C940D020C9478030C945203B6 +:100050000C940D020C940D020C940D020C940D02E4 +:100060000C940D020C940D028F129A149A14A11282 +:10007000D1139A149A14CE13FB129A1485149A145D +:100080009A149A149A149A149A140D1310139A1419 +:100090009A14AF134572726F723A20004D61792045 +:1000A000313420323031382031393A31313A303937 +:1000B0000020636F6D70696C65642000554E4F00C1 +:1000C000206F6E200041726475436F756E746572A7 +:1000D0002056322E33360020002000200049002018 +:1000E0006D696E20002070756C6C757000202D009D +:1000F0002066616C6C696E670020726973696E6757 +:1001000000500040002F0073002C20002000480009 +:100110002041002053002058002C00204E00205485 +:10012000002F0020440020430052002C00204200F9 +:100130002C0020540020617661696C61626C65005E +:100140002C002048656C6C6F2C2070696E73200049 +:100150004D20726573746F72696E6720636F6E668F +:1001600069672066726F6D20454550524F4D004DB6 +:1001700020696C6C6567616C20636F6E66696720CF +:10018000696E20454550524F4D004D206E6F2063E3 +:100190006F6E66696720696E20454550524F4D006D +:1001A0000000000800020100000304070000000036 +:1001B00000000000616C697665002C2000636F6EA2 +:1001C0006669672073617665642C20002C002C0022 +:1001D0002C0020004D20536C6F743A20004D206994 +:1001E0006C6C6567616C20636F6E66696720696E11 +:1001F00020454550524F4D004D206E6F20636F6E6D +:1002000066696720696E20454550524F4D00205366 +:100210006C6F74733A20004D20454550524F4D206D +:10022000436F6E6669673A2000206D696C6C697374 +:1002300065636F6E6473004D204E6578742072653F +:10024000706F727420696E20002C20004D20537452 +:10025000617475733A20004D2072656D6F76656428 +:10026000200052656D496E7400496C6C6567616C65 +:100270002070696E20737065636966696361746973 +:100280006F6E20004D20696C6C6567616C20766133 +:100290006C75652070617373656420666F7220648D +:1002A0006576566572626F7365004D20646576569B +:1002B0006572626F73652073657420746F2000200F +:1002C00073697A6520002C004420676F7420002039 +:1002D0002072656A65637420002020636F756E74F8 +:1002E0002000202068697374496478200020746FAE +:1002F000200020292000202820696E7465726E611C +:100300006C20004D2070696E200000000000250068 +:1003100028002B0000000000240027002A00010212 +:100320000408102040800102040810200102040883 +:1003300010204D20646566696E6564200041646428 +:10034000496E7400496C6C6567616C2070756C73E4 +:1003500065206C6576656C2073706563696669639A +:100360006174696F6E20666F722070696E20000084 +:1003700000000023002600290004040404040404EF +:1003800004020202020202030303030303496C6C2A +:100390006567616C2070696E20737065636966695A +:1003A000636174696F6E20002000200020004D20E2 +:1003B000696E74657276616C732073657420746FF6 +:1003C000200073697A650000D91011241FBECFEF99 +:1003D000D8E0DEBFCDBF11E0A0E0B1E0E4EAFEE28C +:1003E00002C005900D92A438B107D9F726E0A4E821 +:1003F000B1E001C01D92AA3CB207E1F711E0C5EEE1 +:10040000D1E004C02197FE010E942217C43ED1070B +:10041000C9F70E9406110C9450170C940000CF925B +:10042000DF92EF92FF920F931F93CF93DF936C01B4 +:100430007A018B01C0E0D0E0CE15DF0589F0D8014C +:100440006D918D01D601ED91FC910190F081E02D2F +:10045000C6010995892B11F47E0102C02196ECCFCB +:10046000C701DF91CF911F910F91FF90EF90DF9027 +:10047000CF900895089580E090E00895FC01538D99 +:10048000448D252F30E0842F90E0821B930B54176E +:1004900010F0CF96089501970895FC01918D828DFB +:1004A000981761F0828DDF01A80FB11D5D968C91C8 +:1004B000928D9F5F9F73928F90E008958FEF9FEFD3 +:1004C0000895FC01918D828D981731F0828DE80F8F +:1004D000F11D858D90E008958FEF9FEF0895FC0149 +:1004E000918D228D892F90E0805C9F4F821B910916 +:1004F0008F739927089588E995E00E946F0221E0A3 +:10050000892B09F420E0822F0895FC01848DDF01FE +:10051000A80FB11DA35ABF4F2C91848D90E0019676 +:100520008F739927848FA689B7892C93A089B18965 +:100530008C9180648C93938D848D981306C002886F +:10054000F389E02D80818F7D80830895EF92FF9263 +:100550000F931F93CF93DF93EC0181E0888F9B8DE6 +:100560008C8D981305C0E889F989808185FD24C0A8 +:10057000F62E0B8D10E00F5F1F4F0F731127E02E2B +:100580008C8DE8120CC00FB607FCFACFE889F98908 +:10059000808185FFF5CFCE010E948502F1CF8B8D42 +:1005A000FE01E80FF11DE35AFF4FF0820B8FEA893D +:1005B000FB898081806207C0EE89FF896083E889BA +:1005C000F98980818064808381E090E0DF91CF9120 +:1005D0001F910F91FF90EF900895CF93DF93EC015F +:1005E000888D8823C9F0EA89FB89808185FD05C053 +:1005F000A889B9898C9186FD0FC00FB607FCF5CF8D +:10060000808185FFF2CFA889B9898C9185FFEDCFD4 +:10061000CE010E948502E7CFDF91CF91089580E05F +:1006200090E0892B29F00E947B0281110C9400003C +:100630000895EF92FF920F931F93CF93DF938C0156 +:100640007B01C0E0D0E0F701EC0FFD1F6491662351 +:1006500061F0D801ED91FC910190F081E02DC8018D +:100660000995892B11F02196EECFCE01DF91CF9124 +:100670001F910F91FF90EF9008956115710579F02A +:10068000FB0101900020E9F73197AF01461B570BA2 +:10069000DC01ED91FC910280F381E02D099480E072 +:1006A00090E008951F920F920FB60F9211242F938E +:1006B0003F934F935F936F937F938F939F93AF93EA +:1006C000BF93EF93FF9388E995E00E948502FF9125 +:1006D000EF91BF91AF919F918F917F916F915F91BA +:1006E0004F913F912F910F900FBE0F901F90189533 +:1006F0001F920F920FB60F9211242F938F939F93F7 +:10070000EF93FF93E091A805F091A9058081E09116 +:10071000AE05F091AF0582FD12C090818091B105C8 +:100720008F5F8F732091B205821751F0E091B10570 +:10073000F0E0E856FA4F958F8093B10501C08081B3 +:10074000FF91EF919F918F912F910F900FBE0F907E +:100750001F90189590E0FC01E056FE4F2491FC019B +:10076000E25EFC4F3491FC01E758FC4FE491EE232C +:10077000B9F1222339F1233091F038F42130A9F076 +:10078000223001F584B58F7D12C0273091F02830DA +:10079000A1F02430B9F4809180008F7D03C0809156 +:1007A00080008F77809380000DC084B58F7784BDE3 +:1007B00009C08091B0008F7703C08091B0008F7D19 +:1007C0008093B000F0E0EE0FFF1FE159FC4FA591C0 +:1007D000B491EC913E2381E090E021F480E0089513 +:1007E00080E090E008953FB7F8948091B104909133 +:1007F000B204A091B304B091B40426B5A89B05C07F +:100800002F3F19F00196A11DB11D3FBFBA2FA92F8F +:10081000982F8827820F911DA11DB11DBC01CD010C +:1008200042E0660F771F881F991F4A95D1F70895F8 +:100830002FB7F8946091AD047091AE048091AF042D +:100840009091B0042FBF08952F923F924F925F92E4 +:100850006F927F928F929F92AF92BF92CF92DF92D0 +:10086000EF92FF920F931F93CF93DF93C82F0E94B5 +:100870001804AB01BC018C2F90E0FC01EE0FFF1FB0 +:10088000ED58FC4FA591B4919C90DC01A757B94F4E +:100890003C90FC01EE0FFF1FEA5DFE4F0190F081DE +:1008A000E02D2081392432229C92332009F42BC17F +:1008B000FC01EF5EFE4FA080FC01E25FFE4F208056 +:1008C000BB24B3942A1408F41EC18B2D832109F490 +:1008D00017C1EA2DF0E0EE0FFF1FEC5AFE4FA0818A +:1008E000B1811A161B060CF00BC1882483948B2D42 +:1008F000892109F4812C9D013327C901880F991F93 +:10090000880F991FFC01EA5EFC4FC080D180E28015 +:10091000F3802A013B014C185D086E087F087301C3 +:100920006201E0913205EF5FE0933205E09132051C +:10093000E43110F010923205E0913205F0E0C09100 +:100940009801D09199018E010F5F1F4F109399016B +:1009500000939801EE0FFF1FEE53FE4FD183C0832B +:10096000E0913205F0E0E657FD4FA083E0913205BB +:10097000DC01AA5EBC4F4D905D906D907C9013970A +:10098000C4E0EC9FF0011124E65CFD4F40825182EF +:1009900062827382E0913205D4E0ED9FF001112470 +:1009A000E651FE4FC082D182E282F382E0913205AD +:1009B000F0E0890102511D4FE8017880E255FE4FB9 +:1009C0007082E901CC0FDD1FFE01E75CF94F019059 +:1009D000F081E02D2F01612C712CF901EB58F94FBA +:1009E000C414D504E604F704A0F44D935D936D930D +:1009F0007C931397D8013C912081321371C0C65467 +:100A0000DB4F288139812F5F3F4F3983288322E5CF +:100A100068C0E801A881B081F901EC57FE4FAB1323 +:100A20005AC0B081BA1709F443C0DC01AE51BB4FC4 +:100A30004D905D906D907C901397DFEF4D1A5D0A9D +:100A40006D0A7D0A4D925D926D927C921397DC0146 +:100A5000AA59BC4F4D935D936D937C931397D90125 +:100A6000AE56BB4FCC91C11110C0EC01CA54DC4F43 +:100A7000488359836A837B83442443944C92D901ED +:100A8000A258BB4F2C912F5F2C93DC01A256BD4F77 +:100A90004D905D906D907C901397C40CD51CE61C16 +:100AA000F71CCD92DD92ED92FC92139723E414C0D3 +:100AB000DC01A256BD4F4D905D906D907C901397D8 +:100AC000C40CD51CE61CF71CCD92DD92ED92FC9275 +:100AD000139720E501C027E4D8013C91308301C081 +:100AE00028E5E0913205F0E0E656FE4F2083FC0158 +:100AF000EA5EFC4F4083518362837383E8018882FE +:100B0000BB0CA394DFCEDF91CF911F910F91FF908B +:100B1000EF90DF90CF90BF90AF909F908F907F909D +:100B20006F905F904F903F902F9008951F920F927B +:100B30000FB60F9211242F933F938F939F93AF93F0 +:100B4000BF938091AD049091AE04A091AF04B09199 +:100B5000B0043091AC0423E0230F2D3720F401962C +:100B6000A11DB11D05C026E8230F0296A11DB11DD0 +:100B70002093AC048093AD049093AE04A093AF0493 +:100B8000B093B0048091B1049091B204A091B304E9 +:100B9000B091B4040196A11DB11D8093B10490934E +:100BA000B204A093B304B093B404BF91AF919F91EA +:100BB0008F913F912F910F900FBE0F901F9018951E +:100BC0000C94D616CF93DF93EC019C01220F331FB8 +:100BD000F901E457F94F8FEF9FEF91838083FE0176 +:100BE000EE56FB4F1082F901E75CF94F118210823B +:100BF000CE01880F991F880F991FFC01EE51FB4F02 +:100C00001082118212821382FE01E258FB4F108281 +:100C1000FC01E25DFB4F1082118212821382F90106 +:100C2000E654FB4F11821082F901EA5FFB4F1182FB +:100C30001082FC01EA54FC4F40835183628373832A +:100C4000FC01EA59FC4F4083518362837383FC01AA +:100C5000EA5EFC4F4083518362837383FC01E95B4E +:100C6000FA4F4083518362837383FE01EE5FFC4F32 +:100C70001082F901E45DFE4F80810E94AA03FE010B +:100C8000E251FD4F8083CD5CDA4F8883DF91CF91B5 +:100C90000895CF92DF92EF92FF920F931F93CF931D +:100CA000DF931F92CDB7DEB70E9418046B017C0161 +:100CB00000E010E0B701A601C8010E94E2050F5F45 +:100CC0001F4F04311105B1F780910A0190910B017A +:100CD000A0910C01B0910D018C0D9D1DAE1DBF1D8D +:100CE0008093C4069093C506A093C606B093C7062A +:100CF00010929705E3E7F3E0A591B4918C9180936E +:100D00008906E5E7F3E0A591B4918C9180938A067A +:100D1000E7E7F3E0A591B4918C9180938B0680E096 +:100D200090E00E94E005833461F481E090E00E944D +:100D3000E005863631F482E090E00E94E0058736D7 +:100D400011F16AE871E088E995E00E940A0E0E94BC +:100D500018046093A8047093A9048093AA04909344 +:100D6000AB048091B5049091B6049093A70480934E +:100D7000A6040F90DF91CF911F910F91FF90EF90FC +:100D8000DF90CF90089583E090E00E94E005082F67 +:100D90008FEF800F853118F06FE671E0D4CF60E5FA +:100DA00071E088E995E00E940A0E10E064E0C62E2A +:100DB000D12C74E0F72EC6010E94E005482FC60131 +:100DC000019649830E94E005E82EC60102960E9422 +:100DD000E005282F30E0322F2227C9018E0D911D0A +:100DE0009093B5068093B406C60103960E94E00571 +:100DF000E82EC60104960E94E005282F30E0322F2D +:100E000022272E0D311D3093B7062093B606C6015A +:100E100005960E94E005E82EC60106960E94E005B0 +:100E2000282F30E0322F22272E0D311D3093B906A6 +:100E30002093B806C60107960E94E005E82EC60179 +:100E400008960E94E005282F30E0322F22272E0D31 +:100E5000311D3093BB062093BA0689E0C80ED11C21 +:100E6000F092B9044981493421F484E00E94420E91 +:100E700005C0413419F484E00E94870F1F5F1013EE +:100E80009ACF1092B9041092B8041092B704E4EB10 +:100E9000F6E01192119286E0E43CF807D1F757CFC3 +:100EA000EF92FF920F931F93CF93DF931F92CDB7D3 +:100EB000DEB77C01FC0100811181C80169830E94B9 +:100EC000E0056981861719F0C8010E94DE16F70156 +:100ED000808191810196918380830F90DF91CF91E2 +:100EE0001F910F91FF90EF900895CF92DF92EF92B4 +:100EF000FF920F931F93CF93DF9300D000D0CDB715 +:100F0000DEB76C012B833C8349835A830E945007D0 +:100F10004981642FC6010E9450075A81652FC6017E +:100F20000E9450072B81622FC6010E9450073C810E +:100F3000632FC6010E945007602FC6010E94500710 +:100F4000612FC6010E9450076E2DC6010E945007F6 +:100F50006F2DC6010F900F900F900F90DF91CF91E2 +:100F60001F910F91FF90EF90DF90CF900C9450075E +:100F70002F923F924F925F926F927F928F929F92A9 +:100F8000AF92BF92CF92DF92EF92FF920F931F9397 +:100F9000CF93DF93CDB7DEB7A1970FB6F894DEBF3E +:100FA0000FBECDBF1C016D8BDA01C901F894710130 +:100FB000EE0CFF1CEE0CFF1CF9A2E8A287010A54FC +:100FC0001C4F1E830D83F8012081318142815381A2 +:100FD0002F83388749875A87F701EA59FC4F4080A9 +:100FE000518062807380B7016E517B4FFB01E080BE +:100FF000F18002811381E982FA820B831C839101C3 +:10100000220F331FB90166547B4FFB010190F08121 +:10101000E02DFC87EB87F101E258FB4FE080E98A85 +:1010200048A159A142565D4FFA01E080F18002814A +:101030001381EE8AFF8A088F198F78945301420139 +:10104000EF80F88409851A858E189F08A00AB10AD6 +:10105000E8A1F9A1E25DFB4FC080D180E280F3807E +:1010600049815A816B817C814C195D096E097F0928 +:101070004D875E876F87788B6A017B015989C51A16 +:10108000D108E108F108F901EA5FFB4F20813181C5 +:101090000B851C85021B130B1B8F0A8F1D891111D9 +:1010A000E3C0E8A1F9A1E95BFA4F208131814281D7 +:1010B00053812C8F3D8F4E8F5F8F40910601509151 +:1010C00007016091080170910901498B5A8B6B8B64 +:1010D0007C8BAC01BD0109891A892B893C89401B95 +:1010E000510B620B730B0C8D1D8D2E8D3F8D401B94 +:1010F000510B620B730B77FD47C04091000150917B +:10110000010160E070E0C416D506E606F706F8F0C7 +:101110004091020150910301609104017091050119 +:10112000481559056A057B0590F440910A015091D4 +:101130000B0160910C0170910D0109891A892B89AD +:101140003C89401751076207730709F051C0F894B2 +:10115000E8A1F9A1EA54FC4F80839183A283B38371 +:10116000E8A1F9A1EA59FC4F80839183A283B3835C +:1011700078944C015D010F81188529853A85801A84 +:10118000910AA20AB30A3CC040910A0150910B0196 +:1011900060910C0170910D018C019D01041B150BD8 +:1011A000260B370BB901A8010C8D1D8D2E8D3F8D9F +:1011B000401B510B620B730B77FD3BC1409100014B +:1011C0005091010160E070E0C416D506E606F7060E +:1011D00008F42FC140910201509103016091040174 +:1011E00070910501481559056A057B0508F021C174 +:1011F000F894ED81FE8140825182628273827894FC +:10120000F894F101E258FB4F1082E8A1F9A1E256EF +:10121000FD4F1082118212821382789468A179A105 +:10122000625D7B4F29813A814B815C81FB01208388 +:10123000318342835383F101EE0FFF1FAF014A5FF9 +:101240005B4F0B851C85FA0111830083E8A1F9A18E +:10125000E95BFA4F80839183A283B383F101EE5F50 +:10126000FC4F20812F5F20832C013D011D8969E205 +:1012700071E08091C8069091C9060E941903F1019E +:10128000EE0FFF1FE457F94F40815181052E000CEE +:10129000660B770B8091C8069091C9060E943E0F9D +:1012A00066E271E08091C8069091C9060E94190318 +:1012B00049815A816B817C818091C8069091C906D1 +:1012C0000E94230E63E271E08091C8069091C906E6 +:1012D0000E941903B701A6018091C8069091C90622 +:1012E0000E94230E61E271E08091C8069091C906C8 +:1012F0000E9419034D855E856F8578898091C806A7 +:101300009091C9060E94230E6EE171E08091C8069B +:101310009091C9060E941903B501A4018091C806E5 +:101320009091C9060E94230E6BE171E08091C8067E +:101330009091C9060E941903B301A2018091C806C9 +:101340009091C9060E943E0F69E171E08091C80644 +:101350009091C9060E9419036091B5047091B6047A +:101360008091C8069091C9060E943C0E66E171E02A +:101370008091C8069091C9060E9419036A8D7B8DE1 +:101380008091C8069091C9060E943C0E111116C0AA +:1013900063E171E08091C8069091C9060E9419032B +:1013A000F101EE5FFC4F408150E060E070E02AE028 +:1013B0008091C8069091C9060E94BD0DC114D10448 +:1013C000E104F104C1F060E171E08091C806909100 +:1013D000C9060E9419036E897F89888D998DA7019E +:1013E00096010E940017BA01A9018091C806909148 +:1013F000C9060E94230E8091C8069091C906A19645 +:101400000FB6F894DEBF0FBECDBFDF91CF911F9115 +:101410000F91FF90EF90DF90CF90BF90AF909F9093 +:101420008F907F906F905F904F903F902F900C9493 +:10143000060EA1960FB6F894DEBF0FBECDBFDF91AA +:10144000CF911F910F91FF90EF90DF90CF90BF90C1 +:10145000AF909F908F907F906F905F904F903F9054 +:101460002F9008952F923F924F925F926F927F92AA +:101470008F929F92AF92BF92CF92DF92EF92FF92A4 +:101480000F931F93CF93DF937C012A013B0180913F +:10149000320590E0029664E170E00E94EC16EC01E7 +:1014A00020E030E040E004E110E0C9018C0F9D1F16 +:1014B000B8010E94EC16FC01E657FD4FE081F0E018 +:1014C000EE15FF0509F44F5F2F5F3F4F24313105C3 +:1014D00061F7442309F4DFC01E016EE071E08091E2 +:1014E000C8069091C9060E941903F701EE0FFF1F6D +:1014F000E457F94F40815181052E000C660B770BA4 +:101500008091C8069091C9060E943E0F6CE071E080 +:101510008091C8069091C9060E941903C12CD12C54 +:1015200021E0C601820D931D64E170E00E94EC167B +:101530008C01FC01E657FD4F808190E08E159F05E0 +:1015400009F089C0E801CC0FDD1FCC0FDD1F211190 +:1015500020C0FE01E65CFD4F80819181A281B381B4 +:10156000FE01E651FE4F4081518162817381840FFB +:10157000951FA61FB71F88159905AA05BB0508F476 +:1015800063C069E071E08091C8069091C9060E942D +:101590001903F801EE0FFF1FEE53FE4F60817181BA +:1015A0008091C8069091C9060E943C0E67E071E0E8 +:1015B0008091C8069091C9060E941903FE01E65C5D +:1015C000FD4F40815181628173814419550966093B +:1015D00077098091C8069091C9060E943E0F65E088 +:1015E00071E08091C8069091C9060E941903FE011E +:1015F000E651FE4F40815181628173818091C8061E +:101600009091C9060E94230E63E071E08091C806A4 +:101610009091C9060E941903F801E255FE4F4081DE +:1016200050E060E070E02AE08091C8069091C90621 +:101630000E94BD0DF801E656FE4F60818091C806FC +:101640009091C9060E941C0EC65CDD4F888099806F +:10165000AA80BB8020E08FEFC81AD80A84E1C816A0 +:10166000D10409F05ECF8091C8069091C906DF9140 +:10167000CF911F910F91FF90EF90DF90CF90BF908F +:10168000AF909F908F907F906F905F904F903F9022 +:101690002F900C94060EDF91CF911F910F91FF9028 +:1016A000EF90DF90CF90BF90AF909F908F907F9002 +:1016B0006F905F904F903F902F9008950F931F93DE +:1016C000CF93DF93EC0161E071E08091C8069091C7 +:1016D000C9060E9419038E01000F111FF801E4577B +:1016E000F94F40815181052E000C660B770B8091DC +:1016F000C8069091C9060E943E0FFE01EB58F94FB3 +:1017000020818091C8069091C906222329F02130BA +:1017100031F469EF70E005C060EF70E002C06DEE7B +:1017200070E00E941903CF59D94F8881882341F076 +:1017300065EE70E08091C8069091C9060E94190379 +:101740006FED70E08091C8069091C9060E94190360 +:10175000F801E75CF94F608171818091C806909132 +:10176000C906DF91CF911F910F910C943C0ECF923F +:10177000DF92EF92FF926DED70E08091C80690913C +:10178000C9060E94190360910A0170910B018091B2 +:101790000C0190910D0128EEC22E23E0D22EE12CF7 +:1017A000F12CA70196010E940017BA01A9018091AE +:1017B000C8069091C9060E94230E6BED70E08091DF +:1017C000C8069091C9060E941903609106017091A4 +:1017D00007018091080190910901A70196010E94DB +:1017E0000017BA01A9018091C8069091C9060E940C +:1017F000230E69ED70E08091C8069091C9060E94A1 +:10180000190360910201709103018091040190918C +:101810000501A70196010E940017BA01A901809154 +:10182000C8069091C9060E94230E67ED70E0809172 +:10183000C8069091C9060E94190360910001709139 +:1018400001018091C8069091C906FF90EF90DF904A +:10185000CF900C94260E1F93CF93DF93C5ECD0E06E +:101860001C2F1F5EFE0164918091C8069091C906ED +:101870000E941C0E21961C13F5CF60EC70E0809145 +:10188000C8069091C9060E941903CCEBD0E01C2F2A +:101890001D5FFE0164918091C8069091C9060E9467 +:1018A0001C0E21961C13F5CF61EB70E08091C806E9 +:1018B0009091C9060E941903CCE9D0E01C2F1C5E50 +:1018C000FE0164918091C8069091C9060E941C0E89 +:1018D00021961C13F5CFDF91CF911F9108958F9220 +:1018E0009F92AF92BF92CF92DF92EF92FF920F93AF +:1018F0001F93CF93DF930E9418044B015C018091EA +:10190000C8069091C9060E94060E0E942B0C62E444 +:1019100071E08091C8069091C9060E941903C4E540 +:10192000D1E0C12CD12C760181E02991399137FD8C +:1019300014C0811108C060E471E08091C8069091E4 +:10194000C9060E9419032AE0B701A6018091C806C2 +:101950009091C9060E94BD0D80E09FEFC91AD90A77 +:10196000E90AF90AE6E1CE16D104E104F104E9F648 +:1019700065E371E08091C8069091C9060E94190341 +:1019800062E371E08091C8069091C9060E94190334 +:10199000B501A4018091C8069091C9060E94230E4A +:1019A00060E371E08091C8069091C9060E94190316 +:1019B0006091B5047091B6048091C8069091C906F3 +:1019C0000E943C0E6DE271E08091C8069091C906BC +:1019D0000E9419034091A8045091A9046091AA049F +:1019E0007091AB048091C8069091C9060E94230EA5 +:1019F0006BE271E08091C8069091C9060E941903BC +:101A00006091A6047091A7048091C8069091C906C0 +:101A10000E943C0E8091C8069091C9060E94060E55 +:101A20000E94B70B0CE816E0C0E0D0E0F80181910D +:101A300091918F0197FD09C0CE010E945E0B8091AC +:101A4000C8069091C9060E94060E2196C431D105A0 +:101A500069F7DF91CF911F910F91FF90EF90DF9089 +:101A6000CF90BF90AF909F908F9008951F93CF938A +:101A7000DF93C4E9D0E01C2F195FFE0164918091CF +:101A8000C8069091C9060E941C0E21961C13F5CF22 +:101A9000DF91CF911F9108951F920F920FB60F9271 +:101AA00011242F933F934F935F936F937F938F9363 +:101AB0009F93AF93BF93EF93FF9382E00E94240420 +:101AC000FF91EF91BF91AF919F918F917F916F9116 +:101AD0005F914F913F912F910F900FBE0F901F90EC +:101AE00018951F920F920FB60F9211242F933F93C8 +:101AF0004F935F936F937F938F939F93AF93BF9316 +:101B0000EF93FF9381E00E942404FF91EF91BF9136 +:101B1000AF919F918F917F916F915F914F913F9185 +:101B20002F910F900FBE0F901F9018951F920F923C +:101B30000FB60F9211242F933F934F935F936F93A0 +:101B40007F938F939F93AF93BF93EF93FF9380E027 +:101B50000E942404FF91EF91BF91AF919F918F91CB +:101B60007F916F915F914F913F912F910F900FBE99 +:101B70000F901F9018950E944B174F925F926F9293 +:101B80007F92EF92FF920F931F93CF93DF93CDB786 +:101B9000DEB7A1970FB6F894DEBF0FBECDBF7C01B4 +:101BA000FA01CB0119A2223008F42AE08E010F5D60 +:101BB0001F4F422E512C612C712CBF01A3019201A9 +:101BC0000E940017F901CA01015011096A3014F48A +:101BD000605D01C0695CD8016C93232B242B252BFD +:101BE00061F7B801C7010E943D03A1960FB6F894B2 +:101BF000DEBF0FBECDBFDF91CF911F910F91FF9040 +:101C0000EF907F906F905F904F90089560E871E043 +:101C10000C943D030F931F93CF93DF93EC010E942D +:101C200019038C01CE010E94060E800F911FDF91D7 +:101C3000CF911F910F910895DC01ED91FC910190DE +:101C4000F081E02D09942AE00C94BD0D0F931F93B1 +:101C5000CF93DF93EC01AB0160E070E02AE00E94DB +:101C6000BD0D8C01CE010E94060E800F911FDF91E9 +:101C7000CF911F910F910895AB0160E070E02AE0D1 +:101C80000C94BD0DCF92DF92EF92FF920F931F93B2 +:101C9000843058F40E94360D62EC73E08091C806DF +:101CA0009091C9060E941903DDC02091B4063091BD +:101CB000B506C901019780319E4038F00E94360D6B +:101CC0006091B4067091B50675C0A8EEB3E00E94AD +:101CD00028176B017C0160930A0170930B018093BC +:101CE0000C0190930D010E941804DC01CB018C0DB6 +:101CF0009D1DAE1DBF1D0091C4061091C50620910B +:101D0000C6063091C70680179107A207B30770F483 +:101D10000E941804C60ED71EE81EF91EC092C40603 +:101D2000D092C506E092C606F092C7062091B6068C +:101D30003091B706C901019780319E4038F00E946A +:101D4000360D6091B6067091B70634C0A8EEB3E0C8 +:101D50000E94281760930601709307018093080181 +:101D6000909309012091B8063091B90621318EE097 +:101D7000380738F00E94360D6091B8067091B906A8 +:101D800019C0A8EEB3E00E94281760930201709377 +:101D9000030180930401909305018091BA0690910C +:101DA000BB068536910590F00E94360D6091BA060B +:101DB0007091BB068091C8069091C9061F910F9142 +:101DC000FF90EF90DF90CF900C94260E909301013E +:101DD000809300016EEA73E08091C8069091C90675 +:101DE0000E9419036091B4067091B5068091C806EF +:101DF0009091C9060E943C0E6CEA73E08091C8067F +:101E00009091C9060E9419036091B6067091B706B9 +:101E10008091C8069091C9060E943C0E6AEA73E060 +:101E20008091C8069091C9060E9419036091B80676 +:101E30007091B9068091C8069091C9060E943C0E27 +:101E400068EA73E08091C8069091C9060E94190360 +:101E50006091BA067091BB068091C8069091C90640 +:101E60000E943C0E8091C8069091C9061F910F9167 +:101E7000FF90EF90DF90CF900C94060ECF92DF9200 +:101E8000EF92FF920F931F93CF93DF9377FF1DC0C5 +:101E90006A017B01EC016DE20E941C0E8C0144275B +:101EA0005527BA014C195D096E097F092AE0CE0158 +:101EB0000E94BD0D800F911FDF91CF911F910F9157 +:101EC000FF90EF90DF90CF9008952AE0DF91CF91BF +:101ED0001F910F91FF90EF90DF90CF900C94BD0D6C +:101EE0000F931F93CF93DF93EC01462F50E060E0F8 +:101EF00070E02AE00E94BD0D8C01CE010E94060E0A +:101F0000800F911FDF91CF911F910F9108956F92D4 +:101F10007F928F929F92AF92BF92DF92EF92FF9249 +:101F20000F931F93CF93DF93D82E0E941804AB0119 +:101F3000BC01A090B406B090B50685E18A1558F0B2 +:101F400045019924F401EE0FFF1FEC5AFE4F00816A +:101F5000118117FF1EC00E94360D6DE873E080915D +:101F6000C8069091C9060E9419036A2D8091C8067F +:101F70009091C906DF91CF911F910F91FF90EF9043 +:101F8000DF90BF90AF909F908F907F906F900C9458 +:101F9000700F11277801EE0CFF1CF701E45DFE4F76 +:101FA000C081D181F701E457F94F3F0180819181D0 +:101FB000DD2788159905C9F0FE01E758FC4FE4912B +:101FC000E2508E2F90E0FC01EE0FFF1FED58FC4F0A +:101FD000A591B4912C91FC01E757F94F2083C801DA +:101FE0000E94E205F301918280828091B606909171 +:101FF000B7060297029788F00E94360D64E473E0FA +:102000008091C8069091C9060E9419036A2D80919B +:10201000C8069091C9060E94700FF801EB58F94F5D +:1020200081E02091B6063091B7062330310509F0E2 +:1020300080E08083D801AF59B94FF2E0FD1568F513 +:102040008091B8069091B906892B39F1FE01E25EC4 +:10205000FC4F2491FE01E758FC4F84918823D1F076 +:1020600090E0880F991FFC01EC5EFC4F4591549164 +:10207000FC01E65FFC4F659174919FB7F894FA01FB +:102080003081822F809583238083FB018081282BE0 +:1020900020839FBF81E08C9326C0FE01E25EFC4F4F +:1020A0004491FE01E758FC4F24912223D9F030E0FF +:1020B000220F331FF901EC5EFC4F85919491F901D9 +:1020C000E65FFC4F259134916FB7F894FC01508185 +:1020D000742F7095452F47234083F9018081872312 +:1020E00080836FBF1C92F3E0FD1530F48091BA0637 +:1020F0009091BB06009711F482E090E0F701E75C55 +:10210000F94F91838083FE01E25EFC4F8491FE01D2 +:10211000E758FC4FC491CC23A9F1C250EC2FF0E05A +:10212000EE0FFF1FEA5DFE4FA081B181EC91E82B1D +:10213000EC932091680081E090E001C0880FCA957F +:10214000EAF7822B8093680062E373E08091C8060F +:102150009091C9060E941903C8010E945E0B8091EC +:10216000C8069091C906DF91CF911F910F91FF9002 +:10217000EF90DF90BF90AF909F908F907F906F9087 +:102180000C94060E0E94360D6DE373E08091C80634 +:102190009091C906DF91CF911F910F91FF90EF9021 +:1021A000DF90BF90AF909F908F907F906F900C9436 +:1021B0000A0EE8E9F5E01382128288EE93E0A0E0CF +:1021C000B0E084839583A683B78388E191E091830F +:1021D000808385EC90E09587848784EC90E09787F6 +:1021E000868780EC90E0918B808B81EC90E0938BE4 +:1021F000828B82EC90E0958B848B86EC90E0978BC1 +:10220000868B118E128E138E148E0895CF93DF93CA +:10221000CDB7DEB72A970FB6F894DEBF0FBECDBF9D +:10222000789484B5826084BD84B5816084BD85B5B1 +:10223000826085BD85B5816085BD80916E008160BD +:1022400080936E0010928100809181008260809363 +:102250008100809181008160809381008091800065 +:102260008160809380008091B10084608093B10090 +:102270008091B00081608093B00080917A0084608A +:1022800080937A0080917A00826080937A008091B6 +:102290007A00816080937A0080917A0080688093D0 +:1022A0007A001092C100E091A805F091A90582E0A2 +:1022B0008083E091A405F091A5051082E091A60528 +:1022C000F091A70583E380831092B005E091AC05FF +:1022D000F091AD0586E08083E091AA05F091AB0511 +:1022E000808180618083E091AA05F091AB058081B7 +:1022F00088608083E091AA05F091AB0580818068B9 +:102300008083E091AA05F091AB0580818F7D808369 +:102310000E94F3034B015C0114EFC12EDD24D39422 +:10232000E12CF12C0E94F303DC01CB0188199909FF +:10233000AA09BB09883E9340A105B10558F001E008 +:10234000C01AD108E108F10818EE810E13E0911EC1 +:10235000A11CB11CC114D104E104F10419F7789453 +:1023600088E995E00E94060E88E995E09093C906F9 +:102370008093C8061092B6041092B5040E94180407 +:10238000609335067093360680933706909338062F +:102390000E9449060E946F0CB8EE4B2EB3E05B2EF4 +:1023A000612C712C0E94180400913506109136069C +:1023B000209137063091380660177107820793071E +:1023C00050F42091B5043091B6042F5F3F4F309305 +:1023D000B6042093B5046093350670933606809357 +:1023E00037069093380688E995E00E946F02892BA2 +:1023F00009F4AEC288E995E00E944D02182F8C3294 +:10240000C9F4E091B904E73008F0A2C281E08E0F70 +:102410008093B904F0E0EE0FFF1FEC54F94F809168 +:10242000B7049091B804918380831092B8041092FD +:10243000B7048EC280ED810F8A30A0F42091B704DA +:102440003091B8044AE0429FC001439F900D11248F +:10245000C097810F911D17FD9A959093B8048093B2 +:10246000B70476C28FE9810F8A3108F071C280917A +:102470009705882309F443C068EC72E088E995E089 +:102480000E941903E4EBCE2EE6E0DE2EE12CF12CC7 +:102490008091B90490E08E159F05ACF0E114F10431 +:1024A00031F066EC72E088E995E00E941903F601CC +:1024B000619171916F0188E995E00E943C0EFFEFF8 +:1024C000EF1AFF0AE5CF612F88E995E00E941C0E04 +:1024D0006FEB72E088E995E00E9419034091B9041E +:1024E00050E04F5F5F4F052E000C660B770B88E9BD +:1024F00095E00E943E0F88E995E00E94060E812F2C +:10250000110F990BAA0BBB0BFC01E156F109E63147 +:10251000F10508F00FC2EC5CFF4F0C94221780917C +:10252000B904E82FF0E0EE0FFF1FEC54F94F2091B3 +:10253000B7043091B804318320838F5F0E94870FE6 +:10254000F9C18091B904E82FF0E0EE0FFF1FEC54C1 +:10255000F94F2091B7043091B80431832083009162 +:10256000B4061091B5068F3F61F0063150F4F801C2 +:10257000FF27EE0FFF1FEC5AFE4F8081918197FFDE +:1025800005C00E94360D69E672E024C39927FC015C +:10259000EE0FFF1FE45DFE4F208131813327F901EB +:1025A000E25EFC4F4491F901E758FC4F249122234D +:1025B00009F404C32250E22FF0E0EE0FFF1FEA5DA2 +:1025C000FE4FA081B1813C91E42FE095E323EC9391 +:1025D0003C913111F8C26091680041E050E06A011D +:1025E00002C0CC0CDD1C2A95E2F79601209526232B +:1025F00020936800E8C28091B904E82FF0E0EE0F64 +:10260000FF1FEC54F94F2091B7043091B804318387 +:1026100020838F5F0E94420E8DC10E9449068AC1AD +:102620000E9418044B015C016CE472E08091C806C2 +:102630009091C9060E9419030E942B0C8091C80634 +:102640009091C9060E94060E0E94B70B1CE8E12E6D +:1026500016E0F12E00E010E0F701819191917F01E9 +:1026600018161906B4F4C8010E945E0B69E472E002 +:102670008091C8069091C9060E941903A501940192 +:1026800061E0C8010E94B807B501A401C8010E9419 +:10269000320A0F5F1F4F04311105F1F68091C80611 +:1026A0009091C9060E94060E67E172E08091C8060B +:1026B0009091C9060E94190380E090E00E94E00515 +:1026C000682F8091C8069091C9060E941C0E81E077 +:1026D00090E00E94E005682F8091C8069091C9069D +:1026E0000E941C0E82E090E00E94E005682F80911D +:1026F000C8069091C9060E941C0E6EE072E080919F +:10270000C8069091C9060E94190383E090E00E94D8 +:10271000E005482F50E060E070E08091C80690919D +:10272000C9060E943E0F8091C8069091C9060E947A +:10273000060E80E090E00E94E005833409F058C264 +:1027400081E090E00E94E005863609F051C282E007 +:1027500090E00E94E005873609F04AC27EC22091CF +:10276000B7043091B8048091C8069091C9062F3FF4 +:10277000310588F4209397056AEA72E00E941903F4 +:102780006091B7047091B8048091C8069091C90611 +:102790000E94260ECFC064E872E0CAC00E946F0C8F +:1027A000C9C01A82198263E4CE0101960E945007C3 +:1027B00066E6CE0101960E94500767E6CE010196BB +:1027C0000E9450072CE836E03C832B83F901332428 +:1027D000339481919191181619060CF4339436E0D4 +:1027E000E43BF307B1F7632DCE0101960E94500739 +:1027F000E0900001F09001016091020170910301ED +:102800008091040190910501A30192010E9400179B +:102810002D833E834F835887609106017091070195 +:102820008091080190910901A30192010E94001773 +:1028300049015A0160910A0170910B0180910C01CC +:1028400090910D01A30192010E940017BA01A90104 +:102850000D811E81940169E4CE0101960E947507E5 +:1028600079E3A72E76E0B72EC12CD12CEB81FC8129 +:1028700041915191FC83EB8314161506C4F4F501C4 +:10288000E080F180F601EF59F94F008110E0F60188 +:10289000EB58F94F8081811103C022E030E002C083 +:1028A00023E030E061E4CE0101960E947507FFEF5E +:1028B000CF1ADF0A02E0A00EB11C14E1C116D10448 +:1028C000A9F66DEB71E088E995E00E941903432DAC +:1028D00050E060E070E02AE088E995E00E94BD0DDC +:1028E0006AEB71E088E995E00E94190349815A81F9 +:1028F000052E000C660B770B88E995E00E943E0FD1 +:1029000088E995E00E94060E15C0E091B904F0E058 +:10291000EE0FFF1FEC54F94F8091B7049091B8046B +:102920009183808364EB71E08091C8069091C90621 +:102930000E940A0E1092B9041092B8041092B704C3 +:10294000E4EBF6E01192119226E0E43CF207D1F7B5 +:10295000809197058A3030F50E9418040091C406D2 +:102960001091C5062091C6063091C7066B017C0107 +:10297000C01AD10AE20AF30AF7FEE5C00091060187 +:102980001091070120910801309109014B015C0170 +:10299000801A910AA20AB30AECE8F6E0A7E4B5E0CF +:1029A00020E0C9C03CE8832E36E0932E43E3E42EBA +:1029B00045E0F42E5CE2A52E51E0B52E00E010E0DB +:1029C000F401C190D1904F011C141D040CF094C06F +:1029D000F5012080822D0E94AA03382EF701808104 +:1029E000381609F489C0308263E073E08091C8062C +:1029F0009091C9060E941903A601DD0C660B770BA6 +:102A00008091C8069091C9060E943E0F66EF72E061 +:102A10008091C8069091C9060E941903422D50E08A +:102A200060E070E02AE08091C8069091C9060E949B +:102A3000BD0D62EF72E08091C8069091C9060E94B8 +:102A400019036DEE72E08091C8069091C9060E944C +:102A50001903432D50E060E070E02AE08091C80641 +:102A60009091C9060E94BD0D62EE72E08091C80689 +:102A70009091C9060E9419034091320550E060E030 +:102A800070E02AE08091C8069091C9060E94BD0DB1 +:102A900069ED72E08091C8069091C9060E94190301 +:102AA000F801EE0FFF1FEE0FFF1FEE51FB4F4081AD +:102AB0005181628173818091C8069091C9060E94FC +:102AC000230E6FEC72E08091C8069091C9060E94B7 +:102AD0001903F801EE0FFF1FE654FB4F608171816F +:102AE0008091C8069091C9060E943C0E8091C8064C +:102AF0009091C9060E94060E0F5F1F4FFFEFEF1A5D +:102B0000FF0A22E0A20EB11C0431110509F058CFD2 +:102B100023CFCD90DD90ED90FC901397B501A401EB +:102B20004C195D096E097F0977FF21E0149656E084 +:102B3000E43BF50731F041915191141615064CF321 +:102B4000F5CF2223C1F10E9418044B015C018CE8EF +:102B5000E82E86E0F82E00E010E0F70181919191D7 +:102B60007F0197FD0FC0A501940160E0C8010E949C +:102B7000B80780919705853028F0B501A401C801F8 +:102B80000E94320A0F5F1F4F0431110531F7409147 +:102B90000A0150910B0160910C0170910D01480DDB +:102BA000591D6A1D7B1D4093C4065093C506609352 +:102BB000C6067093C7060E940F03F4CB0E94360D21 +:102BC00062E672E0B1CE40E050E0BA010E94E20558 +:102BD00067E572E08091C8069091C9060E941903CA +:102BE000602F8091C8069091C9060E94700FA2CEF6 +:102BF00068EF71E08091C8069091C9060E940A0EA4 +:102C000067E372E08091C8069091C9060E9419039B +:102C1000C090C406D090C506E090C606F090C706E6 +:102C20000E94180497018601061B170B280B390B0D +:102C3000B901A8018091C8069091C9060E94230E8F +:102C400069E272E08091C8069091C9060E9419035A +:102C50008091C8069091C90655CE83E090E00E940D +:102C6000E005282EF5E1F81718F46DED71E0C2CFFC +:102C7000312C04E010E0321419F2C8010E94E00582 +:102C8000282FC80101962A870E94E005F82EC80166 +:102C900002960E94E005C82ED12CDC2CCC24CF0C4F +:102CA000D11CC80103960E94E005F82EC8010496C5 +:102CB0000E94E005A82EB12CBA2CAA24AF0CB11C9E +:102CC000C80105960E94E005F82EC80106960E94EC +:102CD000E005882E912C982C88248F0C911CC8011B +:102CE00007960E94E005382FC801089639870E9490 +:102CF000E005E82EF12CFE2CEE243985E30EF11CC4 +:102D0000075F1F4F64ED71E08091C8069091C9067E +:102D10000E9419032A85622F8091C8069091C906E6 +:102D20000E941C0E62ED71E08091C8069091C90668 +:102D30000E941903B6018091C8069091C9060E94AD +:102D40003C0E60ED71E08091C8069091C9060E942A +:102D50001903B5018091C8069091C9060E943C0EE6 +:102D60006EEC71E08091C8069091C9060E9419032B +:102D7000B4018091C8069091C9060E943C0E6CEC8B +:102D800071E08091C8069091C9060E941903B701AD +:102D90008091C8069091C9060E943C0E8091C80699 +:102DA0009091C9060E94060E339465CFF999FECF23 +:102DB00092BD81BDF89A992780B50895262FF9997B +:102DC000FECF1FBA92BD81BD20BD0FB6F894FA9A0E +:102DD000F99A0FBE0196089597FB072E16F40094FA +:102DE00007D077FD09D00E94371707FC05D03EF4C5 +:102DF000909581959F4F0895709561957F4F0895A7 +:102E0000A1E21A2EAA1BBB1BFD010DC0AA1FBB1FEE +:102E1000EE1FFF1FA217B307E407F50720F0A21B60 +:102E2000B30BE40BF50B661F771F881F991F1A94CD +:102E300069F760957095809590959B01AC01BD01F7 +:102E4000CF010895EE0FFF1F0590F491E02D099436 +:102E5000A29FB001B39FC001A39F700D811D1124DB +:102E6000911DB29F700D811D1124911D0895AA1B03 +:102E7000BB1B51E107C0AA1FBB1FA617B70710F065 +:102E8000A61BB70B881F991F5A95A9F78095909597 +:102E9000BC01CD01089581E090E0F8940C945017A6 +:042EA000F894FFCFD4 +:102EA4000200D007000060EA0000307500000D1336 +:102EB40007080E0000000000A6020F023E02ED0209 +:102EC4006F024D0261026B006C006D000200030092 +:102ED4000400050006000700080009000A000B00B2 +:102EE4000C000D000E000F00100011001200130062 +:102EF40000000000FFFFFFFF0000010002000300CC +:102F04000400050006000700080009000A000B0081 +:102F14000C000D000E000F00100011001200130031 +:042F24000D0A000092 :00000001FF diff --git a/fhem/contrib/arduino/ArduCounter2.36.ino b/fhem/contrib/arduino/ArduCounter2.36.ino new file mode 100755 index 000000000..96a217a8b --- /dev/null +++ b/fhem/contrib/arduino/ArduCounter2.36.ino @@ -0,0 +1,1409 @@ +/* + * Sketch for counting impulses in a defined interval + * e.g. for power meters with an s0 interface that can be + * connected to an input of an arduino or esp8266 board + * + * the sketch uses pin change interrupts which can be anabled + * for any of the inputs on e.g. an arduino uno, jeenode, wemos d1 etc. + * + * the pin change Interrupt handling for arduinos used here + * is based on the arduino playground example on PCINT: + * http://playground.arduino.cc/Main/PcInt which is outdated. + * + * see https://github.com/GreyGnome/EnableInterrupt for a newer library (not used here) + * and also + * https://playground.arduino.cc/Main/PinChangeInterrupt + * http://www.avrfreaks.net/forum/difference-between-signal-and-isr + * + * Refer to avr-gcc header files, arduino source and atmega datasheet. + */ + +/* Arduino Uno / Nano Pin to interrupt map: + * D0-D7 = PCINT 16-23 = PCIR2 = PD = PCIE2 = pcmsk2 + * D8-D13 = PCINT 0-5 = PCIR0 = PB = PCIE0 = pcmsk0 + * A0-A5 (D14-D19) = PCINT 8-13 = PCIR1 = PC = PCIE1 = pcmsk1 + */ + + +/* + Changes: + V1.2 + 27.10.16 - use noInterrupts in report() + - avoid reporting very short timeDiff in case of very slow impulses after a report + - now reporting is delayed if impulses happened only within in intervalSml + - reporting is also delayed if less than countMin pulses counted + - extend command "int" for optional intervalSml and countMin + 29.10.16 - allow interval Min >= Max or Sml > Min + which changes behavior to take fixed calculation interval instead of timeDiff between pulses + -> if intervalMin = intervalMax, counting will allways follow the reporting interval + 3.11.16 - more noInterrupt blocks when accessing the non uint8_t volatiles in report + V1.3 + 4.11.16 - check min pulse width and add more output, + - prefix show output with M + V1.4 + 10.11.16 - restructure add Cmd + - change syntax for specifying minPulseLengh + - res (reset) command + V1.6 + 13.12.16 - new startup message logic?, newline before first communication? + 18.12.16 - replace all code containing Strings, new communication syntax and parsing from Jeelink code + V1.7 + 2.1.17 - change message syntax again, report time as well, first and last impulse are reported + relative to start of intervall not start of reporting intervall + V1.8 + 4.1.17 - fixed a missing break in the case statement for pin definition + 5.1.17 - cleanup debug logging + 14.10.17 - fix a bug where last port state was not initialized after interrupt attached but this is necessary there + 23.11.17 - beautify code, add comments, more debugging for users with problematic pulse creation devices + 28.12.17 - better reportung of first pulse (even if only one pulse and countdiff is 0 but realdiff is 1) + 30.12.17 - rewrite PCInt, new handling of min pulse length, pulse history ring + 1.1.18 - check len in add command, allow pin 8 and 13 + 2.1.18 - add history per pin to report line, show negative starting times in show history + 3.1.18 - little reporting fix (start pos of history report) + + V2.0 + 17.1.18 - rewrite many things - use pin number instead of pcIntPinNumber as index, split interrupt handler for easier porting to ESP8266, ... + V2.23 + 10.2.18 - new commands for check alive and quit, send setup message after reboot also over tcp + remove reporting time of first pulse (now we hava history) + remove pcIntMode (is always change now) + pulse min interval is now always checked and defaults to 2 if not set + march 2018 many changes more to support ESP8266 + 7.3.18 - change pin config output, fix pullup (V2.26), store config in eeprom and read it back after boot + 22.4.18 - many changes, delay report if tcp mode and disconnected, verbose levels, ... + 13.5.18 - V2.36 Keepalive also on Arduino side + + + ToDo / Ideas: + + +*/ + +/* allow printing of every pin change to Serial */ +#define debugPins 1 + +/* allow tracking of pulse lengths */ +#define pulseHistory 1 + +/* use a sample config at boot */ +// #define debugCfg 1 + +#include "pins_arduino.h" +#include + +const char versionStr[] PROGMEM = "ArduCounter V2.36"; +const char compile_date[] PROGMEM = __DATE__ " " __TIME__; +const char errorStr[] PROGMEM = "Error: "; + +#ifdef ARDUINO_BOARD +const char boardName1[] PROGMEM = ARDUINO_BOARD; +#endif + +#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) +const char boardName[] PROGMEM = "UNO"; +#elif defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__) +const char boardName[] PROGMEM = "Leonardo"; +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +const char boardName[] PROGMEM = "Mega"; +#elif defined(ESP8266) +const char boardName[] PROGMEM = "ESP8266"; +#else +const char boardName[] PROGMEM = "UNKNOWN"; +#endif + +#define SERIAL_SPEED 38400 +#define MAX_INPUT_NUM 8 +#define MAX_HIST 20 + + +#ifdef ESP8266 +// varibales / definitions for ESP 8266 based boards +#include + +const char* ssid = "MySSID"; +const char* password = "secret"; + +WiFiServer Server(80); // For ESP WiFi connection +WiFiClient Client1; // active TCP connection +WiFiClient Client2; // secound TCP connection to send reject message +boolean Client1Connected; // remember state of TCP connection +boolean Client2Connected; // remember state of TCP connection + +boolean tcpMode = false; +uint8_t delayedTcpReports = 0; // how often did we already delay reporting because tcp disconnected +uint32_t lastDelayedTcpReports = 0; // last time we delayed + +#define MAX_APIN 8 +#define MAX_PIN 8 + +/* ESP8266 pins that are typically ok to use + * (some might be set to -1 (disallowed) because they are used + * as reset, serial, led or other things on most boards) + * maps printed pin numbers to sketch internal index numbers */ +short allowedPins[MAX_APIN] = + { 0, 1, 2, -1, + -1, 5, 6, 7}; +/* Wemos / NodeMCU Pins 3,4 and 8 (GPIO 0,2 and 15) define boot mode and therefore + * can not be used to connect to signal + */ + +/* Map from sketch internal pin index to real chip IO pin number */ +short internalPins[MAX_PIN] = + { 16, 5, 4, 0, + 2, 14, 12, 13}; + +#else +// variables / definitions for arduino / 328p based boards +#define MAX_APIN 22 +#define MAX_PIN 20 + +/* arduino pins that are typically ok to use + * (some might be set to -1 (disallowed) because they are used + * as reset, serial, led or other things on most boards) + * maps printed pin numbers to sketch internal index numbers */ +short allowedPins[MAX_APIN] = + {-1, -1, 0, 1, + 2, 3, 4, 5, + 6, 7, 8, 9, + 10, 11, 12, 13, + 14, 15, 16, 17, + 18, 19 }; + +/* Map from sketch internal pin index to real chip IO pin number */ +short internalPins[MAX_PIN] = + { 2, 3, 4, 5, + 6, 7, 8, 9, + 10, 11, 12, 13, + 14, 15, 16, 17, + 18, 19 }; + +/* first and last pin at port PB, PC and PD for arduino uno/nano */ +uint8_t firstPin[] = {8, 14, 0}; // aPin -> allowedPins[] -> pinIndex +uint8_t lastPin[] = {13, 19, 7}; + +/* Pin change mask for each chip port on the arduino platform */ +volatile uint8_t *port_to_pcmask[] = { + &PCMSK0, + &PCMSK1, + &PCMSK2 +}; + +/* last PIN States at io port to detect individual pin changes in arduino ISR */ +volatile static uint8_t PCintLast[3]; + +#endif + + +Print *Output; // Pointer to output device (Serial / TCP connection with ESP8266) +uint32_t bootTime; +uint16_t bootWraps; // counter for millis wraps at last reset +uint16_t millisWraps; // counter to track when millis counter wraps +uint32_t lastMillis; // milis at last main loop iteration +uint8_t devVerbose; // >=10 shows pin changes, >=5 shows pin history + +#ifdef debugPins +uint8_t lastState[MAX_PIN]; // for debug output when a pin state changes +#endif + +uint32_t intervalMin = 30000; // default 30 sec - report after this time if nothing else delays it +uint32_t intervalMax = 60000; // default 60 sec - report after this time if it didin't happen before +uint32_t intervalSml = 2000; // default 2 secs - continue count if timeDiff is less and intervalMax not over +uint16_t countMin = 2; // continue counting if count is less than this and intervalMax not over + +uint32_t timeNextReport; +#ifdef ESP8266 +uint32_t expectK; +#endif + +/* index to the following arrays is the internal pin index number */ + +volatile boolean initialized[MAX_PIN]; // did we get first interrupt yet? +short activePin[MAX_PIN]; // printed arduino pin number for index if active - otherwise -1 +uint16_t pulseWidthMin[MAX_PIN]; // minimal pulse length in millis for filtering +uint8_t pulseLevel[MAX_PIN]; // start of pulse for measuring length - 0 / 1 as defined for each pin +uint8_t pullup[MAX_PIN]; // pullup configuration state + +volatile uint32_t counter[MAX_PIN]; // real pulse counter +volatile uint8_t counterIgn[MAX_PIN]; // ignored first pulse after init +volatile uint16_t rejectCounter[MAX_PIN]; // counter for rejected pulses that are shorter than pulseWidthMin +uint32_t lastCount[MAX_PIN]; // counter at last report (to get the delta count) +uint16_t lastRejCount[MAX_PIN]; // reject counter at last report (to get the delta count) + +volatile uint32_t lastChange[MAX_PIN]; // millis at last level change (for measuring pulse length) +volatile uint8_t lastLevel[MAX_PIN]; // level of input at last interrupt +volatile uint8_t lastLongLevel[MAX_PIN]; // last level that was longer than pulseWidthMin + +volatile uint32_t pulseWidthSum[MAX_PIN]; // sum of pulse lengths for average calculation +uint8_t reportSequence[MAX_PIN]; // sequence number for reports + + +#ifdef pulseHistory +volatile uint8_t histIndex; // pointer to next entry in history ring +volatile uint16_t histNextSeq; // next seq number to use +volatile uint16_t histSeq[MAX_HIST]; // history sequence number +volatile uint8_t histPin[MAX_HIST]; // pin for this entry +volatile uint8_t histLevel[MAX_HIST]; // level for this entry +volatile uint32_t histTime[MAX_HIST]; // time for this entry +volatile uint32_t histLen[MAX_HIST]; // time that this level was held +volatile char histAct[MAX_HIST]; // action (count, reject, ...) as one char +#endif + +volatile uint32_t intervalStart[MAX_PIN]; // start of an interval - typically set by first / last pulse +volatile uint32_t intervalEnd[MAX_PIN]; // end of an interval - typically set by first / last pulse +uint32_t lastReport[MAX_PIN]; // millis at last report to find out when maxInterval is over + +uint16_t commandData[MAX_INPUT_NUM]; // input data over serial port or network +uint8_t commandDataPointer = 0; // index pointer to next input value +uint16_t value; // the current value for input function + + +/* + do counting and set start / end time of interval. + reporting is not triggered from here. + + only here counter[] is modified + intervalEnd[] is set here and in report + intervalStart[] is set in case a pin was not initialized yet and in report +*/ +static void inline doCount(uint8_t pinIndex, uint8_t level, uint32_t now) { + uint32_t len = now - lastChange[pinIndex]; + char act = ' '; + +#ifdef pulseHistory + histIndex++; + if (histIndex >= MAX_HIST) histIndex = 0; + histSeq[histIndex] = histNextSeq++; + histPin[histIndex] = pinIndex; + histTime[histIndex] = lastChange[pinIndex]; + histLen[histIndex] = len; + histLevel[histIndex] = lastLevel[pinIndex]; +#endif + if (len < pulseWidthMin[pinIndex]) { // pulse was too short + lastChange[pinIndex] = now; + if (lastLevel[pinIndex] == pulseLevel[pinIndex]) { // if change to gap level + rejectCounter[pinIndex]++; // inc reject counter and set action to R (pulse too short) + act = 'R'; + } else { + act = 'X'; // set action to X (gap too short) + } + } else { + if (lastLevel[pinIndex] != pulseLevel[pinIndex]) { // edge does fit defined pulse start, level is now pulse, before it was gap + act = 'G'; // now the gap is confirmed (even if inbetween was a spike that we ignored) + } else { // edge is a change to gap, level is now gap + if (lastLongLevel[pinIndex] != pulseLevel[pinIndex]) { // last remembered valid level was also gap -> now we had valid new pulse -> count + counter[pinIndex]++; // count + intervalEnd[pinIndex] = now; // remember time of in case pulse will be the last in the interval + if (!initialized[pinIndex]) { + intervalStart[pinIndex] = now; // if this is the very first impulse on this pin -> start interval now + initialized[pinIndex] = true; // and start counting the next impulse (so far counter is 0) + counterIgn[pinIndex]++; // count as to be ignored for diff because it defines the start of the interval + } + pulseWidthSum[pinIndex] += len; // for average calculation + act = 'C'; + } else { // last remembered valid level was a pulse -> now we had another valid pulse + pulseWidthSum[pinIndex] += len; // for average calculation + act = 'P'; // pulse was already counted, only short drop inbetween + } + } + lastLongLevel[pinIndex] = lastLevel[pinIndex]; // remember this valid level as lastLongLevel + } +#ifdef pulseHistory + histAct[histIndex] = act; +#endif + lastChange[pinIndex] = now; + lastLevel[pinIndex] = level; +} + + +/* Interrupt handlers and their installation + * on Arduino and ESP8266 platforms + */ + +#ifndef ESP8266 +/* Add a pin to be handled (Arduino code) */ +uint8_t AddPinChangeInterrupt(uint8_t rPin) { + volatile uint8_t *pcmask; // pointer to PCMSK0 or 1 or 2 depending on the port corresponding to the pin + uint8_t bitM = digitalPinToBitMask(rPin); // mask to bit in PCMSK to enable pin change interrupt for this arduino pin + uint8_t port = digitalPinToPort(rPin); // port that this arduno pin belongs to for enabling interrupts + if (port == NOT_A_PORT) + return 0; + port -= 2; // from port (PB, PC, PD) to index in our array + pcmask = port_to_pcmask[port]; // point to PCMSK0 or 1 or 2 depending on the port corresponding to the pin + *pcmask |= bitM; // set the pin change interrupt mask through a pointer to PCMSK0 or 1 or 2 + PCICR |= 0x01 << port; // enable the interrupt + return 1; +} + + +/* Remove a pin to be handled (Arduino code) */ +uint8_t RemovePinChangeInterrupt(uint8_t rPin) { + volatile uint8_t *pcmask; + uint8_t bitM = digitalPinToBitMask(rPin); + uint8_t port = digitalPinToPort(rPin); + if (port == NOT_A_PORT) + return 0; + port -= 2; // from port (PB, PC, PD) to index in our array + pcmask = port_to_pcmask[port]; + *pcmask &= ~bitM; // clear the bit in the mask. + if (*pcmask == 0) { // if that's the last one, disable the interrupt. + PCICR &= ~(0x01 << port); + } + return 1; +} + + +// now set the arduino interrupt service routines and call the common handler with the port index number +ISR(PCINT0_vect) { + PCint(0); +} +ISR(PCINT1_vect) { + PCint(1); +} +ISR(PCINT2_vect) { + PCint(2); +} + +/* + common function for arduino pin change interrupt handlers. "port" is the PCINT port index (0-2) as passed from above, not PB, PC or PD which are mapped to 2-4 +*/ +static void PCint(uint8_t port) { + uint8_t bit; + uint8_t curr; + uint8_t delta; + short pinIndex; + uint32_t now = millis(); + + // get the pin states for the indicated port. + curr = *portInputRegister(port+2); // current pin states at port (add 2 to get from index to PB, PC or PD) + delta = (curr ^ PCintLast[port]) & *port_to_pcmask[port]; // xor gets bits that are different and & screens out non pcint pins + PCintLast[port] = curr; // store new pin state for next interrupt + + if (delta == 0) return; // no handled pin changed + + bit = 0x01; // start mit rightmost (least significant) bit in a port + for (uint8_t aPin = firstPin[port]; aPin <= lastPin[port]; aPin++) { // loop over each pin on the given port that changed + if (delta & bit) { // did this pin change? + pinIndex = allowedPins[aPin]; + if (pinIndex > 0) { // shound not be necessary but test anyway + doCount (pinIndex, ((curr & bit) > 0), now); // do the counting, history and so on + } + } + bit = bit << 1; // shift mask to go to next bit + } +} + + +#else +/* Add a pin to be handled (ESP8266 code) */ + +/* attachInterrupt needs to be given an individual function for each interrrupt . + * since we cant pass the pin value into the ISR or we need to use an + * internal function __attachInnterruptArg ... but then we need a fixed reference for the pin numbers ... +*/ +uint8_t AddPinChangeInterrupt(uint8_t rPin) { + switch(rPin) { + case 4: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR4, CHANGE); + break; + case 5: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR5, CHANGE); + break; + case 12: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR12, CHANGE); + break; + case 13: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR13, CHANGE); + break; + case 14: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR14, CHANGE); + break; + case 16: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR16, CHANGE); + break; + default: + PrintErrorMsg(); Output->println(F("attachInterrupt")); + } + return 1; +} + +void ESPISR4() { // ISR for real pin GPIO 4 / pinIndex 2 + doCount(2, digitalRead(4), millis()); +} + +void ESPISR5() { // ISR for real pin GPIO 5 / pinIndex 1 + doCount(1, digitalRead(5), millis()); +} + +void ESPISR12() { // ISR for real pin GPIO 12 / pinIndex 6 + doCount(6, digitalRead(12), millis()); +} + +void ESPISR13() { // ISR for real pin GPIO 13 / pinIndex 7 + doCount(7, digitalRead(13), millis()); +} + +void ESPISR14() {// ISR for real pin GPIO 14 / pinIndex 5 + doCount(5, digitalRead(14), millis()); +} + +void ESPISR16() { // ISR for real pin GPIO 16 / pinIndex 0 + doCount(0, digitalRead(16), millis()); +} +#endif + + +void PrintErrorMsg() { + uint8_t len = strlen_P(errorStr); + char myChar; + for (unsigned char k = 0; k < len; k++) { + myChar = pgm_read_byte_near(errorStr + k); + Output->print(myChar); + } +} + + +void printVersionMsg() { + uint8_t len = strlen_P(versionStr); + char myChar; + for (unsigned char k = 0; k < len; k++) { + myChar = pgm_read_byte_near(versionStr + k); + Output->print(myChar); + } + Output->print(F(" on ")); + len = strlen_P(boardName); + for (unsigned char k = 0; k < len; k++) { + myChar = pgm_read_byte_near(boardName + k); + Output->print(myChar); + } + +#ifdef ARDUINO_BOARD + Output->print(F(" ")); + len = strlen_P(boardName1); + for (unsigned char k = 0; k < len; k++) { + myChar = pgm_read_byte_near(boardName1 + k); + Output->print(myChar); + } +#endif + + Output->print(F(" compiled ")); + len = strlen_P(compile_date); + for (unsigned char k = 0; k < len; k++) { + myChar = pgm_read_byte_near(compile_date + k); + Output->print(myChar); + } +} + + +void showIntervals() { + Output->print(F("I")); + Output->print(intervalMin / 1000); + Output->print(F(" ")); + Output->print(intervalMax / 1000); + Output->print(F(" ")); + Output->print(intervalSml / 1000); + Output->print(F(" ")); + Output->println(countMin); +} + + +void showPinConfig(short pinIndex) { + Output->print(F("P")); + Output->print(activePin[pinIndex]); + switch (pulseLevel[pinIndex]) { + case 1: Output->print(F(" rising")); break; + case 0: Output->print(F(" falling")); break; + default: Output->print(F(" -")); break; + } + if (pullup[pinIndex]) + Output->print(F(" pullup")); + Output->print(F(" min ")); + Output->print(pulseWidthMin[pinIndex]); +} + +#ifdef pulseHistory +void showPinHistory(short pinIndex, uint32_t now) { + uint8_t hi; + uint8_t start = (histIndex + 2) % MAX_HIST; + uint8_t count = 0; + uint32_t last; + boolean first = true; + + for (uint8_t i = 0; i < MAX_HIST; i++) { + hi = (start + i) % MAX_HIST; + if (histPin[hi] == pinIndex) + if (first || (last <= histTime[hi]+histLen[hi])) count++; + } + if (!count) return; + + Output->print (F("H")); // start with H + Output->print (activePin[pinIndex]); // printed pin number + Output->print (F(" ")); + for (uint8_t i = 0; i < MAX_HIST; i++) { + hi = (start + i) % MAX_HIST; + if (histPin[hi] == pinIndex) { + if (first || (last <= histTime[hi]+histLen[hi])) { + if (!first) Output->print (F(", ")); + Output->print (histSeq[hi]); // sequence + Output->print (F("s")); + Output->print ((long) (histTime[hi] - now)); // time when level started + Output->print (F("/")); + Output->print (histLen[hi]); // length + Output->print (F("@")); + Output->print (histLevel[hi]); // level (0/1) + Output->print (histAct[hi]); // action + first = false; + } + last = histTime[hi]; + } + } + Output->println(); +} +#endif + +/* + lastCount[] is only modified here (count at time of last reporting) + intervalEnd[] is modified here and in ISR - disable interrupts in critcal moments to avoid garbage in var + intervalStart[] is modified only here or for very first Interrupt in ISR +*/ +void showPinCounter(short pinIndex, boolean showOnly, uint32_t now) { + uint32_t count, countDiff, realDiff; + uint32_t startT, endT, timeDiff, widthSum; + uint16_t rejCount, rejDiff; + uint8_t countIgn; + + noInterrupts(); // copy counters while they cant be changed in isr + startT = intervalStart[pinIndex]; // start of interval (typically first pulse) + endT = intervalEnd[pinIndex]; // end of interval (last unless not enough) + count = counter[pinIndex]; // get current counter (counts all pulses + rejCount = rejectCounter[pinIndex]; + countIgn = counterIgn[pinIndex]; // pulses that mark the beginning of an interval + widthSum = pulseWidthSum[pinIndex]; + interrupts(); + + timeDiff = endT - startT; // time between first and last impulse + realDiff = count - lastCount[pinIndex]; // pulses during intervall + countDiff = realDiff - countIgn; // ignore forst pulse after device restart + rejDiff = rejCount - lastRejCount[pinIndex]; + + if (!showOnly) { // real reporting sets the interval borders new + if((long)(now - (lastReport[pinIndex] + intervalMax)) >= 0) { + // intervalMax is over + if ((countDiff >= countMin) && (timeDiff > intervalSml) && (intervalMin != intervalMax)) { + // normal procedure + noInterrupts(); // vars could be modified in ISR as well + intervalStart[pinIndex] = endT; // time of last impulse becomes first in next + interrupts(); + } else { + // nothing counted or counts happened during a fraction of intervalMin only + noInterrupts(); // vars could be modified in ISR as well + intervalStart[pinIndex] = now; // start a new interval for next report now + intervalEnd[pinIndex] = now; // no last impulse, use now instead + interrupts(); + timeDiff = now - startT; // special handling - calculation ends now + } + } else if( ((long)(now - (lastReport[pinIndex] + intervalMin)) >= 0) + && (countDiff >= countMin) && (timeDiff > intervalSml)) { + // minInterval has elapsed and other conditions are ok + noInterrupts(); // vars could be modified in ISR as well + intervalStart[pinIndex] = endT; // time of last also time of first in next + interrupts(); + } else { + return; // intervalMin and Max not over - dont report yet + } + noInterrupts(); + counterIgn[pinIndex] = 0; + pulseWidthSum[pinIndex] = 0; + interrupts(); + lastCount[pinIndex] = count; // remember current count for next interval + lastRejCount[pinIndex] = rejCount; + lastReport[pinIndex] = now; // remember when we reported +#ifdef ESP8266 + delayedTcpReports = 0; +#endif + reportSequence[pinIndex]++; + } + Output->print(F("R")); // R Report + Output->print(activePin[pinIndex]); + Output->print(F(" C")); // C - Count + Output->print(count); + Output->print(F(" D")); // D - Count Diff (without pulse that marks the begin) + Output->print(countDiff); + Output->print(F("/")); // R - real Diff for long counter - includes first after restart + Output->print(realDiff); + Output->print(F(" T")); // T - Time + Output->print(timeDiff); + Output->print(F(" N")); // N - now + Output->print((long)now); + Output->print(F(",")); + Output->print(millisWraps); + Output->print(F(" X")); // X Reject + Output->print(rejDiff); + + if (!showOnly) { + Output->print(F(" S")); // S - Sequence number + Output->print(reportSequence[pinIndex]); + } + if (countDiff > 0) { + Output->print(F(" A")); + Output->print(widthSum / countDiff); + } + Output->println(); +#ifdef ESP8266 + if (tcpMode && !showOnly) { + Serial.print(F("D reported pin ")); + Serial.print(activePin[pinIndex]); + Serial.print(F(" sequence ")); + Serial.print(reportSequence[pinIndex]); + Serial.println(F(" over tcp ")); + } +#endif + +} + + +/* + report count and time for pins that are between min and max interval +*/ + +boolean reportDue() { + uint32_t now = millis(); + boolean doReport = false; // check if report needs to be called + if((long)(now - timeNextReport) >= 0) // works fine when millis wraps. + doReport = true; // intervalMin is over + else + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) + if (activePin[pinIndex] > 0) + if((long)(now - (lastReport[pinIndex] + intervalMax)) >= 0) + doReport = true; // active pin has not been reported for langer than intervalMax + return doReport; +} + + + +void report() { + uint32_t now = millis(); +#ifdef ESP8266 + if (tcpMode && !Client1Connected && (delayedTcpReports < 3)) { + if(delayedTcpReports == 0 || ((long)(now - (lastDelayedTcpReports + (1 * 30 * 1000))) > 0)) { + Serial.print(F("D report called but tcp is disconnected - delaying (")); + Serial.print(delayedTcpReports); + Serial.print(F(")")); + Serial.print(F(" now ")); + Serial.print(now); + Serial.print(F(" last ")); + Serial.print(lastDelayedTcpReports); + Serial.print(F(" diff ")); + Serial.println(now - lastDelayedTcpReports); + delayedTcpReports++; + lastDelayedTcpReports = now; + return; + } else return; + } +#endif + + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) { // go through all observed pins as pinIndex + if (activePin[pinIndex] >= 0) { + showPinCounter (pinIndex, false, now); // report pin counters if necessary +#ifdef pulseHistory + if (devVerbose >= 5) + showPinHistory(pinIndex, now); // show pin history if verbose >= 5 +#endif + } + } + timeNextReport = now + intervalMin; // check again after intervalMin or if intervalMax is over for a pin +} + + +/* give status report in between if requested over serial input */ +void showCmd() { + uint32_t now = millis(); + Output->print(F("M Status: ")); + printVersionMsg(); + Output->println(); + showIntervals(); + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) { + if (activePin[pinIndex] > 0) { + showPinConfig(pinIndex); + Output->print(F(", ")); + showPinCounter(pinIndex, true, now); +#ifdef pulseHistory + showPinHistory(pinIndex, now); +#endif + } + } + readFromEEPROM(); + Output->print(F("M Next report in ")); + Output->print(timeNextReport - millis()); + Output->print(F(" milliseconds")); + Output->println(); + //Output->println(F("M #end#")); +} + + +void helloCmd() { + uint32_t now = millis(); + Output->println(); + printVersionMsg(); + Output->print(F(" Hello, pins ")); + boolean first = true; + for (uint8_t aPin=0; aPin < MAX_APIN; aPin++) { + if (allowedPins[aPin] >= 0) { + if (!first) { + Output->print(F(",")); + } else { + first = false; + } + Output->print(aPin); + } + } + Output->print(F(" available")); + Output->print(F(" T")); + Output->print(now); + Output->print(F(",")); + Output->print(millisWraps); + Output->print(F(" B")); + Output->print(bootTime); + Output->print(F(",")); + Output->print(bootWraps); + + Output->println(); + showIntervals(); + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) { // go through all observed pins as pinIndex + if (activePin[pinIndex] >= 0) { + showPinConfig(pinIndex); + Output->println(); + } + } +} + + + +/* + handle add command. +*/ +void addCmd(uint16_t *values, uint8_t size) { + uint16_t pulseWidth; + uint32_t now = millis(); + + uint8_t aPin = values[0]; // value 0 is pin number + if (aPin >= MAX_APIN || allowedPins[aPin] < 0) { + PrintErrorMsg(); + Output->print(F("Illegal pin specification ")); + Output->println(aPin); + return; + }; + uint8_t pinIndex = allowedPins[aPin]; + uint8_t rPin = internalPins[pinIndex]; + + if (activePin[pinIndex] != aPin) { // in case this pin is not already active counting + #ifndef ESP8266 + uint8_t port = digitalPinToPort(rPin) - 2; + PCintLast[port] = *portInputRegister(port+2); + #endif + initPinVars(pinIndex, now); + activePin[pinIndex] = aPin; // save arduino pin number and flag this pin as active for reporting + } + + if (values[1] < 2 || values[1] > 3) { // value 1 is level (rising / falling -> 0/1 + PrintErrorMsg(); + Output->print(F("Illegal pulse level specification for pin ")); + Output->println(aPin); + } + pulseLevel[pinIndex] = (values[1] == 3); // 2 = falling -> pulseLevel 0, 3 = rising -> pulseLevel 1 + + + if (size > 2 && values[2]) { // value 2 is pullup + pinMode (rPin, INPUT_PULLUP); + pullup[pinIndex] = 1; + // digitalWrite (rPin, HIGH); // old way to enable pullup resistor + } else { + pinMode (rPin, INPUT); + pullup[pinIndex] = 0; + } + + if (size > 3 && values[3] > 0) { // value 3 is min length + pulseWidth = values[3]; + } else { + pulseWidth = 2; + } + pulseWidthMin[pinIndex] = pulseWidth; + + if (!AddPinChangeInterrupt(rPin)) { // add Pin Change Interrupt + PrintErrorMsg(); + Output->println(F("AddInt")); + return; + } + + Output->print(F("M defined ")); + showPinConfig(pinIndex); + Output->println(); +} + + +/* + handle rem command. +*/ +void removeCmd(uint16_t *values, uint8_t size) { + uint8_t aPin = values[0]; + if (size < 1 || aPin >= MAX_APIN || allowedPins[aPin] < 0) { + PrintErrorMsg(); + Output->print(F("Illegal pin specification ")); + Output->println(aPin); + return; + }; + uint8_t pinIndex = allowedPins[aPin]; + +#ifdef ESP8266 + detachInterrupt(digitalPinToInterrupt(internalPins[pinIndex])); +#else + if (!RemovePinChangeInterrupt(internalPins[pinIndex])) { + PrintErrorMsg(); Output->println(F("RemInt")); + return; + } +#endif + initPinVars(pinIndex, 0); + Output->print(F("M removed ")); + Output->println(aPin); +} + + + +void intervalCmd(uint16_t *values, uint8_t size) { + /*Serial.print(F("D int ptr is ")); + Serial.println(size);*/ + if (size < 4) { // i command always gets 4 values: min, max, sml, cntMin + PrintErrorMsg(); + Output->print(F("size")); + Output->println(); + return; + } + if (values[0] < 1 || values[0] > 3600) { + PrintErrorMsg(); Output->println(values[0]); + return; + } + intervalMin = (long)values[0] * 1000; + if (millis() + intervalMin < timeNextReport) + timeNextReport = millis() + intervalMin; + + if (values[1] < 1 || values[1] > 3600) { + PrintErrorMsg(); Output->println(values[1]); + return; + } + intervalMax = (long)values[1]* 1000; + + if (values[2] > 3600) { + PrintErrorMsg(); Output->println(values[2]); + return; + } + intervalSml = (long)values[2] * 1000; + + if (values[3] > 100) { + PrintErrorMsg(); Output->println(values[3]); + return; + } + countMin = values[3]; + + Output->print(F("M intervals set to ")); + Output->print(values[0]); + Output->print(F(" ")); + Output->print(values[1]); + Output->print(F(" ")); + Output->print(values[2]); + Output->print(F(" ")); + Output->print(values[3]); + Output->println(); +} + + +void keepAliveCmd(uint16_t *values, uint8_t size) { + Output->println(F("alive")); +#ifdef ESP8266 + if (values[0] == 1 && size > 0 && size < 3 && Client1.connected()) { + tcpMode = true; + if (size == 2) { + expectK = millis() + values[1] * 2500; + } else { + expectK = millis() + 600000; // 10 Minutes if nothing sent (should not happen) + } + } +#endif +} + + +#ifdef ESP8266 +void quitCmd() { + if (Client1.connected()) { + Client1.println(F("closing connection")); + Client1.stop(); + tcpMode = false; + Serial.println(F("M TCP connection closed")); + } else { + Serial.println(F("M TCP not connected")); + } +} +#endif + + + +void updateEEPROM(int &address, byte value) { + if( EEPROM.read(address) != value){ + EEPROM.write(address, value); + } + address++; +} + + +void updateEEPROMSlot(int &address, char cmd, int v1, int v2, int v3, int v4) { + updateEEPROM(address, cmd); // I / A + updateEEPROM(address, v1 & 0xff); + updateEEPROM(address, v1 >> 8); + updateEEPROM(address, v2 & 0xff); + updateEEPROM(address, v2 >> 8); + updateEEPROM(address, v3 & 0xff); + updateEEPROM(address, v3 >> 8); + updateEEPROM(address, v4 & 0xff); + updateEEPROM(address, v4 >> 8); +} + + +void saveToEEPROMCmd() { + int address = 0; + uint8_t slots = 1; + updateEEPROM(address, 'C'); + updateEEPROM(address, 'f'); + updateEEPROM(address, 'g'); + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) + if (activePin[pinIndex] > 0) slots ++; + updateEEPROM(address, slots); // number of defined pins + intervall definition + updateEEPROMSlot(address, 'I', (uint16_t)(intervalMin / 1000), (uint16_t)(intervalMax / 1000), + (uint16_t)(intervalSml / 1000), (uint16_t)countMin); + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) + if (activePin[pinIndex] > 0) + updateEEPROMSlot(address, 'A', (uint16_t)activePin[pinIndex], (uint16_t)(pulseLevel[pinIndex] ? 3:2), + (uint16_t)pullup[pinIndex], (uint16_t)pulseWidthMin[pinIndex]); +#ifdef ESP8266 + EEPROM.commit(); +#endif + Serial.print(F("config saved, ")); + Serial.print(slots); + Serial.print(F(", ")); + Serial.println(address); +} + + +void readFromEEPROM() { + int address = 0; + Output->println(); + Output->print(F("M EEPROM Config: ")); + Output->print((char) EEPROM.read(0)); + Output->print((char) EEPROM.read(1)); + Output->print((char) EEPROM.read(2)); + Output->print(F(" Slots: ")); + Output->print((int) EEPROM.read(3)); + Output->println(); + if (EEPROM.read(address) != 'C' || EEPROM.read(address+1) != 'f' || EEPROM.read(address+2) != 'g') { + Output->println(F("M no config in EEPROM")); + return; + } + address = 3; + uint8_t slots = EEPROM.read(address++); + if (slots > MAX_PIN + 1) { + Output->println(F("M illegal config in EEPROM")); + return; + } + uint16_t v1, v2, v3, v4; + char cmd; + for (uint8_t slot=0; slot < slots; slot++) { + cmd = EEPROM.read(address); + v1 = EEPROM.read(address+1) + (((uint16_t)EEPROM.read(address+2)) << 8); + v2 = EEPROM.read(address+3) + (((uint16_t)EEPROM.read(address+4)) << 8); + v3 = EEPROM.read(address+5) + (((uint16_t)EEPROM.read(address+6)) << 8); + v4 = EEPROM.read(address+7) + (((uint16_t)EEPROM.read(address+8)) << 8); + address = address + 9; + Output->print(F("M Slot: ")); + Output->print(cmd); + Output->print(F(" ")); + Output->print(v1); + Output->print(F(",")); + Output->print(v2); + Output->print(F(",")); + Output->print(v3); + Output->print(F(",")); + Output->print(v4); + Output->println(); + } +} + + +void restoreFromEEPROM() { + int address = 0; + if (EEPROM.read(address) != 'C' || EEPROM.read(address+1) != 'f' || EEPROM.read(address+2) != 'g') { + Serial.println(F("M no config in EEPROM")); + return; + } + address = 3; + uint8_t slots = EEPROM.read(address++); + if (slots > MAX_PIN + 1 || slots < 1) { + Serial.println(F("M illegal config in EEPROM")); + return; + } + Serial.println(F("M restoring config from EEPROM")); + char cmd; + for (uint8_t slot=0; slot < slots; slot++) { + cmd = EEPROM.read(address); + commandData[0] = EEPROM.read(address+1) + (((uint16_t)EEPROM.read(address+2)) << 8); + commandData[1] = EEPROM.read(address+3) + (((uint16_t)EEPROM.read(address+4)) << 8); + commandData[2] = EEPROM.read(address+5) + (((uint16_t)EEPROM.read(address+6)) << 8); + commandData[3] = EEPROM.read(address+7) + (((uint16_t)EEPROM.read(address+8)) << 8); + address = address + 9; + commandDataPointer = 4; + if (cmd == 'I') intervalCmd(commandData, commandDataPointer); + if (cmd == 'A') addCmd(commandData, commandDataPointer); + } + commandDataPointer = 0; + value = 0; + for (uint8_t i=0; i < MAX_INPUT_NUM; i++) + commandData[i] = 0; + +} + + +void handleInput(char c) { + if (c == ',') { // Komma input, last value is finished + if (commandDataPointer < (MAX_INPUT_NUM - 1)) { + commandData[commandDataPointer++] = value; + value = 0; + } + } + else if ('0' <= c && c <= '9') { // digit input + value = 10 * value + c - '0'; + } + else if ('a' <= c && c <= 'z') { // letter input is command + + if (devVerbose > 0) { + Serial.print(F("D got ")); + for (short v = 0; v <= commandDataPointer; v++) { + if (v > 0) Serial.print(F(",")); + Serial.print(commandData[v]); + } + Serial.print(c); + Serial.print(F(" size ")); + Serial.print(commandDataPointer+1); + Serial.println(); + } + + switch (c) { + case 'a': + commandData[commandDataPointer] = value; + addCmd(commandData, commandDataPointer+1); + break; + case 'd': + commandData[commandDataPointer] = value; + removeCmd(commandData, commandDataPointer+1); + break; + case 'i': + commandData[commandDataPointer] = value; + intervalCmd(commandData, commandDataPointer+1); + break; + case 'r': + initialize(); + break; + case 's': + showCmd(); + break; + case 'v': + if (value < 255) { + devVerbose = value; + Output->print(F("M devVerbose set to ")); + Output->println(value); + } else { + Output->println(F("M illegal value passed for devVerbose")); + } + break; + case 'h': + helloCmd(); + break; + case 'e': + saveToEEPROMCmd(); + break; + case 'f': + // OTA flash from HTTP Server + break; +#ifdef ESP8266 + case 'q': + quitCmd(); + break; +#endif + case 'k': + commandData[commandDataPointer] = value; + keepAliveCmd(commandData, commandDataPointer+1); + break; + default: + break; + } + commandDataPointer = 0; + value = 0; + for (uint8_t i=0; i < MAX_INPUT_NUM; i++) + commandData[i] = 0; + //Serial.println(F("D End of command")); + } +} + +#ifdef debugCfg +/* do sample config so we don't need to configure pins after each reboot */ +void debugSetup() { + commandData[0] = 10; + commandData[1] = 20; + commandData[2] = 3; + commandData[3] = 0; + commandDataPointer = 4; + intervalCmd(commandData, commandDataPointer); + + commandData[0] = 1; // pin 1 + commandData[1] = 2; // falling + commandData[2] = 1; // pullup + commandData[3] = 30; // min Length + commandDataPointer = 4; + addCmd(commandData, commandDataPointer); + + commandData[0] = 2; // pin 2 + addCmd(commandData, commandDataPointer); + +/* + commandData[0] = 5; // pin 5 + addCmd(commandData, commandDataPointer); + + commandData[0] = 6; // pin 6 + addCmd(commandData, commandDataPointer); +*/ +} +#endif + + +#ifdef debugPins +void debugPinChanges() { + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) { + short aPin = activePin[pinIndex]; + if (aPin > 0) { + uint8_t rPin = internalPins[pinIndex]; + uint8_t pinState = digitalRead(rPin); + + if (pinState != lastState[pinIndex]) { + lastState[pinIndex] = pinState; + Output->print(F("M pin ")); + Output->print(aPin); + Output->print(F(" ( internal ")); + Output->print(rPin); + Output->print(F(" ) ")); + Output->print(F(" to ")); + Output->print(pinState); +#ifdef pulseHistory + Output->print(F(" histIdx ")); + Output->print(histIndex); +#endif + Output->print(F(" count ")); + Output->print(counter[pinIndex]); + Output->print(F(" reject ")); + Output->print(rejectCounter[pinIndex]); + Output->println(); + } + } + } +} +#endif + + +#ifdef ESP8266 +void connectWiFi() { + Client1Connected = false; + Client2Connected = false; + + // Connect to WiFi network + WiFi.mode(WIFI_STA); + delay (1000); + if (WiFi.status() != WL_CONNECTED) { + Serial.print(F("M Connecting WiFi to ")); + Serial.println(ssid); + WiFi.begin(ssid, password); // authenticate + while (WiFi.status() != WL_CONNECTED) { + Serial.print(F("M Status is ")); + switch (WiFi.status()) { + case WL_CONNECT_FAILED: + Serial.println(F("Connect Failed")); + break; + case WL_CONNECTION_LOST: + Serial.println(F("Connection Lost")); + break; + case WL_DISCONNECTED: + Serial.println(F("Disconnected")); + break; + case WL_CONNECTED: + Serial.println(F("Connected")); + break; + default: + Serial.println(WiFi.status()); + } + delay(1000); + } + Serial.println(); + Serial.print(F("M WiFi connected to ")); + Serial.println(WiFi.SSID()); + } else { + Serial.print(F("M WiFi already connected to ")); + Serial.println(WiFi.SSID()); + } + + // Start the server + Server.begin(); + Serial.println(F("M Server started")); + + // Print the IP address + Serial.print(F("M Use this IP: ")); + Serial.println(WiFi.localIP()); +} + + +void handleConnections() { + IPAddress remote; + uint32_t now = millis(); + + if (Client1Connected) { + if((long)(now - expectK) >= 0) { + Serial.println(F("M no keepalive from Client - disconnecting")); + Client1.stop(); + } + } + if (Client1.available()) { + handleInput(Client1.read()); + //Serial.println(F("M new Input over TCP")); + } + if (Client1.connected()) { + Client2 = Server.available(); + if (Client2) { + Client2.println(F("connection already busy")); + remote = Client2.remoteIP(); + Client2.stop(); + Serial.print(F("M second connection from ")); + Serial.print(remote); + Serial.println(F(" rejected")); + } + } else { + if (Client1Connected) { // client used to be connected, now disconnected + Client1Connected = false; + Output = &Serial; + Serial.println(F("M connection to client lost")); + } + Client1 = Server.available(); + if (Client1) { // accepting new connection + remote = Client1.remoteIP(); + Serial.print(F("M new connection from ")); + Serial.print(remote); + Serial.println(F(" accepted")); + Client1Connected = true; + Output = &Client1; + expectK = now + 600000; // max 10 Minutes (to be checked on Fhem module side as well + helloCmd(); // say hello to client + } + } +} +#endif + + +void handleTime() { + uint32_t now = millis(); + if (now < lastMillis) millisWraps++; + lastMillis = now; +} + + +void initPinVars(short pinIndex, uint32_t now) { + activePin[pinIndex] = -1; // inactive (-1) + initialized[pinIndex] = false; // no pulse seen yet + pulseWidthMin[pinIndex] = 0; // min pulse length + counter[pinIndex] = 0; // counter to 0 + counterIgn[pinIndex] = 0; + lastCount[pinIndex] = 0; + rejectCounter[pinIndex] = 0; + lastRejCount[pinIndex] = 0; + intervalStart[pinIndex] = now; // time vars + intervalEnd[pinIndex] = now; + lastChange[pinIndex] = now; + lastReport[pinIndex] = now; + reportSequence[pinIndex] = 0; + uint8_t level = digitalRead(internalPins[pinIndex]); + lastLevel[pinIndex] = level; +#ifdef debugPins + lastState[pinIndex] = level; // for debug output +#endif +} + + +void initialize() { + uint32_t now = millis(); + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) { + initPinVars(pinIndex, now); + } + timeNextReport = now + intervalMin; // time for first output + devVerbose = 0; +#ifndef ESP8266 + for (uint8_t port=0; port <= 2; port++) { + PCintLast[port] = *portInputRegister(port+2); // current pin states at port for PCInt handler + } +#endif +#ifdef debugCfg + debugSetup(); +#endif + restoreFromEEPROM(); + bootTime = millis(); // with boot / reset time + bootWraps = millisWraps; +#ifdef ESP8266 + expectK = now + 600000; // max 10 Minutes (to be checked on Fhem module side as well +#endif +} + + +void setup() { + Serial.begin(SERIAL_SPEED); // initialize serial +#ifdef ESP8266 + EEPROM.begin(100); +#endif + delay (500); + interrupts(); + Serial.println(); + Output = &Serial; + millisWraps = 0; + lastMillis = millis(); + initialize(); + helloCmd(); // started message to serial +#ifdef ESP8266 + connectWiFi(); +#endif +} + + +/* + Main Loop + checks if report should be called because timeNextReport is reached + or lastReport for one pin is older than intervalMax + timeNextReport is only set here (and when interval is changed / at setup) +*/ +void loop() { + handleTime(); + if (Serial.available()) { + handleInput(Serial.read()); + } +#ifdef ESP8266 + handleConnections(); +#endif + +#ifdef debugPins + if (devVerbose >= 10) { + debugPinChanges(); + } +#endif + + if (reportDue()) { + report(); + } +} +