Compare commits

...

147 Commits

Author SHA1 Message Date
Gunnar Skjold
0f4848c872 Added missing dep 2020-04-07 20:56:49 +02:00
Gunnar Skjold
6911d203ca Merge pull request #56 from gskjold/dev-v1.2
Version 1.2
2020-04-07 20:53:39 +02:00
Gunnar Skjold
e96b5bbf1b Changes during testing 2020-03-30 21:14:58 +02:00
Gunnar Skjold
8457db50f6 Merge branch 'master' into dev-v1.2 2020-03-30 20:12:13 +02:00
Gunnar Skjold
279c5f8321 Fixed actions script 2020-03-30 07:28:02 +02:00
Gunnar Skjold
889b9153fa Increased limit for ArduinoJson positive exponentiation 2020-03-30 07:05:34 +02:00
Gunnar Skjold
0de1d0bb6f Changed accumulated values for Kaifa 2020-03-30 07:02:42 +02:00
Gunnar Skjold
bf13965a9e Various changes during testing 2020-03-26 20:55:23 +01:00
Gunnar Skjold
7b52efd332 Fix missing release version on files 2020-03-25 20:37:15 +01:00
Gunnar Skjold
c936f605d6 Fixes #45 2020-03-25 20:21:39 +01:00
Gunnar Skjold
9d0ceb9ca8 Fixes problem with release 2020-03-25 20:07:23 +01:00
Gunnar Skjold
b33273e3cc Fixes #47 2020-03-25 20:06:42 +01:00
Gunnar Skjold
d9b45d037b Some changes during testing 2020-03-24 21:19:09 +01:00
Gunnar Skjold
8c75a9530e Default config for ESP32 2020-03-24 20:26:13 +01:00
Gunnar Skjold
73d00f786a Added remote debugging 2020-03-24 20:17:44 +01:00
Gunnar Skjold
ab016fff93 Merge pull request #54 from Allram/master
Increased MQTT buffer to work with Aidon 6525 meters
2020-03-24 20:11:00 +01:00
Vegard Fladby
a215aa7766 Increased MQTT buffer to work with Aidon 6525 meters 2020-03-24 19:49:40 +01:00
Gunnar Skjold
d747c84a14 Added DNS to static IP config. Added hostname to config. Added mDNS 2020-03-22 15:08:17 +01:00
Gunnar Skjold
26634f96b0 Added firmware upload from UI 2020-03-22 11:54:27 +01:00
Gunnar Skjold
97669cf4ad When using raw payload with MQTT, only update if changed 2020-03-10 18:57:25 +01:00
Gunnar Skjold
e12980db11 Added option to send data as raw values to MQTT 2020-03-10 18:43:18 +01:00
Gunnar Skjold
732639814b Reduce resolution of "up" in JSON from millis to seconds 2020-03-10 17:46:18 +01:00
Gunnar Skjold
c07c2e66d6 Fixed uptime rollover in UI 2020-03-08 19:47:47 +01:00
Gunnar Skjold
9b70802450 Fixed conversion of date and time from meter to account for CET/CEST 2020-03-08 18:37:10 +01:00
Gunnar Skjold
30d73c3a6e Updated documentation 2020-03-01 13:24:06 +01:00
Gunnar Skjold
bd905c3595 Merge pull request #44 from gskjold/dev-v1.1.0
Dev v1.1.0
2020-03-01 12:56:12 +01:00
Gunnar Skjold
1a2e70b1fb Merge pull request #42 from ArnieO/dev-v1.1.0
Dev v1.1.0 Optional ESP8266 Vcc calibration factor in *.ini file
2020-03-01 12:53:56 +01:00
Gunnar Skjold
d6da7b2715 Merge branch 'dev-v1.1.0' of github.com:gskjold/AmsToMqttBridge into dev-v1.1.0 2020-03-01 09:41:18 +01:00
Gunnar Skjold
059a430f9a Fixed problem with AP mode with INVALID_BUTTON_PIN set 2020-03-01 09:39:58 +01:00
Gunnar Skjold
8ade50c2a6 Initialize all meter data to 0. Removed calculations for i2 2020-02-26 09:06:29 +01:00
Gunnar Skjold
5b94d8ff61 Added calculated value for L2 current when missing from Aidon 2020-02-25 14:08:04 +01:00
ArnieO
232b9c279d Optional Vcc calibration factor defined in *.ino 2020-02-24 20:05:34 +01:00
ArnieO
9b6a6af6ec Merge remote-tracking branch 'upstream/dev-v1.1.0' into dev-v1.1.0 2020-02-24 13:32:26 +01:00
Gunnar Skjold
9671e1eba3 Fixed bug where UI showed stalled HAN when exporting power. Also, maybe fixed issue with Vcc precision in UI? 2020-02-24 12:01:51 +01:00
Gunnar Skjold
78e531a7e9 Changed term for production and consumption when local production is defined 2020-02-24 07:47:39 +01:00
Gunnar Skjold
478d63505d Allow compiling when RGB is not defined 2020-02-24 07:47:12 +01:00
Gunnar Skjold
d8dfaaa730 Version hardening 2020-02-24 07:46:48 +01:00
Gunnar Skjold
f311b70b37 Merge branch 'master' into dev-v1.1.0 2020-02-24 07:17:48 +01:00
Gunnar Skjold
52bc2b14c9 Some changes after testing 2020-02-23 20:31:10 +01:00
ArnieO
2ddfc16d6a Updated comment for rgbled() function 2020-02-23 17:12:26 +01:00
Gunnar Skjold
51ab4a7f07 Reducing precision on temperature and vcc in json to reduce length 2020-02-23 11:34:25 +01:00
Gunnar Skjold
e90a30bfde Implemented blinking for red LED on error 2020-02-22 17:23:56 +01:00
Gunnar Skjold
a63e6962d3 Merge pull request #38 from ArnieO/dev-v1.1.0
Added code for optional RGB LED
2020-02-22 16:42:19 +01:00
Gunnar Skjold
951ccf7de5 Merge branch 'dev-v1.1.0' into dev-v1.1.0 2020-02-22 16:42:04 +01:00
Gunnar Skjold
001e3376df Merge pull request #39 from gskjold/dev-v1.1.0-mqttraw
Merged code preparations for other MQTT payload formats
2020-02-22 16:37:29 +01:00
Gunnar Skjold
9e4bf93f0a Some changes to reduce dlms read errors 2020-02-22 12:29:04 +01:00
ArnieO
e5ac823f69 Changed mqtt buffer to 384, JSON buffer to <512> 2020-02-21 23:29:01 +01:00
Gunnar Skjold
73fd228e2f Merge branch 'dev-v1.1.0' into dev-v1.1.0-mqttraw 2020-02-21 20:58:17 +01:00
Gunnar Skjold
fdac8f88af Minor optimization 2020-02-21 20:52:55 +01:00
Gunnar Skjold
9c8552869c Preparations for selectable MQTT payload format 2020-02-21 20:51:55 +01:00
ArnieO
be75b013c0 Added code for RGB LED 2020-02-21 19:13:44 +01:00
ArnieO
79274e490d Added code for RGB LED 2020-02-21 18:53:05 +01:00
ArnieO
47293eebe4 Added code for RGB LED 2020-02-21 18:38:28 +01:00
Gunnar Skjold
90b62638ed Dependency hardening 2020-02-20 20:36:12 +01:00
Gunnar Skjold
78e766156d Minimizing calls to web server 2020-02-18 21:33:41 +01:00
Gunnar Skjold
4b32af69a7 Fixed typo 2020-02-18 07:37:42 +01:00
Gunnar Skjold
916b5550d9 Fixed typo 2020-02-18 07:25:10 +01:00
Gunnar Skjold
48016240f9 Some cleanup after testing with ESP32 2020-02-17 20:06:52 +01:00
Gunnar Skjold
518b408205 Minor changes to fix build 2020-02-17 17:23:18 +01:00
Gunnar Skjold
73a0359597 Minor changes to fix build 2020-02-17 17:21:34 +01:00
Gunnar Skjold
bbe82f9cdc Added a small delay that helped smooth the voltage on a HAN powered device. No more sudden reboots 2020-02-16 21:45:58 +01:00
Gunnar Skjold
4786735d4c Support older config versions. Fixed css for AP mode. Some cleanup and changes to preserve power 2020-02-16 20:09:29 +01:00
Gunnar Skjold
227eb7b6ff Now using external base64 lib. Also updated some previously commited errors 2020-02-16 16:03:01 +01:00
Gunnar Skjold
00edd94033 Fixed some bugs from late night coding 2020-02-16 15:46:01 +01:00
Gunnar Skjold
ccd818e1ab Merge branch 'master' into dev-v1.1.0 2020-02-16 15:28:47 +01:00
Gunnar Skjold
fc42fb22d8 Merge pull request #33 from gskjold/dev-v1.0.1
Dev v1.0.1
2020-02-16 14:49:36 +01:00
Gunnar Skjold
f6066fbbf3 Cleanup and fix bugs found during testing 2020-02-15 22:13:04 +01:00
Gunnar Skjold
9c09740a41 Production graph and fixed vcc value 2020-02-15 21:04:18 +01:00
Gunnar Skjold
4e24e2949a Updated featheresp32 config to use Serial2 for Mbus 2020-02-15 18:01:10 +01:00
Gunnar Skjold
eff00f1fe0 Only show temp if sensor is attached. Added common functions to get temp and vcc 2020-02-14 21:48:03 +01:00
Gunnar Skjold
f484f3eb0e Merge branch 'dev-v1.0.1' into dev-v1.1.0 2020-02-14 20:19:15 +01:00
Gunnar Skjold
b2174dd521 If debug mode and HW_ROARFRED, use software serial to set upp RX for HAN with 2400 and TX for debugging with 115200 2020-02-14 20:14:30 +01:00
Gunnar Skjold
fe79a96827 Added change to allow auto modem sleep 2020-02-14 19:52:15 +01:00
Gunnar Skjold
517a40b0a6 Finalized new configuration menu and moved AP button trigger from setup to loop 2020-02-14 19:49:25 +01:00
Gunnar Skjold
75f3c8c592 Merge branch 'dev-v1.0.1' into dev-v1.1.0 2020-02-14 16:07:54 +01:00
Gunnar Skjold
554cc7c023 Added date and time from meter as rtc in json 2020-02-14 16:03:52 +01:00
Gunnar Skjold
6d0c722c98 Using kwh and kvarh as standard for accumulated numbers from kamstrup 2020-02-14 12:25:40 +01:00
Gunnar Skjold
d2f93c07bd Not sure if this does anything, but increased json and mqtt limits to see if Kamstrup list 3 is received 2020-02-13 20:50:13 +01:00
Gunnar Skjold
d63516fd49 Deleted autosave 2020-02-13 20:41:08 +01:00
Gunnar Skjold
c114b777c7 Minor changes to UI 2020-02-13 20:40:33 +01:00
Gunnar Skjold
a06729b535 Bugfix for previous commit 2020-02-12 20:11:55 +01:00
Gunnar Skjold
0ea21991ea Continued work with v1.1.0
- Merge branch 'low_power' into dev-v1.1.0
- Corrected accumulated import/export from Aidon
- Added VCC and RSSI to MQTT messages

Changes in UI:
- New top navbar
- Show VCC and WiFi information
- Show MQTT error messages
- Show ESP, HAN, WiFi and MQTT status badge
- Show accumulated Import/export
2020-02-12 19:55:06 +01:00
Gunnar Skjold
1994f16b82 Merge branch 'dev-v1.0.1' into dev-v1.1.0 2020-02-12 16:41:04 +01:00
Gunnar Skjold
b6efae656f Expose export power in JSON 2020-02-12 16:40:51 +01:00
Gunnar Skjold
fa0f93cefe Switched to reactive import for Q 2020-02-12 13:25:36 +01:00
Gunnar Skjold
058dc658c1 Switched to reactive import for Q 2020-02-12 13:16:49 +01:00
Gunnar Skjold
f6df84bf9a Auto detect meter type 2020-02-11 18:40:38 +01:00
Gunnar Skjold
4b9cb27e58 Disable web security if AP mode is triggered 2020-02-11 17:32:18 +01:00
Gunnar Skjold
5f14517258 Minor changes after testing MQTT reconnect 2020-02-11 17:25:52 +01:00
Gunnar Skjold
ad820fff01 Allow other services to get resources while trying to connect to mqtt 2020-02-11 11:04:37 +01:00
Gunnar Skjold
6d3d4adc7e Merge branch 'master' into low_power 2020-02-09 13:45:27 +01:00
Gunnar Skjold
99a23b3bf7 Cropped webui image 2020-02-09 13:19:48 +01:00
Gunnar Skjold
15e861ce70 Added AP mode pin for both Wemos D1 and D32 2020-02-09 12:18:08 +01:00
Gunnar Skjold
fdfadb9bf9 Updated Aidon parser with support for 3 phase IT/TT system 2020-02-08 18:23:56 +01:00
Gunnar Skjold
388d35c390 Updated documentation 2020-02-07 23:12:27 +01:00
Gunnar Skjold
e466a45b5c Fixed missing check in checkbox when configuration opened in firefox 2020-02-07 22:33:55 +01:00
Gunnar Skjold
2e7b9e8e43 Fixed missing check in checkbox when configuration opened in firefox 2020-02-07 22:26:17 +01:00
Gunnar Skjold
deb2148e9a Software serial for development boards. Added a few extra boards 2020-02-07 17:27:58 +01:00
Gunnar Skjold
27cb5dd833 Trying a large sleep when cap is not charged 2020-02-06 19:15:06 +01:00
Gunnar Skjold
7e6ac860fd Merge branch 'master' into low_power 2020-02-06 19:02:14 +01:00
Gunnar Skjold
3a7f6078f4 Use builtin LED for Lolin D32 2020-02-06 19:02:05 +01:00
Gunnar Skjold
dbc551a41d Moved configuration object to main file and load the config before start. Fixed issue where partiy is switched for Kamstrup half way when in debug mode 2020-02-05 20:43:37 +01:00
Gunnar Skjold
9bb596aab1 Reverted what was intended as support for earlier configuration versions. 2020-02-02 08:15:49 +01:00
Gunnar Skjold
4a3d22e75c Fixed script to generate webroot header files 2020-02-01 09:57:43 +01:00
Gunnar Skjold
d68ffc827d Trigger build on changes in scripts and web 2020-02-01 09:56:14 +01:00
Gunnar Skjold
20c62a63cf Fixed script to generate webroot header files 2020-02-01 09:54:58 +01:00
Gunnar Skjold
8f85b43fc3 Made MQTT optional 2020-02-01 09:52:37 +01:00
Gunnar Skjold
57d8603790 Added option for electric distribution system (230/400) 2020-01-31 21:30:20 +01:00
Gunnar Skjold
fc1f1554d8 Extracted webroot into usable files 2020-01-31 21:08:27 +01:00
Gunnar Skjold
70ed0b538a Merge branch 'master' into low_power 2020-01-29 21:00:10 +01:00
Gunnar Skjold
ced6f125fd Trigger build on changing ini file 2020-01-29 20:58:09 +01:00
Gunnar Skjold
f76cacf835 Trigger build on changing ini file 2020-01-29 20:56:31 +01:00
Gunnar Skjold
a8205edae9 Fixed build after merge 2020-01-29 20:53:52 +01:00
Gunnar Skjold
0a317450f6 Merge branch 'master' into low_power 2020-01-29 20:51:28 +01:00
Gunnar Skjold
e9ed6d825a Merge pull request #14 from gskjold/issue-9
New web interface that is always available
2020-01-29 20:50:26 +01:00
Gunnar Skjold
a6751c787c Merge branch 'issue-9' into low_power 2020-01-29 20:39:07 +01:00
Gunnar Skjold
378dbbcc99 Only show phases with power, and always deliver volts and amps to frontend 2020-01-29 20:38:53 +01:00
Gunnar Skjold
aed56b0b56 Merge branch 'issue-9' into low_power 2020-01-28 21:19:01 +01:00
Gunnar Skjold
36b37eb2a6 Calculate max power when receiving json from reader 2020-01-28 21:18:48 +01:00
Gunnar Skjold
550b216ba6 Merge branch 'issue-9' into low_power 2020-01-28 21:12:00 +01:00
Gunnar Skjold
7e4047096b Stripped away bootstrap css and created a smaller boot.css as replacement. Load real bootstrap from CDN. Added HTML only (non-js) view of data 2020-01-28 21:10:54 +01:00
Gunnar Skjold
7fdedd8bcf Forgot some changes 2020-01-28 19:20:50 +01:00
Gunnar Skjold
f693869bd4 Merge branch 'master' into issue-9 2020-01-28 19:18:13 +01:00
Gunnar Skjold
3312f88804 Some changes to make it compile for both ESP8266 and ESP32 2020-01-28 18:17:20 +01:00
Gunnar Skjold
50faaca559 Moved Base64 lib 2020-01-24 14:54:42 +01:00
Gunnar Skjold
bf44849ecf Added base64 lib directly into this project to fix build problem with esp32 2020-01-24 14:52:14 +01:00
Gunnar Skjold
4bfd9dee9a Merge pull request #10 from gskjold/issue-6
Make the configuration page available all the time
2020-01-24 14:47:29 +01:00
Gunnar Skjold
32d58fdd71 Stripped jquery and full bootstrap from image 2020-01-23 19:45:29 +01:00
Gunnar Skjold
aef78962fb Some modifications to reduce power consumption i AP mode 2020-01-23 18:47:02 +01:00
Gunnar Skjold
8ee713b616 Included some code from @dakarym to support the self powered board for testing 2020-01-22 15:26:07 +01:00
Gunnar Skjold
0fa3e3585a Finalized live update of meter data in web gui 2020-01-19 21:37:56 +01:00
Gunnar Skjold
a88291c0f0 Implemented new user interface and prepared for live view 2020-01-17 21:49:36 +01:00
Gunnar Skjold
ac1609bfac Merge branch 'issue-6' into issue-9 2020-01-17 19:17:44 +01:00
Gunnar Skjold
22d5839d60 Added HTML, CSS and JS for new user interface 2020-01-17 14:41:02 +01:00
Gunnar Skjold
8f0932f1f1 Added configurable basic auth to web server 2020-01-15 21:22:06 +01:00
Gunnar Skjold
aeb161455e Enable config page on runtime with populated form 2020-01-15 20:17:06 +01:00
Gunnar Skjold
568180d7b2 Update release.yml 2019-12-12 19:49:22 +01:00
Gunnar Skjold
0d99da6c9a Update build.yml 2019-12-12 19:48:22 +01:00
Gunnar Skjold
843cea7626 Updated readme 2019-12-12 19:39:00 +01:00
Gunnar Skjold
c82a2a1d4b Added adafruit esp32 feather as a target 2019-12-12 19:32:20 +01:00
Gunnar Skjold
86dd8c1b87 Updated readme 2019-12-12 19:25:32 +01:00
Gunnar Skjold
bdc0c03a76 Restructuring and cleaning out unnecessary files 2019-12-12 19:25:10 +01:00
Gunnar Skjold
5680b5a501 Restructuring and cleaning out unnecessary files 2019-12-12 19:23:15 +01:00
Gunnar Skjold
4cd1fa87d1 Making watt, amperage and volt the standard unit for all meters 2019-12-11 18:20:21 +01:00
Gunnar Skjold
1579562612 Set correct parity for Kamstrup 2019-12-11 14:40:08 +01:00
Gunnar Skjold
2713b5adae Updated readme with release and flashing section 2019-11-22 21:08:30 +01:00
Gunnar Skjold
c20b07bfc2 Add release version to binaries 2019-11-22 20:36:42 +01:00
321 changed files with 7531 additions and 228571 deletions

View File

@@ -2,8 +2,14 @@ name: Build
on:
push:
paths:
- src/**
- lib/**
- scripts/**
- web/**
- platformio.ini
branches:
- '*'
- master
tags:
- '*'
- '!v*.*.*'
@@ -34,6 +40,8 @@ jobs:
run: |
python -m pip install --upgrade pip
pip install -U platformio
- name: Configure build targets
run: echo "[platformio]\ndefault_envs = hw1esp12e, esp12e, esp32" > platformio-user.ini
- name: PlatformIO lib install
run: pio lib install
- name: PlatformIO run

View File

@@ -14,6 +14,16 @@ jobs:
steps:
- name: Check out code from repo
uses: actions/checkout@v1
- name: Get release version for filenames
id: release_tag
env:
GITHUB_REF: ${{ github.ref }}
run: echo ::set-output name=tag::$(echo ${GITHUB_REF:11})
- name: Get release version for code
id: release_tag
env:
GITHUB_REF: ${{ github.ref }}
run: echo ::set-env name=GITHUB_TAG::$(echo ${GITHUB_REF##*/})
- name: Cache Python dependencies
uses: actions/cache@v1
with:
@@ -46,17 +56,8 @@ jobs:
release_name: Release ${{ github.ref }}
draft: false
prerelease: false
- name: Upload esp12e binary to release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: .pio/build/esp12e/firmware.bin
asset_name: ams2mqtt-esp12e-${{ steps.release_tag.outputs.tag }}.bin
asset_content_type: application/octet-stream
- name: Upload hw1esp12e binary to release
uses: actions/upload-release-asset@v1.0.1
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
@@ -64,3 +65,48 @@ jobs:
asset_path: .pio/build/hw1esp12e/firmware.bin
asset_name: ams2mqtt-hw1esp12e-${{ steps.release_tag.outputs.tag }}.bin
asset_content_type: application/octet-stream
- name: Upload esp12e binary to release
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: .pio/build/esp12e/firmware.bin
asset_name: ams2mqtt-esp12e-${{ steps.release_tag.outputs.tag }}.bin
asset_content_type: application/octet-stream
- name: Upload d1mini binary to release
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: .pio/build/d1mini/firmware.bin
asset_name: ams2mqtt-d1mini-${{ steps.release_tag.outputs.tag }}.bin
asset_content_type: application/octet-stream
- name: Upload esp32 binary to release
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: .pio/build/esp32/firmware.bin
asset_name: ams2mqtt-esp32-${{ steps.release_tag.outputs.tag }}.bin
asset_content_type: application/octet-stream
- name: Upload lolind32 binary to release
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: .pio/build/lolind32/firmware.bin
asset_name: ams2mqtt-lolind32-${{ steps.release_tag.outputs.tag }}.bin
asset_content_type: application/octet-stream
- name: Upload featheresp32 binary to release
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: .pio/build/featheresp32/firmware.bin
asset_name: ams2mqtt-featheresp32-${{ steps.release_tag.outputs.tag }}.bin
asset_content_type: application/octet-stream

5
.gitignore vendored
View File

@@ -6,4 +6,7 @@
*.sw[op]
.vscode
.pio
platformio-user.ini
platformio-user.ini
/src/version.h
/src/web/root
/src/AmsToMqttBridge.ino.cpp

View File

@@ -1,371 +0,0 @@
/*
Name: AmsToMqttBridge.ino
Created: 3/13/2018 7:40:28 PM
Author: roarf
*/
//#define HAS_DALLAS_TEMP_SENSOR 1 // Set to zero if Dallas one wire temp sensor is not present
//#define IS_CUSTOM_AMS_BOARD 1 // Set to zero if using NodeMCU or board not designed by Roar Fredriksen
#include <ArduinoJson.h>
#include <MQTT.h>
#if HAS_DALLAS_TEMP_SENSOR
#include <DallasTemperature.h>
#include <OneWire.h>
#endif
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32)
#include <WiFi.h>
#endif
#include "HanConfigAp.h"
#include "HanReader.h"
#include "HanToJson.h"
#define WIFI_CONNECTION_TIMEOUT 30000;
#if IS_CUSTOM_AMS_BOARD
#define LED_PIN 2 // The blue on-board LED of the ESP8266 custom AMS board
#define LED_ACTIVE_HIGH 0
#define AP_BUTTON_PIN 0
#else
#define LED_PIN LED_BUILTIN
#define LED_ACTIVE_HIGH 1
#define AP_BUTTON_PIN INVALID_BUTTON_PIN
#endif
#if HAS_DALLAS_TEMP_SENSOR
#define TEMP_SENSOR_PIN 5 // Temperature sensor connected to GPIO5
OneWire oneWire(TEMP_SENSOR_PIN);
DallasTemperature tempSensor(&oneWire);
#endif
// Object used to boot as Access Point
HanConfigAp ap;
// WiFi client and MQTT client
WiFiClient *client;
MQTTClient mqtt(384);
// Object used for debugging
HardwareSerial* debugger = NULL;
// The HAN Port reader, used to read serial data and decode DLMS
HanReader hanReader;
// the setup function runs once when you press reset or power the board
void setup()
{
// Uncomment to debug over the same port as used for HAN communication
//debugger = &Serial;
if (debugger) {
// Setup serial port for debugging
debugger->begin(2400, SERIAL_8E1);
//debugger->begin(115200);
while (!debugger);
debugger->println("");
debugger->println("Started...");
}
// Flash the LED, to indicate we can boot as AP now
pinMode(LED_PIN, OUTPUT);
led_on();
delay(1000);
// Initialize the AP
ap.setup(AP_BUTTON_PIN, debugger);
led_off();
if (!ap.isActivated)
{
setupWiFi();
// Configure uart for AMS data
Serial.begin(2400, SERIAL_8E1);
while (!Serial);
hanReader.setup(&Serial, debugger);
// Compensate for the known Kaifa bug
hanReader.compensateFor09HeaderBug = (ap.config.meterType == 1);
}
}
// the loop function runs over and over again until power down or reset
void loop()
{
// Only do normal stuff if we're not booted as AP
if (!ap.loop())
{
// Turn off the LED
led_off();
// allow the MQTT client some resources
mqtt.loop();
delay(10); // <- fixes some issues with WiFi stability
// Reconnect to WiFi and MQTT as needed
if (!mqtt.connected()) {
MQTT_connect();
}
else
{
// Read data from the HAN port
readHanPort();
}
}
else
{
// Continously flash the LED when AP mode
if (millis() / 1000 % 2 == 0) led_on();
else led_off();
}
}
void led_on()
{
#if LED_ACTIVE_HIGH
digitalWrite(LED_PIN, HIGH);
#else
digitalWrite(LED_PIN, LOW);
#endif
}
void led_off()
{
#if LED_ACTIVE_HIGH
digitalWrite(LED_PIN, LOW);
#else
digitalWrite(LED_PIN, HIGH);
#endif
}
void setupWiFi()
{
// Turn off AP
WiFi.enableAP(false);
// Connect to WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ap.config.ssid, ap.config.ssidPassword);
// Wait for WiFi connection
if (debugger) debugger->print("\nWaiting for WiFi to connect...");
while (WiFi.status() != WL_CONNECTED) {
if (debugger) debugger->print(".");
delay(500);
}
if (debugger) debugger->println(" connected");
client = new WiFiClient();
mqtt.begin(ap.config.mqtt, *client);
// Direct incoming MQTT messages
if (ap.config.mqttSubscribeTopic != 0 && strlen(ap.config.mqttSubscribeTopic) > 0) {
mqtt.subscribe(ap.config.mqttSubscribeTopic);
mqtt.onMessage(mqttMessageReceived);
}
// Notify everyone we're here!
sendMqttData("Connected!");
}
void mqttMessageReceived(String &topic, String &payload)
{
if (debugger) {
debugger->println("Incoming MQTT message:");
debugger->print("[");
debugger->print(topic);
debugger->print("] ");
debugger->println(payload);
}
// Do whatever needed here...
// Ideas could be to query for values or to initiate OTA firmware update
}
void readHanPort()
{
if (hanReader.read())
{
// Flash LED on, this shows us that data is received
led_on();
// Get the timestamp (as unix time) from the package
time_t time = hanReader.getPackageTime();
if (debugger) debugger->print("Time of the package is: ");
if (debugger) debugger->println(time);
// Define a json object to keep the data
StaticJsonDocument<500> json;
// Any generic useful info here
json["id"] = WiFi.macAddress();
json["up"] = millis();
json["t"] = time;
// Add a sub-structure to the json object,
// to keep the data from the meter itself
JsonObject data = json.createNestedObject("data");
#if HAS_DALLAS_TEMP_SENSOR
// Get the temperature too
tempSensor.requestTemperatures();
data["temp"] = tempSensor.getTempCByIndex(0);
#endif
hanToJson(data, ap.config.meterType, hanReader);
// Write the json to the debug port
if (debugger) {
debugger->print("Sending data to MQTT: ");
serializeJsonPretty(json, *debugger);
debugger->println();
}
// Make sure we have configured a publish topic
if (! ap.config.mqttPublishTopic == 0 || strlen(ap.config.mqttPublishTopic) == 0)
{
// Publish the json to the MQTT server
String msg;
serializeJson(json, msg);
mqtt.publish(ap.config.mqttPublishTopic, msg.c_str());
mqtt.loop();
}
// Flash LED off
led_off();
}
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect()
{
// Connect to WiFi access point.
if (debugger)
{
debugger->println();
debugger->println();
debugger->print("Connecting to WiFi network ");
debugger->println(ap.config.ssid);
}
if (WiFi.status() != WL_CONNECTED)
{
// Make one first attempt at connect, this seems to considerably speed up the first connection
WiFi.disconnect();
WiFi.begin(ap.config.ssid, ap.config.ssidPassword);
delay(1000);
}
// Wait for the WiFi connection to complete
long vTimeout = millis() + WIFI_CONNECTION_TIMEOUT;
while (WiFi.status() != WL_CONNECTED) {
delay(50);
if (debugger) debugger->print(".");
// If we timed out, disconnect and try again
if (vTimeout < millis())
{
if (debugger)
{
debugger->print("Timout during connect. WiFi status is: ");
debugger->println(WiFi.status());
}
WiFi.disconnect();
WiFi.begin(ap.config.ssid, ap.config.ssidPassword);
vTimeout = millis() + WIFI_CONNECTION_TIMEOUT;
}
yield();
}
if (debugger) {
debugger->println();
debugger->println("WiFi connected");
debugger->println("IP address: ");
debugger->println(WiFi.localIP());
debugger->print("\nconnecting to MQTT: ");
debugger->print(ap.config.mqtt);
debugger->print(", port: ");
debugger->print(ap.config.mqttPort);
debugger->println();
}
// Wait for the MQTT connection to complete
while (!mqtt.connected()) {
// Connect to a unsecure or secure MQTT server
if ((ap.config.mqttUser == 0 && mqtt.connect(ap.config.mqttClientID)) ||
(ap.config.mqttUser != 0 && mqtt.connect(ap.config.mqttClientID, ap.config.mqttUser, ap.config.mqttPass)))
{
if (debugger) debugger->println("\nSuccessfully connected to MQTT!");
// Subscribe to the chosen MQTT topic, if set in configuration
if (ap.config.mqttSubscribeTopic != 0 && strlen(ap.config.mqttSubscribeTopic) > 0)
{
mqtt.subscribe(ap.config.mqttSubscribeTopic);
if (debugger) debugger->printf(" Subscribing to [%s]\r\n", ap.config.mqttSubscribeTopic);
}
}
else
{
if (debugger)
{
debugger->print(".");
debugger->print("failed, ");
debugger->println(" trying again in 5 seconds");
}
// Wait 2 seconds before retrying
mqtt.disconnect();
delay(2000);
}
// Allow some resources for the WiFi connection
yield();
delay(2000);
}
}
// Send a simple string embedded in json over MQTT
void sendMqttData(String data)
{
// Make sure we have configured a publish topic
if (ap.config.mqttPublishTopic == 0 || strlen(ap.config.mqttPublishTopic) == 0)
return;
// Make sure we're connected
if (!client->connected() || !mqtt.connected()) {
MQTT_connect();
}
// Build a json with the message in a "data" attribute
StaticJsonDocument<500> json;
json["id"] = WiFi.macAddress();
json["up"] = millis();
json["data"] = data;
// Stringify the json
String msg;
serializeJson(json, msg);
// Send the json over MQTT
mqtt.publish(ap.config.mqttPublishTopic, msg.c_str());
if (debugger) debugger->print("sendMqttData: ");
if (debugger) debugger->println(data);
}

View File

@@ -1,31 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AmsToMqttBridge", "AmsToMqttBridge.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HanReader", "..\HanReader\HanReader.vcxitems", "{CD0F5364-923B-49E4-8BE5-EA7D8A60DF80}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
..\HanReader\HanReader.vcxitems*{c5f80730-f44f-4478-bdae-6634efc2ca88}*SharedItemsImports = 4
..\HanReader\HanReader.vcxitems*{cd0f5364-923b-49e4-8be5-ea7d8a60df80}*SharedItemsImports = 9
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5DFC14B6-4C33-4307-8BDA-C050F68A74F6}
EndGlobalSection
EndGlobal

View File

@@ -1,104 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{C5F80730-F44F-4478-BDAE-6634EFC2CA88}</ProjectGuid>
<RootNamespace>AmsToMqttBridge</RootNamespace>
<ProjectName>AmsToMqttBridge</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>
</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>
</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
<Import Project="..\HanReader\HanReader.vcxitems" Label="Shared" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(ProjectDir)..\AmsToMqttBridge;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\EEPROM;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WebServer\src;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\DNSServer\src;$(ProjectDir)..\HanReader\src;$(ProjectDir)..\..\..\..\..\..\..\..\..\Program Files (x86)\Arduino\libraries;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries;$(ProjectDir)..\..\..\..\..\..\..\Google Drive\Private\Elektronikk\Arduino\libraries;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\libb64;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\spiffs;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\variants\generic;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\lwip\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\xtensa-lx106-elf;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\lib\gcc\xtensa-lx106-elf\4.8.2\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<ForcedIncludeFiles>$(ProjectDir)__vm\.AmsToMqttBridge.vsarduino.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
<IgnoreStandardIncludePath>false</IgnoreStandardIncludePath>
<PreprocessorDefinitions>__ESP8266_ESp8266__;__ESP8266_ESP8266__;__ets__;ICACHE_FLASH;F_CPU=80000000L;LWIP_OPEN_SRC;ARDUINO=106012;ARDUINO_ESP8266_ESP01;ARDUINO_ARCH_ESP8266;ESP8266;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ProjectCapability Include="VisualMicro" />
</ItemGroup>
<PropertyGroup>
<DebuggerFlavor>VisualMicroDebugger</DebuggerFlavor>
</PropertyGroup>
<ItemGroup>
<None Include="AmsToMqttBridge.ino">
<FileType>CppCode</FileType>
</None>
</ItemGroup>
<ItemGroup>
<ClInclude Include="accesspoint.h" />
<ClInclude Include="configuration.h" />
<ClInclude Include="__vm\.AmsToMqttBridge.vsarduino.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="accesspoint.cpp" />
<ClCompile Include="configuration.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties custom_esp8266_generic_UploadSpeed="256000" />
</VisualStudio>
</ProjectExtensions>
</Project>

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="AmsToMqttBridge.ino" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="__vm\.AmsToMqttBridge.vsarduino.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@@ -1,9 +0,0 @@
name=HanConfigAp
version=1.0.0
author=roarfred
maintainer=roarfred <not@important.com>
sentence=HAN Configuraiton accesspoint
paragraph=HAN Configuraiton accesspoint
category=Sensors
url=https://github.com/roarfred/AmsToMqttBridge
architectures=*

File diff suppressed because one or more lines are too long

View File

@@ -1,60 +0,0 @@
// ap.h
#ifndef _ACCESSPOINT_h
#define _ACCESSPOINT_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#elif defined(ESP32) // ARDUINO_ARCH_ESP32
#include <WiFi.h>
#include <WebServer.h>
#else
#warning "Unsupported board type"
#endif
#include <DNSServer.h>
#include "configuration.h"
#define INVALID_BUTTON_PIN 0xFFFFFFFF
class HanConfigAp {
public:
void setup(int accessPointButtonPin, Stream* debugger);
bool loop();
bool hasConfig();
configuration config;
bool isActivated = false;
private:
const char* AP_SSID = "AMS2MQTT";
// DNS server
const byte DNS_PORT = 53;
DNSServer dnsServer;
static size_t print(const char* text);
static size_t println(const char* text);
static size_t print(const Printable& data);
static size_t println(const Printable& data);
// Web server
static void handleRoot();
static void handleSave();
#if defined(ESP8266)
static ESP8266WebServer server;
#elif defined(ESP32) // ARDUINO_ARCH_ESP32
static WebServer server;
#endif
static Stream* debugger;
};
#endif

View File

@@ -1,230 +0,0 @@
//
//
//
#include "configuration.h"
bool configuration::hasConfig()
{
bool hasConfig = false;
EEPROM.begin(EEPROM_SIZE);
hasConfig = EEPROM.read(EEPROM_CONFIG_ADDRESS) == EEPROM_CHECK_SUM;
EEPROM.end();
return hasConfig;
}
bool configuration::save()
{
int address = EEPROM_CONFIG_ADDRESS;
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(address, EEPROM_CHECK_SUM);
address++;
address += saveString(address, ssid);
address += saveString(address, ssidPassword);
address += saveByte(address, meterType);
address += saveString(address, mqtt);
address += saveInt(address, mqttPort);
address += saveString(address, mqttClientID);
address += saveString(address, mqttPublishTopic);
address += saveString(address, mqttSubscribeTopic);
if (isSecure()) {
address += saveBool(address, true);
address += saveString(address, mqttUser);
address += saveString(address, mqttPass);
}
else
address += saveBool(address, false);
bool success = EEPROM.commit();
EEPROM.end();
return success;
}
bool configuration::load()
{
int address = EEPROM_CONFIG_ADDRESS;
bool success = false;
EEPROM.begin(EEPROM_SIZE);
if (EEPROM.read(address) == EEPROM_CHECK_SUM)
{
address++;
address += readString(address, &ssid);
address += readString(address, &ssidPassword);
address += readByte(address, &meterType);
address += readString(address, &mqtt);
address += readInt(address, &mqttPort);
address += readString(address, &mqttClientID);
address += readString(address, &mqttPublishTopic);
address += readString(address, &mqttSubscribeTopic);
bool secure = false;
address += readBool(address, &secure);
if (secure)
{
address += readString(address, &mqttUser);
address += readString(address, &mqttPass);
}
else
{
mqttUser = 0;
mqttPass = 0;
}
success = true;
}
else
{
ssid = (char*)String("").c_str();
ssidPassword = (char*)String("").c_str();
meterType = (byte)0;
mqtt = (char*)String("").c_str();
mqttClientID = (char*)String("").c_str();
mqttPublishTopic = (char*)String("").c_str();
mqttSubscribeTopic = (char*)String("").c_str();
mqttUser = 0;
mqttPass = 0;
mqttPort = 1883;
}
EEPROM.end();
return success;
}
bool configuration::isSecure()
{
return (mqttUser != 0) && (String(mqttUser).length() > 0);
}
int configuration::readInt(int address, int *value)
{
int lower = EEPROM.read(address);
int higher = EEPROM.read(address + 1);
*value = lower + (higher << 8);
return 2;
}
int configuration::saveInt(int address, int value)
{
byte lowByte = value & 0xFF;
byte highByte = ((value >> 8) & 0xFF);
EEPROM.write(address, lowByte);
EEPROM.write(address + 1, highByte);
return 2;
}
int configuration::readBool(int address, bool *value)
{
byte y = EEPROM.read(address);
*value = (bool)y;
return 1;
}
int configuration::saveBool(int address, bool value)
{
byte y = (byte)value;
EEPROM.write(address, y);
return 1;
}
int configuration::readByte(int address, byte *value)
{
*value = EEPROM.read(address);
return 1;
}
int configuration::saveByte(int address, byte value)
{
EEPROM.write(address, value);
return 1;
}
void configuration::print(Stream* debugger)
{
/*
char* ssid;
char* ssidPassword;
byte meterType;
char* mqtt;
int mqttPort;
char* mqttClientID;
char* mqttPublishTopic;
char* mqttSubscribeTopic;
bool secure;
char* mqttUser;
char* mqttPass;
*/
debugger->println("Configuration:");
debugger->println("-----------------------------------------------");
debugger->printf("ssid: %s\r\n", this->ssid);
debugger->printf("ssidPassword: %s\r\n", this->ssidPassword);
debugger->printf("meterType: %i\r\n", this->meterType);
debugger->printf("mqtt: %s\r\n", this->mqtt);
debugger->printf("mqttPort: %i\r\n", this->mqttPort);
debugger->printf("mqttClientID: %s\r\n", this->mqttClientID);
debugger->printf("mqttPublishTopic: %s\r\n", this->mqttPublishTopic);
debugger->printf("mqttSubscribeTopic: %s\r\n", this->mqttSubscribeTopic);
if (this->isSecure())
{
debugger->printf("SECURE MQTT CONNECTION:\r\n");
debugger->printf("mqttUser: %s\r\n", this->mqttUser);
debugger->printf("mqttPass: %s\r\n", this->mqttPass);
}
debugger->println("-----------------------------------------------");
}
template <class T> int configuration::writeAnything(int ee, const T& value)
{
const byte* p = (const byte*)(const void*)&value;
unsigned int i;
for (i = 0; i < sizeof(value); i++)
EEPROM.write(ee++, *p++);
return i;
}
template <class T> int configuration::readAnything(int ee, T& value)
{
byte* p = (byte*)(void*)&value;
unsigned int i;
for (i = 0; i < sizeof(value); i++)
*p++ = EEPROM.read(ee++);
return i;
}
int configuration::readString(int pAddress, char* pString[])
{
int address = 0;
byte length = EEPROM.read(pAddress + address);
address++;
char* buffer = new char[length];
for (int i = 0; i<length; i++)
{
buffer[i] = EEPROM.read(pAddress + address++);
}
*pString = buffer;
return address;
}
int configuration::saveString(int pAddress, char* pString)
{
int address = 0;
int length = strlen(pString) + 1;
EEPROM.put(pAddress + address, length);
address++;
for (int i = 0; i < length; i++)
{
EEPROM.put(pAddress + address, pString[i]);
address++;
}
return address;
}

View File

@@ -1,56 +0,0 @@
// config.h
#ifndef _CONFIGURATION_h
#define _CONFIGURATION_h
#include <EEPROM.h>
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
class configuration {
public:
char* ssid;
char* ssidPassword;
char* mqtt;
int mqttPort;
char* mqttClientID;
char* mqttPublishTopic;
char* mqttSubscribeTopic;
char* mqttUser;
char* mqttPass;
byte meterType;
bool hasConfig();
bool isSecure();
bool save();
bool load();
void print(Stream* debugger);
protected:
private:
const int EEPROM_SIZE = 512;
const byte EEPROM_CHECK_SUM = 71; // Used to check if config is stored. Change if structure changes
const int EEPROM_CONFIG_ADDRESS = 0;
int saveString(int pAddress, char* pString);
int readString(int pAddress, char* pString[]);
int saveInt(int pAddress, int pValue);
int readInt(int pAddress, int *pValue);
int saveBool(int pAddress, bool pValue);
int readBool(int pAddress, bool *pValue);
int saveByte(int pAddress, byte pValue);
int readByte(int pAddress, byte *pValue);
template <class T> int writeAnything(int ee, const T& value);
template <class T> int readAnything(int ee, T& value);
};
#endif

View File

@@ -1,15 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HanReader", "HanReader.vcxitems", "{CD0F5364-923B-49E4-8BE5-EA7D8A60DF80}"
EndProject
Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AFFB18CF-A4FB-46A9-8148-C5B4A380C48B}
EndGlobalSection
EndGlobal

View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Globals">
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
<HasSharedItems>true</HasSharedItems>
<ItemsProjectGuid>{cd0f5364-923b-49e4-8be5-ea7d8a60df80}</ItemsProjectGuid>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ProjectCapability Include="SourceItemsFromImports" />
</ItemGroup>
<ItemGroup>
<Text Include="$(MSBuildThisFileDirectory)keywords.txt" />
<Text Include="$(MSBuildThisFileDirectory)readme.txt" />
<Text Include="$(MSBuildThisFileDirectory)library.properties" />
</ItemGroup>
<ItemGroup>
<!-- <ClInclude Include="$(MSBuildThisFileDirectory)HanReader.h" /> -->
<ClInclude Include="$(MSBuildThisFileDirectory)src\Crc16.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)src\DlmsReader.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)src\HanReader.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)src\Kaifa.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)src\Kamstrup.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="$(MSBuildThisFileDirectory)src\Crc16.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)src\DlmsReader.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)src\HanReader.cpp" />
</ItemGroup>
</Project>

View File

@@ -1,46 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;s</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="$(MSBuildThisFileDirectory)src\Crc16.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)src\DlmsReader.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)src\HanReader.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Text Include="$(MSBuildThisFileDirectory)readme.txt" />
<Text Include="$(MSBuildThisFileDirectory)library.properties" />
<Text Include="$(MSBuildThisFileDirectory)keywords.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="$(MSBuildThisFileDirectory)src\Crc16.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="$(MSBuildThisFileDirectory)src\DlmsReader.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="$(MSBuildThisFileDirectory)src\HanReader.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="$(MSBuildThisFileDirectory)src\Kaifa.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="$(MSBuildThisFileDirectory)src\Kamstrup.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@@ -1,9 +0,0 @@
name=HanToJson
version=1.0.0
author=roarfred
maintainer=roarfred <not@important.com>
sentence=HAN reader data to Json
paragraph=HAN reader data to Json
category=Sensors
url=https://github.com/roarfred/AmsToMqttBridge
architectures=*

View File

@@ -1,240 +0,0 @@
#include "HanToJson.h"
#include "Aidon.h"
#include "Kaifa.h"
#include "Kamstrup.h"
static void hanToJsonKaifa3phase(int listSize, JsonObject& data, HanReader& hanReader, Stream *debugger)
{
if (listSize >= (int)Kaifa::List3PhaseShort)
{
data["lv"] = hanReader.getString( (int)Kaifa_List3Phase::ListVersionIdentifier);
data["id"] = hanReader.getString( (int)Kaifa_List3Phase::MeterID);
data["type"] = hanReader.getString( (int)Kaifa_List3Phase::MeterType);
data["P"] = hanReader.getInt( (int)Kaifa_List3Phase::ActiveImportPower);
data["Q"] = hanReader.getInt( (int)Kaifa_List3Phase::ReactiveImportPower);
data["I1"] = hanReader.getInt( (int)Kaifa_List3Phase::CurrentL1);
data["I2"] = hanReader.getInt( (int)Kaifa_List3Phase::CurrentL2);
data["I3"] = hanReader.getInt( (int)Kaifa_List3Phase::CurrentL3);
data["U1"] = hanReader.getInt( (int)Kaifa_List3Phase::VoltageL1);
data["U2"] = hanReader.getInt( (int)Kaifa_List3Phase::VoltageL2);
data["U3"] = hanReader.getInt( (int)Kaifa_List3Phase::VoltageL3);
}
if (listSize >= (int)Kaifa::List3PhaseLong)
{
data["tPI"] = hanReader.getInt( (int)Kaifa_List3Phase::CumulativeActiveImportEnergy);
data["tPO"] = hanReader.getInt( (int)Kaifa_List3Phase::CumulativeActiveExportEnergy);
data["tQI"] = hanReader.getInt( (int)Kaifa_List3Phase::CumulativeReactiveImportEnergy);
data["tQO"] = hanReader.getInt( (int)Kaifa_List3Phase::CumulativeReactiveExportEnergy);
}
}
static void hanToJsonKaifa1phase(int listSize, JsonObject& data, HanReader& hanReader, Stream *debugger)
{
if (listSize >= (int)Kaifa::List1PhaseShort)
{
data["lv"] = hanReader.getString( (int)Kaifa_List1Phase::ListVersionIdentifier);
data["id"] = hanReader.getString( (int)Kaifa_List1Phase::MeterID);
data["type"] = hanReader.getString( (int)Kaifa_List1Phase::MeterType);
data["P"] = hanReader.getInt( (int)Kaifa_List1Phase::ActiveImportPower);
data["Q"] = hanReader.getInt( (int)Kaifa_List1Phase::ReactiveImportPower);
data["I1"] = hanReader.getInt( (int)Kaifa_List1Phase::CurrentL1);
data["U1"] = hanReader.getInt( (int)Kaifa_List1Phase::VoltageL1);
}
if (listSize >= (int)Kaifa::List1PhaseLong)
{
data["tPI"] = hanReader.getInt( (int)Kaifa_List1Phase::CumulativeActiveImportEnergy);
data["tPO"] = hanReader.getInt( (int)Kaifa_List1Phase::CumulativeActiveExportEnergy);
data["tQI"] = hanReader.getInt( (int)Kaifa_List1Phase::CumulativeReactiveImportEnergy);
data["tQO"] = hanReader.getInt( (int)Kaifa_List1Phase::CumulativeReactiveExportEnergy);
}
}
static void hanToJsonKaifa(JsonObject& data, HanReader& hanReader, Stream *debugger)
{
int listSize = hanReader.getListSize();
if (listSize == (int)Kaifa::List1)
{
// Handle listSize == 1 specially
data["P"] = hanReader.getInt( (int)Kaifa_List1::ActivePowerImported);
return;
}
switch (listSize) {
case (int)Kaifa::List3PhaseShort:
case (int)Kaifa::List3PhaseLong:
return hanToJsonKaifa3phase(listSize, data, hanReader, debugger);
case (int)Kaifa::List1PhaseShort:
case (int)Kaifa::List1PhaseLong:
return hanToJsonKaifa1phase(listSize, data, hanReader, debugger);
default:
if (debugger) debugger->printf("Warning: Unknown listSize %d\n", listSize);
return;
}
}
static void hanToJsonAidon3phase(int listSize, JsonObject& data, HanReader& hanReader, Stream *debugger)
{
if (listSize >= (int)Aidon::List3PhaseShort)
{
data["lv"] = hanReader.getString( (int)Aidon_List3Phase::ListVersionIdentifier);
data["id"] = hanReader.getString( (int)Aidon_List3Phase::MeterID);
data["type"] = hanReader.getString( (int)Aidon_List3Phase::MeterType);
data["P"] = hanReader.getInt( (int)Aidon_List3Phase::ActiveImportPower);
data["Q"] = hanReader.getInt( (int)Aidon_List3Phase::ReactiveExportPower);
data["I1"] = ((double) hanReader.getInt( (int)Aidon_List3Phase::CurrentL1)) / 10;
data["I2"] = ((double) hanReader.getInt( (int)Aidon_List3Phase::CurrentL2)) / 10;
data["I3"] = ((double) hanReader.getInt( (int)Aidon_List3Phase::CurrentL3)) / 10;
data["U1"] = ((double) hanReader.getInt( (int)Aidon_List3Phase::VoltageL1)) / 10;
data["U2"] = ((double) hanReader.getInt( (int)Aidon_List3Phase::VoltageL2)) / 10;
data["U3"] = ((double) hanReader.getInt( (int)Aidon_List3Phase::VoltageL3)) / 10;
}
if (listSize >= (int)Aidon::List3PhaseLong)
{
data["tPI"] = hanReader.getInt( (int)Aidon_List3Phase::CumulativeActiveImportEnergy);
data["tPO"] = hanReader.getInt( (int)Aidon_List3Phase::CumulativeActiveExportEnergy);
data["tQI"] = hanReader.getInt( (int)Aidon_List3Phase::CumulativeReactiveImportEnergy);
data["tQO"] = hanReader.getInt( (int)Aidon_List3Phase::CumulativeReactiveExportEnergy);
}
// TODO: Do not divide Aidon values by 10!?
}
static void hanToJsonAidon1phase(int listSize, JsonObject& data, HanReader& hanReader, Stream *debugger)
{
if (listSize >= (int)Aidon::List1PhaseShort)
{
data["lv"] = hanReader.getString( (int)Aidon_List1Phase::ListVersionIdentifier);
data["id"] = hanReader.getString( (int)Aidon_List1Phase::MeterID);
data["type"] = hanReader.getString( (int)Aidon_List1Phase::MeterType);
data["P"] = hanReader.getInt( (int)Aidon_List1Phase::ActiveImportPower);
data["Q"] = hanReader.getInt( (int)Aidon_List1Phase::ReactiveExportPower);
data["I1"] = ((double) hanReader.getInt( (int)Aidon_List1Phase::CurrentL1)) / 10;
data["U1"] = ((double) hanReader.getInt( (int)Aidon_List1Phase::VoltageL1)) / 10;
}
// TODO Aidon::List1PhaseLong
}
static void hanToJsonAidon(JsonObject& data, HanReader& hanReader, Stream *debugger)
{
int listSize = hanReader.getListSize();
// Based on the list number, get all details
// according to OBIS specifications for the meter
if (listSize == (int)Aidon::List1)
{
// Handle listSize == 1 specially
data["P"] = hanReader.getInt((int)Aidon_List1::ActiveImportPower);
return;
}
switch (listSize) {
case (int)Aidon::List3PhaseShort:
case (int)Aidon::List3PhaseLong:
return hanToJsonAidon3phase(listSize, data, hanReader, debugger);
case (int)Aidon::List1PhaseShort:
case (int)Aidon::List1PhaseLong:
return hanToJsonAidon1phase(listSize, data, hanReader, debugger);
default:
if (debugger) debugger->printf("Warning: Unknown listSize %d\n", listSize);
return;
}
}
static void hanToJsonKamstrup3phase(int listSize, JsonObject& data, HanReader& hanReader, Stream *debugger)
{
if (listSize >= (int)Kamstrup::List3PhaseShort)
{
data["lv"] = hanReader.getString( (int)Kamstrup_List3Phase::ListVersionIdentifier);
data["id"] = hanReader.getString( (int)Kamstrup_List3Phase::MeterID);
data["type"] = hanReader.getString( (int)Kamstrup_List3Phase::MeterType);
data["P"] = hanReader.getInt( (int)Kamstrup_List3Phase::ActiveImportPower);
data["Q"] = hanReader.getInt( (int)Kamstrup_List3Phase::ReactiveImportPower);
data["I1"] = hanReader.getInt( (int)Kamstrup_List3Phase::CurrentL1);
data["I2"] = hanReader.getInt( (int)Kamstrup_List3Phase::CurrentL2);
data["I3"] = hanReader.getInt( (int)Kamstrup_List3Phase::CurrentL3);
data["U1"] = hanReader.getInt( (int)Kamstrup_List3Phase::VoltageL1);
data["U2"] = hanReader.getInt( (int)Kamstrup_List3Phase::VoltageL2);
data["U3"] = hanReader.getInt( (int)Kamstrup_List3Phase::VoltageL3);
}
if (listSize >= (int)Kamstrup::List3PhaseLong)
{
data["tPI"] = hanReader.getInt( (int)Kamstrup_List3Phase::CumulativeActiveImportEnergy);
data["tPO"] = hanReader.getInt( (int)Kamstrup_List3Phase::CumulativeActiveExportEnergy);
data["tQI"] = hanReader.getInt( (int)Kamstrup_List3Phase::CumulativeReactiveImportEnergy);
data["tQO"] = hanReader.getInt( (int)Kamstrup_List3Phase::CumulativeReactiveExportEnergy);
}
}
static void hanToJsonKamstrup1phase(int listSize, JsonObject& data, HanReader& hanReader, Stream *debugger)
{
if (listSize >= (int)Kamstrup::List1PhaseShort)
{
data["lv"] = hanReader.getString( (int)Kamstrup_List1Phase::ListVersionIdentifier);
data["id"] = hanReader.getString( (int)Kamstrup_List1Phase::MeterID);
data["type"] = hanReader.getString( (int)Kamstrup_List1Phase::MeterType);
data["P"] = hanReader.getInt( (int)Kamstrup_List1Phase::ActiveImportPower);
data["Q"] = hanReader.getInt( (int)Kamstrup_List1Phase::ReactiveImportPower);
data["I1"] = hanReader.getInt( (int)Kamstrup_List1Phase::CurrentL1);
data["U1"] = hanReader.getInt( (int)Kamstrup_List1Phase::VoltageL1);
}
if (listSize >= (int)Kamstrup::List1PhaseLong)
{
data["tPI"] = hanReader.getInt( (int)Kamstrup_List1Phase::CumulativeActiveImportEnergy);
data["tPO"] = hanReader.getInt( (int)Kamstrup_List1Phase::CumulativeActiveExportEnergy);
data["tQI"] = hanReader.getInt( (int)Kamstrup_List1Phase::CumulativeReactiveImportEnergy);
data["tQO"] = hanReader.getInt( (int)Kamstrup_List1Phase::CumulativeReactiveExportEnergy);
}
}
static void hanToJsonKamstrup(JsonObject& data, HanReader& hanReader, Stream *debugger)
{
int listSize = hanReader.getListSize();
switch (listSize) {
case (int)Kamstrup::List3PhaseShort:
case (int)Kamstrup::List3PhaseLong:
return hanToJsonKamstrup3phase(listSize, data, hanReader, debugger);
case (int)Kamstrup::List1PhaseShort:
case (int)Kamstrup::List1PhaseLong:
return hanToJsonKamstrup1phase(listSize, data, hanReader, debugger);
default:
if (debugger) debugger->printf("Warning: Unknown listSize %d\n", listSize);
return;
}
}
void hanToJson(JsonObject& data, byte meterType, HanReader& hanReader, Stream *debugger)
{
// Based on the list number, get all details
// according to OBIS specifications for the meter
switch (meterType)
{
case 1: // Kaifa
return hanToJsonKaifa(data, hanReader, debugger);
case 2: // Aidon
return hanToJsonAidon(data, hanReader, debugger);
case 3: // Kamstrup
return hanToJsonKamstrup(data, hanReader, debugger);
default:
if (debugger) {
debugger->print("Meter type ");
debugger->print(meterType, HEX);
debugger->println(" is unknown");
}
break;
}
}
void hanToJson(JsonObject& data, byte meterType, HanReader& hanReader)
{
return hanToJson(data, meterType, hanReader, NULL);
}

View File

@@ -1,17 +0,0 @@
#ifndef _HANTOJSON_h
#define _HANTOJSON_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <ArduinoJson.h>
#include "HanReader.h"
void hanToJson(JsonObject& data, byte meterType, HanReader& hanReader);
void hanToJson(JsonObject& root, byte meterType, HanReader& hanReader, Stream *debugPort);
#endif

View File

@@ -1,27 +0,0 @@
## Arduino Code
FW and libraries for running on various HW
### AmsToMqttBridge
The original FW by roarfred, runs a Wifi access point until configured. Uploads data as json to a MQTT server.
### WifiFeatherRestBridge
_Note: This project is still under development._
Firmware for runninw AMS decoding with off-the-shelf components, so no PCB etching or soldering necessary. Specifially,
the sketch runs on the [Adafruit Feather M0 WiFi w/ATWINC1500](https://www.adafruit.com/product/3010) card and uses the
[TSS721 M-BUS module board](https://www.aliexpress.com/item/TSS721/32751482255.html) available from Aliexpress.
![FeatherMbus](/Debugging/Documentation/feather_3010-00_mbus_slave.jpg)
### Arduino Libraries/HanReader
The shared library to read from a serial port and decode the data into packets.
### Arduino Libraries/HanToJson
Shared library to create a json structure from the read HAN packets (for the different meter types).

View File

@@ -1,283 +0,0 @@
/**
* Simple sketch to simulate reading data from different meters.
*
* Created 24. October 2017 by Roar Fredriksen
*/
#include <ArduinoJson.h>
//#include "Kaifa.h"
//#include "Kamstrup.h"
//#include "Aidon.h"
#include "HanReader.h"
#include "HanToJson.h"
// The HAN Port reader
HanReader hanReader;
HardwareSerial* debugger = NULL;
byte meterType = 1; // Start with Kaifa
int sampleIndex = 0;
int expectIndex = 0;
byte kaifa_samples[] =
{
// List #1
0x7E, 0xA0, 0x27, 0x01, 0x02, 0x01, 0x10, 0x5A, 0x87, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00, 0x00,
0x00, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x13, 0x1F, 0x02, 0xFF, 0x80, 0x00, 0x00, 0x02,
0x01, 0x06, 0x00, 0x00, 0x03, 0x98, 0xAB, 0xAD, 0x7E,
// List#2
0x7E, 0xA0, 0x79, 0x01, 0x02, 0x01, 0x10, 0x80, 0x93, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00, 0x00,
0x00, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x13, 0x1F, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x02,
0x0D, 0x09, 0x07, 0x4B, 0x46, 0x4D, 0x5F, 0x30, 0x30, 0x31, 0x09, 0x10, 0x36, 0x39, 0x37, 0x30,
0x36, 0x33, 0x31, 0x34, 0x30, 0x31, 0x37, 0x35, 0x33, 0x39, 0x38, 0x35, 0x09, 0x08, 0x4D, 0x41,
0x33, 0x30, 0x34, 0x48, 0x33, 0x45, 0x06, 0x00, 0x00, 0x03, 0x96, 0x06, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x05, 0x64, 0x06,
0x00, 0x00, 0x0C, 0x92, 0x06, 0x00, 0x00, 0x0C, 0x49, 0x06, 0x00, 0x00, 0x09, 0x46, 0x06, 0x00,
0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x09, 0x4E, 0x1F, 0x85, 0x7E,
// List#3
0x7E, 0xA0, 0x9B, 0x01, 0x02, 0x01, 0x10, 0xEE, 0xAE, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00, 0x00,
0x00, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x14, 0x00, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x02,
0x12, 0x09, 0x07, 0x4B, 0x46, 0x4D, 0x5F, 0x30, 0x30, 0x31, 0x09, 0x10, 0x36, 0x39, 0x37, 0x30,
0x36, 0x33, 0x31, 0x34, 0x30, 0x31, 0x37, 0x35, 0x33, 0x39, 0x38, 0x35, 0x09, 0x08, 0x4D, 0x41,
0x33, 0x30, 0x34, 0x48, 0x33, 0x45, 0x06, 0x00, 0x00, 0x03, 0xFE, 0x06, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x07, 0x91, 0x06,
0x00, 0x00, 0x0C, 0x9D, 0x06, 0x00, 0x00, 0x0D, 0x66, 0x06, 0x00, 0x00, 0x09, 0x41, 0x06, 0x00,
0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x09, 0x4C, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x14,
0x00, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x06, 0x00, 0x02, 0xBF, 0x69, 0x06, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x3F, 0xFC, 0x71, 0x71, 0x7E,
// List#2.1
0x7e, 0xa0, 0x65, 0x01, 0x02, 0x01, 0x10, 0xf0, 0x50, 0xe6, 0xe7, 0x00, 0x0f, 0x40, 0x00, 0x00,
0x00, 0x09, 0x0c, 0x07, 0xe3, 0x05, 0x08, 0x03, 0x16, 0x20, 0x28, 0xff, 0x80, 0x00, 0x00, 0x02,
0x09, 0x09, 0x07, 0x4b, 0x46, 0x4d, 0x5f, 0x30, 0x30, 0x31, 0x09, 0x10, 0x36, 0x39, 0x37, 0x30,
0x36, 0x33, 0x31, 0x34, 0x30, 0x31, 0x39, 0x39, 0x31, 0x36, 0x38, 0x34, 0x09, 0x08, 0x4d, 0x41,
0x31, 0x30, 0x35, 0x48, 0x32, 0x45, 0x06, 0x00, 0x00, 0x03, 0xa5, 0x06, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x21, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x10, 0x0e, 0x06,
0x00, 0x00, 0x09, 0x0a, 0x98, 0x76, 0x7e,
};
String kaifa_expect[] = {
String("{\"t\":1505417462,\"data\":{\"P\":920}}"),
String("{\"t\":1505417470,\"data\":{\"lv\":\"KFM_001\",\"id\":\"6970631401753985\",\"type\":\"MA304H3E\",\"P\":918,\"Q\":0,\"I1\":1380,\"I2\":3218,\"I3\":3145,\"U1\":2374,\"U2\":0,\"U3\":2382}}"),
String("{\"t\":1505419210,\"data\":{\"lv\":\"KFM_001\",\"id\":\"6970631401753985\",\"type\":\"MA304H3E\",\"P\":1022,\"Q\":0,\"I1\":1937,\"I2\":3229,\"I3\":3430,\"U1\":2369,\"U2\":0,\"U3\":2380,\"tPI\":180073,\"tPO\":0,\"tQI\":247,\"tQO\":16380}}"),
String("{\"t\":1557354760,\"data\":{\"lv\":\"KFM_001\",\"id\":\"6970631401991684\",\"type\":\"MA105H2E\",\"P\":933,\"Q\":33,\"I1\":4110,\"U1\":2314}}")
};
byte aidon_samples[] =
{ // From Aidon-HAN-Interface-Description-v10A-ID-34331.pdf
// List 2 sending (1-phase)
0x7e, 0xa0, 0xd2, 0x41, 0x08, 0x83, 0x13, 0x82, 0xd6, 0xe6, 0xe7, 0x00, 0x0f, 0x40, 0x00, 0x00,
0x00, 0x00, 0x01, 0x09, 0x02, 0x02, 0x09, 0x06, 0x01, 0x01, 0x00, 0x02, 0x81, 0xff, 0x0a, 0x0b,
0x41, 0x49, 0x44, 0x4f, 0x4e, 0x5f, 0x56, 0x30, 0x30, 0x30, 0x31, 0x02, 0x02, 0x09, 0x06, 0x00,
0x00, 0x60, 0x01, 0x00, 0xff, 0x0a, 0x10, 0x37, 0x33, 0x35, 0x39, 0x39, 0x39, 0x32, 0x38, 0x39,
0x30, 0x39, 0x34, 0x31, 0x37, 0x34, 0x32, 0x02, 0x02, 0x09, 0x06, 0x00, 0x00, 0x60, 0x01, 0x07,
0xff, 0x0a, 0x04, 0x36, 0x35, 0x31, 0x35, 0x02, 0x03, 0x09, 0x06, 0x01, 0x00, 0x01, 0x07, 0x00,
0xff, 0x06, 0x00, 0x00, 0x05, 0x52, 0x02, 0x02, 0x0f, 0x00, 0x16, 0x1b, 0x02, 0x03, 0x09, 0x06,
0x01, 0x00, 0x02, 0x07, 0x00, 0xff, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x0f, 0x00, 0x16,
0x1b, 0x02, 0x03, 0x09, 0x06, 0x01, 0x00, 0x03, 0x07, 0x00, 0xff, 0x06, 0x00, 0x00, 0x03, 0xe4,
0x02, 0x02, 0x0f, 0x00, 0x16, 0x1d, 0x02, 0x03, 0x09, 0x06, 0x01, 0x00, 0x04, 0x07, 0x00, 0xff,
0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x0f, 0x00, 0x16, 0x1d, 0x02, 0x03, 0x09, 0x06, 0x01,
0x00, 0x1f, 0x07, 0x00, 0xff, 0x10, 0x00, 0x5d, 0x02, 0x02, 0x0f, 0xff, 0x16, 0x21, 0x02, 0x03,
0x09, 0x06, 0x01, 0x00, 0x20, 0x07, 0x00, 0xff, 0x12, 0x09, 0xc4, 0x02, 0x02, 0x0f, 0xff, 0x16,
0x23, 0xe0, 0xc4, 0x7e
};
String aidon_expect[] = {
String("{\"t\":0,\"data\":{\"lv\":\"AIDON_V0001\",\"id\":\"7359992890941742\",\"type\":\"6515\",\"P\":1362,\"Q\":0,\"I1\":9.3,\"U1\":250}}")
};
byte kamstrup_samples[] =
{ // [2017-10-20 04.43.32.368 - Received 229 (0xE5) bytes]
// List #1
0x7E, 0xA0, 0xE2, 0x2B, 0x21, 0x13, 0x23, 0x9A, 0xE6, 0xE7, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x07, 0xE2, 0x03, 0x04, 0x07, 0x14, 0x3B, 0x32, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x19, 0x0A,
0x0E, 0x4B, 0x61, 0x6D, 0x73, 0x74, 0x72, 0x75, 0x70, 0x5F, 0x56, 0x30, 0x30, 0x30, 0x31, 0x09,
0x06, 0x01, 0x01, 0x00, 0x00, 0x05, 0xFF, 0x0A, 0x10, 0x35, 0x37, 0x30, 0x36, 0x35, 0x36, 0x37,
0x32, 0x37, 0x34, 0x33, 0x38, 0x39, 0x37, 0x30, 0x32, 0x09, 0x06, 0x01, 0x01, 0x60, 0x01, 0x01,
0xFF, 0x0A, 0x12, 0x36, 0x38, 0x34, 0x31, 0x31, 0x32, 0x31, 0x42, 0x4E, 0x32, 0x34, 0x33, 0x31,
0x30, 0x31, 0x30, 0x34, 0x30, 0x09, 0x06, 0x01, 0x01, 0x01, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00,
0x11, 0x28, 0x09, 0x06, 0x01, 0x01, 0x02, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09,
0x06, 0x01, 0x01, 0x03, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x84, 0x09, 0x06, 0x01, 0x01,
0x04, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x1F, 0x07, 0x00,
0xFF, 0x06, 0x00, 0x00, 0x05, 0x66, 0x09, 0x06, 0x01, 0x01, 0x33, 0x07, 0x00, 0xFF, 0x06, 0x00,
0x00, 0x03, 0x0C, 0x09, 0x06, 0x01, 0x01, 0x47, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x05, 0x5A,
0x09, 0x06, 0x01, 0x01, 0x20, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xE0, 0x09, 0x06, 0x01, 0x01, 0x34,
0x07, 0x00, 0xFF, 0x12, 0x00, 0xDF, 0x09, 0x06, 0x01, 0x01, 0x48, 0x07, 0x00, 0xFF, 0x12, 0x00,
0xDF, 0xA1, 0xD8, 0x7E,
// List #2
0x7E, 0xA1, 0x2C, 0x2B, 0x21, 0x13, 0xFC, 0x04, 0xE6, 0xE7, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x07, 0xE2, 0x03, 0x04, 0x07, 0x15, 0x00, 0x05, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x23, 0x0A,
0x0E, 0x4B, 0x61, 0x6D, 0x73, 0x74, 0x72, 0x75, 0x70, 0x5F, 0x56, 0x30, 0x30, 0x30, 0x31, 0x09,
0x06, 0x01, 0x01, 0x00, 0x00, 0x05, 0xFF, 0x0A, 0x10, 0x35, 0x37, 0x30, 0x36, 0x35, 0x36, 0x37,
0x32, 0x37, 0x34, 0x33, 0x38, 0x39, 0x37, 0x30, 0x32, 0x09, 0x06, 0x01, 0x01, 0x60, 0x01, 0x01,
0xFF, 0x0A, 0x12, 0x36, 0x38, 0x34, 0x31, 0x31, 0x32, 0x31, 0x42, 0x4E, 0x32, 0x34, 0x33, 0x31,
0x30, 0x31, 0x30, 0x34, 0x30, 0x09, 0x06, 0x01, 0x01, 0x01, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00,
0x0E, 0x3B, 0x09, 0x06, 0x01, 0x01, 0x02, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09,
0x06, 0x01, 0x01, 0x03, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x86, 0x09, 0x06, 0x01, 0x01,
0x04, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x1F, 0x07, 0x00,
0xFF, 0x06, 0x00, 0x00, 0x04, 0x21, 0x09, 0x06, 0x01, 0x01, 0x33, 0x07, 0x00, 0xFF, 0x06, 0x00,
0x00, 0x03, 0x0C, 0x09, 0x06, 0x01, 0x01, 0x47, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x04, 0x1C,
0x09, 0x06, 0x01, 0x01, 0x20, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xE2, 0x09, 0x06, 0x01, 0x01, 0x34,
0x07, 0x00, 0xFF, 0x12, 0x00, 0xE0, 0x09, 0x06, 0x01, 0x01, 0x48, 0x07, 0x00, 0xFF, 0x12, 0x00,
0xDF, 0x09, 0x06, 0x00, 0x01, 0x01, 0x00, 0x00, 0xFF, 0x09, 0x0C, 0x07, 0xE2, 0x03, 0x04, 0x07,
0x15, 0x00, 0x05, 0xFF, 0x80, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x01, 0x08, 0x00, 0xFF, 0x06,
0x00, 0x1A, 0x40, 0x49, 0x09, 0x06, 0x01, 0x01, 0x02, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00,
0x00, 0x09, 0x06, 0x01, 0x01, 0x03, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x05, 0x64, 0x09, 0x06,
0x01, 0x01, 0x04, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x02, 0x7B, 0x21, 0x20, 0x92, 0x7E
};
String kamstrup_expect[] = {
String("{\"t\":1520197190,\"data\":{\"lv\":\"Kamstrup_V0001\",\"id\":\"5706567274389702\",\"type\":\"6841121BN243101040\",\"P\":4392,\"Q\":132,\"I1\":1382,\"I2\":780,\"I3\":1370,\"U1\":224,\"U2\":223,\"U3\":223}}"),
String("{\"t\":1520197205,\"data\":{\"lv\":\"Kamstrup_V0001\",\"id\":\"5706567274389702\",\"type\":\"6841121BN243101040\",\"P\":3643,\"Q\":134,\"I1\":1057,\"I2\":780,\"I3\":1052,\"U1\":226,\"U2\":224,\"U3\":223,\"tPI\":1720393,\"tPO\":0,\"tQI\":1380,\"tQO\":162593}}")
};
void assert_equal(DynamicJsonDocument& doc, const String& expected)
{
String jsonActual;
serializeJson(doc, jsonActual);
if (jsonActual != expected)
{
debugger->printf("Test assert failed:\n %s\n !=\n %s\n", jsonActual.c_str(), expected.c_str());
while (true) {}
}
}
void setup() {
Serial1.begin(115200);
//while (!Serial) {}
Serial1.println("Serial1 debugging port initialized");
// initialize the HanReader
// (passing no han port, as we are feeding data manually, but provide Serial for debugging)
hanReader.setup(NULL, &Serial1);
hanReader.compensateFor09HeaderBug = true; // Starting with Kaifa
debugger = &Serial1;
}
void loopKaifa()
{
if (sampleIndex >= sizeof(kaifa_samples))
{
meterType++;
sampleIndex = 0;
expectIndex = 0;
hanReader.setup(NULL, debugger);
hanReader.compensateFor09HeaderBug = false;
Serial1.println("Done with Kaifa");
}
// Read one byte from the "port", and see if we got a full package
if (hanReader.read(kaifa_samples[sampleIndex++]))
{
DynamicJsonDocument doc(500);
doc["t"] = hanReader.getPackageTime();
JsonObject data = doc.createNestedObject("data");
hanToJson(data, meterType, hanReader);
debugger->println("Kaifa JsonData: ");
serializeJsonPretty(doc, Serial1);
debugger->println();
if (expectIndex < sizeof(kaifa_expect) / sizeof(kaifa_expect[0]))
{
assert_equal(doc, kaifa_expect[expectIndex++]);
} else {
debugger->println("Not enough expected results spesified");
while (true) {}
}
}
}
void loopAidon()
{
if (sampleIndex >= sizeof(aidon_samples))
{
meterType++;
sampleIndex = 0;
expectIndex = 0;
hanReader.setup(NULL, &Serial1);
debugger->println("Done with Aidon");
}
// Read one byte from the "port", and see if we got a full package
if (hanReader.read(aidon_samples[sampleIndex++]))
{
DynamicJsonDocument doc(500);
doc["t"] = hanReader.getPackageTime();
JsonObject data = doc.createNestedObject("data");
hanToJson(data, meterType, hanReader);
debugger->println("Aidon JsonData: ");
serializeJsonPretty(doc, Serial1);
debugger->println();
if (expectIndex < sizeof(aidon_expect) / sizeof(aidon_expect[0]))
{
assert_equal(doc, aidon_expect[expectIndex++]);
} else {
debugger->println("Not enough expected results spesified");
while (true) {}
}
}
}
void loopKamstrup()
{
if (sampleIndex >= sizeof(kamstrup_samples))
{
meterType++;
sampleIndex = 0;
hanReader.setup(NULL, &Serial1);
debugger->println("Done with Kamstrup");
}
// Read one byte from the "port", and see if we got a full package
if (hanReader.read(kamstrup_samples[sampleIndex++]))
{
DynamicJsonDocument doc(500);
doc["t"] = hanReader.getPackageTime();
JsonObject data = doc.createNestedObject("data");
hanToJson(data, meterType, hanReader);
debugger->println("Kamstrup JsonData: ");
serializeJsonPretty(doc, Serial1);
debugger->println();
if (expectIndex < sizeof(kamstrup_expect) / sizeof(kamstrup_expect[0]))
{
assert_equal(doc, kamstrup_expect[expectIndex++]);
} else {
debugger->println("Not enough expected results spesified");
while (true) {}
}
}
}
void loop() {
switch (meterType)
{
case 1: // Kaifa
return loopKaifa();
case 2: // Aidon
return loopAidon();
case 3: // Kamstrup
return loopKamstrup();
default:
debugger->println("Done");
while (true) ;
break;
}
}

View File

@@ -1,121 +0,0 @@
/*
* Simple sketch to simulate reading data from a Kamstrup
* AMS Meter.
*
* Created 24. October 2017 by Roar Fredriksen
*/
#include <HanReader.h>
#include <Kaifa.h>
// The HAN Port reader
HanReader hanReader;
byte samples[] =
{
// List #1
0x7E, 0xA0, 0x27, 0x01, 0x02, 0x01, 0x10, 0x5A, 0x87, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x13, 0x1F, 0x02, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x00, 0x03, 0x98, 0xAB, 0xAD, 0x7E,
// List#2
0x7E, 0xA0, 0x79, 0x01, 0x02, 0x01, 0x10, 0x80, 0x93, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x13, 0x1F, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x0D, 0x09, 0x07, 0x4B, 0x46, 0x4D, 0x5F, 0x30, 0x30, 0x31, 0x09, 0x10, 0x36, 0x39, 0x37, 0x30, 0x36, 0x33, 0x31, 0x34, 0x30, 0x31, 0x37, 0x35, 0x33, 0x39, 0x38, 0x35, 0x09, 0x08, 0x4D, 0x41, 0x33, 0x30, 0x34, 0x48, 0x33, 0x45, 0x06, 0x00, 0x00, 0x03, 0x96, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x05, 0x64, 0x06, 0x00, 0x00, 0x0C, 0x92, 0x06, 0x00, 0x00, 0x0C, 0x49, 0x06, 0x00, 0x00, 0x09, 0x46, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x09, 0x4E, 0x1F, 0x85, 0x7E,
// List#3
0x7E, 0xA0, 0x9B, 0x01, 0x02, 0x01, 0x10, 0xEE, 0xAE, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x14, 0x00, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x12, 0x09, 0x07, 0x4B, 0x46, 0x4D, 0x5F, 0x30, 0x30, 0x31, 0x09, 0x10, 0x36, 0x39, 0x37, 0x30, 0x36, 0x33, 0x31, 0x34, 0x30, 0x31, 0x37, 0x35, 0x33, 0x39, 0x38, 0x35, 0x09, 0x08, 0x4D, 0x41, 0x33, 0x30, 0x34, 0x48, 0x33, 0x45, 0x06, 0x00, 0x00, 0x03, 0xFE, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x07, 0x91, 0x06, 0x00, 0x00, 0x0C, 0x9D, 0x06, 0x00, 0x00, 0x0D, 0x66, 0x06, 0x00, 0x00, 0x09, 0x41, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x09, 0x4C, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x14, 0x00, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x06, 0x00, 0x02, 0xBF, 0x69, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x3F, 0xFC, 0x71, 0x71, 0x7E
};
int sampleIndex = 0;
void setup() {
setupDebugPort();
// initialize the HanReader
// (passing no han port, as we are feeding data manually, but provide Serial for debugging)
hanReader.setup(NULL, &Serial);
hanReader.compensateFor09HeaderBug = true;
}
void setupDebugPort()
{
// Initialize the Serial port for debugging
Serial.begin(115200);
while (!Serial) {}
Serial.setDebugOutput(true);
Serial.println("Serial1");
Serial.println("Serial debugging port initialized");
}
void loop() {
// Read one byte from the "port", and see if we got a full package
if (hanReader.read(samples[sampleIndex++]))
{
// Get the list identifier
int listSize = hanReader.getListSize();
Serial.println("");
Serial.print("List size: ");
Serial.print(listSize);
Serial.print(": ");
// Only care for the ACtive Power Imported, which is found in the first list
if (listSize == (int)Kaifa::List1 || listSize == (int)Kaifa::List2 || listSize == (int)Kaifa::List3)
{
if (listSize == (int)Kaifa::List1)
{
Serial.println(" (list #1 has no ID)");
}
else
{
String id = hanReader.getString((int)Kaifa_List2::ListVersionIdentifier);
Serial.println(id);
}
time_t time = hanReader.getPackageTime();
Serial.print("Time of the package is: ");
Serial.println(time);
if (listSize == (int)Kaifa::List1)
{
int power = hanReader.getInt((int)Kaifa_List1::ActivePowerImported);
Serial.print("Power consumtion is right now: ");
Serial.print(power);
Serial.println(" W");
}
else
{
float current[3];
current[0] = (float)hanReader.getInt((int)Kaifa_List2::CurrentL1) / 1000.0;
current[1] = (float)hanReader.getInt((int)Kaifa_List2::CurrentL2) / 1000.0;
current[2] = (float)hanReader.getInt((int)Kaifa_List2::CurrentL3) / 1000.0;
int voltage[3];
voltage[0] = hanReader.getInt((int)Kaifa_List2::VoltageL1);
voltage[1] = hanReader.getInt((int)Kaifa_List2::VoltageL2);
voltage[2] = hanReader.getInt((int)Kaifa_List2::VoltageL3);
for (int i = 0; i < 3; i++)
{
Serial.print("L");
Serial.print(i + 1);
Serial.print(" is ");
Serial.print(voltage[i]);
Serial.print(" V (");
Serial.print(current[i]);
Serial.println(" A)");
}
if (listSize == (int)Kaifa::List3)
{
time_t clock = hanReader.getTime((int)Kaifa_List3::MeterClock);
Serial.print("Clock is: ");
Serial.println(clock);
}
}
}
}
delay(10);
if (sampleIndex >= sizeof(samples))
{
delay(2000);
sampleIndex = 0;
}
}

View File

@@ -1,31 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KaifaTest", "KaifaTest.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HanReader", "..\HanReader\HanReader.vcxitems", "{CD0F5364-923B-49E4-8BE5-EA7D8A60DF80}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
..\HanReader\HanReader.vcxitems*{c5f80730-f44f-4478-bdae-6634efc2ca88}*SharedItemsImports = 4
..\HanReader\HanReader.vcxitems*{cd0f5364-923b-49e4-8be5-ea7d8a60df80}*SharedItemsImports = 9
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {35D8A583-E857-4E42-B780-543F324B8851}
EndGlobalSection
EndGlobal

View File

@@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{C5F80730-F44F-4478-BDAE-6634EFC2CA88}</ProjectGuid>
<RootNamespace>KaifaTest</RootNamespace>
<ProjectName>KaifaTest</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>
</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>
</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
<Import Project="..\HanReader\HanReader.vcxitems" Label="Shared" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(ProjectDir)..\KaifaTest;$(ProjectDir)..\HanReader\src;$(ProjectDir)..\..\..\..\..\..\..\..\..\Program Files (x86)\Arduino\libraries;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries;$(ProjectDir)..\..\..\..\..\..\..\Google Drive\Private\Elektronikk\Arduino\libraries;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\libb64;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\spiffs;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\variants\generic;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\lwip\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\xtensa-lx106-elf;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\lib\gcc\xtensa-lx106-elf\4.8.2\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<ForcedIncludeFiles>$(ProjectDir)__vm\.KaifaTest.vsarduino.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
<IgnoreStandardIncludePath>false</IgnoreStandardIncludePath>
<PreprocessorDefinitions>__ESP8266_ESp8266__;__ESP8266_ESP8266__;__ets__;ICACHE_FLASH;F_CPU=80000000L;LWIP_OPEN_SRC;ARDUINO=106012;ARDUINO_ESP8266_ESP01;ARDUINO_ARCH_ESP8266;ESP8266;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ProjectCapability Include="VisualMicro" />
</ItemGroup>
<PropertyGroup>
<DebuggerFlavor>VisualMicroDebugger</DebuggerFlavor>
</PropertyGroup>
<ItemGroup>
<None Include="KaifaTest.ino">
<FileType>CppCode</FileType>
</None>
</ItemGroup>
<ItemGroup>
<ClInclude Include="__vm\.KaifaTest.vsarduino.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="KaifaTest.ino" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="__vm\.KaifaTest.vsarduino.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@@ -1,128 +0,0 @@
/*
* Simple sketch to simulate reading data from a Kamstrup
* AMS Meter.
*
* Created 24. October 2017 by Roar Fredriksen
*/
#include <HanReader.h>
#include <Kamstrup.h>
// The HAN Port reader
HanReader hanReader;
byte samples[] =
// [2017-10-20 04.43.32.368 - Received 229 (0xE5) bytes]
{
// List #1
0x7E, 0xA0, 0xE2, 0x2B, 0x21, 0x13, 0x23, 0x9A, 0xE6, 0xE7, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x07, 0xE2, 0x03, 0x04, 0x07, 0x14, 0x3B,
0x32, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x19, 0x0A, 0x0E, 0x4B, 0x61, 0x6D, 0x73, 0x74, 0x72, 0x75, 0x70, 0x5F, 0x56, 0x30, 0x30, 0x30, 0x31, 0x09,
0x06, 0x01, 0x01, 0x00, 0x00, 0x05, 0xFF, 0x0A, 0x10, 0x35, 0x37, 0x30, 0x36, 0x35, 0x36, 0x37, 0x32, 0x37, 0x34, 0x33, 0x38, 0x39, 0x37, 0x30,
0x32, 0x09, 0x06, 0x01, 0x01, 0x60, 0x01, 0x01, 0xFF, 0x0A, 0x12, 0x36, 0x38, 0x34, 0x31, 0x31, 0x32, 0x31, 0x42, 0x4E, 0x32, 0x34, 0x33, 0x31,
0x30, 0x31, 0x30, 0x34, 0x30, 0x09, 0x06, 0x01, 0x01, 0x01, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x11, 0x28, 0x09, 0x06, 0x01, 0x01, 0x02, 0x07,
0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x03, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x84, 0x09, 0x06, 0x01, 0x01,
0x04, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x1F, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x05, 0x66, 0x09, 0x06,
0x01, 0x01, 0x33, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x03, 0x0C, 0x09, 0x06, 0x01, 0x01, 0x47, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x05, 0x5A,
0x09, 0x06, 0x01, 0x01, 0x20, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xE0, 0x09, 0x06, 0x01, 0x01, 0x34, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xDF, 0x09, 0x06,
0x01, 0x01, 0x48, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xDF, 0xA1, 0xD8, 0x7E,
// List #2
0x7E, 0xA1, 0x2C, 0x2B, 0x21, 0x13, 0xFC, 0x04, 0xE6, 0xE7, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x07, 0xE2, 0x03, 0x04, 0x07, 0x15, 0x00,
0x05, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x23, 0x0A, 0x0E, 0x4B, 0x61, 0x6D, 0x73, 0x74, 0x72, 0x75, 0x70, 0x5F, 0x56, 0x30, 0x30, 0x30, 0x31, 0x09,
0x06, 0x01, 0x01, 0x00, 0x00, 0x05, 0xFF, 0x0A, 0x10, 0x35, 0x37, 0x30, 0x36, 0x35, 0x36, 0x37, 0x32, 0x37, 0x34, 0x33, 0x38, 0x39, 0x37, 0x30,
0x32, 0x09, 0x06, 0x01, 0x01, 0x60, 0x01, 0x01, 0xFF, 0x0A, 0x12, 0x36, 0x38, 0x34, 0x31, 0x31, 0x32, 0x31, 0x42, 0x4E, 0x32, 0x34, 0x33, 0x31,
0x30, 0x31, 0x30, 0x34, 0x30, 0x09, 0x06, 0x01, 0x01, 0x01, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x0E, 0x3B, 0x09, 0x06, 0x01, 0x01, 0x02, 0x07,
0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x03, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x86, 0x09, 0x06, 0x01, 0x01,
0x04, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x1F, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x04, 0x21, 0x09, 0x06,
0x01, 0x01, 0x33, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x03, 0x0C, 0x09, 0x06, 0x01, 0x01, 0x47, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x04, 0x1C,
0x09, 0x06, 0x01, 0x01, 0x20, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xE2, 0x09, 0x06, 0x01, 0x01, 0x34, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xE0, 0x09, 0x06,
0x01, 0x01, 0x48, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xDF, 0x09, 0x06, 0x00, 0x01, 0x01, 0x00, 0x00, 0xFF, 0x09, 0x0C, 0x07, 0xE2, 0x03, 0x04, 0x07,
0x15, 0x00, 0x05, 0xFF, 0x80, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x01, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x1A, 0x40, 0x49, 0x09, 0x06, 0x01, 0x01,
0x02, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x03, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x05, 0x64, 0x09, 0x06,
0x01, 0x01, 0x04, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x02, 0x7B, 0x21, 0x20, 0x92, 0x7E
};
int sampleIndex = 0;
void setup() {
setupDebugPort();
// initialize the HanReader
// (passing no han port, as we are feeding data manually, but provide Serial for debugging)
hanReader.setup(NULL, &Serial);
}
void setupDebugPort()
{
// Initialize the Serial port for debugging
Serial.begin(115200);
while (!Serial) {}
Serial.setDebugOutput(true);
Serial.println("Serial1");
Serial.println("Serial debugging port initialized");
}
void loop() {
// Read one byte from the "port", and see if we got a full package
if (hanReader.read(samples[sampleIndex++]))
{
// Get the list identifier
int listSize = hanReader.getListSize();
Serial.println("");
Serial.print("List size: ");
Serial.print(listSize);
Serial.print(": ");
// Only care for the ACtive Power Imported, which is found in the first list
if (listSize == (int)Kamstrup::List1 || listSize == (int)Kamstrup::List2)
{
String id = hanReader.getString((int)Kamstrup_List1::ListVersionIdentifier);
Serial.println(id);
time_t time = hanReader.getPackageTime();
Serial.print("Time of the package is: ");
Serial.println(time);
int power = hanReader.getInt((int)Kamstrup_List1::ActiveImportPower);
Serial.print("Power consumtion is right now: ");
Serial.print(power);
Serial.println(" W");
float current[3];
current[0] = (float)hanReader.getInt((int)Kamstrup_List1::CurrentL1) / 100.0;
current[1] = (float)hanReader.getInt((int)Kamstrup_List1::CurrentL2) / 100.0;
current[2] = (float)hanReader.getInt((int)Kamstrup_List1::CurrentL3) / 100.0;
int voltage[3];
voltage[0] = hanReader.getInt((int)Kamstrup_List1::VoltageL1);
voltage[1] = hanReader.getInt((int)Kamstrup_List1::VoltageL2);
voltage[2] = hanReader.getInt((int)Kamstrup_List1::VoltageL3);
for (int i = 0; i < 3; i++)
{
Serial.print("L");
Serial.print(i + 1);
Serial.print(" is ");
Serial.print(voltage[i]);
Serial.print(" V (");
Serial.print(current[i]);
Serial.println(" A)");
}
if (listSize == (int)Kamstrup::List2)
{
time_t clock = hanReader.getTime((int)Kamstrup_List2::MeterClock);
Serial.print("Clock is: ");
Serial.println(clock);
}
}
}
delay(10);
if (sampleIndex >= sizeof(samples))
{
delay(2000);
sampleIndex = 0;
}
}

View File

@@ -1,31 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KamstrupTest", "KamstrupTest.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HanReader", "..\HanReader\HanReader.vcxitems", "{CD0F5364-923B-49E4-8BE5-EA7D8A60DF80}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
..\HanReader\HanReader.vcxitems*{c5f80730-f44f-4478-bdae-6634efc2ca88}*SharedItemsImports = 4
..\HanReader\HanReader.vcxitems*{cd0f5364-923b-49e4-8be5-ea7d8a60df80}*SharedItemsImports = 9
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {852F88D2-3495-4048-9662-E3DDE77A7FD7}
EndGlobalSection
EndGlobal

View File

@@ -1,99 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{C5F80730-F44F-4478-BDAE-6634EFC2CA88}</ProjectGuid>
<RootNamespace>
</RootNamespace>
<ProjectName>KamstrupTest</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>
</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>
</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
<Import Project="..\HanReader\HanReader.vcxitems" Label="Shared" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(ProjectDir)..\KamstrupTest;$(ProjectDir)..\HanReader\src;$(ProjectDir)..\..\..\..\..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\Extensions\53ggn0bh.0i3\Micro Platforms\visualmicro\ide\libraries;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries;$(ProjectDir)..\..\..\..\..\Arduino\libraries;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\libb64;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\spiffs;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\variants\generic;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\lwip\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\xtensa-lx106-elf;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\lib\gcc\xtensa-lx106-elf\4.8.2\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<ForcedIncludeFiles>$(ProjectDir)__vm\.KamstrupTest.vsarduino.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
<IgnoreStandardIncludePath>false</IgnoreStandardIncludePath>
<PreprocessorDefinitions>__ESP8266_ESp8266__;__ESP8266_ESP8266__;_VMDEBUG=1;__ets__;ICACHE_FLASH;F_CPU=80000000L;LWIP_OPEN_SRC;ARDUINO=10801;ARDUINO_ESP8266_ESP01;ARDUINO_ARCH_ESP8266;ESP8266;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ProjectCapability Include="VisualMicro" />
</ItemGroup>
<ItemGroup>
<None Include="KamstrupTest.ino">
<FileType>CppCode</FileType>
</None>
</ItemGroup>
<ItemGroup>
<ClInclude Include="__vm\.KamstrupTest.vsarduino.h" />
</ItemGroup>
<PropertyGroup>
<DebuggerFlavor>VisualMicroDebugger</DebuggerFlavor>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties custom_esp8266_generic_UploadSpeed="115200" arduino.upload.port="COM3" />
</VisualStudio>
</ProjectExtensions>
</Project>

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="KamstrupTest.ino" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="__vm\.KamstrupTest.vsarduino.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@@ -1,33 +0,0 @@
# Setup
1. Copy AmsToMqttBridge\Code\Arduino\HanReader\src to Arduino\libraries
2. Download the following libraries and put them in Arduino\libraries
- ESP8266WiFi
- PubSubClient
- ArduinoJson
The device will boot as an AP (Access Point) the first time it starts.
Connect to the AP (ESP-AMS-MQTT) and browse to the Web page http://192.168.4.1/
Fill inn the form on the Web page and hit 'Submit'
The ESP will reboot and connect to your network, publishing it's Firmware version to the 'esp/ams/fw/version' topic.
The ESP can be reset trough the topic 'esp/ams/reset' or by pulling GPIO 13 LOW.
# Firmware Over The Air upgrade
The ESP now supports FOTA upgrades. Compile your Arduino sketch to binary (Sketch > Export compiled binary)
Upload the .bin file to a Web Server and create a version file.
Example:
If your .bin file is named 'ams.bin', create a 'ams.version' in the same folder and write a version number different from the
version published on the 'esp/ams/fw/version' topic.
Then send the URL of the file, exluding the file ending, to the 'esp/ams/fw/update' topic like this:
`mosquitto_pub -t 'esp/ams/fw/update' -m 'http://your.local.webserver/ams'` if the bin and version file is in the root folder.
The ESP will publish upgrade information to the 'esp/ams/fw/info' topic.
# Output
All output is published on `esp/ams/#`

View File

@@ -1,524 +0,0 @@
/*
* Template sketch for a selv managed ESP8266 WiFi - MQTT setup.
*
* The ESP will boot and try to connect to a WiFi network.
* If it's not able to connect, it will boot up as an Access Point (AP).
*
* The user can then connect to the AP and browse to http://192.168.4.1
* and fill inn SSID/password, MQTT IP and meter type.
*
* The ESP will then store the information in EEPROM for later use.
* It is possible to reset the ESP trough MQTT or pulling GPIO13 HIGH.
*
* The sketch also supports Firmware OTA.
*
* Created 01. march 2017 by Ruben Andreassen
*/
/**
* EEPROM
*/
#include <EEPROM.h>
struct SettingsObject {
char ssid[51];
char password[51];
char mqtt[16];
int meter;
};
SettingsObject customSettings;
/**
* WIFI
*/
#include <ESP8266WiFi.h>
WiFiClient espClient;
const char* ssid_ap = "ESP-AMS-MQTT";
/**
* Access Point
*/
#include <ESP8266WebServer.h>
ESP8266WebServer server(80); //Server on port 80
bool apMode = false;
const char MAIN_page[] PROGMEM = R"=====(
<html>
<head>
<title>AMS - MQTT Bridge</title>
</head>
<body>
<form method="post" action="/store">
SSID <input type="text" name="ssid" /><br/>
Password <input type="text" name="password" /><br/>
MQTT IP <input type="text" name="mqtt" /><br/>
Meter <select name="meter">
<option value="0">Kamstrup</option>
<option value="1">Kaifa</option>
<!-- <option value="2">Aidon</option> -->
</select><br/>
<input type="submit" value="Submit" />
</form>
</body>
</html>
)=====";
/**
* Firmware updater
*/
#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>
const int FW_VERSION = 1010;
/**
* MQTT
*/
#include <PubSubClient.h>
PubSubClient client(espClient);
const char* mqtt_topic_fw_version = "esp/ams/fw/version";
const char* mqtt_topic_fw_update = "esp/ams/fw/update";
const char* mqtt_topic_fw_info = "esp/ams/fw/info";
const char* mqtt_topic_reset = "esp/ams/reset";
/**
* AMS
*/
#include <HanReader.h>
#include <Kamstrup.h>
#include <Kaifa.h>
// The HAN Port reader
HanReader hanReader;
const char* mqtt_topic = "esp/ams";
const char* mqtt_topic_PackageTime = "esp/ams/packagetime";
const char* mqtt_topic_ListSize = "esp/ams/listsize";
const char* mqtt_topic_ListVersionIdentifier = "esp/ams/listversionidentifier";
const char* mqtt_topic_MeterID = "esp/ams/meterid";
const char* mqtt_topic_MeterType = "esp/ams/metertype";
const char* mqtt_topic_ActiveImportPower = "esp/ams/activeimportpower";
const char* mqtt_topic_ActiveExportPower = "esp/ams/activeExportpower";
const char* mqtt_topic_ReactiveImportPower = "esp/ams/reactiveimportpower";
const char* mqtt_topic_ReactiveExportPower = "esp/ams/reactiveexportpower";
const char* mqtt_topic_CurrentL1 = "esp/ams/currentl1";
const char* mqtt_topic_CurrentL2 = "esp/ams/currentl2";
const char* mqtt_topic_CurrentL3 = "esp/ams/currentl3";
const char* mqtt_topic_VoltageL1 = "esp/ams/voltagel1";
const char* mqtt_topic_VoltageL2 = "esp/ams/voltagel2";
const char* mqtt_topic_VoltageL3 = "esp/ams/voltagel3";
const char* mqtt_topic_MeterClock = "esp/ams/meterclock";
const char* mqtt_topic_CumulativeActiveImportEnergy = "esp/ams/cumulativeactiveimportenergy";
const char* mqtt_topic_CumulativeActiveExportEnergy = "esp/ams/cumulativeactiveexportenergy";
const char* mqtt_topic_CumulativeReactiveImportEnergy = "esp/ams/cumulativereactiveimportenergy";
const char* mqtt_topic_CumulativeReactiveExportEnergy = "esp/ams/cumulativereactiveexportenergy";
String last_PackageTime = "";
String last_ListVersionIdentifier = "";
String last_MeterID = "";
String last_MeterType = "";
int last_ActiveImportPower = 0;
int last_ActiveExportPower = 0;
int last_ReactiveImportPower = 0;
int last_ReactiveExportPower = 0;
int last_CurrentL1 = 0;
int last_CurrentL2 = 0;
int last_CurrentL3 = 0;
int last_VoltageL1 = 0;
int last_VoltageL2 = 0;
int last_VoltageL3 = 0;
/**
* Setup and loop
*/
void setup() {
Serial.begin(9600);
pinMode(13, INPUT); //Reset PIN
loadCredentials();
if (!setupWiFi()) {
setupAP();
} else {
setupMqtt();
setupAms();
}
}
void loop() {
if (apMode) {
server.handleClient(); //Handle client requests
} else {
if (digitalRead(13) == LOW) {
clearCredentials();
}
loopMqtt();
if (customSettings.meter == 0) {
loopAmsKamstrup();
} else if (customSettings.meter == 1) {
loopAmsKaifa();
} /*else if (customSettings.meter == 2) {
Serial.println("Aidon selected");
// Not yet supported
}*/
}
}
/**
* EEPROM
*/
void clearCredentials() {
EEPROM.begin(512);
// write a 0 to all 512 bytes of the EEPROM
for (int i = 0; i < 512; i++) {
EEPROM.write(i, (char)0);
}
EEPROM.end();
for( int i = 0; i < sizeof(customSettings.ssid); ++i) {
customSettings.ssid[i] = (char)0;
customSettings.password[i] = (char)0;
}
for( int i = 0; i < sizeof(customSettings.mqtt); ++i) {
customSettings.mqtt[i] = (char)0;
}
customSettings.meter = -1;
WiFi.disconnect(1);
}
/** Load WLAN credentials from EEPROM */
void loadCredentials() {
EEPROM.begin(512);
EEPROM.get(0, customSettings);
customSettings.ssid[strlen(customSettings.ssid)] = '\0';
customSettings.password[strlen(customSettings.password)] = '\0';
EEPROM.end();
}
/** Store WLAN credentials to EEPROM */
void saveCredentials() {
EEPROM.begin(512);
EEPROM.put(0, customSettings);
EEPROM.commit();
EEPROM.end();
}
/**
* WIFI
*/
bool setupWiFi()
{
int retryCount = 0;
delay(10);
WiFi.mode(WIFI_STA);
WiFi.begin((char*)customSettings.ssid, (char*)customSettings.password);
while (WiFi.status() != WL_CONNECTED && retryCount < 20) {
delay(500);
Serial.println("Trying to connect to WiFi");
Serial.println(WiFi.status());
retryCount++;
}
Serial.println(WiFi.status());
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Could not connect");
return false;
} else {
Serial.println("Connected!");
return true;
}
}
/**
* Access Point
*/
void setupAP()
{
WiFi.mode(WIFI_AP); //Only Access point
WiFi.softAP(ssid_ap); //Start HOTspot removing password will disable security
IPAddress myIP = WiFi.softAPIP(); //Get IP address
Serial.print("HotSpt IP:");
Serial.println(myIP);
server.on("/", handleRoot); //Which routine to handle at root location
server.on("/store", handleSubmit); //Which routine to handle at root location
server.begin(); //Start server
apMode = true;
}
void handleRoot() {
String s = MAIN_page;
server.send(200, "text/html", s);
}
void handleSubmit() {
clearCredentials();
strncpy(customSettings.ssid, server.arg("ssid").c_str(), 51);
strncpy(customSettings.password, server.arg("password").c_str(), 51);
strncpy(customSettings.mqtt, server.arg("mqtt").c_str(), 16);
//strncpy(customSettings.meter, server.arg("meter").c_str(), 1);
customSettings.meter = server.arg("meter").toInt();
saveCredentials();
server.send(200, "text/plain", "Rebooting and connecting to your WiFi....");
delay(2000);
ESP.reset();
}
/**
* Firmware updater
*/
void checkForUpdates(String fwURL) {
String fwVersionURL = fwURL;
fwVersionURL.concat( ".version" );
client.publish(mqtt_topic_fw_info, ((String)"Checking for firmware updates.").c_str());
client.publish(mqtt_topic_fw_info, fwVersionURL.c_str());
HTTPClient httpClient;
httpClient.begin( fwVersionURL );
int httpCode = httpClient.GET();
if( httpCode == 200 ) {
String newFWVersion = httpClient.getString();
client.publish(mqtt_topic_fw_info, ((String)"Current firmware version").c_str());
client.publish(mqtt_topic_fw_info, ((String)FW_VERSION).c_str());
client.publish(mqtt_topic_fw_info, ((String)"Available firmware version").c_str());
client.publish(mqtt_topic_fw_info, newFWVersion.c_str());
int newVersion = newFWVersion.toInt();
if( newVersion > FW_VERSION ) {
client.publish(mqtt_topic_fw_info, ((String)"Preparing to update").c_str());
String fwImageURL = fwURL;
fwImageURL.concat( ".bin" );
client.publish(mqtt_topic_fw_info, ((String)"Downloading new firmware.").c_str());
client.publish(mqtt_topic_fw_info, fwImageURL.c_str());
t_httpUpdate_return ret = ESPhttpUpdate.update( fwImageURL );
switch(ret) {
case HTTP_UPDATE_FAILED:
//Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
client.publish(mqtt_topic_fw_info, ((String)HTTP_UPDATE_FAILED).c_str());
client.publish(mqtt_topic_fw_info, ((String)ESPhttpUpdate.getLastError()).c_str());
client.publish(mqtt_topic_fw_info, ESPhttpUpdate.getLastErrorString().c_str());
break;
case HTTP_UPDATE_NO_UPDATES:
client.publish(mqtt_topic_fw_info, ((String)HTTP_UPDATE_NO_UPDATES).c_str());
break;
}
}
else {
client.publish(mqtt_topic_fw_info, ((String)"Already on latest version").c_str());
}
}
else {
client.publish(mqtt_topic_fw_info, ((String)"Firmware version check failed, got HTTP response code").c_str());
client.publish(mqtt_topic_fw_info, ((String)httpCode).c_str());
}
httpClient.end();
}
/**
* MQTT
*/
void setupMqtt()
{
String input = (String)customSettings.mqtt;
// Define number of pieces
const int numberOfPieces = 4;
String pieces[numberOfPieces];
// Keep track of current position in array
int counter = 0;
// Keep track of the last comma so we know where to start the substring
int lastIndex = 0;
Serial.println(input);
Serial.println(input.length());
for (int i = 0; i < input.length(); i++) {
// Loop through each character and check if it's a comma
if (input.substring(i, i+1) == ".") {
// Grab the piece from the last index up to the current position and store it
pieces[counter] = input.substring(lastIndex, i);
// Update the last position and add 1, so it starts from the next character
lastIndex = i + 1;
// Increase the position in the array that we store into
counter++;
}
// If we're at the end of the string (no more commas to stop us)
if (i == input.length() - 1) {
// Grab the last part of the string from the lastIndex to the end
pieces[counter] = input.substring(lastIndex, i+1);
}
}
IPAddress server(pieces[0].toInt(), pieces[1].toInt(), pieces[2].toInt(), pieces[3].toInt());
client.setServer(server, 1883);
client.setCallback(callbackMqtt);
}
// Ensure the MQTT lirary gets some attention too
void loopMqtt()
{
if (!client.connected()) {
reconnectMqtt();
}
client.loop();
delay(100);
}
void callbackMqtt(char* topic, byte* payload, unsigned int length) {
/*for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}*/
if (strcmp(topic, mqtt_topic_fw_update) == 0) {
String fwURL = "";
for (int i = 0; i < length; i++) {
fwURL.concat( (char)payload[i] );
}
checkForUpdates(fwURL);
} else if (strcmp(topic, mqtt_topic_reset) == 0) {
clearCredentials();
delay(1000);
ESP.reset();
}
}
void reconnectMqtt() {
// Loop until we're reconnected
while (!client.connected()) {
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
Serial.println("MQTT reconnect");
// Attempt to connect
if (client.connect(clientId.c_str())) {
client.subscribe(mqtt_topic_reset);
client.subscribe(mqtt_topic_fw_update);
client.publish(mqtt_topic_fw_version, ((String)FW_VERSION).c_str());
}
else {
// Wait 5 seconds before retrying
delay(5000);
}
}
}
/**
* AMS
*/
void setupAms() {
// initialize the HanReader
if (customSettings.meter == 0) {
Serial.println("Kamstup selected");
hanReader.setup(&Serial, 2400, SERIAL_8N1, NULL);
}else if (customSettings.meter == 1) {
Serial.println("Kaifa selected");
hanReader.setup(&Serial);
} /*else if (customSettings.meter == 2) {
Serial.println("Aidon selected");
// Not yet supported
}*/ else {
Serial.println("Unknown meter type");
}
}
void loopAmsKamstrup() {
// Read one byte from the port, and see if we got a full package
if (hanReader.read())
{
// Get the list identifier
int listSize = hanReader.getListSize();
if (listSize == (int)Kamstrup::List1 || listSize == (int)Kamstrup::List2)
{
//Publish uptime to let the world know i'm alive
client.publish(mqtt_topic, ((String)millis()).c_str());
last_ListVersionIdentifier = publishNewValue(hanReader.getString((int)Kamstrup_List1::ListVersionIdentifier), last_ListVersionIdentifier, listSize, (int)Kamstrup::List2, mqtt_topic_ListVersionIdentifier);
last_MeterID = publishNewValue(hanReader.getString((int)Kamstrup_List1::MeterID), last_MeterID, listSize, (int)Kamstrup::List2, mqtt_topic_MeterID);
last_MeterType = publishNewValue(hanReader.getString((int)Kamstrup_List1::MeterType), last_MeterType, listSize, (int)Kamstrup::List2, mqtt_topic_MeterType);
last_PackageTime = publishNewValue((String)hanReader.getPackageTime(), last_PackageTime, listSize, (int)Kamstrup::List2, mqtt_topic_PackageTime);
last_ActiveImportPower = publishNewValue(hanReader.getInt((int)Kamstrup_List1::ActiveImportPower), last_ActiveImportPower, listSize, (int)Kamstrup::List2, mqtt_topic_ActiveImportPower);
last_ActiveExportPower = publishNewValue(hanReader.getInt((int)Kamstrup_List1::ActiveExportPower), last_ActiveExportPower, listSize, (int)Kamstrup::List2, mqtt_topic_ActiveExportPower);
last_ReactiveImportPower = publishNewValue(hanReader.getInt((int)Kamstrup_List1::ReactiveImportPower), last_ReactiveImportPower, listSize, (int)Kamstrup::List2, mqtt_topic_ReactiveImportPower);
last_ReactiveExportPower = publishNewValue(hanReader.getInt((int)Kamstrup_List1::ReactiveExportPower), last_ReactiveExportPower, listSize, (int)Kamstrup::List2, mqtt_topic_ReactiveExportPower);
last_CurrentL1 = publishNewValue(((float)hanReader.getInt((int)Kamstrup_List1::CurrentL1) / 100.0), last_CurrentL1, listSize, (int)Kamstrup::List2, mqtt_topic_CurrentL1);
last_CurrentL2 = publishNewValue(((float)hanReader.getInt((int)Kamstrup_List1::CurrentL2) / 100.0), last_CurrentL2, listSize, (int)Kamstrup::List2, mqtt_topic_CurrentL2);
last_CurrentL3 = publishNewValue(((float)hanReader.getInt((int)Kamstrup_List1::CurrentL3) / 100.0), last_CurrentL3, listSize, (int)Kamstrup::List2, mqtt_topic_CurrentL3);
last_VoltageL1 = publishNewValue(hanReader.getInt((int)Kamstrup_List1::VoltageL1), last_VoltageL1, listSize, (int)Kamstrup::List2, mqtt_topic_VoltageL1);
last_VoltageL2 = publishNewValue(hanReader.getInt((int)Kamstrup_List1::VoltageL2), last_VoltageL2, listSize, (int)Kamstrup::List2, mqtt_topic_VoltageL2);
last_VoltageL3 = publishNewValue(hanReader.getInt((int)Kamstrup_List1::VoltageL3), last_VoltageL3, listSize, (int)Kamstrup::List2, mqtt_topic_VoltageL3);
if (listSize == (int)Kamstrup::List2)
{
client.publish(mqtt_topic_MeterClock, ((String)hanReader.getTime((int)Kamstrup_List2::MeterClock)).c_str());
client.publish(mqtt_topic_CumulativeActiveImportEnergy, ((String)hanReader.getInt((int)Kamstrup_List2::CumulativeActiveImportEnergy)).c_str());
client.publish(mqtt_topic_CumulativeActiveExportEnergy, ((String)hanReader.getInt((int)Kamstrup_List2::CumulativeActiveExportEnergy)).c_str());
client.publish(mqtt_topic_CumulativeReactiveImportEnergy, ((String)hanReader.getInt((int)Kamstrup_List2::CumulativeReactiveImportEnergy)).c_str());
client.publish(mqtt_topic_CumulativeReactiveExportEnergy, ((String)hanReader.getInt((int)Kamstrup_List2::CumulativeReactiveExportEnergy)).c_str());
}
}
}
}
void loopAmsKaifa() {
//TODO
}
/*
* Only publish new values or when a spesific list size occours
*/
int publishNewValue(int currentValue, int lastValue, int currentListSize, int publishListSize, const char* topic) {
if (currentValue != lastValue || currentListSize == publishListSize) {
client.publish(topic, ((String)currentValue).c_str());
}
return currentValue;
}
float publishNewValue(float currentValue, float lastValue, int currentListSize, int publishListSize, const char* topic) {
if (currentValue != lastValue || currentListSize == publishListSize) {
client.publish(topic, ((String)currentValue).c_str());
}
return currentValue;
}
String publishNewValue(String currentValue, String lastValue, int currentListSize, int publishListSize, const char* topic) {
if (currentValue != lastValue || currentListSize == publishListSize) {
client.publish(topic, currentValue.c_str());
}
return currentValue;
}

View File

@@ -1,7 +0,0 @@
[Dd]ebug/
[Rr]elease/
# Visual Studio 2015 cache/options directory
.vs/
__vm/
*.user

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

View File

@@ -1,37 +0,0 @@
#include "Crc16.h"
Crc16Class::Crc16Class()
{
unsigned short value;
unsigned short temp;
for (unsigned short i = 0; i < 256; ++i)
{
value = 0;
temp = i;
for (byte j = 0; j < 8; ++j)
{
if (((value ^ temp) & 0x0001) != 0)
{
value = (ushort)((value >> 1) ^ polynomial);
}
else
{
value >>= 1;
}
temp >>= 1;
}
table[i] = value;
}
}
unsigned short Crc16Class::ComputeChecksum(byte *data, int start, int length)
{
ushort fcs = 0xffff;
for (int i = start; i < (start + length); i++)
{
byte index = (fcs ^ data[i]) & 0xff;
fcs = (ushort)((fcs >> 8) ^ table[index]);
}
fcs ^= 0xffff;
return fcs;
}

View File

@@ -1,23 +0,0 @@
#ifndef _CRC16_h
#define _CRC16_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
class Crc16Class
{
public:
Crc16Class();
unsigned short ComputeChecksum(byte *data, int start, int length);
protected:
private:
const unsigned short polynomial = 0x8408;
unsigned short table[256];
};
#endif

View File

@@ -1,154 +0,0 @@
#include "DlmsReader.h"
DlmsReader::DlmsReader()
{
//this->Clear();
}
void DlmsReader::Clear()
{
this->position = 0;
this->dataLength = 0;
this->destinationAddressLength = 0;
this->sourceAddressLength = 0;
this->frameFormatType = 0;
}
bool DlmsReader::Read(byte data)
{
if (position == 0 && data != 0x7E)
{
// we haven't started yet, wait for the start flag (no need to capture any data yet)
return false;
}
else
{
// We have completed reading of one package, so clear and be ready for the next
if (dataLength > 0 && position >= dataLength + 2)
Clear();
// Check if we're about to run into a buffer overflow
if (position >= DLMS_READER_BUFFER_SIZE)
Clear();
// Check if this is a second start flag, which indicates the previous one was a stop from the last package
if (position == 1 && data == 0x7E)
{
// just return, we can keep the one byte we had in the buffer
return false;
}
// We have started, so capture every byte
buffer[position++] = data;
if (position == 1)
{
// This was the start flag, we're not done yet
return false;
}
else if (position == 2)
{
// Capture the Frame Format Type
frameFormatType = (byte)(data & 0xF0);
if (!IsValidFrameFormat(frameFormatType))
Clear();
return false;
}
else if (position == 3)
{
// Capture the length of the data package
dataLength = ((buffer[1] & 0x0F) << 8) | buffer[2];
return false;
}
else if (destinationAddressLength == 0)
{
// Capture the destination address
destinationAddressLength = GetAddress(3, destinationAddress, 0, DLMS_READER_MAX_ADDRESS_SIZE);
if (destinationAddressLength > 3)
Clear();
return false;
}
else if (sourceAddressLength == 0)
{
// Capture the source address
sourceAddressLength = GetAddress(3 + destinationAddressLength, sourceAddress, 0, DLMS_READER_MAX_ADDRESS_SIZE);
if (sourceAddressLength > 3)
Clear();
return false;
}
else if (position == 4 + destinationAddressLength + sourceAddressLength + 2)
{
// Verify the header checksum
ushort headerChecksum = GetChecksum(position - 3);
if (headerChecksum != Crc16.ComputeChecksum(buffer, 1, position - 3))
Clear();
return false;
}
else if (position == dataLength + 1)
{
// Verify the data package checksum
ushort checksum = this->GetChecksum(position - 3);
if (checksum != Crc16.ComputeChecksum(buffer, 1, position - 3))
Clear();
return false;
}
else if (position == dataLength + 2)
{
// We're done, check the stop flag and signal we're done
if (data == 0x7E)
return true;
else
{
Clear();
return false;
}
}
}
return false;
}
bool DlmsReader::IsValidFrameFormat(byte frameFormatType)
{
return frameFormatType == 0xA0;
}
int DlmsReader::GetRawData(byte *dataBuffer, int start, int length)
{
if (dataLength > 0 && position == dataLength + 2)
{
int headerLength = 3 + destinationAddressLength + sourceAddressLength + 2;
int bytesWritten = 0;
for (int i = headerLength + 1; i < dataLength - 1; i++)
{
dataBuffer[i + start - headerLength - 1] = buffer[i];
bytesWritten++;
}
return bytesWritten;
}
else
return 0;
}
int DlmsReader::GetAddress(int addressPosition, byte* addressBuffer, int start, int length)
{
int addressBufferPos = start;
for (int i = addressPosition; i < position; i++)
{
addressBuffer[addressBufferPos++] = buffer[i];
// LSB=1 means this was the last address byte
if ((buffer[i] & 0x01) == 0x01)
break;
// See if we've reached last byte, try again when we've got more data
else if (i == position - 1)
return 0;
}
return addressBufferPos - start;
}
ushort DlmsReader::GetChecksum(int checksumPosition)
{
return (ushort)(buffer[checksumPosition + 2] << 8 |
buffer[checksumPosition + 1]);
}

View File

@@ -1,42 +0,0 @@
#ifndef _DLMSREADER_h
#define _DLMSREADER_h
#include "Crc16.h"
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#define DLMS_READER_BUFFER_SIZE 256
#define DLMS_READER_MAX_ADDRESS_SIZE 5
class DlmsReader
{
public:
DlmsReader();
bool Read(byte data);
int GetRawData(byte *buffer, int start, int length);
protected:
Crc16Class Crc16;
private:
byte buffer[DLMS_READER_BUFFER_SIZE];
int position;
int dataLength;
byte frameFormatType;
byte destinationAddress[DLMS_READER_MAX_ADDRESS_SIZE];
byte destinationAddressLength;
byte sourceAddress[DLMS_READER_MAX_ADDRESS_SIZE];
byte sourceAddressLength;
void Clear();
int GetAddress(int addressPosition, byte* buffer, int start, int length);
unsigned short GetChecksum(int checksumPosition);
bool IsValidFrameFormat(byte frameFormatType);
void WriteBuffer();
};
#endif

View File

@@ -1,191 +0,0 @@
/*
* Simple sketch to read MBus data from electrical meter
* As the protocol requires "Even" parity, and this is
* only supported on the hardware port of the ESP8266,
* we'll have to use Serial1 for debugging.
*
* This means you'll have to program the ESP using the
* regular RX/TX port, and then you must remove the FTDI
* and connect the MBus signal from the meter to the
* RS pin. The FTDI/RX can be moved to Pin2 for debugging
*
* Created 14. september 2017 by Roar Fredriksen
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "HanReader.h"
// The HAN Port reader
HanReader hanReader;
// WiFi and MQTT endpoints
const char* ssid = "Roar_Etne";
const char* password = "**********";
const char* mqtt_server = "192.168.10.203";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
setupDebugPort();
setupWiFi();
setupMqtt();
// initialize the HanReader
// (passing Serial as the HAN port and Serial1 for debugging)
hanReader.setup(&Serial, &Serial1);
}
void setupMqtt()
{
client.setServer(mqtt_server, 1883);
}
void setupDebugPort()
{
// Initialize the Serial1 port for debugging
// (This port is fixed to Pin2 of the ESP8266)
Serial1.begin(115200);
while (!Serial1) {}
Serial1.setDebugOutput(true);
Serial1.println("Serial1");
Serial1.println("Serial debugging port initialized");
}
void setupWiFi()
{
// Initialize wifi
Serial1.print("Connecting to ");
Serial1.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial1.print(".");
}
Serial1.println("");
Serial1.println("WiFi connected");
Serial1.println("IP address: ");
Serial1.println(WiFi.localIP());
}
void loop() {
loopMqtt();
// Read one byt from the port, and see if we got a full package
if (hanReader.read())
{
// Get the list identifier
List list = hanReader.getList();
Serial1.println("");
Serial1.print("List #");
Serial1.print((byte)list, HEX);
Serial1.print(": ");
// Make sure we got a valid list
if (list == List::ListUnknown)
{
Serial1.println("Invalid list");
return;
}
// Get the timestamp (as unix time) from the package
time_t time = hanReader.getPackageTime();
// Define a json object to keep the data
StaticJsonBuffer<500> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
// Any generic useful info here
root["id"] = "espdebugger";
root["up"] = millis();
root["t"] = time;
// Add a sub-structure to the json object,
// to keep the data from the meter itself
JsonObject& data = root.createNestedObject("data");
// Based on the list number, get all details
// according to OBIS specifications for the meter
if (list == List::List1)
{
data["P"] = hanReader.getInt(List1_ObisObjects::ActivePowerImported);
}
else if (list == List::List2)
{
data["lv"] = hanReader.getString(List2_ObisObjects::ObisListVersionIdentifier);
data["id"] = hanReader.getString(List2_ObisObjects::MeterID);
data["type"] = hanReader.getString(List2_ObisObjects::MeterType);
data["P"] = hanReader.getInt(List2_ObisObjects::ActivePowerImported);
data["Q"] = hanReader.getInt(List2_ObisObjects::ReactivePowerImported);
data["I1"] = hanReader.getInt(List2_ObisObjects::CurrentPhaseL1);
data["I2"] = hanReader.getInt(List2_ObisObjects::CurrentPhaseL2);
data["I3"] = hanReader.getInt(List2_ObisObjects::CurrentPhaseL3);
data["U1"] = hanReader.getInt(List2_ObisObjects::VoltagePhaseL1);
data["U2"] = hanReader.getInt(List2_ObisObjects::VoltagePhaseL1);
data["U3"] = hanReader.getInt(List2_ObisObjects::VoltagePhaseL1);
}
else if (list == List::List3)
{
data["lv"] = hanReader.getString(List3_ObisObjects::ObisListVersionIdentifier);;
data["id"] = hanReader.getString(List3_ObisObjects::MeterID);
data["type"] = hanReader.getString(List3_ObisObjects::MeterType);
data["P"] = hanReader.getInt(List3_ObisObjects::ActivePowerImported);
data["Q"] = hanReader.getInt(List3_ObisObjects::ReactivePowerImported);
data["I1"] = hanReader.getInt(List3_ObisObjects::CurrentPhaseL1);
data["I2"] = hanReader.getInt(List3_ObisObjects::CurrentPhaseL2);
data["I3"] = hanReader.getInt(List3_ObisObjects::CurrentPhaseL3);
data["U1"] = hanReader.getInt(List3_ObisObjects::VoltagePhaseL1);
data["U2"] = hanReader.getInt(List3_ObisObjects::VoltagePhaseL1);
data["U3"] = hanReader.getInt(List3_ObisObjects::VoltagePhaseL1);
data["tPI"] = hanReader.getInt(List3_ObisObjects::TotalActiveEnergyImported);
data["tPO"] = hanReader.getInt(List3_ObisObjects::TotalActiveEnergyExported);
data["tQI"] = hanReader.getInt(List3_ObisObjects::TotalReactiveEnergyImported);
data["tQO"] = hanReader.getInt(List3_ObisObjects::TotalReactiveEnergyExported);
}
// Write the json to the debug port
root.printTo(Serial1);
Serial1.println();
// Publish the json to the MQTT server
char msg[1024];
root.printTo(msg, 1024);
client.publish("sensors/out/espdebugger", msg);
}
}
// Ensure the MQTT lirary gets some attention too
void loopMqtt()
{
if (!client.connected()) {
reconnectMqtt();
}
client.loop();
}
void reconnectMqtt() {
// Loop until we're reconnected
while (!client.connected()) {
Serial1.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP8266Client")) {
Serial1.println("connected");
// Once connected, publish an announcement...
// client.publish("sensors", "hello world");
// ... and resubscribe
// client.subscribe("inTopic");
}
else {
Serial1.print("failed, rc=");
Serial1.print(client.state());
Serial1.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}

View File

@@ -1,22 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26228.4
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ESPDebugger", "ESPDebugger.vcxproj", "{B9C3E8F6-86B2-4D70-89ED-D6A7B8C7AC8D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B9C3E8F6-86B2-4D70-89ED-D6A7B8C7AC8D}.Debug|x86.ActiveCfg = Debug|Win32
{B9C3E8F6-86B2-4D70-89ED-D6A7B8C7AC8D}.Debug|x86.Build.0 = Debug|Win32
{B9C3E8F6-86B2-4D70-89ED-D6A7B8C7AC8D}.Release|x86.ActiveCfg = Release|Win32
{B9C3E8F6-86B2-4D70-89ED-D6A7B8C7AC8D}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@@ -1,101 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{B9C3E8F6-86B2-4D70-89ED-D6A7B8C7AC8D}</ProjectGuid>
<RootNamespace>
</RootNamespace>
<ProjectName>ESPDebugger</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>
</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>
</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\Arduino\libraries\ArduinoJson\src;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src;$(ProjectDir)..\..\..\..\Arduino\libraries\PubSubClient\src;$(ProjectDir)..\..\..\..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\Extensions\pabjyzh5.4hi\Micro Platforms\visualmicro\ide\libraries;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries;$(ProjectDir)..\..\..\..\Arduino\libraries;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\libb64;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\spiffs;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\variants\generic;$(ProjectDir)..\ESPDebugger;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\lwip\include;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\xtensa-lx106-elf;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\lib\gcc\xtensa-lx106-elf\4.8.2\include;$(ProjectDir)..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<ForcedIncludeFiles>$(ProjectDir)__vm\.ESPDebugger.vsarduino.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
<IgnoreStandardIncludePath>false</IgnoreStandardIncludePath>
<PreprocessorDefinitions>__ESP8266_ESp8266__;__ESP8266_ESP8266__;_VMDEBUG=1;__ets__;ICACHE_FLASH;F_CPU=80000000L;LWIP_OPEN_SRC;ARDUINO=10801;ARDUINO_ESP8266_ESP01;ARDUINO_ARCH_ESP8266;ESP8266;__cplusplus=201103L;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ProjectCapability Include="VisualMicro" />
</ItemGroup>
<ItemGroup>
<None Include="ESPDebugger.ino">
<FileType>CppCode</FileType>
</None>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Crc16.h" />
<ClInclude Include="DlmsReader.h" />
<ClInclude Include="HanReader.h" />
<ClInclude Include="KaifaHan.h" />
<ClInclude Include="__vm\.ESPDebugger.vsarduino.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="Crc16.cpp" />
<ClCompile Include="DlmsReader.cpp" />
<ClCompile Include="HanReader.cpp" />
<ClCompile Include="KaifaHan.cpp" />
</ItemGroup>
<PropertyGroup>
<DebuggerFlavor>VisualMicroDebugger</DebuggerFlavor>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="ESPDebugger.ino" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="__vm\.ESPDebugger.vsarduino.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="HanReader.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="KaifaHan.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="DlmsReader.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Crc16.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="HanReader.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="KaifaHan.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Crc16.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DlmsReader.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -1,70 +0,0 @@
#include "HanReader.h"
HanReader::HanReader()
{
}
void HanReader::setup(HardwareSerial *hanPort, unsigned long baudrate, SerialConfig config, Stream *debugPort)
{
// Initialize H/W serial port for MBus communication
hanPort->begin(baudrate, config);
while (!hanPort) {}
bytesRead = 0;
han = hanPort;
debug = debugPort;
if (debug) debug->println("MBUS serial setup complete");
}
void HanReader::setup(HardwareSerial *hanPort)
{
setup(hanPort, 2400, SERIAL_8E1, NULL);
}
void HanReader::setup(HardwareSerial *hanPort, Stream *debugPort)
{
setup(hanPort, 2400, SERIAL_8E1, debugPort);
}
bool HanReader::read()
{
if (han->available())
{
byte newByte = han->read();
if (reader.Read(newByte))
{
bytesRead = reader.GetRawData(buffer, 0, 512);
list = (List)kaifa.GetListID(buffer, 0, bytesRead);
return true;
}
}
return false;
}
List HanReader::getList()
{
return list;
}
time_t HanReader::getPackageTime()
{
return kaifa.GetPackageTime(buffer, 0, bytesRead);
}
int HanReader::getInt(List1_ObisObjects objectId) { return getInt((int)objectId); }
int HanReader::getInt(List2_ObisObjects objectId) { return getInt((int)objectId); }
int HanReader::getInt(List3_ObisObjects objectId) { return getInt((int)objectId); }
int HanReader::getInt(int objectId)
{
return kaifa.GetInt(objectId, buffer, 0, bytesRead);
}
String HanReader::getString(List1_ObisObjects objectId) { return getString((int)objectId); }
String HanReader::getString(List2_ObisObjects objectId) { return getString((int)objectId); }
String HanReader::getString(List3_ObisObjects objectId) { return getString((int)objectId); }
String HanReader::getString(int objectId)
{
return kaifa.GetString(objectId, buffer, 0, bytesRead);
}

View File

@@ -1,45 +0,0 @@
#ifndef _HANREADER_h
#define _HANREADER_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include "KaifaHan.h"
#include "DlmsReader.h"
class HanReader
{
public:
HanReader();
void setup(HardwareSerial *hanPort);
void setup(HardwareSerial *hanPort, Stream *debugPort);
void setup(HardwareSerial *hanPort, unsigned long baudrate, SerialConfig config, Stream *debugPort);
bool read();
List getList();
time_t getPackageTime();
int getInt(List1_ObisObjects objectId);
int getInt(List2_ObisObjects objectId);
int getInt(List3_ObisObjects objectId);
int getInt(int objectId);
String getString(List1_ObisObjects objectId);
String getString(List2_ObisObjects objectId);
String getString(List3_ObisObjects objectId);
String getString(int objectId);
private:
Stream *debug;
HardwareSerial *han;
byte buffer[512];
int bytesRead;
KaifaHan kaifa;
DlmsReader reader;
List list;
};
#endif

View File

@@ -1,104 +0,0 @@
#include "KaifaHan.h"
byte KaifaHan::GetListID(byte *buffer, int start, int length)
{
if (length > 23)
{
byte list = buffer[start + 23];
if (list == (byte)List::List1) return (byte)List::List1;
if (list == (byte)List::List2) return (byte)List::List2;
if (list == (byte)List::List3) return (byte)List::List3;
}
return (byte)List::ListUnknown;
}
long KaifaHan::GetPackageTime(byte *buffer, int start, int length)
{
const int timeStart = 10;
int year = buffer[start + timeStart] << 8 |
buffer[start + timeStart + 1];
int month = buffer[start + timeStart + 2];
int day = buffer[start + timeStart + 3];
int hour = buffer[start + timeStart + 5];
int minute = buffer[start + timeStart + 6];
int second = buffer[start + timeStart + 7];
return toUnixTime(year, month, day, hour, minute, second);
}
int KaifaHan::GetInt(int dataPosition, byte *buffer, int start, int length)
{
int valuePosition = findValuePosition(dataPosition, buffer, start, length);
if (valuePosition > 0)
{
int value = 0;
for (int i = valuePosition + 1; i < valuePosition + 5; i++)
{
value = value << 8 | buffer[i];
}
return value;
}
return 0;
}
int KaifaHan::findValuePosition(int dataPosition, byte *buffer, int start, int length)
{
const int dataStart = 24;
for (int i=start + dataStart; i<length; i++)
{
if (dataPosition-- == 0)
return i;
else if (buffer[i] == 0x09) // string value
i += buffer[i+1] + 1;
else if (buffer[i] == 0x06) // integer value
i += 4;
else
return 0; // unknown data type found
}
return 0;
}
String KaifaHan::GetString(int dataPosition, byte *buffer, int start, int length)
{
int valuePosition = findValuePosition(dataPosition, buffer, start, length);
if (valuePosition > 0)
{
String value = String("");
for (int i = valuePosition + 2; i < valuePosition + buffer[valuePosition + 1]; i++)
{
value += String((char)buffer[i]);
}
return value;
}
return String("");
}
time_t KaifaHan::toUnixTime(int year, int month, int day, int hour, int minute, int second)
{
byte daysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
long secondsPerMinute = 60;
long secondsPerHour = secondsPerMinute * 60;
long secondsPerDay = secondsPerHour * 24;
long time = (year - 1970) * secondsPerDay * 365L;
for (int yearCounter = 1970; yearCounter<year; yearCounter++)
if ((yearCounter % 4 == 0) && ((yearCounter % 100 != 0) || (yearCounter % 400 == 0)))
time += secondsPerDay;
if (month > 2 && (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))
time += secondsPerDay;
for (int monthCounter = 1; monthCounter<month; monthCounter++)
time += daysInMonth[monthCounter - 1] * secondsPerDay;
time += (day - 1) * secondsPerDay;
time += hour * secondsPerHour;
time += minute * secondsPerMinute;
time += second;
return (time_t)time;
}

View File

@@ -1,73 +0,0 @@
#ifndef _KAIFAHAN_h
#define _KAIFAHAN_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
class KaifaHan
{
public:
byte GetListID(byte *buffer, int start, int length);
long GetPackageTime(byte *buffer, int start, int length);
int GetInt(int dataPosition, byte *buffer, int start, int length);
String GetString(int dataPosition, byte *buffer, int start, int length);
protected:
private:
int findValuePosition(int dataPosition, byte *buffer, int start, int length);
time_t toUnixTime(int year, int month, int day, int hour, int minute, int second);
};
enum class List : byte {
ListUnknown = 0x00,
List1 = 0x01,
List2 = 0x0D,
List3 = 0x12
};
enum class List1_ObisObjects {
ActivePowerImported
};
enum class List2_ObisObjects {
ObisListVersionIdentifier,
MeterID,
MeterType,
ActivePowerImported,
ActivePowerExported,
ReactivePowerImported,
ReactivePowerExported,
CurrentPhaseL1,
CurrentPhaseL2,
CurrentPhaseL3,
VoltagePhaseL1,
VoltagePhaseL2,
VoltagePhaseL3
};
enum class List3_ObisObjects {
ObisListVersionIdentifier,
MeterID,
MeterType,
ActivePowerImported,
ActivePowerExported,
ReactivePowerImported,
ReactivePowerExported,
CurrentPhaseL1,
CurrentPhaseL2,
CurrentPhaseL3,
VoltagePhaseL1,
VoltagePhaseL2,
VoltagePhaseL3,
ClockAndDate,
TotalActiveEnergyImported,
TotalActiveEnergyExported,
TotalReactiveEnergyImported,
TotalReactiveEnergyExported
};
#endif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -1,253 +0,0 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
appsettings.secrets.json

View File

@@ -1,28 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26228.4
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HanDebugger", "HanDebugger\HanDebugger.csproj", "{EB8BDAFE-8991-4E9E-9E7E-F9BE61EBC122}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HanDebuggerTest", "HanDebuggerTest\HanDebuggerTest.csproj", "{B22621C3-84EB-46DC-8F8D-E01D0A9923C7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{EB8BDAFE-8991-4E9E-9E7E-F9BE61EBC122}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB8BDAFE-8991-4E9E-9E7E-F9BE61EBC122}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EB8BDAFE-8991-4E9E-9E7E-F9BE61EBC122}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EB8BDAFE-8991-4E9E-9E7E-F9BE61EBC122}.Release|Any CPU.Build.0 = Release|Any CPU
{B22621C3-84EB-46DC-8F8D-E01D0A9923C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B22621C3-84EB-46DC-8F8D-E01D0A9923C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B22621C3-84EB-46DC-8F8D-E01D0A9923C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B22621C3-84EB-46DC-8F8D-E01D0A9923C7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>

View File

@@ -1,56 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HanDebugger
{
public static class Crc16
{
private const ushort polynomial = 0x8408;
private static ushort[] table = new ushort[256];
static Crc16()
{
ushort value;
ushort temp;
for (ushort i = 0; i < table.Length; ++i)
{
value = 0;
temp = i;
for (byte j = 0; j < 8; ++j)
{
if (((value ^ temp) & 0x0001) != 0)
{
value = (ushort)((value >> 1) ^ polynomial);
}
else
{
value >>= 1;
}
temp >>= 1;
}
table[i] = value;
}
}
public static ushort ComputeChecksum(byte[] data)
{
return ComputeChecksum(data, 0, data.Length);
}
public static ushort ComputeChecksum(byte[] data, int start, int length)
{
ushort fcs = 0xffff;
for (int i = start; i < (start + length); i++)
{
var index = (fcs ^ data[i]) & 0xff;
fcs = (ushort)((fcs >> 8) ^ table[index]);
}
fcs ^= 0xffff;
return fcs;
}
}
}

View File

@@ -1,166 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HanDebugger
{
public class DlmsReader
{
private byte[] buffer;
private int position;
private int dataLength;
private byte frameFormatType;
private byte[] destinationAddress;
private byte[] sourceAddress;
public DlmsReader()
{
Clear();
}
private void Clear()
{
buffer = new byte[256];
position = 0;
dataLength = 0;
destinationAddress = null;
sourceAddress = null;
frameFormatType = 0;
}
public bool Read(byte data)
{
if (position == 0 && data != 0x7E)
{
// we haven't started yet, wait for the start flag (no need to capture any data yet)
return false;
}
else
{
// We have completed reading of one package, so clear and be ready for the next
if (dataLength > 0 && position >= dataLength + 2)
Clear();
// Check if we're about to run into a buffer overflow
if (position >= buffer.Length)
Clear();
// Check if this is a second start flag, which indicates the previous one was a stop from the last package
if (position == 1 && data == 0x7E)
{
// just return, we can keep the one byte we had in the buffer
return false;
}
// We have started, so capture every byte
buffer[position++] = data;
if (position == 1)
{
// This was the start flag, we're not done yet
return false;
}
else if (position == 2)
{
// Capture the Frame Format Type
frameFormatType = (byte)(data & 0xF0);
if (!IsValidFrameFormat(frameFormatType))
Clear();
return false;
}
else if (position == 3)
{
// Capture the length of the data package
dataLength = ((buffer[1] & 0x0F) << 8) | buffer[2];
return false;
}
else if (destinationAddress == null)
{
// Capture the destination address
destinationAddress = GetAddress(3);
if (destinationAddress?.Length > 3)
Clear();
return false;
}
else if (sourceAddress == null)
{
// Capture the source address
sourceAddress = GetAddress(3 + destinationAddress.Length);
if (sourceAddress?.Length > 3)
Clear();
return false;
}
else if (position == 4 + destinationAddress.Length + sourceAddress.Length + 2)
{
// Verify the header checksum
var headerChecksum = GetChecksum(position - 3);
if (headerChecksum != Crc16.ComputeChecksum(buffer, 1, position - 3))
Clear();
return false;
}
else if (position == dataLength + 1)
{
// Verify the data package checksum
var checksum = GetChecksum(position - 3);
if (checksum != Crc16.ComputeChecksum(buffer, 1, position - 3))
Clear();
return false;
}
else if (position == dataLength + 2)
{
// We're done, check the stop flag and signal we're done
if (data == 0x7E)
return true;
else
{
Clear();
return false;
}
}
}
return false;
}
private bool IsValidFrameFormat(byte frameFormatType)
{
return frameFormatType == 0xA0;
}
public byte[] GetRawData()
{
if (dataLength > 0 && position == dataLength + 2)
{
var headerLength = 3 + destinationAddress.Length + sourceAddress.Length + 2;
return buffer.Skip(headerLength + 1).Take(dataLength - headerLength - 2).ToArray();
}
else
return null;
}
private byte[] GetAddress(int addressPosition)
{
List<byte> address = new List<byte>();
for (int i = addressPosition; i < position; i++)
{
address.Add(buffer[i]);
// LSB=1 means this was the last address byte
if ((buffer[i] & 0x01) == 0x01)
break;
// See if we've reached last byte, try again when we've got more data
else if (i == position - 1)
return null;
}
return address.ToArray();
}
private ushort GetChecksum(int checksumPosition)
{
return (ushort)(buffer[checksumPosition + 2] << 8 |
buffer[checksumPosition + 1]);
}
}
}

View File

@@ -1,64 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{EB8BDAFE-8991-4E9E-9E7E-F9BE61EBC122}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>HanDebugger</RootNamespace>
<AssemblyName>HanDebugger</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Crc16.cs" />
<Compile Include="KaifaHanBeta.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Reader.cs" />
<Compile Include="DlmsReader.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -1,70 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HanDebugger
{
// As it seems Kaifa/Valider put some premature firmware on my AMS,
// there's need for some dirty hacks to get any information
public class KaifaHanBeta
{
public const byte ListUnknown = 0x00;
public const byte List1 = 0x01;
public const byte List2 = 0x0D;
public const byte List3 = 0x12;
public static byte GetListID(byte[] package, int start, int length)
{
switch (package[start + 23])
{
case List1:
case List2:
case List3:
return package[start + 23];
default:
return 0x00;
}
}
public static double GetPackageTime(byte[] package, int start, int length)
{
const int timeStart = 10;
int year = package[start + timeStart] << 8 |
package[start + timeStart + 1];
int month = package[start + timeStart + 2];
int day = package[start + timeStart + 3];
int hour = package[start + timeStart + 5];
int minute = package[start + timeStart + 6];
int second = package[start + timeStart + 7];
return new DateTime(year, month, day, hour, minute, second).Subtract(new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds;
}
public static int GetInt(int dataPosition, byte[] buffer, int start, int length)
{
const int dataStart = 24;
int value = 0;
int foundPosition = 0;
for (int i = start + dataStart; i < start + length; i++)
{
if (foundPosition == 0)
{
if (buffer[i] == 0x06)
foundPosition = i;
}
else
{
value = value << 8 |
buffer[i];
if (i == foundPosition + 4)
return value;
}
}
return 0;
}
}
}

View File

@@ -1,63 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace HanDebugger
{
class Program
{
static List<byte> gBuffer = new List<byte>();
static void Main(string[] args)
{
SerialPort vPort = new SerialPort("COM3", 2400, Parity.Even, 8, StopBits.One);
vPort.DataReceived += VPort_DataReceived;
vPort.Open();
while (true)
Thread.Sleep(100);
}
private static void VPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var vPort = sender as SerialPort;
byte[] vBuffer = new byte[1000];
int vBytesRead = vPort.Read(vBuffer, 0, vBuffer.Length);
for (int i = 0; i < vBytesRead; i++)
{
gBuffer.Add(vBuffer[i]);
// If we're catching a '7E' and it's not the beginning, it must be the end
if (gBuffer.Count > 1 && vBuffer[i] == 0x7e)
WriteAndEmptyBuffer();
}
}
private static void WriteAndEmptyBuffer()
{
Console.WriteLine();
Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Received {gBuffer.Count} (0x{gBuffer.Count:X2}) bytes]");
int j = 0;
foreach (var vByte in gBuffer)
{
Console.Write(string.Format("{0:X2} ", (int)vByte));
if (++j % 8 == 0)
Console.Write(" ");
if (j % 24 == 0)
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine();
gBuffer.Clear();
}
}
}

View File

@@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("HanDebugger")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("HanDebugger")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("eb8bdafe-8991-4e9e-9e7e-f9be61ebc122")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -1,72 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HanDebugger
{
public class Reader
{
private int position;
private int dataLength;
private byte[] buffer;
public Reader(byte[] buffer)
{
this.buffer = buffer;
position = 0;
dataLength = ((buffer[1] & 0x0F) << 8) | buffer[2];
}
public bool IsValid()
{
return IsValidStart() &&
IsValidLength() &&
IsValidHeaderChecksum() &&
IsValidChecksum();
}
private bool IsValidChecksum()
{
ushort checkSum = GetChecksum(dataLength - 2);
return checkSum == Crc16.ComputeChecksum(buffer, 1, dataLength - 2);
}
private bool IsValidHeaderChecksum()
{
int headerLength = GetHeaderLength();
ushort checkSum = GetChecksum(headerLength);
return checkSum == Crc16.ComputeChecksum(buffer, 1, headerLength);
}
private ushort GetChecksum(int checksumPosition)
{
return (ushort)(buffer[checksumPosition + 2] << 8 |
buffer[checksumPosition + 1]);
}
private int GetHeaderLength()
{
var pos = position + 3; // Dest address
while ((buffer[pos] & 0x01) == 0x00)
pos++;
pos++; // source address
while ((buffer[pos] & 0x01) == 0x00)
pos++;
pos++; // control field
return pos;
}
private bool IsValidLength()
{
return buffer.Length >= dataLength + 2;
}
public bool IsValidStart()
{
return (buffer[0] == 0x7E);
}
}
}

View File

@@ -1,66 +0,0 @@
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using HanDebugger;
namespace HanDebuggerTest
{
[TestClass]
public class Crc16Test
{
[TestMethod]
public void Crc16ChecksumTest()
{
TestChecksum(new byte[] { 0x80, 0x93 }, "7E A0 79 01 02 01 10", 1, 6);
TestChecksum(new byte[] { 0x80, 0x93 }, "7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FC 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8C 06 00 00 08 1C 06 00 00 07 97 06 00 00 0A CA 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 66 FD 27 7E", 1, 6);
TestChecksum(new byte[] { 0x80, 0x93 }, "A0 79 01 02 01 10");
TestChecksum(new byte[] { 0xA7, 0x44 }, "A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8A 06 00 00 08 22 06 00 00 07 9A 06 00 00 0A D4 06 00 00 09 5B 06 00 00 00 00 06 00 00 09 66");
//string bytesAsString = "A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8A 06 00 00 08 22 06 00 00 07 9A 06 00 00 0A D4 06 00 00 09 5B 06 00 00 00 00 06 00 00 09 66";
//byte[] bytes = bytesAsString.Split(' ').Select(v => (byte)int.Parse(v, System.Globalization.NumberStyles.HexNumber)).ToArray();
//var checksum = Crc16.ComputeChecksum(bytes);
//var checksumBytes = ConvertToBytes(checksum);
//Assert.IsTrue(Equals(new byte[] { 0xa7, 0x44 }, checksumBytes), "Checksum did not match");
}
private void TestChecksum(byte[] validChecksum, string dataAsString)
{
byte[] bytes = dataAsString.Trim().Split(' ').Select(v => (byte)int.Parse(v, System.Globalization.NumberStyles.HexNumber)).ToArray();
var checksum = Crc16.ComputeChecksum(bytes);
var checksumBytes = ConvertToBytes(checksum);
Assert.IsTrue(Equals(validChecksum, checksumBytes), $"Checksum did not match. Was: {Format(checksumBytes)}, Expected: {Format(validChecksum)}");
}
private void TestChecksum(byte[] validChecksum, string dataAsString, int start, int length)
{
// "A0 79 01 02 01 10"
byte[] bytes = dataAsString.Trim().Split(' ').Select(v => (byte)int.Parse(v, System.Globalization.NumberStyles.HexNumber)).ToArray();
var checksum = Crc16.ComputeChecksum(bytes, start, length);
var checksumBytes = ConvertToBytes(checksum);
Assert.IsTrue(Equals(validChecksum, checksumBytes), $"Checksum did not match. Was: {Format(checksumBytes)}, Expected: {Format(validChecksum)}");
}
private string Format(byte[] buffer)
{
return string.Join(" ", buffer.Select(v => $"{v:X}").ToArray());
}
private static byte[] ConvertToBytes(ushort checksum)
{
return new byte[]
{
(byte)(checksum & 0xff),
(byte)((checksum >> 8) & 0xff)
};
}
private static bool Equals(byte[] a1, byte[] a2)
{
if (a1 == null || a2 == null) return false;
if (a1?.Length != a2?.Length) return false;
for (int i = 0; i < a1.Length; i++)
if (a1[i] != a2[i])
return false;
return true;
}
}
}

View File

@@ -1,55 +0,0 @@
using HanDebugger;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HanDebuggerTest
{
[TestClass]
public class DlmsReaderTest
{
[TestMethod]
public void TestDlmsReader()
{
var text = File.ReadAllText("SampleData.txt").Replace("\r\n", " ").Replace(" ", " ");
byte[] bytes = text.Trim().Split(' ').Select(v => (byte)int.Parse(v, System.Globalization.NumberStyles.HexNumber)).ToArray();
var reader = new DlmsReader();
int packages = 0;
for (int i=0; i<bytes.Length; i++)
{
if (reader.Read(bytes[i]))
{
packages++;
//byte[] data = reader.GetRawData();
}
}
Assert.IsTrue(packages == 559, $"There should be 559 packages. Was: {packages}");
}
[TestMethod]
public void TestDlmsReaderWithError()
{
var text = File.ReadAllText("SampleData.txt").Replace("\r\n", " ").Replace(" ", " ");
byte[] bytes = text.Trim().Split(' ').Select(v => (byte)int.Parse(v, System.Globalization.NumberStyles.HexNumber)).ToArray();
bytes = bytes.Skip(10).ToArray();
var reader = new DlmsReader();
int packages = 0;
for (int i = 0; i < bytes.Length; i++)
{
if (reader.Read(bytes[i]))
{
packages++;
//byte[] data = reader.GetRawData();
}
}
Assert.IsTrue(packages == 558, $"There should be 558 packages. Was: {packages}");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{B22621C3-84EB-46DC-8F8D-E01D0A9923C7}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>HanDebuggerTest</RootNamespace>
<AssemblyName>HanDebuggerTest</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\MSTest.TestFramework.1.1.11\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\MSTest.TestFramework.1.1.11\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Crc16Test.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="DlmsReaderTest.cs" />
<Compile Include="ReaderTest.cs" />
<Compile Include="KaifaHanBetaTest.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\HanDebugger\HanDebugger.csproj">
<Project>{eb8bdafe-8991-4e9e-9e7e-f9be61ebc122}</Project>
<Name>HanDebugger</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="ESP 20170918 Raw.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="SampleData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Kamstrup228.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props'))" />
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets'))" />
</Target>
<Import Project="..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets')" />
</Project>

View File

@@ -1,65 +0,0 @@
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using System.Collections.Generic;
using HanDebugger;
namespace HanDebuggerTest
{
[TestClass]
[DeploymentItem(@"ESP 20170918 Raw.txt")]
[DeploymentItem("Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll")]
public class KaifaHanBetaTest
{
[TestMethod]
public void TestGetPackageID()
{
Dictionary<byte, int> packageCount = new Dictionary<byte, int>();
var packages = File.ReadAllLines("ESP 20170918 Raw.txt");
var lines = packages.Select(line => line.Trim().Split(' ').Select(v => (byte)int.Parse(v, System.Globalization.NumberStyles.HexNumber)).ToArray()).ToArray();
foreach (var line in lines)
{
byte list = KaifaHanBeta.GetListID(line, 0, line.Length);
if (packageCount.ContainsKey(list))
packageCount[list]++;
else
packageCount.Add(list, 1);
}
var startTime = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(KaifaHanBeta.GetPackageTime(lines[0], 0, lines[0].Length));
var finishTime = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(KaifaHanBeta.GetPackageTime(lines[packages.Length - 1], 0, packages[packages.Length - 1].Length));
var durationInSeconds = finishTime.Subtract(startTime).TotalSeconds;
Assert.IsTrue(durationInSeconds > 60 * 60 * 4, $"There should be more than 4 hours of recording. Was: {durationInSeconds / 60 * 60 * 4}");
double list3PerSecond = (1.0 / 3600.0);
double list2PerSecond = (1.0 / 10.0) - list3PerSecond;
double list1PerSecond = (1.0 / 2.0) - list2PerSecond;
Assert.AreEqual(false, packageCount.ContainsKey(KaifaHanBeta.ListUnknown), "There should be no unknown packages");
Assert.AreEqual(durationInSeconds * list1PerSecond, packageCount[KaifaHanBeta.List1], 1 + 0.01 * packageCount[KaifaHanBeta.List1], "There should be one 'List1' every 2.5s");
Assert.AreEqual(durationInSeconds * list2PerSecond, packageCount[KaifaHanBeta.List2], 1 + 0.01 * packageCount[KaifaHanBeta.List2], "There should be one 'List2' every 10s");
Assert.AreEqual(durationInSeconds * list3PerSecond, packageCount[KaifaHanBeta.List3], 1 + 0.01 * packageCount[KaifaHanBeta.List3], "There should be one 'List3' every 1h");
double targetList1To2Ratio = 4.0;
double actualList1To2Ratio = (double)packageCount[KaifaHanBeta.List1] / (double)packageCount[KaifaHanBeta.List2];
Assert.AreEqual(targetList1To2Ratio, actualList1To2Ratio, 0.01, "There should be a ratio of List1:List2 of 4");
}
[TestMethod]
public void TestGetConsumption()
{
List<int> consumption = new List<int>();
var packages = File.ReadAllLines("ESP 20170918 Raw.txt");
var lines = packages.Select(line => line.Trim().Split(' ').Select(v => (byte)int.Parse(v, System.Globalization.NumberStyles.HexNumber)).ToArray()).ToArray();
foreach (var line in lines)
{
if (KaifaHanBeta.GetListID(line, 0, line.Length) == KaifaHanBeta.List1)
{
consumption.Add(KaifaHanBeta.GetInt(0, line, 0, line.Length));
}
}
Assert.AreEqual(1500.0, consumption.Average(), 500.0, "Consumption should be between 1000 and 2000 watts");
}
}
}

View File

@@ -1 +0,0 @@
7E A0 E2 2B 21 13 23 9A E6 E7 00 0F 00 00 00 00 0C 07 E2 03 04 07 14 34 00 FF 80 00 00 02 19 0A 0E 4B 61 6D 73 74 72 75 70 5F 56 30 30 30 31 09 06 01 01 00 00 05 FF 0A 10 35 37 30 36 35 36 37 32 37 34 33 38 39 37 30 32 09 06 01 01 60 01 01 FF 0A 12 36 38 34 31 31 32 31 42 4E 32 34 33 31 30 31 30 34 30 09 06 01 01 01 07 00 FF 06 00 00 0E E7 09 06 01 01 02 07 00 FF 06 00 00 00 00 09 06 01 01 03 07 00 FF 06 00 00 00 00 09 06 01 01 04 07 00 FF 06 00 00 00 BF 09 06 01 01 1F 07 00 FF 06 00 00 05 59 09 06 01 01 33 07 00 FF 06 00 00 01 EC 09 06 01 01 47 07 00 FF 06 00 00 05 14 09 06 01 01 20 07 00 FF 12 00 E1 09 06 01 01 34 07 00 FF 12 00 DD 09 06 01 01 48 07 00 FF 12 00 DE 46 0F 7E

View File

@@ -1,20 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("HanDebuggerTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("HanDebuggerTest")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("b22621c3-84eb-46dc-8f8d-e01d0a9923c7")]
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -1,49 +0,0 @@
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using HanDebugger;
namespace HanDebuggerTest
{
[TestClass]
[DeploymentItem(@"SampleData.txt")]
[DeploymentItem(@"Kamstrup228.txt")]
[DeploymentItem("Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll")]
public class ReaderTest
{
[TestMethod]
public void TestParser()
{
var lines = File.ReadAllLines("SampleData.txt");
var sample = lines[0].Trim();
byte[] bytes = sample.Split(' ').Select(v => (byte)int.Parse(v, System.Globalization.NumberStyles.HexNumber)).ToArray();
var reader = new Reader(bytes);
Assert.IsTrue(reader.IsValid(), "Data is not valid");
}
[TestMethod]
public void TestAllLines()
{
var lines = File.ReadAllLines("SampleData.txt");
for (int i=0; i<lines.Length; i++)
{
var sample = lines[i].Trim();
byte[] bytes = sample.Split(' ').Select(v => (byte)int.Parse(v, System.Globalization.NumberStyles.HexNumber)).ToArray();
var reader = new Reader(bytes);
Assert.IsTrue(reader.IsValid(), $"Data is not valid (Line #{i + 1}): {sample}");
}
}
[TestMethod]
public void TestKamstrup228()
{
var text = File.ReadAllText("Kamstrup228.txt");
byte[] bytes = text.Trim().Split(' ').Select(v => (byte)int.Parse(v, System.Globalization.NumberStyles.HexNumber)).ToArray();
var reader = new Reader(bytes);
Assert.IsTrue(reader.IsValid(), "Data is not valid");
}
}
}

View File

@@ -1,559 +0,0 @@
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FC 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8C 06 00 00 08 1C 06 00 00 07 97 06 00 00 0A CA 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 66 FD 27 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 02 FF 80 00 00 02 01 06 00 00 02 FF 21 9D 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 04 FF 80 00 00 02 01 06 00 00 02 FB C8 DC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 06 FF 80 00 00 02 01 06 00 00 02 FB 73 DE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 08 FF 80 00 00 02 01 06 00 00 02 FD 64 B6 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8A 06 00 00 08 22 06 00 00 07 9A 06 00 00 0A D4 06 00 00 09 5B 06 00 00 00 00 06 00 00 09 66 A7 44 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 0C FF 80 00 00 02 01 06 00 00 02 FC 9B A2 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 0E FF 80 00 00 02 01 06 00 00 02 FF BB 92 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 10 FF 80 00 00 02 01 06 00 00 02 FC D9 B8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 12 FF 80 00 00 02 01 06 00 00 02 FB DD CE 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FE 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8A 06 00 00 08 21 06 00 00 07 99 06 00 00 0A C8 06 00 00 09 60 06 00 00 00 00 06 00 00 09 6C 93 0A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 16 FF 80 00 00 02 01 06 00 00 02 FD 9D AE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 18 FF 80 00 00 02 01 06 00 00 02 F9 98 E5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 1A FF 80 00 00 02 01 06 00 00 02 FB 31 C4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 1C FF 80 00 00 02 01 06 00 00 02 FD CA A6 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FB 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8C 06 00 00 08 11 06 00 00 07 98 06 00 00 0A C1 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 69 FB 4C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 20 FF 80 00 00 02 01 06 00 00 02 FE A3 A5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 22 FF 80 00 00 02 01 06 00 00 02 FD 83 95 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 24 FF 80 00 00 02 01 06 00 00 02 FB 78 F7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 26 FF 80 00 00 02 01 06 00 00 02 FE 6E A2 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 F9 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8B 06 00 00 08 0F 06 00 00 07 97 06 00 00 0A BF 06 00 00 09 5A 06 00 00 00 00 06 00 00 09 65 16 EB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 2A FF 80 00 00 02 01 06 00 00 02 FC E6 8E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 2C FF 80 00 00 02 01 06 00 00 03 01 99 BC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 2E FF 80 00 00 02 01 06 00 00 02 FE 82 A8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 30 FF 80 00 00 02 01 06 00 00 02 FC 69 93 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FE 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8A 06 00 00 08 23 06 00 00 07 9C 06 00 00 0A D4 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 68 8D E0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 34 FF 80 00 00 02 01 06 00 00 02 FB A0 E2 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 36 FF 80 00 00 02 01 06 00 00 02 FE B6 B7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 38 FF 80 00 00 02 01 06 00 00 02 FA B3 FC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 11 3A FF 80 00 00 02 01 06 00 00 03 09 C4 22 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 0B 06 00 00 00 00 06 00 00 00 00 06 00 00 00 85 06 00 00 08 43 06 00 00 07 8D 06 00 00 0A FF 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 67 89 B7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 02 FF 80 00 00 02 01 06 00 00 02 F9 E0 F6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 04 FF 80 00 00 02 01 06 00 00 02 FA B6 C3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 06 FF 80 00 00 02 01 06 00 00 02 FA 0D C1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 08 FF 80 00 00 02 01 06 00 00 02 FC 1A A9 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 F9 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8C 06 00 00 08 07 06 00 00 07 98 06 00 00 0A B6 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 67 53 02 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 0C FF 80 00 00 02 01 06 00 00 02 FA 5A C9 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 0E FF 80 00 00 02 01 06 00 00 02 FD 5E BF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 10 FF 80 00 00 02 01 06 00 00 02 F7 FD 08 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 12 FF 80 00 00 02 01 06 00 00 02 F7 46 0A 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 F9 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8C 06 00 00 08 0D 06 00 00 07 95 06 00 00 0A BD 06 00 00 09 5A 06 00 00 00 00 06 00 00 09 63 2B DF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 16 FF 80 00 00 02 01 06 00 00 02 F9 4E E6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 18 FF 80 00 00 02 01 06 00 00 02 F8 E6 FA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 1A FF 80 00 00 02 01 06 00 00 02 FC 79 BE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 1C FF 80 00 00 02 01 06 00 00 02 FA 82 DC 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 F9 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8B 06 00 00 08 09 06 00 00 07 97 06 00 00 0A B8 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 67 F2 4F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 20 FF 80 00 00 02 01 06 00 00 02 FC 46 88 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 22 FF 80 00 00 02 01 06 00 00 02 FA CB EF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 24 FF 80 00 00 02 01 06 00 00 02 F7 E3 33 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 26 FF 80 00 00 02 01 06 00 00 02 FE 99 AC 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FB 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8C 06 00 00 08 15 06 00 00 07 99 06 00 00 0A C3 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 66 B3 90 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 2A FF 80 00 00 02 01 06 00 00 02 F9 BC D7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 2C FF 80 00 00 02 01 06 00 00 02 FD 55 96 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 2E FF 80 00 00 02 01 06 00 00 02 FA 51 E0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 30 FF 80 00 00 02 01 06 00 00 02 FB 21 E9 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8B 06 00 00 08 21 06 00 00 07 98 06 00 00 0A D2 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 66 44 03 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 34 FF 80 00 00 02 01 06 00 00 02 FA DE FD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 36 FF 80 00 00 02 01 06 00 00 02 FB EC EE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 38 FF 80 00 00 02 01 06 00 00 02 FD FB 86 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 12 3A FF 80 00 00 02 01 06 00 00 02 FB 76 E1 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FB 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8B 06 00 00 08 12 06 00 00 07 99 06 00 00 0A C2 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 66 C2 B1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 02 FF 80 00 00 02 01 06 00 00 02 FB 5F D0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 04 FF 80 00 00 02 01 06 00 00 02 F9 80 F4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 06 FF 80 00 00 02 01 06 00 00 02 FB 29 D5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 08 FF 80 00 00 02 01 06 00 00 02 F8 93 EA 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 F7 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8B 06 00 00 08 0E 06 00 00 07 8D 06 00 00 0A B7 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 67 0A A5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 0C FF 80 00 00 02 01 06 00 00 03 01 73 9C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 0E FF 80 00 00 02 01 06 00 00 02 FD F3 BA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 10 FF 80 00 00 02 01 06 00 00 02 FB 3C C7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 12 FF 80 00 00 02 01 06 00 00 02 F9 95 E6 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FA 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8A 06 00 00 08 17 06 00 00 07 98 06 00 00 0A BB 06 00 00 09 5B 06 00 00 00 00 06 00 00 09 64 2C E0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 16 FF 80 00 00 02 01 06 00 00 02 F8 6A F2 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 18 FF 80 00 00 02 01 06 00 00 02 F8 4B FF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 1A FF 80 00 00 02 01 06 00 00 02 FE C6 98 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 1C FF 80 00 00 02 01 06 00 00 03 05 8F CF 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 00 06 00 00 00 00 06 00 00 00 00 06 00 00 00 88 06 00 00 08 19 06 00 00 07 B2 06 00 00 0A D5 06 00 00 09 5B 06 00 00 00 00 06 00 00 09 65 E7 33 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 20 FF 80 00 00 02 01 06 00 00 03 09 11 34 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 22 FF 80 00 00 02 01 06 00 00 03 02 79 88 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 24 FF 80 00 00 02 01 06 00 00 03 0B 75 12 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 26 FF 80 00 00 02 01 06 00 00 02 FE 34 A9 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 06 06 00 00 00 00 06 00 00 00 00 06 00 00 00 87 06 00 00 08 33 06 00 00 07 98 06 00 00 0A F0 06 00 00 09 5C 06 00 00 00 00 06 00 00 09 67 D8 86 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 2A FF 80 00 00 02 01 06 00 00 03 0E F9 48 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 2C FF 80 00 00 02 01 06 00 00 02 FE 63 A1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 2E FF 80 00 00 02 01 06 00 00 02 FA FC E5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 30 FF 80 00 00 02 01 06 00 00 02 FB 8C EC 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FC 06 00 00 00 00 06 00 00 00 00 06 00 00 00 89 06 00 00 08 15 06 00 00 07 96 06 00 00 0A C8 06 00 00 09 56 06 00 00 00 00 06 00 00 09 63 0D 02 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 34 FF 80 00 00 02 01 06 00 00 02 F9 E8 CA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 36 FF 80 00 00 02 01 06 00 00 03 04 E1 FD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 38 FF 80 00 00 02 01 06 00 00 03 15 C8 F1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 13 3A FF 80 00 00 02 01 06 00 00 03 08 17 38 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 10 06 00 00 00 00 06 00 00 00 00 06 00 00 00 85 06 00 00 08 41 06 00 00 07 99 06 00 00 0B 02 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 69 D8 2C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 02 FF 80 00 00 02 01 06 00 00 03 0E E6 71 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 04 FF 80 00 00 02 01 06 00 00 03 1C B8 45 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 06 FF 80 00 00 02 01 06 00 00 03 13 F4 BF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 08 FF 80 00 00 02 01 06 00 00 02 FF 6F 86 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 1A 06 00 00 00 00 06 00 00 00 00 06 00 00 00 83 06 00 00 08 6A 06 00 00 07 98 06 00 00 0B 2E 06 00 00 09 5B 06 00 00 00 00 06 00 00 09 67 78 B7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 0C FF 80 00 00 02 01 06 00 00 02 FE 90 92 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 0E FF 80 00 00 02 01 06 00 00 02 FF A2 81 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 10 FF 80 00 00 02 01 06 00 00 02 FB 7F DF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 12 FF 80 00 00 02 01 06 00 00 02 FA 4D CC 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FC 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8B 06 00 00 08 24 06 00 00 07 8C 06 00 00 0A CE 06 00 00 09 5C 06 00 00 00 00 06 00 00 09 66 96 0B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 16 FF 80 00 00 02 01 06 00 00 02 FE 1F 8F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 18 FF 80 00 00 02 01 06 00 00 03 02 05 A6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 1A FF 80 00 00 02 01 06 00 00 03 05 01 D0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 1C FF 80 00 00 02 01 06 00 00 03 02 73 A3 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 05 06 00 00 00 00 06 00 00 00 00 06 00 00 00 89 06 00 00 08 26 06 00 00 07 97 06 00 00 0A EC 06 00 00 09 5A 06 00 00 00 00 06 00 00 09 66 50 B8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 20 FF 80 00 00 02 01 06 00 00 03 08 DB 3D 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 22 FF 80 00 00 02 01 06 00 00 02 FD 9A 86 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 24 FF 80 00 00 02 01 06 00 00 02 FC DE 90 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 26 FF 80 00 00 02 01 06 00 00 03 00 5E B6 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8A 06 00 00 08 1E 06 00 00 07 99 06 00 00 0A D2 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 67 EB 6F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 2A FF 80 00 00 02 01 06 00 00 02 FE ED BE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 2C FF 80 00 00 02 01 06 00 00 02 FD BB 8B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 2E FF 80 00 00 02 01 06 00 00 02 FD 00 89 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 30 FF 80 00 00 02 01 06 00 00 02 FC 70 80 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FE 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8B 06 00 00 08 1D 06 00 00 07 9A 06 00 00 0A D0 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 68 29 72 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 34 FF 80 00 00 02 01 06 00 00 02 F6 5C 2A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 36 FF 80 00 00 02 01 06 00 00 02 F7 6E 39 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 38 FF 80 00 00 02 01 06 00 00 02 FA AA EF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 14 3A FF 80 00 00 02 01 06 00 00 02 FC 27 88 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FB 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8B 06 00 00 08 14 06 00 00 07 99 06 00 00 0A C4 06 00 00 09 60 06 00 00 00 00 06 00 00 09 68 E2 98 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 02 FF 80 00 00 02 01 06 00 00 03 16 82 E8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 04 FF 80 00 00 02 01 06 00 00 03 11 F0 9B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 06 FF 80 00 00 02 01 06 00 00 02 FD F1 AD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 08 FF 80 00 00 02 01 06 00 00 03 08 2A 19 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 02 FE 06 00 00 00 00 06 00 00 00 00 06 00 00 00 8A 06 00 00 08 18 06 00 00 07 9A 06 00 00 0A CC 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 67 F7 2E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 0C FF 80 00 00 02 01 06 00 00 02 FE 3D 97 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 0E FF 80 00 00 02 01 06 00 00 02 FE 86 95 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 10 FF 80 00 00 02 01 06 00 00 02 FC 6D AE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 12 FF 80 00 00 02 01 06 00 00 02 FC D6 AC 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 13 06 00 00 00 00 06 00 00 00 00 06 00 00 00 85 06 00 00 08 61 06 00 00 07 98 06 00 00 0B 29 06 00 00 09 60 06 00 00 00 00 06 00 00 09 68 5D 02 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 16 FF 80 00 00 02 01 06 00 00 03 21 10 BD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 18 FF 80 00 00 02 01 06 00 00 02 FB 3E D0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 1A FF 80 00 00 02 01 06 00 00 03 46 33 A5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 1C FF 80 00 00 02 01 06 00 00 03 5F BE 2F 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 66 06 00 00 00 00 06 00 00 00 00 06 00 00 00 6D 06 00 00 08 58 06 00 00 09 43 06 00 00 0C 0E 06 00 00 09 5C 06 00 00 00 00 06 00 00 09 65 90 F3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 20 FF 80 00 00 02 01 06 00 00 03 60 38 D7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 22 FF 80 00 00 02 01 06 00 00 03 32 14 A4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 24 FF 80 00 00 02 01 06 00 00 03 54 E9 A5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 26 FF 80 00 00 02 01 06 00 00 03 47 48 85 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 86 06 00 00 00 00 06 00 00 00 00 06 00 00 00 59 06 00 00 07 F5 06 00 00 0A 40 06 00 00 0C 64 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 67 70 07 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 2A FF 80 00 00 02 01 06 00 00 03 B4 C6 4F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 2C FF 80 00 00 02 01 06 00 00 03 BC 43 C4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 2E FF 80 00 00 02 01 06 00 00 03 CA 49 D0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 30 FF 80 00 00 02 01 06 00 00 03 94 4B 73 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 A1 06 00 00 00 00 06 00 00 00 00 06 00 00 00 40 06 00 00 06 F1 06 00 00 0B 82 06 00 00 0C 7F 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 65 7A A8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 34 FF 80 00 00 02 01 06 00 00 03 A5 37 56 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 36 FF 80 00 00 02 01 06 00 00 03 B0 A0 13 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 38 FF 80 00 00 02 01 06 00 00 03 C1 8F 7C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 15 3A FF 80 00 00 02 01 06 00 00 03 B7 85 68 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 BB 06 00 00 00 00 06 00 00 00 00 06 00 00 00 34 06 00 00 06 D0 06 00 00 0C 2B 06 00 00 0C DD 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 67 55 B4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 02 FF 80 00 00 02 01 06 00 00 03 BE 37 CF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 04 FF 80 00 00 02 01 06 00 00 03 C1 8A 43 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 06 FF 80 00 00 02 01 06 00 00 03 D4 1D 06 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 08 FF 80 00 00 02 01 06 00 00 03 DE 66 A4 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 C9 06 00 00 00 00 06 00 00 00 00 06 00 00 00 2E 06 00 00 06 D5 06 00 00 0C 6D 06 00 00 0D 12 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 66 FC 7B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 0C FF 80 00 00 02 01 06 00 00 03 CA B5 F7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 0E FF 80 00 00 02 01 06 00 00 03 D8 9D C6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 10 FF 80 00 00 02 01 06 00 00 03 DA 76 FD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 12 FF 80 00 00 02 01 06 00 00 03 CF E1 B8 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 D0 06 00 00 00 00 06 00 00 00 00 06 00 00 00 2B 06 00 00 06 E9 06 00 00 0C 80 06 00 00 0D 35 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 64 EB 38 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 16 FF 80 00 00 02 01 06 00 00 03 D9 20 C8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 18 FF 80 00 00 02 01 06 00 00 03 D1 49 49 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 1A FF 80 00 00 02 01 06 00 00 04 31 F4 E1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 1C FF 80 00 00 02 01 06 00 00 04 0B E0 78 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 FF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 51 06 00 00 07 A0 06 00 00 0C 8A 06 00 00 0D 55 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 65 E7 78 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 20 FF 80 00 00 02 01 06 00 00 04 03 5A C5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 22 FF 80 00 00 02 01 06 00 00 04 0A 20 5A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 24 FF 80 00 00 02 01 06 00 00 04 03 2C C0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 26 FF 80 00 00 02 01 06 00 00 04 08 44 7C 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 00 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 9E 06 00 00 0C 85 06 00 00 0D 4F 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 69 24 5D 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 2A FF 80 00 00 02 01 06 00 00 04 04 B2 B9 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 2C FF 80 00 00 02 01 06 00 00 04 03 C0 CA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 2E FF 80 00 00 02 01 06 00 00 04 04 C4 BC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 30 FF 80 00 00 02 01 06 00 00 04 00 19 E2 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 04 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4F 06 00 00 07 A0 06 00 00 0C 98 06 00 00 0D 5F 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 66 8A 0F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 34 FF 80 00 00 02 01 06 00 00 04 06 59 82 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 36 FF 80 00 00 02 01 06 00 00 04 12 47 D6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 38 FF 80 00 00 02 01 06 00 00 04 03 6E DA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 16 3A FF 80 00 00 02 01 06 00 00 04 00 4E EA 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 FF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 8D 06 00 00 0C 9C 06 00 00 0D 4D 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 67 B0 B1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 02 FF 80 00 00 02 01 06 00 00 04 03 FC E9 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 04 FF 80 00 00 02 01 06 00 00 03 FE 53 8F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 06 FF 80 00 00 02 01 06 00 00 03 FF 61 9C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 08 FF 80 00 00 02 01 06 00 00 04 00 30 D3 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 FD 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 84 06 00 00 0C 9D 06 00 00 0D 47 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 65 AD ED 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 0C FF 80 00 00 02 01 06 00 00 03 FC AD A6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 0E FF 80 00 00 02 01 06 00 00 03 FD 9F B5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 10 FF 80 00 00 02 01 06 00 00 04 0C 68 06 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 12 FF 80 00 00 02 01 06 00 00 04 00 BF CE 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 01 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4F 06 00 00 07 94 06 00 00 0C 9D 06 00 00 0D 55 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 66 4F 3E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 16 FF 80 00 00 02 01 06 00 00 03 FF B9 89 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 18 FF 80 00 00 02 01 06 00 00 03 FF 98 84 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 1A FF 80 00 00 02 01 06 00 00 04 01 DA D5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 1C FF 80 00 00 02 01 06 00 00 04 00 9E C3 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 FF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 8B 06 00 00 0C 98 06 00 00 0D 4A 06 00 00 09 60 06 00 00 00 00 06 00 00 09 68 50 76 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 20 FF 80 00 00 02 01 06 00 00 04 02 7E D1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 22 FF 80 00 00 02 01 06 00 00 03 FE 2E A3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 24 FF 80 00 00 02 01 06 00 00 04 02 08 D4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 26 FF 80 00 00 02 01 06 00 00 04 03 3A C7 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 FF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 51 06 00 00 07 94 06 00 00 0C 91 06 00 00 0D 4C 06 00 00 09 62 06 00 00 00 00 06 00 00 09 66 E8 CD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 2A FF 80 00 00 02 01 06 00 00 04 01 B2 EB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 2C FF 80 00 00 02 01 06 00 00 04 03 6D CF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 2E FF 80 00 00 02 01 06 00 00 03 FD 2F 9E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 30 FF 80 00 00 02 01 06 00 00 03 FC 5F 97 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 02 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 B1 06 00 00 0C 8B 06 00 00 0D 5D 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 63 90 B6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 34 FF 80 00 00 02 01 06 00 00 04 01 4B F3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 36 FF 80 00 00 02 01 06 00 00 04 01 F0 F1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 38 FF 80 00 00 02 01 06 00 00 04 04 7C AB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 17 3A FF 80 00 00 02 01 06 00 00 04 00 E3 EF 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 FF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 93 06 00 00 0C 92 06 00 00 0D 4E 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 65 19 A5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 02 FF 80 00 00 02 01 06 00 00 04 01 C5 FF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 04 FF 80 00 00 02 01 06 00 00 03 FF F1 AB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 06 FF 80 00 00 02 01 06 00 00 04 00 3A EB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 08 FF 80 00 00 02 01 06 00 00 04 05 B6 B1 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 00 06 00 00 00 00 06 00 00 00 00 06 00 00 00 51 06 00 00 07 91 06 00 00 0C 94 06 00 00 0D 4E 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 67 7C C3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 0C FF 80 00 00 02 01 06 00 00 04 00 6D E3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 0E FF 80 00 00 02 01 06 00 00 04 02 C4 C2 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 10 FF 80 00 00 02 01 06 00 00 04 00 2F F9 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 12 FF 80 00 00 02 01 06 00 00 04 01 1D EA 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 00 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 9C 06 00 00 0C 8F 06 00 00 0D 54 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 66 EA AC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 16 FF 80 00 00 02 01 06 00 00 03 FD 80 9F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 18 FF 80 00 00 02 01 06 00 00 03 FE 3A A0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 1A FF 80 00 00 02 01 06 00 00 04 05 D5 A6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 1C FF 80 00 00 02 01 06 00 00 03 FE 4C A5 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 00 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 93 06 00 00 0C 95 06 00 00 0D 53 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 64 F9 7E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 20 FF 80 00 00 02 01 06 00 00 04 03 DC F5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 22 FF 80 00 00 02 01 06 00 00 04 01 75 D4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 24 FF 80 00 00 02 01 06 00 00 04 02 23 E1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 26 FF 80 00 00 02 01 06 00 00 04 05 27 97 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 03 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4F 06 00 00 07 9E 06 00 00 0C 98 06 00 00 0D 5F 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 65 E5 BE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 2A FF 80 00 00 02 01 06 00 00 04 00 10 CF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 2C FF 80 00 00 02 01 06 00 00 04 03 46 FA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 2E FF 80 00 00 02 01 06 00 00 04 04 42 8C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 30 FF 80 00 00 02 01 06 00 00 04 02 8D F1 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 05 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4D 06 00 00 07 A0 06 00 00 0C 97 06 00 00 0D 62 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 66 FB 6E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 34 FF 80 00 00 02 01 06 00 00 04 00 E9 D7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 36 FF 80 00 00 02 01 06 00 00 04 04 76 93 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 38 FF 80 00 00 02 01 06 00 00 04 03 E8 EA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 18 3A FF 80 00 00 02 01 06 00 00 04 01 41 CB 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0C 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4F 06 00 00 07 98 06 00 00 0C BF 06 00 00 0D 7F 06 00 00 09 60 06 00 00 00 00 06 00 00 09 68 1B 6B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 02 FF 80 00 00 02 01 06 00 00 04 07 5E 9F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 04 FF 80 00 00 02 01 06 00 00 04 02 3E CF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 06 FF 80 00 00 02 01 06 00 00 04 03 0C DC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 08 FF 80 00 00 02 01 06 00 00 04 05 1B B4 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 02 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 96 06 00 00 0C 96 06 00 00 0D 57 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 66 67 73 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 0C FF 80 00 00 02 01 06 00 00 04 02 D2 C5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 0E FF 80 00 00 02 01 06 00 00 04 04 5F A2 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 10 FF 80 00 00 02 01 06 00 00 04 02 90 DF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 12 FF 80 00 00 02 01 06 00 00 04 01 B0 EF 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 03 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 A0 06 00 00 0C 96 06 00 00 0D 5F 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 65 5E 3C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 16 FF 80 00 00 02 01 06 00 00 04 03 D4 C9 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 18 FF 80 00 00 02 01 06 00 00 04 05 C3 A1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 1A FF 80 00 00 02 01 06 00 00 0A D6 7E DD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 1C FF 80 00 00 02 01 06 00 00 0F F4 1B A6 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F EB 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4B 06 00 00 37 B5 06 00 00 3A 01 06 00 00 0D 60 06 00 00 09 4A 06 00 00 00 00 06 00 00 09 60 80 3E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 20 FF 80 00 00 02 01 06 00 00 0F F0 CD D1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 22 FF 80 00 00 02 01 06 00 00 0F ED 12 18 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 24 FF 80 00 00 02 01 06 00 00 0F F4 9F 92 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 26 FF 80 00 00 02 01 06 00 00 0F F3 9B E4 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F EC 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4C 06 00 00 37 AA 06 00 00 39 FB 06 00 00 0D 64 06 00 00 09 4C 06 00 00 00 00 06 00 00 09 62 8A FA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 2A FF 80 00 00 02 01 06 00 00 0F ED FE 12 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 2C FF 80 00 00 02 01 06 00 00 0F E6 E0 AB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 2E FF 80 00 00 02 01 06 00 00 0F E1 E4 DD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 30 FF 80 00 00 02 01 06 00 00 0F DF E0 1D 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F E1 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4B 06 00 00 37 91 06 00 00 39 D9 06 00 00 0D 74 06 00 00 09 47 06 00 00 00 00 06 00 00 09 5C 0E FB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 34 FF 80 00 00 02 01 06 00 00 0F E2 F0 F2 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 36 FF 80 00 00 02 01 06 00 00 0F E1 D0 C2 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 38 FF 80 00 00 02 01 06 00 00 0F E6 4E BB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 19 3A FF 80 00 00 02 01 06 00 00 0F E4 E7 9A 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F E5 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4C 06 00 00 37 97 06 00 00 39 EA 06 00 00 0D 6B 06 00 00 09 4A 06 00 00 00 00 06 00 00 09 5F 25 AC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 02 FF 80 00 00 02 01 06 00 00 0F E6 86 83 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 04 FF 80 00 00 02 01 06 00 00 0F E0 7D E1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 06 FF 80 00 00 02 01 06 00 00 0F E3 5D D1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 08 FF 80 00 00 02 01 06 00 00 0F E1 6E FF 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F EC 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4C 06 00 00 37 8C 06 00 00 39 F8 06 00 00 0D 8D 06 00 00 09 48 06 00 00 00 00 06 00 00 09 5D CE 5D 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 0C FF 80 00 00 02 01 06 00 00 0F DE 6C 33 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 0E FF 80 00 00 02 01 06 00 00 0F E2 38 CA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 10 FF 80 00 00 02 01 06 00 00 0F E0 D3 F1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 12 FF 80 00 00 02 01 06 00 00 0F E2 7A D0 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F E1 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4B 06 00 00 37 8C 06 00 00 39 D9 06 00 00 0D 71 06 00 00 09 48 06 00 00 00 00 06 00 00 09 61 30 BE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 16 FF 80 00 00 02 01 06 00 00 0F E0 1E F6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 18 FF 80 00 00 02 01 06 00 00 0F E1 B6 EA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 1A FF 80 00 00 02 01 06 00 00 0F E2 96 DA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 1C FF 80 00 00 02 01 06 00 00 0F E1 C0 EF 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F E3 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4B 06 00 00 37 8F 06 00 00 39 DF 06 00 00 0D 6F 06 00 00 09 48 06 00 00 00 00 06 00 00 09 5F EA 89 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 20 FF 80 00 00 02 01 06 00 00 0F DF CF 06 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 22 FF 80 00 00 02 01 06 00 00 0F DC EF 36 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 24 FF 80 00 00 02 01 06 00 00 0F DD AB 20 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 26 FF 80 00 00 02 01 06 00 00 0F D9 34 64 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F D4 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4A 06 00 00 37 76 06 00 00 39 B8 06 00 00 0D 77 06 00 00 09 43 06 00 00 00 00 06 00 00 09 5B 4A 2D 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 2A FF 80 00 00 02 01 06 00 00 0F CF 19 1E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 2C FF 80 00 00 02 01 06 00 00 0F D3 39 C3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 2E FF 80 00 00 02 01 06 00 00 0F D7 A6 87 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 30 FF 80 00 00 02 01 06 00 00 0F D6 D6 8E 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F DB 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4B 06 00 00 37 79 06 00 00 39 C9 06 00 00 0D 76 06 00 00 09 45 06 00 00 00 00 06 00 00 09 5D 18 EE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 34 FF 80 00 00 02 01 06 00 00 0F D7 29 9A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 36 FF 80 00 00 02 01 06 00 00 0F DB FE 52 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 38 FF 80 00 00 02 01 06 00 00 0F DC 60 2B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1A 3A FF 80 00 00 02 01 06 00 00 0F F5 18 95 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 10 00 06 00 00 00 00 06 00 00 00 00 06 00 00 00 42 06 00 00 37 C0 06 00 00 39 D1 06 00 00 0D F2 06 00 00 09 46 06 00 00 00 00 06 00 00 09 5E 08 07 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 02 FF 80 00 00 02 01 06 00 00 0F F0 9C F3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 04 FF 80 00 00 02 01 06 00 00 0F EA 8A 4B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 06 FF 80 00 00 02 01 06 00 00 0F E7 D4 92 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 08 FF 80 00 00 02 01 06 00 00 0F E5 E7 BC 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F E5 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4B 06 00 00 37 90 06 00 00 39 DF 06 00 00 0D 72 06 00 00 09 48 06 00 00 00 00 06 00 00 09 61 52 09 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 0C FF 80 00 00 02 01 06 00 00 0F F9 7C 63 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 0E FF 80 00 00 02 01 06 00 00 0F E1 0E FD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 10 FF 80 00 00 02 01 06 00 00 0F DA A7 6A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 12 FF 80 00 00 02 01 06 00 00 0F D6 70 A2 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F DF 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4C 06 00 00 37 80 06 00 00 39 CB 06 00 00 0D 8E 06 00 00 09 44 06 00 00 00 00 06 00 00 09 5B 48 E6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 16 FF 80 00 00 02 01 06 00 00 0F D8 78 4E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 18 FF 80 00 00 02 01 06 00 00 0F D2 03 EC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 1A FF 80 00 00 02 01 06 00 00 0F D3 31 FF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 1C FF 80 00 00 02 01 06 00 00 0F D2 75 E9 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F D1 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4B 06 00 00 37 6D 06 00 00 39 BE 06 00 00 0D 6F 06 00 00 09 43 06 00 00 00 00 06 00 00 09 5B 06 B0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 20 FF 80 00 00 02 01 06 00 00 0F D5 38 AC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 22 FF 80 00 00 02 01 06 00 00 0F D7 91 8D 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 24 FF 80 00 00 02 01 06 00 00 0F E5 CD 98 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 26 FF 80 00 00 02 01 06 00 00 0F E5 76 9A 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F E8 06 00 00 00 00 06 00 00 00 00 06 00 00 00 49 06 00 00 37 92 06 00 00 39 DE 06 00 00 0D 85 06 00 00 09 48 06 00 00 00 00 06 00 00 09 5F 91 44 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 2A FF 80 00 00 02 01 06 00 00 0F E8 09 4E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 2C FF 80 00 00 02 01 06 00 00 0F EC E0 0F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 2E FF 80 00 00 02 01 06 00 00 0F E9 F6 5A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 30 FF 80 00 00 02 01 06 00 00 0F E5 63 88 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F E4 06 00 00 00 00 06 00 00 00 00 06 00 00 00 49 06 00 00 37 90 06 00 00 39 D1 06 00 00 0D 81 06 00 00 09 47 06 00 00 00 00 06 00 00 09 5D 35 68 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 34 FF 80 00 00 02 01 06 00 00 0F DB E8 55 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 36 FF 80 00 00 02 01 06 00 00 0F E7 BC AC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 38 FF 80 00 00 02 01 06 00 00 0F E2 30 F6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1B 3A FF 80 00 00 02 01 06 00 00 0F DF ED 1E 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 0F DB 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4C 06 00 00 37 7E 06 00 00 39 D1 06 00 00 0D 71 06 00 00 09 46 06 00 00 00 00 06 00 00 09 5E B2 82 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 02 FF 80 00 00 02 01 06 00 00 0F E7 E1 8F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 04 FF 80 00 00 02 01 06 00 00 04 0A 6F 50 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 06 FF 80 00 00 02 01 06 00 00 04 0A D4 52 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 08 FF 80 00 00 02 01 06 00 00 04 0D 4A 2B 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 06 06 00 00 00 00 06 00 00 00 00 06 00 00 00 50 06 00 00 07 98 06 00 00 0C A0 06 00 00 0D 62 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 65 1F 3A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 0C FF 80 00 00 02 01 06 00 00 04 05 74 A2 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 0E FF 80 00 00 02 01 06 00 00 04 08 2A 7B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 10 FF 80 00 00 02 01 06 00 00 04 06 AD 8A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 12 FF 80 00 00 02 01 06 00 00 04 07 9F 99 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 08 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 A4 06 00 00 0C A0 06 00 00 0D 70 06 00 00 09 59 06 00 00 00 00 06 00 00 09 61 61 92 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 16 FF 80 00 00 02 01 06 00 00 04 06 60 8D 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 18 FF 80 00 00 02 01 06 00 00 04 04 53 A3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 1A FF 80 00 00 02 01 06 00 00 04 05 61 B0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 1C FF 80 00 00 02 01 06 00 00 04 05 AC B7 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0B 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 A1 06 00 00 0C A8 06 00 00 0D 74 06 00 00 09 5C 06 00 00 00 00 06 00 00 09 66 FD D7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 20 FF 80 00 00 02 01 06 00 00 04 0B 20 6F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 22 FF 80 00 00 02 01 06 00 00 04 08 00 5F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 24 FF 80 00 00 02 01 06 00 00 04 0A DF 7B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 26 FF 80 00 00 02 01 06 00 00 04 08 76 5A 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 08 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4F 06 00 00 07 9C 06 00 00 0C A1 06 00 00 0D 68 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 65 CF 6F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 2A FF 80 00 00 02 01 06 00 00 04 08 EC 55 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 2C FF 80 00 00 02 01 06 00 00 04 08 21 52 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 2E FF 80 00 00 02 01 06 00 00 04 06 E4 B9 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 30 FF 80 00 00 02 01 06 00 00 04 07 94 B0 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0A 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 9F 06 00 00 0C A3 06 00 00 0D 70 06 00 00 09 5C 06 00 00 00 00 06 00 00 09 65 72 6A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 34 FF 80 00 00 02 01 06 00 00 04 06 6B A4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 36 FF 80 00 00 02 01 06 00 00 04 07 59 B7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 38 FF 80 00 00 02 01 06 00 00 04 0C AB 04 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1C 3A FF 80 00 00 02 01 06 00 00 04 0A 26 63 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 08 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4D 06 00 00 07 AA 06 00 00 0C 96 06 00 00 0D 6C 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 65 8E 58 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 02 FF 80 00 00 02 01 06 00 00 04 07 EA 89 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 04 FF 80 00 00 02 01 06 00 00 04 11 90 FB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 06 FF 80 00 00 02 01 06 00 00 04 05 8E AF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 08 FF 80 00 00 02 01 06 00 00 04 10 83 E5 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 05 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4F 06 00 00 07 95 06 00 00 0C A2 06 00 00 0D 62 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 65 30 07 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 0C FF 80 00 00 02 01 06 00 00 04 0B A7 4E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 0E FF 80 00 00 02 01 06 00 00 04 08 87 7E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 10 FF 80 00 00 02 01 06 00 00 04 05 9B BD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 12 FF 80 00 00 02 01 06 00 00 04 06 BB 8D 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 07 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 9B 06 00 00 0C A4 06 00 00 0D 68 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 66 ED 6A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 16 FF 80 00 00 02 01 06 00 00 04 06 CD 88 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 18 FF 80 00 00 02 01 06 00 00 04 07 65 94 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 1A FF 80 00 00 02 01 06 00 00 04 08 29 6E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 1C FF 80 00 00 02 01 06 00 00 04 05 01 B2 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 06 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 98 06 00 00 0C A2 06 00 00 0D 64 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 67 D0 ED 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 20 FF 80 00 00 02 01 06 00 00 04 09 9F 49 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 22 FF 80 00 00 02 01 06 00 00 04 06 D3 B3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 24 FF 80 00 00 02 01 06 00 00 04 06 1E B4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 26 FF 80 00 00 02 01 06 00 00 04 07 2C A7 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 09 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 9C 06 00 00 0C A7 06 00 00 0D 6D 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 69 86 EB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 2A FF 80 00 00 02 01 06 00 00 04 07 B6 A8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 2C FF 80 00 00 02 01 06 00 00 04 16 73 AE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 2E FF 80 00 00 02 01 06 00 00 04 07 C0 AD 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 30 FF 80 00 00 02 01 06 00 00 04 08 CE 4D 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 09 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 A2 06 00 00 0C A5 06 00 00 0D 70 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 65 DD 68 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 34 FF 80 00 00 02 01 06 00 00 04 07 4F B0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 36 FF 80 00 00 02 01 06 00 00 04 09 8A 5B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 38 FF 80 00 00 02 01 06 00 00 04 0D 8F 10 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1D 3A FF 80 00 00 02 01 06 00 00 04 09 10 54 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0C 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4D 06 00 00 07 B9 06 00 00 0C AD 06 00 00 0D 74 06 00 00 09 60 06 00 00 00 00 06 00 00 09 69 FF EA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 02 FF 80 00 00 02 01 06 00 00 04 08 EA 7F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 04 FF 80 00 00 02 01 06 00 00 04 08 27 78 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 06 FF 80 00 00 02 01 06 00 00 04 08 9C 7A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 08 FF 80 00 00 02 01 06 00 00 04 0B 26 45 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 08 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4D 06 00 00 07 A3 06 00 00 0C 9E 06 00 00 0D 6A 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 67 60 76 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 0C FF 80 00 00 02 01 06 00 00 04 07 3C 8A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 0E FF 80 00 00 02 01 06 00 00 04 0D DD 27 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 10 FF 80 00 00 02 01 06 00 00 04 08 89 68 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 12 FF 80 00 00 02 01 06 00 00 04 07 C5 92 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0B 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4D 06 00 00 07 AA 06 00 00 0C A4 06 00 00 0D 77 06 00 00 09 60 06 00 00 00 00 06 00 00 09 67 58 FB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 16 FF 80 00 00 02 01 06 00 00 04 07 B3 97 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 18 FF 80 00 00 02 01 06 00 00 04 0B FE 50 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 1A FF 80 00 00 02 01 06 00 00 04 08 DE 60 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 1C FF 80 00 00 02 01 06 00 00 04 05 F6 BC 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 09 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 A6 06 00 00 0C A6 06 00 00 0D 74 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 65 7B F6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 20 FF 80 00 00 02 01 06 00 00 04 0E D7 33 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 22 FF 80 00 00 02 01 06 00 00 04 0B C1 66 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 24 FF 80 00 00 02 01 06 00 00 04 10 5E CF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 26 FF 80 00 00 02 01 06 00 00 04 0A 3E 72 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0C 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4D 06 00 00 07 BB 06 00 00 0C A9 06 00 00 0D 82 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 66 55 9A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 2A FF 80 00 00 02 01 06 00 00 04 0A A4 7D 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 2C FF 80 00 00 02 01 06 00 00 04 0A 69 7A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 2E FF 80 00 00 02 01 06 00 00 04 09 49 4A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 30 FF 80 00 00 02 01 06 00 00 04 15 5D 88 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0E 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 C2 06 00 00 0C A9 06 00 00 0D 87 06 00 00 09 61 06 00 00 00 00 06 00 00 09 68 39 65 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 34 FF 80 00 00 02 01 06 00 00 04 09 C6 57 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 36 FF 80 00 00 02 01 06 00 00 04 0B 6F 76 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 38 FF 80 00 00 02 01 06 00 00 04 0D 78 1E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1E 3A FF 80 00 00 02 01 06 00 00 04 0A 7C 68 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0D 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4F 06 00 00 07 B9 06 00 00 0C A7 06 00 00 0D 7E 06 00 00 09 60 06 00 00 00 00 06 00 00 09 68 58 7E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 02 FF 80 00 00 02 01 06 00 00 04 0F F8 0E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 04 FF 80 00 00 02 01 06 00 00 04 0B 11 4F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 06 FF 80 00 00 02 01 06 00 00 04 0A 23 5C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 08 FF 80 00 00 02 01 06 00 00 04 0C 34 34 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0C 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4F 06 00 00 07 BA 06 00 00 0C AA 06 00 00 0D 81 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 64 CA 7B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 0C FF 80 00 00 02 01 06 00 00 04 0B FD 45 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 0E FF 80 00 00 02 01 06 00 00 04 10 14 E9 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 10 FF 80 00 00 02 01 06 00 00 04 0B BF 5F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 12 FF 80 00 00 02 01 06 00 00 04 0A 8D 4C 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0C 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 C1 06 00 00 0C 9E 06 00 00 0D 7E 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 66 87 96 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 16 FF 80 00 00 02 01 06 00 00 04 09 60 7B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 18 FF 80 00 00 02 01 06 00 00 04 0D 65 30 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 1A FF 80 00 00 02 01 06 00 00 04 0D DE 32 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 1C FF 80 00 00 02 01 06 00 00 04 0C 9A 24 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0E 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 BD 06 00 00 0C A9 06 00 00 0D 84 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 67 96 51 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 20 FF 80 00 00 02 01 06 00 00 04 0F F3 27 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 22 FF 80 00 00 02 01 06 00 00 04 0D 5A 06 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 24 FF 80 00 00 02 01 06 00 00 04 0E 0C 33 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 26 FF 80 00 00 02 01 06 00 00 04 0F 3E 20 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0C 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 BA 06 00 00 0C AA 06 00 00 0D 82 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 68 7E E4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 2A FF 80 00 00 02 01 06 00 00 04 0E 2D 3E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 2C FF 80 00 00 02 01 06 00 00 04 0E E0 39 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 2E FF 80 00 00 02 01 06 00 00 04 0C 49 18 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 30 FF 80 00 00 02 01 06 00 00 04 0E A2 23 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0D 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4F 06 00 00 07 BE 06 00 00 0C A8 06 00 00 0D 83 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 68 05 8B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 34 FF 80 00 00 02 01 06 00 00 04 0B 79 71 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 36 FF 80 00 00 02 01 06 00 00 04 08 59 41 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 38 FF 80 00 00 02 01 06 00 00 04 09 F1 5D 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 1F 3A FF 80 00 00 02 01 06 00 00 04 15 A7 85 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0B 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4F 06 00 00 07 BC 06 00 00 0C AE 06 00 00 0D 7F 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 65 CE 70 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 02 FF 80 00 00 02 01 06 00 00 04 0C 38 E6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 04 FF 80 00 00 02 01 06 00 00 04 0A C3 84 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 06 FF 80 00 00 02 01 06 00 00 04 0C 4E E3 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 08 FF 80 00 00 02 01 06 00 00 04 10 82 34 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0D 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 C0 06 00 00 0C A8 06 00 00 0D 85 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 64 0A 70 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 0C FF 80 00 00 02 01 06 00 00 04 0E 0B C8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 0E FF 80 00 00 02 01 06 00 00 04 0D 2B F8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 10 FF 80 00 00 02 01 06 00 00 04 0A 6D 94 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 12 FF 80 00 00 02 01 06 00 00 04 0B 5F 87 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 11 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4D 06 00 00 07 CC 06 00 00 0C AE 06 00 00 0D 93 06 00 00 09 60 06 00 00 00 00 06 00 00 09 66 51 C9 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 16 FF 80 00 00 02 01 06 00 00 04 0D 1F E7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 18 FF 80 00 00 02 01 06 00 00 04 0C B7 FB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 1A FF 80 00 00 02 01 06 00 00 04 14 C5 65 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 1C FF 80 00 00 02 01 06 00 00 04 23 34 27 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 10 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4D 06 00 00 07 C8 06 00 00 0C 9D 06 00 00 0D 83 06 00 00 09 61 06 00 00 00 00 06 00 00 09 68 EE 44 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 20 FF 80 00 00 02 01 06 00 00 04 10 DE 15 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 22 FF 80 00 00 02 01 06 00 00 04 13 FE 25 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 24 FF 80 00 00 02 01 06 00 00 04 0D CC DB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 26 FF 80 00 00 02 01 06 00 00 04 0F 65 FA 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 04 0F 06 00 00 00 00 06 00 00 00 00 06 00 00 00 4E 06 00 00 07 C7 06 00 00 0C AA 06 00 00 0D 8C 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 66 07 D8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 2A FF 80 00 00 02 01 06 00 00 04 0E 76 E4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 2C FF 80 00 00 02 01 06 00 00 04 0D 20 D1 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 2E FF 80 00 00 02 01 06 00 00 04 0A 24 A7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 30 FF 80 00 00 02 01 06 00 00 04 0A DD BF 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 64 06 00 00 00 00 06 00 00 00 00 06 00 00 00 91 06 00 00 07 C1 06 00 00 08 FE 06 00 00 0B 16 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 67 D9 99 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 34 FF 80 00 00 02 01 06 00 00 03 23 60 4B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 36 FF 80 00 00 02 01 06 00 00 03 0A 18 F5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 38 FF 80 00 00 02 01 06 00 00 03 08 2B DB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 20 3A FF 80 00 00 02 01 06 00 00 03 06 EE 30 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 05 06 00 00 00 00 06 00 00 00 00 06 00 00 00 B0 06 00 00 07 BA 06 00 00 07 97 06 00 00 0A 35 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 68 8E 2C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 02 FF 80 00 00 02 01 06 00 00 03 0A AB CB 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 04 FF 80 00 00 02 01 06 00 00 03 02 2E 40 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 06 FF 80 00 00 02 01 06 00 00 03 08 CF ED 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 08 FF 80 00 00 02 01 06 00 00 03 0B 75 D2 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 08 06 00 00 00 00 06 00 00 00 00 06 00 00 00 AF 06 00 00 07 BB 06 00 00 07 9E 06 00 00 0A 3B 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 69 FD 58 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 0C FF 80 00 00 02 01 06 00 00 03 05 7D 3E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 0E FF 80 00 00 02 01 06 00 00 03 08 23 E7 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 10 FF 80 00 00 02 01 06 00 00 03 05 3F 24 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 12 FF 80 00 00 02 01 06 00 00 03 04 0D 37 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 07 06 00 00 00 00 06 00 00 00 00 06 00 00 00 B0 06 00 00 07 BC 06 00 00 07 9A 06 00 00 0A 3B 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 68 62 08 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 16 FF 80 00 00 02 01 06 00 00 03 05 F2 23 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 18 FF 80 00 00 02 01 06 00 00 03 05 D3 2E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 1A FF 80 00 00 02 01 06 00 00 03 09 04 E6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 1C FF 80 00 00 02 01 06 00 00 03 06 3E 19 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 07 06 00 00 00 00 06 00 00 00 00 06 00 00 00 B0 06 00 00 07 BC 06 00 00 07 9A 06 00 00 0A 38 06 00 00 09 60 06 00 00 00 00 06 00 00 09 6B A6 A2 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 20 FF 80 00 00 02 01 06 00 00 03 09 3B D0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 22 FF 80 00 00 02 01 06 00 00 03 07 FE 3B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 24 FF 80 00 00 02 01 06 00 00 03 08 C4 C4 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 26 FF 80 00 00 02 01 06 00 00 03 09 F6 D7 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 07 06 00 00 00 00 06 00 00 00 00 06 00 00 00 B0 06 00 00 07 C5 06 00 00 07 8F 06 00 00 0A 3D 06 00 00 09 61 06 00 00 00 00 06 00 00 09 6A 24 5B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 2A FF 80 00 00 02 01 06 00 00 03 10 2C 55 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 2C FF 80 00 00 02 01 06 00 00 03 0B B3 FC 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 2E FF 80 00 00 02 01 06 00 00 03 0B 08 FE 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 30 FF 80 00 00 02 01 06 00 00 03 08 6A D4 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 0C 06 00 00 00 00 06 00 00 00 00 06 00 00 00 AF 06 00 00 07 C6 06 00 00 07 A2 06 00 00 0A 4B 06 00 00 09 5C 06 00 00 00 00 06 00 00 09 64 30 46 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 34 FF 80 00 00 02 01 06 00 00 03 09 95 C0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 36 FF 80 00 00 02 01 06 00 00 03 06 D9 3A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 38 FF 80 00 00 02 01 06 00 00 03 07 71 26 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 21 3A FF 80 00 00 02 01 06 00 00 03 04 51 16 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 0B 06 00 00 00 00 06 00 00 00 00 06 00 00 00 AE 06 00 00 07 BD 06 00 00 07 AC 06 00 00 0A 42 06 00 00 09 5C 06 00 00 00 00 06 00 00 09 66 2C 7C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 02 FF 80 00 00 02 01 06 00 00 03 0A 5C C5 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 04 FF 80 00 00 02 01 06 00 00 03 07 74 19 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 06 FF 80 00 00 02 01 06 00 00 03 06 46 0A 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 08 FF 80 00 00 02 01 06 00 00 03 0A 0B CD 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 05 06 00 00 00 00 06 00 00 00 00 06 00 00 00 B1 06 00 00 07 B2 06 00 00 07 98 06 00 00 0A 2F 06 00 00 09 60 06 00 00 00 00 06 00 00 09 6A 8F 73 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 0C FF 80 00 00 02 01 06 00 00 03 04 03 21 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 0E FF 80 00 00 02 01 06 00 00 03 04 B8 23 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 10 FF 80 00 00 02 01 06 00 00 03 03 FE 4F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 12 FF 80 00 00 02 01 06 00 00 03 05 73 28 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 09 06 00 00 00 00 06 00 00 00 00 06 00 00 00 AF 06 00 00 07 C0 06 00 00 07 9C 06 00 00 0A 44 06 00 00 09 5B 06 00 00 00 00 06 00 00 09 66 3E 93 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 16 FF 80 00 00 02 01 06 00 00 03 07 17 0E 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 18 FF 80 00 00 02 01 06 00 00 03 05 24 20 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 1A FF 80 00 00 02 01 06 00 00 03 07 8D 01 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 1C FF 80 00 00 02 01 06 00 00 03 05 52 25 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 07 06 00 00 00 00 06 00 00 00 00 06 00 00 00 B1 06 00 00 07 B7 06 00 00 07 99 06 00 00 0A 36 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 68 19 D9 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 20 FF 80 00 00 02 01 06 00 00 03 07 B2 37 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 22 FF 80 00 00 02 01 06 00 00 03 07 09 35 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 24 FF 80 00 00 02 01 06 00 00 03 1B 29 E8 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 26 FF 80 00 00 02 01 06 00 00 03 05 6D 13 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 28 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 03 06 00 00 00 00 06 00 00 00 00 06 00 00 00 B2 06 00 00 07 AE 06 00 00 07 98 06 00 00 0A 28 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 68 C1 72 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 2A FF 80 00 00 02 01 06 00 00 03 07 E5 3F 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 2C FF 80 00 00 02 01 06 00 00 03 05 3A 1B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 2E FF 80 00 00 02 01 06 00 00 03 04 08 08 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 30 FF 80 00 00 02 01 06 00 00 03 01 5C 47 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 32 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 02 06 00 00 00 00 06 00 00 00 00 06 00 00 00 B1 06 00 00 07 B8 06 00 00 07 8F 06 00 00 0A 2D 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 69 7A 05 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 34 FF 80 00 00 02 01 06 00 00 03 0E DD BA 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 36 FF 80 00 00 02 01 06 00 00 03 05 B5 06 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 38 FF 80 00 00 02 01 06 00 00 03 0D DC 87 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 22 3A FF 80 00 00 02 01 06 00 00 03 1A 59 E1 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 00 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 13 06 00 00 00 00 06 00 00 00 00 06 00 00 00 AE 06 00 00 07 DC 06 00 00 07 98 06 00 00 0A 64 06 00 00 09 5C 06 00 00 00 00 06 00 00 09 66 E1 F0 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 02 FF 80 00 00 02 01 06 00 00 03 05 06 38 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 04 FF 80 00 00 02 01 06 00 00 03 02 74 4B 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 06 FF 80 00 00 02 01 06 00 00 03 05 70 3D 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 08 FF 80 00 00 02 01 06 00 00 03 07 43 13 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 0A FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 04 06 00 00 00 00 06 00 00 00 00 06 00 00 00 B0 06 00 00 07 B5 06 00 00 07 98 06 00 00 0A 30 06 00 00 09 5D 06 00 00 00 00 06 00 00 09 67 69 E6 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 0C FF 80 00 00 02 01 06 00 00 03 05 27 35 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 0E FF 80 00 00 02 01 06 00 00 03 0A 6B CF 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 10 FF 80 00 00 02 01 06 00 00 03 07 77 0C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 12 FF 80 00 00 02 01 06 00 00 03 07 CC 0E 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 14 FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 07 06 00 00 00 00 06 00 00 00 00 06 00 00 00 B0 06 00 00 07 BC 06 00 00 07 99 06 00 00 0A 3A 06 00 00 09 5F 06 00 00 00 00 06 00 00 09 67 7A 50 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 16 FF 80 00 00 02 01 06 00 00 03 04 21 39 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 18 FF 80 00 00 02 01 06 00 00 03 04 00 34 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 1A FF 80 00 00 02 01 06 00 00 03 07 20 04 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 1C FF 80 00 00 02 01 06 00 00 03 0C 3E BD 7E
7E A0 79 01 02 01 10 80 93 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 1E FF 80 00 00 02 0D 09 07 4B 46 4D 5F 30 30 31 09 10 36 39 37 30 36 33 31 34 30 31 37 35 33 39 38 35 09 08 4D 41 33 30 34 48 33 45 06 00 00 03 08 06 00 00 00 00 06 00 00 00 00 06 00 00 00 AF 06 00 00 07 BC 06 00 00 07 99 06 00 00 0A 3D 06 00 00 09 5E 06 00 00 00 00 06 00 00 09 68 A2 19 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 20 FF 80 00 00 02 01 06 00 00 03 0C CC 8C 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 22 FF 80 00 00 02 01 06 00 00 03 09 DA D9 7E
7E A0 27 01 02 01 10 5A 87 E6 E7 00 0F 40 00 00 00 09 0C 07 E1 09 0E 04 15 23 24 FF 80 00 00 02 01 06 00 00 03 0A 8C EC 7E

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MSTest.TestAdapter" version="1.1.11" targetFramework="net452" />
<package id="MSTest.TestFramework" version="1.1.11" targetFramework="net452" />
</packages>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -1,26 +0,0 @@
## AMS <-> MQTT Bridge
# Code
Various code projects to help debug and build the final system
### HanDebugger (C# console)
A very simplified c# console application to read serial data directly from the HAN bus, using the HAN-FTDI circuit and a FTDI device (USB serial port). The application will simply use the right serial setup (2400 baud, 8E1) to set up a connection and continously read incoming data. The received data is split on the package start and -end flags (0x7E) and output to console.
![HanScreenshot](/Code/HanDebugger/screenshot.png)
### ESPDebugger (Arduino sketch on ESP8266)
Very similar to the HanDebugger, simply reading the HAN data and outputting the same data to the Serial1 port, HEX-formatted and splitted by lines on start and -end flags.
![ESPCircuit](./ESPDebugger/Circuit%20(breadboard).jpg)
![ESPScreenshot](./ESPDebugger/screenshot.png)
### SerialTestPattern (Arduino sketch, any variant)
This code outputs a changing serial test pattern.
![](SerialTestPattern/SerialTestPattern.gif)
### SerialSimulator (Python code to send sample HAN data over serial port)
Use this Python3 script (e.g. running on a desktop computer using a USB to serial dongle) to simulate the data sent over the HAN port (after being translate from Mbus to uart signals).
![](SerialSimulator/ams_serial_simulator.jpg)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

View File

@@ -1,19 +0,0 @@
import serial
import time
import sys
import sample_data
serial_port = sys.argv[1]
with serial.Serial(port=serial_port, baudrate=2400, bytesize=8, parity='E', stopbits=1) as ser:
print(ser)
print('sleeping')
time.sleep(1)
while True:
for packet in sample_data.kaifa_20190508_packets[:]:
sys.stdout.flush()
ser.write(packet)
print('sleeping')
time.sleep(2)
break

View File

@@ -1,27 +0,0 @@
# From Samples/Kaifa/HAN 20170912-3.txt:
kaifa_han_20170912_3_packets = [
# [2017-09-13 00.00.07.776 - Received 41 (0x29) bytes]
b'\x7E\xA0\x27\x01\x02\x01\x10\x5A\x87\xE6\xE7\x00\x0F\x40\x00\x00\x00\x09\x0C\x07\xE1\x09\x0D\x02\x00\x00\x06\xFF\x80\x00\x00\x02\x01\x06\x00\x00\x11\xAC\x85\x61\x7E',
# [2017-09-13 00.00.09.784 - Received 41 (0x29) bytes]
b'\x7E\xA0\x27\x01\x02\x01\x10\x5A\x87\xE6\xE7\x00\x0F\x40\x00\x00\x00\x09\x0C\x07\xE1\x09\x0D\x02\x00\x00\x08\xFF\x80\x00\x00\x02\x01\x06\x00\x00\x11\xB4\x6D\xF0\x7E',
# [2017-09-13 00.00.11.761 - Received 157 (0x9D) bytes]
b'\x7E\xA0\x9B\x01\x02\x01\x10\xEE\xAE\xE6\xE7\x00\x0F\x40\x00\x00\x00\x09\x0C\x07\xE1\x09\x0D\x02\x00\x00\x0A\xFF\x80\x00\x00\x02\x12\x09\x07\x4B\x46\x4D\x5F\x30\x30\x31\x09\x10\x36\x39\x37\x30\x36\x33\x31\x34\x30\x31\x37\x35\x33\x39\x38\x35\x09\x08\x4D\x41\x33\x30\x34\x48\x33\x45\x06\x00\x00\x11\xB5\x06\x00\x00\x00\x00\x06\x00\x00\x00\x00\x06\x00\x00\x00\x80\x06\x00\x00\x38\x48\x06\x00\x00\x3C\x76\x06\x00\x00\x14\x5B\x06\x00\x00\x09\x4D\x06\x00\x00\x00\x00\x06\x00\x00\x09\x5A\x09\x0C\x07\xE1\x09\x0D\x02\x00\x00\x0A\xFF\x80\x00\x00\x06\x00\x01\xB8\x57\x06\x00\x00\x00\x00\x06\x00\x00\x00\x65\x06\x00\x00\x33\xA4\x54\x83\x7E',
# [2017-09-13 00.00.13.769 - Received 41 (0x29) bytes]
b'\x7E\xA0\x27\x01\x02\x01\x10\x5A\x87\xE6\xE7\x00\x0F\x40\x00\x00\x00\x09\x0C\x07\xE1\x09\x0D\x02\x00\x00\x0C\xFF\x80\x00\x00\x02\x01\x06\x00\x00\x11\xB9\xFE\x2E\x7E',
# [2017-09-13 00.00.15.778 - Received 41 (0x29) bytes]
b'\x7E\xA0\x27\x01\x02\x01\x10\x5A\x87\xE6\xE7\x00\x0F\x40\x00\x00\x00\x09\x0C\x07\xE1\x09\x0D\x02\x00\x00\x0E\xFF\x80\x00\x00\x02\x01\x06\x00\x00\x11\xBA\xDE\x1E\x7E',
# [2017-09-13 00.00.17.786 - Received 41 (0x29) bytes]
b'\x7E\xA0\x27\x01\x02\x01\x10\x5A\x87\xE6\xE7\x00\x0F\x40\x00\x00\x00\x09\x0C\x07\xE1\x09\x0D\x02\x00\x00\x10\xFF\x80\x00\x00\x02\x01\x06\x00\x00\x11\xBB\xAE\x17\x7E',
# [2017-09-13 00.00.19.762 - Received 41 (0x29) bytes]
b'\x7E\xA0\x27\x01\x02\x01\x10\x5A\x87\xE6\xE7\x00\x0F\x40\x00\x00\x00\x09\x0C\x07\xE1\x09\x0D\x02\x00\x00\x12\xFF\x80\x00\x00\x02\x01\x06\x00\x00\x11\xB7\x79\xDF\x7E',
# [2017-09-13 00.00.21.771 - Received 123 (0x7B) bytes]
b'\x7E\xA0\x79\x01\x02\x01\x10\x80\x93\xE6\xE7\x00\x0F\x40\x00\x00\x00\x09\x0C\x07\xE1\x09\x0D\x02\x00\x00\x14\xFF\x80\x00\x00\x02\x0D\x09\x07\x4B\x46\x4D\x5F\x30\x30\x31\x09\x10\x36\x39\x37\x30\x36\x33\x31\x34\x30\x31\x37\x35\x33\x39\x38\x35\x09\x08\x4D\x41\x33\x30\x34\x48\x33\x45\x06\x00\x00\x11\xBB\x06\x00\x00\x00\x00\x06\x00\x00\x00\x00\x06\x00\x00\x00\x7F\x06\x00\x00\x38\x4D\x06\x00\x00\x3C\x86\x06\x00\x00\x14\x5B\x06\x00\x00\x09\x4F\x06\x00\x00\x00\x00\x06\x00\x00\x09\x5C\xC1\x54\x7E',
]
# From Kaifa MA105H2E 2019-05-08
kaifa_20190508_packets = [
b'~\xa0\'\x01\x02\x01\x10Z\x87\xe6\xe7\x00\x0f@\x00\x00\x00\t\x0c\x07\xe3\x05\x08\x03\x16 "\xff\x80\x00\x00\x02\x01\x06\x00\x00\x03\xa3L\xab~',
b'~\xa0e\x01\x02\x01\x10\xf0P\xe6\xe7\x00\x0f@\x00\x00\x00\t\x0c\x07\xe3\x05\x08\x03\x16 (\xff\x80\x00\x00\x02\t\t\x07KFM_001\t\x106970631401991684\t\x08MA105H2E\x06\x00\x00\x03\xa5\x06\x00\x00\x00\x00\x06\x00\x00\x00!\x06\x00\x00\x00\x00\x06\x00\x00\x10\x0e\x06\x00\x00\t\n\x98v~',
b'~\xa0\'\x01\x02\x01\x10Z\x87\xe6\xe7\x00\x0f@\x00\x00\x00\t\x0c\x07\xe3\x05\x08\x03\x16 "\xff\x80\x00\x00\x02\x01\x06\x00\x00\x03\xa3L\xab~',
]

View File

@@ -1,7 +0,0 @@
This is a simple Arduino sketch that can be used to generate a
serial test pattern (input to the m-bus master for instance).
It will send one byte at the time, changing one bit compared
to previous at a fixed interval.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

View File

@@ -1,36 +0,0 @@
#include <SoftwareSerial.h>
#define RX_PIN 10
#define TX_PIN 11
SoftwareSerial mySerial(RX_PIN, TX_PIN);
// https://en.wikipedia.org/wiki/Binary_Gray_sequence
static unsigned int binary_to_gray(unsigned int num)
{
return num ^ (num >> 1);
}
void setup() {
mySerial.begin(9600);
}
void loop() {
static unsigned int i = 0;
static unsigned int ch = 0;
// Change the character more seldom than each loop entry.
if (i++ > 20) {
i = 0;
// 127 => leave the last bit sent always zero.
if (++ch > 127) {
ch = 0;
}
}
mySerial.write(binary_to_gray(ch));
// 9600 bps => 8 bit = 8/9600s ~ 0.8ms
delay(50);
}

View File

@@ -1,77 +0,0 @@
# Getting started building or modifying
## Tools
### Kicad
Install the [KiCad](http://www.kicad-pcb.org/) program to edit the schematic or PCB.
KiCad documentation and forums:
* https://kicad-pcb.org/help/documentation/#_getting_started
* https://forum.kicad.info/
* https://www.reddit.com/r/KiCad/
* https://en.wikipedia.org/wiki/KiCad
### Simulator
If you want to simulate parts of the circuit you also need a simulator. This is
highly recommended! This saves a *lot* of troubleshooting and makes you find
solutions you otherwise would not have found.
[Electronic circuit simulation](https://en.wikipedia.org/wiki/Electronic_circuit_simulation)
using computers have a long history. Many of them have origins directly or indirectly
related to the classic SPICE simulator (e.g. [Ngspice](http://ngspice.sourceforge.net)).
At the core they work similar to source code compilers - you give it a text file
describing the circuit and it produces a textual simulation result. Some of the simulators
are intended to be used just in text mode while other have a graphical frontend where
you are able to draw the circuit like in a schematic editor:
* [QUCS](http://qucs.sourceforge.net/) - Quite Universal Circuit Simulator.
* [QUCS-S](https://ra3xdh.github.io/) - A qucs version using ngspice as simulation backend. This one has been used for the simulations for board 3.
* [eSim](http://esim.fossee.in/).
* [Other alternatives](https://en.wikipedia.org/wiki/List_of_free_electronics_circuit_simulators).
### Git
While it is possible to download the content from this repository as a compresset
zip file, you want to use git to fetch the content. For Linux install depending on
distribution with
```
apt-get install git # debian, ubuntu, etc
dnf install git # fedora
yum install git # rhel, centos
```
For windows the most convenient option is to install [git for windows](https://git-scm.com/download/win).
To download the source of this repository run:
```
git clone https://github.com/roarfred/AmsToMqttBridge
cd AmsToMqttBridge
git submodule init
git submodule update --recursive
```
Make sure that all submodules are fetched. If not `git submodule status` will show something like the following (notice the `-` in front):
```bash
-f886cacb58461d356730e744d9d2ae55590825e4 kicad-symbols
```
while when properly fetched it will show the commit id normally
(plus any labels if appropriate):
```bash
f886cacb58461d356730e744d9d2ae55590825e4 kicad-symbols (5.0.0-rc1)
```
To mitigate, run update:
```bash
$ git submodule update --init
Submodule 'Electrical/kicad-libs/kicad-symbols' (https://github.com/kicad/kicad-symbols) registered for path 'kicad-symbols'
Cloning into '.../AmsToMqttBridge/Electrical/kicad-libs/kicad-symbols'...
Submodule path 'kicad-symbols': checked out 'f886cacb58461d356730e744d9d2ae55590825e4'
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
Record=TopLevelDocument|FileName=AMSTOMQTT.SchDoc

View File

@@ -1,20 +0,0 @@
----------------------------------------------------------------------------------------------------------------------------------
NCDrill File Report For: AMSTOMQTT.PcbDoc 25-Oct-17 2:22:37 PM
----------------------------------------------------------------------------------------------------------------------------------
Layer Pair : Top Layer to Bottom Layer
ASCII RoundHoles File : AMSTOMQTT.TXT
Tool Hole Size Hole Tolerance Hole Type Hole Count Plated Tool Travel
----------------------------------------------------------------------------------------------------------------------------------
T1 28mil (0.7mm) Round 9 PTH 4.25inch (107.84mm)
T2 28mil (0.711mm) Round 1 PTH 0.00inch (0.00mm)
T3 30mil (0.76mm) Round 10 PTH 0.91inch (23.16mm)
T4 33mil (0.85mm) Round 22 PTH 7.25inch (184.18mm)
T5 35mil (0.9mm) Round 18 PTH 5.72inch (145.35mm)
T6 47mil (1.2mm) Round 8 PTH 1.55inch (39.49mm)
T7 126mil (3.2mm) Round 2 PTH 0.45inch (11.43mm)
----------------------------------------------------------------------------------------------------------------------------------
Totals 70
Total Processing Time (hh:mm:ss) : 00:00:00

View File

@@ -1,21 +0,0 @@
------------------------------------------------------------------------------------------
Gerber File Extension Report For: AMSTOMQTT.GBR 25-Oct-17 2:21:42 PM
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
Layer Extension Layer Description
------------------------------------------------------------------------------------------
.GTL Top Layer
.GBL Bottom Layer
.GPB Bottom Pad Master
.GPT Top Pad Master
.GTO Top Overlay
.GTP Top Paste
.GTS Top Solder
.GBS Bottom Solder
.GKO Keep-Out Layer
.GM1 Mechanical 1
.GM13 Mechanical 13
.GM15 Mechanical 15
------------------------------------------------------------------------------------------

View File

@@ -1,248 +0,0 @@
G04 Layer_Physical_Order=2*
G04 Layer_Color=16711680*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
%ADD16C,0.02000*%
%ADD18C,0.05512*%
%ADD19C,0.06000*%
%ADD20C,0.04724*%
%ADD21R,0.05906X0.05906*%
%ADD22C,0.05906*%
%ADD23O,0.07874X0.03937*%
%ADD24O,0.07874X0.03937*%
%ADD25R,0.05906X0.05906*%
%ADD26C,0.07087*%
%ADD27C,0.05000*%
D16*
X169500Y152500D02*
X176000D01*
X169000Y153000D02*
X169500Y152500D01*
X162500Y153000D02*
X169000D01*
X124800Y190700D02*
X162500Y153000D01*
X29800Y190700D02*
X124800D01*
X25000Y195500D02*
X29800Y190700D01*
X131657Y41157D02*
X145500Y55000D01*
X67500Y52500D02*
X78843Y41157D01*
X65000Y78000D02*
X75000D01*
X162500Y183000D02*
X166756Y187256D01*
X178500D01*
X180800Y184956D01*
Y147700D02*
Y184956D01*
X169383Y136283D02*
X180800Y147700D01*
X55091Y136283D02*
X169383D01*
X69400Y123600D02*
X85000Y108000D01*
X37124Y123600D02*
X69400D01*
X23000Y109476D02*
X37124Y123600D01*
X159900Y166400D02*
X176000Y182500D01*
X202800Y102700D02*
X206000Y99500D01*
X141200Y102700D02*
X202800D01*
X136000Y97500D02*
X141200Y102700D01*
X95000Y108000D02*
X125500D01*
X136000Y97500D01*
X145500D02*
X166000D01*
X136000Y88000D02*
X145500Y97500D01*
X95000Y88000D02*
X136000D01*
X75000Y108000D02*
X95000Y88000D01*
X49000Y110500D02*
X51900Y113400D01*
X69600D01*
X75000Y108000D01*
X191744Y190256D02*
X204000Y178000D01*
X174744Y190256D02*
X191744D01*
X159000Y206000D02*
X174744Y190256D01*
X90000Y83000D02*
X95000Y78000D01*
X51500Y83000D02*
X90000D01*
X49000Y80500D02*
X51500Y83000D01*
X43000Y80500D02*
X49000D01*
X42000Y79500D02*
X43000Y80500D01*
X36000Y79500D02*
X42000D01*
X173531Y122531D02*
X187969D01*
X189000Y121500D01*
X165500Y114500D02*
X173531Y122531D01*
X78843Y41157D02*
X131657D01*
D18*
X77343Y52500D02*
D03*
X67500D02*
D03*
X165500Y144500D02*
D03*
Y114500D02*
D03*
X136000Y88000D02*
D03*
X166000D02*
D03*
Y97500D02*
D03*
X136000D02*
D03*
X189000Y182500D02*
D03*
Y152500D02*
D03*
X206000Y99500D02*
D03*
Y129500D02*
D03*
X55000Y195500D02*
D03*
X25000D02*
D03*
X36000Y109500D02*
D03*
Y79500D02*
D03*
X49000Y80500D02*
D03*
Y110500D02*
D03*
X55000Y204000D02*
D03*
X25000D02*
D03*
X176000Y152500D02*
D03*
Y182500D02*
D03*
X162500Y153000D02*
D03*
Y183000D02*
D03*
X106500Y41157D02*
D03*
Y51000D02*
D03*
D19*
X185500Y55000D02*
D03*
X180500Y65000D02*
D03*
X175500Y55000D02*
D03*
X170500Y65000D02*
D03*
X165500Y55000D02*
D03*
X160500Y65000D02*
D03*
X155500Y55000D02*
D03*
X150500Y65000D02*
D03*
X140500D02*
D03*
X145500Y55000D02*
D03*
D20*
X25000Y12000D02*
D03*
Y32000D02*
D03*
D21*
X23000Y81524D02*
D03*
X95000Y108000D02*
D03*
X204000Y198000D02*
D03*
D22*
X23000Y109476D02*
D03*
X85000Y108000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X95000Y78000D02*
D03*
X85000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X159000Y206000D02*
D03*
X204000Y188000D02*
D03*
Y178000D02*
D03*
Y168000D02*
D03*
Y158000D02*
D03*
Y148000D02*
D03*
D23*
X189000Y121500D02*
D03*
Y126500D02*
D03*
D24*
Y131500D02*
D03*
D25*
X169000Y206000D02*
D03*
D26*
X55091Y183500D02*
D03*
X29500D02*
D03*
Y165784D02*
D03*
X55091D02*
D03*
Y136283D02*
D03*
X29500D02*
D03*
Y118567D02*
D03*
X55091D02*
D03*
D27*
X159900Y166400D02*
D03*
M02*

View File

@@ -1,169 +0,0 @@
G04 Layer_Color=16711935*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
%ADD43C,0.06312*%
%ADD44C,0.06800*%
%ADD45C,0.00800*%
%ADD46C,0.05524*%
%ADD47R,0.06706X0.06706*%
%ADD48C,0.06706*%
%ADD49O,0.08674X0.04737*%
%ADD50O,0.08674X0.04737*%
%ADD51R,0.06706X0.06706*%
%ADD52C,0.07887*%
%ADD53C,0.05800*%
D43*
X77343Y52500D02*
D03*
X67500D02*
D03*
X165500Y144500D02*
D03*
Y114500D02*
D03*
X136000Y88000D02*
D03*
X166000D02*
D03*
Y97500D02*
D03*
X136000D02*
D03*
X189000Y182500D02*
D03*
Y152500D02*
D03*
X206000Y99500D02*
D03*
Y129500D02*
D03*
X55000Y195500D02*
D03*
X25000D02*
D03*
X36000Y109500D02*
D03*
Y79500D02*
D03*
X49000Y80500D02*
D03*
Y110500D02*
D03*
X55000Y204000D02*
D03*
X25000D02*
D03*
X176000Y152500D02*
D03*
Y182500D02*
D03*
X162500Y153000D02*
D03*
Y183000D02*
D03*
X106500Y41157D02*
D03*
Y51000D02*
D03*
D44*
X185500Y55000D02*
D03*
X180500Y65000D02*
D03*
X175500Y55000D02*
D03*
X170500Y65000D02*
D03*
X165500Y55000D02*
D03*
X160500Y65000D02*
D03*
X155500Y55000D02*
D03*
X150500Y65000D02*
D03*
X140500D02*
D03*
X145500Y55000D02*
D03*
D45*
X185500Y30000D02*
D03*
X140500D02*
D03*
D46*
X25000Y12000D02*
D03*
Y32000D02*
D03*
D47*
X23000Y81524D02*
D03*
X95000Y108000D02*
D03*
X204000Y198000D02*
D03*
D48*
X23000Y109476D02*
D03*
X85000Y108000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X95000Y78000D02*
D03*
X85000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X159000Y206000D02*
D03*
X204000Y188000D02*
D03*
Y178000D02*
D03*
Y168000D02*
D03*
Y158000D02*
D03*
Y148000D02*
D03*
D49*
X189000Y121500D02*
D03*
Y126500D02*
D03*
D50*
Y131500D02*
D03*
D51*
X169000Y206000D02*
D03*
D52*
X55091Y183500D02*
D03*
X29500D02*
D03*
Y165784D02*
D03*
X55091D02*
D03*
Y136283D02*
D03*
X29500D02*
D03*
Y118567D02*
D03*
X55091D02*
D03*
D53*
X159900Y166400D02*
D03*
M02*

View File

@@ -1,17 +0,0 @@
G04 Layer_Color=16711935*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
%ADD32C,0.01000*%
D32*
X0Y0D02*
X233858D01*
X0D02*
Y214173D01*
X233858Y0D02*
Y214173D01*
X0D02*
X233858D01*
M02*

View File

@@ -1,7 +0,0 @@
G04 Layer_Color=16711935*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
M02*

View File

@@ -1,197 +0,0 @@
G04 Layer_Color=16711935*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
%ADD32C,0.01000*%
%ADD54C,0.00394*%
%ADD55C,0.00200*%
D32*
X82155Y117208D02*
X145806D01*
Y211458D01*
X82155D02*
X145806D01*
X82155Y117208D02*
Y211458D01*
D54*
X98701Y103630D02*
G03*
X98701Y103630I-1969J0D01*
G01*
X41811Y14279D02*
X68189D01*
X41811Y28886D02*
X68189D01*
X41811Y14279D02*
Y28886D01*
X68189Y14279D02*
Y28886D01*
X59724Y107173D02*
X100276D01*
X59724Y78827D02*
X100276D01*
Y107173D01*
X59724Y78827D02*
Y107173D01*
D55*
X81984Y189238D02*
Y211500D01*
X145984D01*
Y189238D02*
Y211500D01*
X81984Y189238D02*
X145984D01*
X83651Y208333D02*
X83484Y208500D01*
X83151D01*
X82984Y208333D01*
Y207667D01*
X83151Y207500D01*
X83484D01*
X83651Y207667D01*
X83984Y208500D02*
Y207667D01*
X84150Y207500D01*
X84484D01*
X84650Y207667D01*
Y208500D01*
X84984D02*
X85650D01*
X85317D01*
Y207500D01*
X86483Y208500D02*
X86150D01*
X85983Y208333D01*
Y207667D01*
X86150Y207500D01*
X86483D01*
X86650Y207667D01*
Y208333D01*
X86483Y208500D01*
X86983D02*
Y207667D01*
X87150Y207500D01*
X87483D01*
X87649Y207667D01*
Y208500D01*
X87983D02*
X88649D01*
X88316D01*
Y207500D01*
X89982D02*
Y208500D01*
X90482D01*
X90649Y208333D01*
Y208000D01*
X90482Y207833D01*
X89982D01*
X91482Y208500D02*
X91148D01*
X90982Y208333D01*
Y207667D01*
X91148Y207500D01*
X91482D01*
X91648Y207667D01*
Y208333D01*
X91482Y208500D01*
X91981D02*
Y207500D01*
X92648D01*
X92981Y208500D02*
Y208333D01*
X93314Y208000D01*
X93647Y208333D01*
Y208500D01*
X93314Y208000D02*
Y207500D01*
X94647Y208333D02*
X94481Y208500D01*
X94147D01*
X93981Y208333D01*
Y207667D01*
X94147Y207500D01*
X94481D01*
X94647Y207667D01*
Y208000D01*
X94314D01*
X95480Y208500D02*
X95147D01*
X94980Y208333D01*
Y207667D01*
X95147Y207500D01*
X95480D01*
X95647Y207667D01*
Y208333D01*
X95480Y208500D01*
X95980Y207500D02*
Y208500D01*
X96646Y207500D01*
Y208500D01*
X82984Y209500D02*
Y210167D01*
X83318Y210500D01*
X83651Y210167D01*
Y209500D01*
Y210000D01*
X82984D01*
X83984Y209500D02*
Y210500D01*
X84650Y209500D01*
Y210500D01*
X84984D02*
X85650D01*
X85317D01*
Y209500D01*
X86650Y210500D02*
X85983D01*
Y209500D01*
X86650D01*
X85983Y210000D02*
X86317D01*
X86983Y209500D02*
Y210500D01*
X87649Y209500D01*
Y210500D01*
X87983Y209500D02*
Y210500D01*
X88649Y209500D01*
Y210500D01*
X88982Y209500D02*
Y210167D01*
X89316Y210500D01*
X89649Y210167D01*
Y209500D01*
Y210000D01*
X88982D01*
X90982Y209500D02*
Y210167D01*
X91315Y210500D01*
X91648Y210167D01*
Y209500D01*
Y210000D01*
X90982D01*
X91981Y209500D02*
Y210500D01*
X92481D01*
X92648Y210333D01*
Y210000D01*
X92481Y209833D01*
X91981D01*
X92315D02*
X92648Y209500D01*
X93647Y210500D02*
X92981D01*
Y209500D01*
X93647D01*
X92981Y210000D02*
X93314D01*
X93981Y209500D02*
Y210167D01*
X94314Y210500D01*
X94647Y210167D01*
Y209500D01*
Y210000D01*
X93981D01*
M02*

View File

@@ -1,44 +0,0 @@
G04 Layer_Color=32768*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
%ADD32C,0.01000*%
%ADD54C,0.00394*%
%ADD56C,0.00197*%
D32*
X78646Y117208D02*
Y211458D01*
X149315D01*
Y117208D02*
Y211458D01*
X78646Y117208D02*
X149315D01*
D54*
X55000Y19614D02*
Y23551D01*
X53031Y21583D02*
X56969D01*
X80000Y91032D02*
Y94969D01*
X78032Y93000D02*
X81969D01*
X187032Y126500D02*
X190969D01*
X189000Y124531D02*
Y128469D01*
X113980Y163333D02*
Y165333D01*
X112980Y164333D02*
X114980D01*
D56*
X40827Y4457D02*
X69173D01*
X40827Y38709D02*
X69173D01*
X40827Y4457D02*
Y38709D01*
X69173Y4457D02*
Y38709D01*
M02*

View File

@@ -1,159 +0,0 @@
G04 Layer_Color=255*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
%ADD18C,0.05512*%
%ADD19C,0.06000*%
%ADD20C,0.04724*%
%ADD21R,0.05906X0.05906*%
%ADD22C,0.05906*%
%ADD23O,0.07874X0.03937*%
%ADD24O,0.07874X0.03937*%
%ADD25R,0.05906X0.05906*%
%ADD26C,0.07087*%
D18*
X77343Y52500D02*
D03*
X67500D02*
D03*
X165500Y144500D02*
D03*
Y114500D02*
D03*
X136000Y88000D02*
D03*
X166000D02*
D03*
Y97500D02*
D03*
X136000D02*
D03*
X189000Y182500D02*
D03*
Y152500D02*
D03*
X206000Y99500D02*
D03*
Y129500D02*
D03*
X55000Y195500D02*
D03*
X25000D02*
D03*
X36000Y109500D02*
D03*
Y79500D02*
D03*
X49000Y80500D02*
D03*
Y110500D02*
D03*
X55000Y204000D02*
D03*
X25000D02*
D03*
X176000Y152500D02*
D03*
Y182500D02*
D03*
X162500Y153000D02*
D03*
Y183000D02*
D03*
X106500Y41157D02*
D03*
Y51000D02*
D03*
D19*
X185500Y55000D02*
D03*
X180500Y65000D02*
D03*
X175500Y55000D02*
D03*
X170500Y65000D02*
D03*
X165500Y55000D02*
D03*
X160500Y65000D02*
D03*
X155500Y55000D02*
D03*
X150500Y65000D02*
D03*
X140500D02*
D03*
X145500Y55000D02*
D03*
D20*
X25000Y12000D02*
D03*
Y32000D02*
D03*
D21*
X23000Y81524D02*
D03*
X95000Y108000D02*
D03*
X204000Y198000D02*
D03*
D22*
X23000Y109476D02*
D03*
X85000Y108000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X95000Y78000D02*
D03*
X85000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X159000Y206000D02*
D03*
X204000Y188000D02*
D03*
Y178000D02*
D03*
Y168000D02*
D03*
Y158000D02*
D03*
Y148000D02*
D03*
D23*
X189000Y121500D02*
D03*
Y126500D02*
D03*
D24*
Y131500D02*
D03*
D25*
X169000Y206000D02*
D03*
D26*
X55091Y183500D02*
D03*
X29500D02*
D03*
Y165784D02*
D03*
X55091D02*
D03*
Y136283D02*
D03*
X29500D02*
D03*
Y118567D02*
D03*
X55091D02*
D03*
M02*

View File

@@ -1,233 +0,0 @@
G04 Layer_Color=255*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
%ADD10R,0.03937X0.09449*%
%ADD11R,0.12992X0.09449*%
%ADD12R,0.08858X0.03937*%
%ADD13R,0.08268X0.06299*%
%ADD14R,0.01575X0.05315*%
%ADD15R,0.07087X0.07480*%
%ADD18C,0.05512*%
%ADD19C,0.06000*%
%ADD20C,0.04724*%
%ADD21R,0.05906X0.05906*%
%ADD22C,0.05906*%
%ADD23O,0.07874X0.03937*%
%ADD24O,0.07874X0.03937*%
%ADD25R,0.05906X0.05906*%
%ADD26C,0.07087*%
D10*
X45945Y10165D02*
D03*
X55000D02*
D03*
X64055D02*
D03*
D11*
X55000Y33000D02*
D03*
D12*
X83961Y123382D02*
D03*
Y131256D02*
D03*
Y139130D02*
D03*
Y147004D02*
D03*
Y154878D02*
D03*
Y162752D02*
D03*
Y170626D02*
D03*
Y178500D02*
D03*
X144000D02*
D03*
Y170626D02*
D03*
Y162752D02*
D03*
Y154878D02*
D03*
Y147004D02*
D03*
Y139130D02*
D03*
Y131256D02*
D03*
Y123382D02*
D03*
D13*
X86169Y19736D02*
D03*
X110382D02*
D03*
D14*
X93158Y20228D02*
D03*
X95717D02*
D03*
X98276D02*
D03*
X100835D02*
D03*
X103394D02*
D03*
D15*
X93551Y9500D02*
D03*
X103000D02*
D03*
X113039D02*
D03*
X83512D02*
D03*
D18*
X77343Y52500D02*
D03*
X67500D02*
D03*
X165500Y144500D02*
D03*
Y114500D02*
D03*
X136000Y88000D02*
D03*
X166000D02*
D03*
Y97500D02*
D03*
X136000D02*
D03*
X189000Y182500D02*
D03*
Y152500D02*
D03*
X206000Y99500D02*
D03*
Y129500D02*
D03*
X55000Y195500D02*
D03*
X25000D02*
D03*
X36000Y109500D02*
D03*
Y79500D02*
D03*
X49000Y80500D02*
D03*
Y110500D02*
D03*
X55000Y204000D02*
D03*
X25000D02*
D03*
X176000Y152500D02*
D03*
Y182500D02*
D03*
X162500Y153000D02*
D03*
Y183000D02*
D03*
X106500Y41157D02*
D03*
Y51000D02*
D03*
D19*
X185500Y55000D02*
D03*
X180500Y65000D02*
D03*
X175500Y55000D02*
D03*
X170500Y65000D02*
D03*
X165500Y55000D02*
D03*
X160500Y65000D02*
D03*
X155500Y55000D02*
D03*
X150500Y65000D02*
D03*
X140500D02*
D03*
X145500Y55000D02*
D03*
D20*
X25000Y12000D02*
D03*
Y32000D02*
D03*
D21*
X23000Y81524D02*
D03*
X95000Y108000D02*
D03*
X204000Y198000D02*
D03*
D22*
X23000Y109476D02*
D03*
X85000Y108000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X95000Y78000D02*
D03*
X85000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X159000Y206000D02*
D03*
X204000Y188000D02*
D03*
Y178000D02*
D03*
Y168000D02*
D03*
Y158000D02*
D03*
Y148000D02*
D03*
D23*
X189000Y121500D02*
D03*
Y126500D02*
D03*
D24*
Y131500D02*
D03*
D25*
X169000Y206000D02*
D03*
D26*
X55091Y183500D02*
D03*
X29500D02*
D03*
Y165784D02*
D03*
X55091D02*
D03*
Y136283D02*
D03*
X29500D02*
D03*
Y118567D02*
D03*
X55091D02*
D03*
M02*

View File

@@ -1,457 +0,0 @@
G04 Layer_Physical_Order=1*
G04 Layer_Color=255*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
%ADD10R,0.03937X0.09449*%
%ADD11R,0.12992X0.09449*%
%ADD12R,0.08858X0.03937*%
%ADD13R,0.08268X0.06299*%
%ADD14R,0.01575X0.05315*%
%ADD15R,0.07087X0.07480*%
%ADD16C,0.02000*%
%ADD17C,0.01500*%
%ADD18C,0.05512*%
%ADD19C,0.06000*%
%ADD20C,0.04724*%
%ADD21R,0.05906X0.05906*%
%ADD22C,0.05906*%
%ADD23O,0.07874X0.03937*%
%ADD24O,0.07874X0.03937*%
%ADD25R,0.05906X0.05906*%
%ADD26C,0.07087*%
%ADD27C,0.05000*%
D10*
X45945Y10165D02*
D03*
X55000D02*
D03*
X64055D02*
D03*
D11*
X55000Y33000D02*
D03*
D12*
X83961Y123382D02*
D03*
Y131256D02*
D03*
Y139130D02*
D03*
Y147004D02*
D03*
Y154878D02*
D03*
Y162752D02*
D03*
Y170626D02*
D03*
Y178500D02*
D03*
X144000D02*
D03*
Y170626D02*
D03*
Y162752D02*
D03*
Y154878D02*
D03*
Y147004D02*
D03*
Y139130D02*
D03*
Y131256D02*
D03*
Y123382D02*
D03*
D13*
X86169Y19736D02*
D03*
X110382D02*
D03*
D14*
X93158Y20228D02*
D03*
X95717D02*
D03*
X98276D02*
D03*
X100835D02*
D03*
X103394D02*
D03*
D15*
X93551Y9500D02*
D03*
X103000D02*
D03*
X113039D02*
D03*
X83512D02*
D03*
D16*
X106500Y31000D02*
Y41157D01*
X103394Y27894D02*
X106500Y31000D01*
X103394Y20228D02*
Y27894D01*
X43500Y52500D02*
X67500D01*
X25000Y34000D02*
X43500Y52500D01*
X25000Y32000D02*
Y34000D01*
Y32000D02*
X33000Y24000D01*
Y19500D02*
Y24000D01*
Y19500D02*
X42335Y10165D01*
X45945D01*
X92929Y20228D02*
Y25071D01*
X89500Y28500D02*
X92929Y25071D01*
X76500Y28500D02*
X89500D01*
X73500Y25500D02*
X76500Y28500D01*
X73500Y12500D02*
Y25500D01*
X71165Y10165D02*
X73500Y12500D01*
X64055Y10165D02*
X71165D01*
X26195Y13194D02*
X29305D01*
X40000Y2500D01*
X59500D01*
X64055Y7055D02*
Y10165D01*
X162500Y147500D02*
X165500Y144500D01*
X162500Y147500D02*
Y153000D01*
X25000Y195500D02*
Y204000D01*
X74100Y127500D02*
Y155800D01*
Y127500D02*
X78218Y123382D01*
X82800D02*
X83961D01*
X25000Y195500D02*
X34400D01*
X74100Y155800D01*
X78218Y123382D02*
X82800D01*
X80000Y117600D02*
X82800Y120400D01*
X80000Y55157D02*
Y117600D01*
X77343Y52500D02*
X80000Y55157D01*
X74500Y52500D02*
X77343D01*
X55000Y33000D02*
X74500Y52500D01*
X55000Y10165D02*
Y33000D01*
X189000Y163000D02*
Y182500D01*
Y163000D02*
X204000Y148000D01*
X144000Y120488D02*
Y123382D01*
X157744Y106744D02*
X171114D01*
X144000Y120488D02*
X157744Y106744D01*
X144000Y110000D02*
Y120488D01*
Y110000D02*
X166000Y88000D01*
X145500Y67500D02*
X166000Y88000D01*
X145500Y55000D02*
Y67500D01*
X55091Y154000D02*
Y165783D01*
X49100Y148009D02*
X55091Y154000D01*
X49100Y123900D02*
Y148009D01*
X65000Y78000D02*
Y108000D01*
Y55000D02*
Y78000D01*
Y55000D02*
X67500Y52500D01*
X144000Y147004D02*
X147800D01*
X150429Y149633D01*
Y166329D01*
X162500Y178400D01*
Y183000D01*
X128000Y65000D02*
X140500D01*
X85000Y108000D02*
X128000Y65000D01*
X36000Y94524D02*
Y109500D01*
X23000Y81524D02*
X36000Y94524D01*
X55000Y195500D02*
X84500D01*
X90400Y189600D01*
Y164500D02*
Y189600D01*
X88652Y162752D02*
X90400Y164500D01*
X83961Y162752D02*
X88652D01*
X153429Y159929D02*
X159900Y166400D01*
X153429Y143729D02*
Y159929D01*
X148830Y139130D02*
X153429Y143729D01*
X144000Y139130D02*
X148830D01*
X162456Y109744D02*
X168500D01*
X158800Y113400D02*
X162456Y109744D01*
X158800Y113400D02*
Y126956D01*
X154500Y131256D02*
X158800Y126956D01*
X144000Y131256D02*
X154500D01*
X60091Y178500D02*
X83961D01*
X55091Y183500D02*
X60091Y178500D01*
X49800Y198800D02*
X55000Y204000D01*
X49800Y188791D02*
Y198800D01*
Y188791D02*
X55091Y183500D01*
X134500Y181500D02*
X159000Y206000D01*
X134500Y174626D02*
Y181500D01*
Y174626D02*
X138500Y170626D01*
X144000D01*
X181000Y211000D02*
X204000Y188000D01*
X164000Y211000D02*
X181000D01*
X164000Y201000D02*
Y211000D01*
X157700Y194700D02*
X164000Y201000D01*
X157700Y180200D02*
Y194700D01*
X156000Y178500D02*
X157700Y180200D01*
X144000Y178500D02*
X156000D01*
X95000Y72342D02*
X106500Y60842D01*
X95000Y72342D02*
Y78000D01*
X59500Y2500D02*
X64000Y7000D01*
X64055Y7055D01*
X106500Y51000D02*
Y60842D01*
X204000Y129500D02*
X206000D01*
X201000Y126500D02*
X204000Y129500D01*
X189000Y126500D02*
X201000D01*
X171114Y106744D02*
X179500Y115130D01*
Y129500D01*
X181500Y131500D01*
X189000D01*
Y133000D01*
X204000Y148000D01*
X168500Y109744D02*
X175000Y116244D01*
Y138500D01*
X189000Y152500D01*
X165500Y114500D02*
X171000Y120000D01*
X169000Y206000D02*
X171000D01*
Y120000D02*
Y206000D01*
X49100Y123900D02*
X65000Y108000D01*
X82800Y120400D02*
Y123382D01*
D17*
X64500Y6500D02*
Y7500D01*
X65000Y9000D02*
X65500Y8500D01*
X23500Y12000D02*
X25000Y10500D01*
X64000Y6500D02*
Y7000D01*
Y9500D01*
D18*
X77343Y52500D02*
D03*
X67500D02*
D03*
X165500Y144500D02*
D03*
Y114500D02*
D03*
X136000Y88000D02*
D03*
X166000D02*
D03*
Y97500D02*
D03*
X136000D02*
D03*
X189000Y182500D02*
D03*
Y152500D02*
D03*
X206000Y99500D02*
D03*
Y129500D02*
D03*
X55000Y195500D02*
D03*
X25000D02*
D03*
X36000Y109500D02*
D03*
Y79500D02*
D03*
X49000Y80500D02*
D03*
Y110500D02*
D03*
X55000Y204000D02*
D03*
X25000D02*
D03*
X176000Y152500D02*
D03*
Y182500D02*
D03*
X162500Y153000D02*
D03*
Y183000D02*
D03*
X106500Y41157D02*
D03*
Y51000D02*
D03*
D19*
X185500Y55000D02*
D03*
X180500Y65000D02*
D03*
X175500Y55000D02*
D03*
X170500Y65000D02*
D03*
X165500Y55000D02*
D03*
X160500Y65000D02*
D03*
X155500Y55000D02*
D03*
X150500Y65000D02*
D03*
X140500D02*
D03*
X145500Y55000D02*
D03*
D20*
X25000Y12000D02*
D03*
Y32000D02*
D03*
D21*
X23000Y81524D02*
D03*
X95000Y108000D02*
D03*
X204000Y198000D02*
D03*
D22*
X23000Y109476D02*
D03*
X85000Y108000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X95000Y78000D02*
D03*
X85000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X159000Y206000D02*
D03*
X204000Y188000D02*
D03*
Y178000D02*
D03*
Y168000D02*
D03*
Y158000D02*
D03*
Y148000D02*
D03*
D23*
X189000Y121500D02*
D03*
Y126500D02*
D03*
D24*
Y131500D02*
D03*
D25*
X169000Y206000D02*
D03*
D26*
X55091Y183500D02*
D03*
X29500D02*
D03*
Y165784D02*
D03*
X55091D02*
D03*
Y136283D02*
D03*
X29500D02*
D03*
Y118567D02*
D03*
X55091D02*
D03*
D27*
X159900Y166400D02*
D03*
M02*

File diff suppressed because it is too large Load Diff

View File

@@ -1,81 +0,0 @@
G04 Layer_Color=8421504*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
%ADD10R,0.03937X0.09449*%
%ADD11R,0.12992X0.09449*%
%ADD12R,0.08858X0.03937*%
%ADD13R,0.08268X0.06299*%
%ADD14R,0.01575X0.05315*%
%ADD15R,0.07087X0.07480*%
D10*
X45945Y10165D02*
D03*
X55000D02*
D03*
X64055D02*
D03*
D11*
X55000Y33000D02*
D03*
D12*
X83961Y123382D02*
D03*
Y131256D02*
D03*
Y139130D02*
D03*
Y147004D02*
D03*
Y154878D02*
D03*
Y162752D02*
D03*
Y170626D02*
D03*
Y178500D02*
D03*
X144000D02*
D03*
Y170626D02*
D03*
Y162752D02*
D03*
Y154878D02*
D03*
Y147004D02*
D03*
Y139130D02*
D03*
Y131256D02*
D03*
Y123382D02*
D03*
D13*
X86169Y19736D02*
D03*
X110382D02*
D03*
D14*
X93158Y20228D02*
D03*
X95717D02*
D03*
X98276D02*
D03*
X100835D02*
D03*
X103394D02*
D03*
D15*
X93551Y9500D02*
D03*
X103000D02*
D03*
X113039D02*
D03*
X83512D02*
D03*
M02*

View File

@@ -1,243 +0,0 @@
G04 Layer_Color=8388736*
%FSLAX25Y25*%
%MOIN*%
G70*
G01*
G75*
%ADD37R,0.04737X0.10249*%
%ADD38R,0.13792X0.10249*%
%ADD39R,0.09658X0.04737*%
%ADD40R,0.09068X0.07099*%
%ADD41R,0.02375X0.06115*%
%ADD42R,0.07887X0.08280*%
%ADD43C,0.06312*%
%ADD44C,0.06800*%
%ADD45C,0.00800*%
%ADD46C,0.05524*%
%ADD47R,0.06706X0.06706*%
%ADD48C,0.06706*%
%ADD49O,0.08674X0.04737*%
%ADD50O,0.08674X0.04737*%
%ADD51R,0.06706X0.06706*%
%ADD52C,0.07887*%
%ADD53C,0.05800*%
D37*
X45945Y10165D02*
D03*
X55000D02*
D03*
X64055D02*
D03*
D38*
X55000Y33000D02*
D03*
D39*
X83961Y123382D02*
D03*
Y131256D02*
D03*
Y139130D02*
D03*
Y147004D02*
D03*
Y154878D02*
D03*
Y162752D02*
D03*
Y170626D02*
D03*
Y178500D02*
D03*
X144000D02*
D03*
Y170626D02*
D03*
Y162752D02*
D03*
Y154878D02*
D03*
Y147004D02*
D03*
Y139130D02*
D03*
Y131256D02*
D03*
Y123382D02*
D03*
D40*
X86169Y19736D02*
D03*
X110382D02*
D03*
D41*
X93158Y20228D02*
D03*
X95717D02*
D03*
X98276D02*
D03*
X100835D02*
D03*
X103394D02*
D03*
D42*
X93551Y9500D02*
D03*
X103000D02*
D03*
X113039D02*
D03*
X83512D02*
D03*
D43*
X77343Y52500D02*
D03*
X67500D02*
D03*
X165500Y144500D02*
D03*
Y114500D02*
D03*
X136000Y88000D02*
D03*
X166000D02*
D03*
Y97500D02*
D03*
X136000D02*
D03*
X189000Y182500D02*
D03*
Y152500D02*
D03*
X206000Y99500D02*
D03*
Y129500D02*
D03*
X55000Y195500D02*
D03*
X25000D02*
D03*
X36000Y109500D02*
D03*
Y79500D02*
D03*
X49000Y80500D02*
D03*
Y110500D02*
D03*
X55000Y204000D02*
D03*
X25000D02*
D03*
X176000Y152500D02*
D03*
Y182500D02*
D03*
X162500Y153000D02*
D03*
Y183000D02*
D03*
X106500Y41157D02*
D03*
Y51000D02*
D03*
D44*
X185500Y55000D02*
D03*
X180500Y65000D02*
D03*
X175500Y55000D02*
D03*
X170500Y65000D02*
D03*
X165500Y55000D02*
D03*
X160500Y65000D02*
D03*
X155500Y55000D02*
D03*
X150500Y65000D02*
D03*
X140500D02*
D03*
X145500Y55000D02*
D03*
D45*
X185500Y30000D02*
D03*
X140500D02*
D03*
D46*
X25000Y12000D02*
D03*
Y32000D02*
D03*
D47*
X23000Y81524D02*
D03*
X95000Y108000D02*
D03*
X204000Y198000D02*
D03*
D48*
X23000Y109476D02*
D03*
X85000Y108000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X95000Y78000D02*
D03*
X85000D02*
D03*
X75000D02*
D03*
X65000D02*
D03*
X159000Y206000D02*
D03*
X204000Y188000D02*
D03*
Y178000D02*
D03*
Y168000D02*
D03*
Y158000D02*
D03*
Y148000D02*
D03*
D49*
X189000Y121500D02*
D03*
Y126500D02*
D03*
D50*
Y131500D02*
D03*
D51*
X169000Y206000D02*
D03*
D52*
X55091Y183500D02*
D03*
X29500D02*
D03*
Y165784D02*
D03*
X55091D02*
D03*
Y136283D02*
D03*
X29500D02*
D03*
Y118567D02*
D03*
X55091D02*
D03*
D53*
X159900Y166400D02*
D03*
M02*

View File

@@ -1,2 +0,0 @@
Layer Pairs Export File for PCB: C:\Users\shaper\Downloads\AMSTOMQTT(FINAL)\AMSTOMQTT.PcbDoc
LayersSetName=Top_Bot_Thru_Holes|DrillFile=amstomqtt.txt|DrillLayers=gtl,gbl

View File

@@ -1,246 +0,0 @@
*************************************************************
FileName = AMSTOMQTT.GBR
AutoAperture = True
*************************************************************
Generating : Top Layer
File : AMSTOMQTT.GTL
Adding Layer : Top Layer
Adding Layer : Multi-Layer
Used DCodes :
D10
D11
D12
D13
D14
D15
D16
D17
D18
D19
D20
D21
D22
D23
D24
D25
D26
D27
*************************************************************
*************************************************************
Generating : Bottom Layer
File : AMSTOMQTT.GBL
Adding Layer : Bottom Layer
Adding Layer : Multi-Layer
Used DCodes :
D16
D18
D19
D20
D21
D22
D23
D24
D25
D26
D27
*************************************************************
*************************************************************
Generating : Bottom Pad Master
File : AMSTOMQTT.GPB
Adding Layer : Bottom Layer
Adding Layer : Multi-Layer
Used DCodes :
D18
D19
D20
D21
D22
D23
D24
D25
D26
*************************************************************
*************************************************************
Generating : Top Pad Master
File : AMSTOMQTT.GPT
Adding Layer : Top Layer
Adding Layer : Multi-Layer
Used DCodes :
D10
D11
D12
D13
D14
D15
D18
D19
D20
D21
D22
D23
D24
D25
D26
*************************************************************
*************************************************************
Generating : Top Overlay
File : AMSTOMQTT.GTO
Adding Layer : Top Overlay
Used DCodes :
D28
D29
D30
D31
D32
D33
D34
D35
D36
*************************************************************
*************************************************************
Generating : Top Paste
File : AMSTOMQTT.GTP
Adding Layer : Top Paste
Adding Layer : Top Layer
Adding Layer : Multi-Layer
Used DCodes :
D10
D11
D12
D13
D14
D15
*************************************************************
*************************************************************
Generating : Top Solder
File : AMSTOMQTT.GTS
Adding Layer : Top Solder
Adding Layer : Top Layer
Adding Layer : Multi-Layer
Used DCodes :
D37
D38
D39
D40
D41
D42
D43
D44
D45
D46
D47
D48
D49
D50
D51
D52
D53
*************************************************************
*************************************************************
Generating : Bottom Solder
File : AMSTOMQTT.GBS
Adding Layer : Bottom Solder
Adding Layer : Bottom Layer
Adding Layer : Multi-Layer
Used DCodes :
D43
D44
D45
D46
D47
D48
D49
D50
D51
D52
D53
*************************************************************
*************************************************************
Generating : Keep-Out Layer
File : AMSTOMQTT.GKO
Adding Layer : Keep-Out Layer
Used DCodes :
D32
*************************************************************
*************************************************************
Generating : Mechanical 1
File : AMSTOMQTT.GM1
Adding Layer : Mechanical 1
Used DCodes :
*************************************************************
*************************************************************
Generating : Mechanical 13
File : AMSTOMQTT.GM13
Adding Layer : Mechanical 13
Used DCodes :
D32
D54
D55
*************************************************************
*************************************************************
Generating : Mechanical 15
File : AMSTOMQTT.GM15
Adding Layer : Mechanical 15
Used DCodes :
D32
D54
D56
*************************************************************

Some files were not shown because too many files have changed in this diff Show More