From 4a9a4972da45a0986af2b5e307cde5e3ed631497 Mon Sep 17 00:00:00 2001 From: edgd1er <3601462+edgd1er@users.noreply.github.com> Date: Sat, 16 Sep 2023 08:07:57 +0200 Subject: [PATCH] lint + sonar + device aqara settings + clean --- .github/dependabot.yml | 2 +- .github/workflows/sonar.yml | 9 +- .gitignore | 3 + .hooks/install_hooks.sh | 25 - .hooks/post-merge | 59 - .hooks/pre-commit | 30 - .idea/Abeille.iml | 7 - .tools/create_branch.sh | 270 - .tools/gen_devices_list.php | 145 - .tools/git_merge_driver.txt | 28 - .tools/git_push.sh | 69 - .tools/save_changes.sh | 62 - .tools/set_git_config.sh | 11 - .tools/set_git_noproxy.sh | 4 - .tools/set_python3.sh | 6 - .tools/sync_all.sh | 44 - .tools/sync_changes.sh | 72 - .tools/update_changelog.sh | 104 - .tools/update_md5.sh | 62 - .../inf_batteryVoltAndPercent-285-300.json | 2 +- .../inf_zbAttr-0001-BatteryPercent.json | 4 +- .../sensor_magnet.aq2/sensor_magnet.aq2.json | 3 +- core/config/devices/weather/weather.json | 20 +- core/config/rucheCommand.json | 26 + core/scripts/powerCycleUsb.sh | 5 + desktop/modal/AbeilleNetwork.modal.php | 4 + resources/archives/AbeilleInterrogate.php | 39 - resources/archives/AbeilleLQI_List.php | 389 - resources/archives/AbeilleRoutes.ajax.php | 26 - resources/archives/AbeilleSupport.php | 340 - resources/archives/CheckAlive.php | 65 - resources/archives/CheckBattery.php | 141 - resources/archives/HueCatalogue.json | 122 - ...uster IAS Zone & Diagnostics Only_ZHA.xml | 81 - resources/archives/LqiStorage.php | 123 - resources/archives/NetworkDefinition.php | 161 - resources/archives/RadioTraffic.php | 187 - resources/archives/RadioTrafficMap.php | 147 - resources/archives/RadioVoisines.php | 166 - resources/archives/RadioVoisinesMap.php | 145 - resources/archives/RouteRecord.json | 7526 ----------------- resources/archives/RouteRecord.php | 108 - .../ReadJN5168/EEPROMRead1OnlyFlashed.bin | Bin 4032 -> 0 bytes .../ReadJN5168/EEPROMRead2BootGetVersion.bin | Bin 4032 -> 0 bytes .../ReadJN5168/EEPROMRead3SetMask17.bin | Bin 4032 -> 0 bytes .../ReadJN5168/EEPROMRead4SetMask23.bin | Bin 4032 -> 0 bytes ...SetMask24StartNetworkAddXiaomiTempRond.bin | Bin 4032 -> 0 bytes .../EEPROMRead6ProductionJeedomZwave.bin | Bin 4032 -> 0 bytes .../Zigate_Module/ReadJN5168/read.php | 69 - .../archives/addParameterToAllTemplates.php | 73 - .../class/AbeilleCmdPrepareTest.class.php | 41 - .../class/AbeilleCmdProcessTest.class.php | 101 - .../core/class/AbeilleCmdTest.class.php | 23 - .../core/class/AbeilleParserTest.class.php | 125 - .../core/class/AbeilleParserTestDB.class.php | 93 - .../core/class/AbeilleTemplateCmd.class.php | 137 - .../class/AbeilleTemplateCommon.class.php | 98 - .../core/class/AbeilleTemplateEq.class.php | 155 - .../archives/core/class/AbeilleTest.class.php | 30 - .../core/class/AbeilleTestDB.class.php | 74 - .../core/config/commands/Identify.json | 13 - .../archives/core/config/commands/Lift.json | 20 - .../config/commands/LivoloSwitchTrick1.json | 19 - .../config/commands/LivoloSwitchTrick2.json | 16 - .../config/commands/LivoloSwitchTrick3.json | 16 - .../config/commands/LivoloSwitchTrick4.json | 16 - .../commands/PuissanceCurrentPrise.json | 21 - .../commands/PuissanceVoltagePrise.json | 21 - .../archives/core/config/commands/Tilt.json | 15 - .../core/config/commands/Xiaomi-ff01.json | 16 - .../act_tuyaEF00-Set-Setpoint-Mult.json | 16 - .../commands/act_tuyaEF00-Set-Setpoint.json | 15 - .../act_tuyaEF00-SetThermostatMode.json | 12 - .../commands/act_zbConfigureReporting.json | 13 - .../danfossTemperatureConsigneGet.json | 16 - .../danfossTemperatureConsigneValue.json | 17 - .../config/commands/inf_time-Timestamp.json | 12 - .../commands/inf_zbAttr-0000-SWBuildID.json | 11 - .../core/config/commands/levelVolet.json | 21 - .../commands/moveToLiftAndTiltBSO_Lift.json | 17 - .../commands/moveToLiftAndTiltBSO_Tilt.json | 17 - .../core/config/commands/offGroup.json | 17 - .../config/commands/offGroupBroadcast.json | 17 - .../core/config/commands/offVolet.json | 15 - .../core/config/commands/onGroup.json | 17 - .../config/commands/onGroupBroadcast.json | 17 - .../core/config/commands/onVolet.json | 15 - .../commands/poll-0B04-0505-0508-050B.json | 19 - .../commands/setReportLightColorSpectre.json | 16 - .../commands/setReportPuissanceLegrand.json | 15 - .../commands/spiritBatterie-Pourcent.json | 21 - .../config/commands/spiritTemperature.json | 19 - .../core/config/commands/spiritUnknown1.json | 19 - .../core/config/commands/spiritUnknown2.json | 19 - .../config/commands/temperatureLight.json | 21 - .../config/commands/temperatureLight1.json | 20 - .../config/commands/temperatureLight2.json | 20 - .../config/commands/temperatureLightV2.json | 18 - .../core/config/commands/testSmoke.json | 13 - .../core/config/commands/toggleGroup.json | 18 - .../core/config/commands/zb-CustomInfo.json | 9 - .../archives/core/config/setAffichage.php | 174 - resources/archives/core/php/AbeilleTest.php | 549 -- .../core/scripts/installPiGpio.abeille.php | 55 - .../archives/core/scripts/installPiGpio.sh | 29 - .../archives/core/scripts/installSocat.sh | 29 - .../archives/core/scripts/installWiringPi.sh | 50 - .../core/scripts/updateFirmwareDIN.sh | 103 - resources/archives/desktop/Abeille-Js.php | 830 -- .../desktop/AbeilleEq-Advanced-Common.php | 76 - .../desktop/AbeilleEq-Advanced-Device.php | 188 - .../AbeilleEq-Advanced-Interrogations.php | 357 - .../desktop/AbeilleEq-Advanced-Specific.php | 130 - .../desktop/AbeilleEq-Advanced-Zigate.php | 230 - .../archives/desktop/AbeilleEq-Advanced.php | 155 - resources/archives/desktop/AbeilleEq-Cmds.php | 38 - .../archives/desktop/AbeilleEq-Js-Cmds.php | 191 - resources/archives/desktop/AbeilleEq-Js.php | 804 -- .../desktop/AbeilleEq-Main-Generic.php | 113 - .../archives/desktop/AbeilleEq-Main-Icon.php | 67 - .../desktop/AbeilleEq-Main-Others.php | 40 - resources/archives/desktop/AbeilleEq-Main.php | 18 - resources/archives/desktop/AbeilleEq.php | 117 - resources/archives/desktop/health.js | 5 - .../desktop/modal/installPiGpio.abeille.php | 55 - .../desktop/modal/installSocat.abeille.php | 56 - .../desktop/modal/installWiringPi.abeille.php | 55 - resources/archives/docs/fr_FR/Changelog.rst | 3285 ------- resources/archives/essai.json | 92 - resources/archives/fw_DIY/DIYRuZRT.zip | Bin 213434 -> 0 bytes resources/archives/inconnu.php | 33 - resources/archives/modelesPage.php | 152 - .../prog_jennic/JennicModuleProgrammerRPI3 | Bin 24016 -> 0 bytes .../resources/prog_jennic-0.7/README.md | 11 - .../resources/prog_jennic-0.7/README.txt | 13 - .../build/FlashProgrammerExtension_JN5168.bin | Bin 2486 -> 0 bytes .../resources/prog_jennic-0.7/build/Makefile | 68 - .../prog_jennic-0.7/build/version.txt | 1 - .../resources/prog_jennic-0.7/source/ChipID.h | 126 - .../prog_jennic-0.7/source/Firmware.c | 287 - .../prog_jennic-0.7/source/Firmware.h | 138 - .../FlashProgrammerExtension_JN5168.bin.h | 210 - .../source/JN51xx_BootLoader.c | 1656 ---- .../source/JN51xx_BootLoader.h | 125 - .../resources/prog_jennic-0.7/source/common.h | 109 - .../resources/prog_jennic-0.7/source/dbg.h | 271 - .../resources/prog_jennic-0.7/source/main.c | 342 - .../resources/prog_jennic-0.7/source/uart.c | 523 -- .../resources/prog_jennic-0.7/source/uart.h | 98 - resources/archives/upload.php | 56 - resources/archives/usbreset/README.txt | 19 - resources/archives/usbreset/makefile | 24 - resources/archives/usbreset/usbreset.c | 40 - resources/archives/verification.php | 3 - resources/archives/verification.sh | 153 - resources/archives/xmlhttpConfChange.php | 14 - resources/archives/xmlhttpMQTTSend.php | 52 - 157 files changed, 69 insertions(+), 24892 deletions(-) delete mode 100755 .hooks/install_hooks.sh delete mode 100755 .hooks/post-merge delete mode 100755 .hooks/pre-commit delete mode 100755 .idea/Abeille.iml delete mode 100755 .tools/create_branch.sh delete mode 100644 .tools/gen_devices_list.php delete mode 100644 .tools/git_merge_driver.txt delete mode 100755 .tools/git_push.sh delete mode 100644 .tools/save_changes.sh delete mode 100644 .tools/set_git_config.sh delete mode 100644 .tools/set_git_noproxy.sh delete mode 100644 .tools/set_python3.sh delete mode 100644 .tools/sync_all.sh delete mode 100644 .tools/sync_changes.sh delete mode 100644 .tools/update_changelog.sh delete mode 100755 .tools/update_md5.sh delete mode 100644 resources/archives/AbeilleInterrogate.php delete mode 100644 resources/archives/AbeilleLQI_List.php delete mode 100644 resources/archives/AbeilleRoutes.ajax.php delete mode 100644 resources/archives/AbeilleSupport.php delete mode 100644 resources/archives/CheckAlive.php delete mode 100644 resources/archives/CheckBattery.php delete mode 100644 resources/archives/HueCatalogue.json delete mode 100644 resources/archives/IAS ACE Cluster IAS Zone & Diagnostics Only_ZHA.xml delete mode 100644 resources/archives/LqiStorage.php delete mode 100644 resources/archives/NetworkDefinition.php delete mode 100644 resources/archives/RadioTraffic.php delete mode 100644 resources/archives/RadioTrafficMap.php delete mode 100644 resources/archives/RadioVoisines.php delete mode 100644 resources/archives/RadioVoisinesMap.php delete mode 100644 resources/archives/RouteRecord.json delete mode 100644 resources/archives/RouteRecord.php delete mode 100644 resources/archives/Zigate_Module/ReadJN5168/EEPROMRead1OnlyFlashed.bin delete mode 100644 resources/archives/Zigate_Module/ReadJN5168/EEPROMRead2BootGetVersion.bin delete mode 100644 resources/archives/Zigate_Module/ReadJN5168/EEPROMRead3SetMask17.bin delete mode 100644 resources/archives/Zigate_Module/ReadJN5168/EEPROMRead4SetMask23.bin delete mode 100644 resources/archives/Zigate_Module/ReadJN5168/EEPROMRead5SetMask24StartNetworkAddXiaomiTempRond.bin delete mode 100644 resources/archives/Zigate_Module/ReadJN5168/EEPROMRead6ProductionJeedomZwave.bin delete mode 100644 resources/archives/Zigate_Module/ReadJN5168/read.php delete mode 100644 resources/archives/addParameterToAllTemplates.php delete mode 100644 resources/archives/core/class/AbeilleCmdPrepareTest.class.php delete mode 100644 resources/archives/core/class/AbeilleCmdProcessTest.class.php delete mode 100644 resources/archives/core/class/AbeilleCmdTest.class.php delete mode 100644 resources/archives/core/class/AbeilleParserTest.class.php delete mode 100644 resources/archives/core/class/AbeilleParserTestDB.class.php delete mode 100644 resources/archives/core/class/AbeilleTemplateCmd.class.php delete mode 100644 resources/archives/core/class/AbeilleTemplateCommon.class.php delete mode 100644 resources/archives/core/class/AbeilleTemplateEq.class.php delete mode 100644 resources/archives/core/class/AbeilleTest.class.php delete mode 100644 resources/archives/core/class/AbeilleTestDB.class.php delete mode 100644 resources/archives/core/config/commands/Identify.json delete mode 100644 resources/archives/core/config/commands/Lift.json delete mode 100644 resources/archives/core/config/commands/LivoloSwitchTrick1.json delete mode 100644 resources/archives/core/config/commands/LivoloSwitchTrick2.json delete mode 100644 resources/archives/core/config/commands/LivoloSwitchTrick3.json delete mode 100644 resources/archives/core/config/commands/LivoloSwitchTrick4.json delete mode 100644 resources/archives/core/config/commands/PuissanceCurrentPrise.json delete mode 100644 resources/archives/core/config/commands/PuissanceVoltagePrise.json delete mode 100644 resources/archives/core/config/commands/Tilt.json delete mode 100644 resources/archives/core/config/commands/Xiaomi-ff01.json delete mode 100644 resources/archives/core/config/commands/act_tuyaEF00-Set-Setpoint-Mult.json delete mode 100644 resources/archives/core/config/commands/act_tuyaEF00-Set-Setpoint.json delete mode 100644 resources/archives/core/config/commands/act_tuyaEF00-SetThermostatMode.json delete mode 100644 resources/archives/core/config/commands/act_zbConfigureReporting.json delete mode 100644 resources/archives/core/config/commands/danfossTemperatureConsigneGet.json delete mode 100644 resources/archives/core/config/commands/danfossTemperatureConsigneValue.json delete mode 100644 resources/archives/core/config/commands/inf_time-Timestamp.json delete mode 100644 resources/archives/core/config/commands/inf_zbAttr-0000-SWBuildID.json delete mode 100644 resources/archives/core/config/commands/levelVolet.json delete mode 100644 resources/archives/core/config/commands/moveToLiftAndTiltBSO_Lift.json delete mode 100644 resources/archives/core/config/commands/moveToLiftAndTiltBSO_Tilt.json delete mode 100644 resources/archives/core/config/commands/offGroup.json delete mode 100644 resources/archives/core/config/commands/offGroupBroadcast.json delete mode 100644 resources/archives/core/config/commands/offVolet.json delete mode 100644 resources/archives/core/config/commands/onGroup.json delete mode 100644 resources/archives/core/config/commands/onGroupBroadcast.json delete mode 100644 resources/archives/core/config/commands/onVolet.json delete mode 100644 resources/archives/core/config/commands/poll-0B04-0505-0508-050B.json delete mode 100644 resources/archives/core/config/commands/setReportLightColorSpectre.json delete mode 100644 resources/archives/core/config/commands/setReportPuissanceLegrand.json delete mode 100644 resources/archives/core/config/commands/spiritBatterie-Pourcent.json delete mode 100644 resources/archives/core/config/commands/spiritTemperature.json delete mode 100644 resources/archives/core/config/commands/spiritUnknown1.json delete mode 100644 resources/archives/core/config/commands/spiritUnknown2.json delete mode 100644 resources/archives/core/config/commands/temperatureLight.json delete mode 100644 resources/archives/core/config/commands/temperatureLight1.json delete mode 100644 resources/archives/core/config/commands/temperatureLight2.json delete mode 100644 resources/archives/core/config/commands/temperatureLightV2.json delete mode 100644 resources/archives/core/config/commands/testSmoke.json delete mode 100644 resources/archives/core/config/commands/toggleGroup.json delete mode 100644 resources/archives/core/config/commands/zb-CustomInfo.json delete mode 100644 resources/archives/core/config/setAffichage.php delete mode 100644 resources/archives/core/php/AbeilleTest.php delete mode 100644 resources/archives/core/scripts/installPiGpio.abeille.php delete mode 100644 resources/archives/core/scripts/installPiGpio.sh delete mode 100644 resources/archives/core/scripts/installSocat.sh delete mode 100644 resources/archives/core/scripts/installWiringPi.sh delete mode 100644 resources/archives/core/scripts/updateFirmwareDIN.sh delete mode 100644 resources/archives/desktop/Abeille-Js.php delete mode 100644 resources/archives/desktop/AbeilleEq-Advanced-Common.php delete mode 100644 resources/archives/desktop/AbeilleEq-Advanced-Device.php delete mode 100644 resources/archives/desktop/AbeilleEq-Advanced-Interrogations.php delete mode 100644 resources/archives/desktop/AbeilleEq-Advanced-Specific.php delete mode 100644 resources/archives/desktop/AbeilleEq-Advanced-Zigate.php delete mode 100644 resources/archives/desktop/AbeilleEq-Advanced.php delete mode 100644 resources/archives/desktop/AbeilleEq-Cmds.php delete mode 100644 resources/archives/desktop/AbeilleEq-Js-Cmds.php delete mode 100644 resources/archives/desktop/AbeilleEq-Js.php delete mode 100644 resources/archives/desktop/AbeilleEq-Main-Generic.php delete mode 100644 resources/archives/desktop/AbeilleEq-Main-Icon.php delete mode 100644 resources/archives/desktop/AbeilleEq-Main-Others.php delete mode 100644 resources/archives/desktop/AbeilleEq-Main.php delete mode 100644 resources/archives/desktop/AbeilleEq.php delete mode 100644 resources/archives/desktop/health.js delete mode 100644 resources/archives/desktop/modal/installPiGpio.abeille.php delete mode 100644 resources/archives/desktop/modal/installSocat.abeille.php delete mode 100644 resources/archives/desktop/modal/installWiringPi.abeille.php delete mode 100644 resources/archives/docs/fr_FR/Changelog.rst delete mode 100644 resources/archives/essai.json delete mode 100644 resources/archives/fw_DIY/DIYRuZRT.zip delete mode 100644 resources/archives/inconnu.php delete mode 100644 resources/archives/modelesPage.php delete mode 100644 resources/archives/prog_jennic/JennicModuleProgrammerRPI3 delete mode 100644 resources/archives/resources/prog_jennic-0.7/README.md delete mode 100644 resources/archives/resources/prog_jennic-0.7/README.txt delete mode 100644 resources/archives/resources/prog_jennic-0.7/build/FlashProgrammerExtension_JN5168.bin delete mode 100644 resources/archives/resources/prog_jennic-0.7/build/Makefile delete mode 100644 resources/archives/resources/prog_jennic-0.7/build/version.txt delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/ChipID.h delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/Firmware.c delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/Firmware.h delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/FlashProgrammerExtension_JN5168.bin.h delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/JN51xx_BootLoader.c delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/JN51xx_BootLoader.h delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/common.h delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/dbg.h delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/main.c delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/uart.c delete mode 100644 resources/archives/resources/prog_jennic-0.7/source/uart.h delete mode 100644 resources/archives/upload.php delete mode 100644 resources/archives/usbreset/README.txt delete mode 100644 resources/archives/usbreset/makefile delete mode 100644 resources/archives/usbreset/usbreset.c delete mode 100644 resources/archives/verification.php delete mode 100644 resources/archives/verification.sh delete mode 100644 resources/archives/xmlhttpConfChange.php delete mode 100644 resources/archives/xmlhttpMQTTSend.php diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5aef52bfcc..55ffe9f89c 100755 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,4 +4,4 @@ updates: - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "daily" \ No newline at end of file + interval: "weekly" \ No newline at end of file diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 41c3439ecf..a0fdd62c4e 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -25,7 +25,11 @@ jobs: # Disabling shallow clone is recommended for improving relevancy of reporting with: fetch-depth: 0 - + - name: phplint + uses: michaelw90/PHP-Lint@master + - uses: actions/setup-node@v3 + with: + node-version: 16 - name: SonarCloud Scan uses: SonarSource/sonarcloud-github-action@master env: @@ -44,3 +48,6 @@ jobs: -Dsonar.projectKey=edgd1er_Abeille -Dsonar.verbose=true -Dsonar.exclusions='images/,.git/**,.idea/**,.github/**,.scannerwork/**' + -Dsonar.c.file.suffixes=- + -Dsonar.cpp.file.suffixes=- + -Dsonar.objc.file.suffixes=- diff --git a/.gitignore b/.gitignore index 361ca80ca7..3eb17e57f1 100755 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff: +.idea/* .idea/**/workspace.xml .idea/**/tasks.xml .idea/dictionaries @@ -64,3 +65,5 @@ AbeilleLQI_MapDataAbeille5.json.lock .settings/org.eclipse.wst.common.project.facet.core.xml .DS_Store + +resources/archives/ diff --git a/.hooks/install_hooks.sh b/.hooks/install_hooks.sh deleted file mode 100755 index 6e6fc73c67..0000000000 --- a/.hooks/install_hooks.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# Hooks installation and update script - -echo "Hooks: installation & mise-à-jour" - -# Updating hooks if required -HOOKS=`ls .hooks/*` -for F in ${HOOKS} -do - FILE_NAME=$(basename $F) - if [ "${FILE_NAME}" == "install_hooks.sh" ]; then - continue - fi - - # Updating only new/changes hooks - cmp .hooks/${FILE_NAME} .git/hooks/${FILE_NAME} >/dev/null 2>&1 - if [ $? != 0 ]; then - echo "- mise-à-jour de ${FILE_NAME}" - cp .hooks/${FILE_NAME} .git/hooks - fi -done -echo "= OK" - -exit 0 diff --git a/.hooks/post-merge b/.hooks/post-merge deleted file mode 100755 index 2443ffb6c5..0000000000 --- a/.hooks/post-merge +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/sh - -# This hook is called when a 'git pull' is done on local repository - -# It does the following -# - Update GIT hooks from '.hooks' (versioned files) to '.git/hooks' (local files). -# - Currently disabled: Update Abeille version from last commit date - -# Updating hooks if required -.hooks/install_hooks.sh - -exit 0 -# Rest is currently disabled - -# Updating Abeille version -CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD` # Current branch -LAST_COMMIT_SHORT=`git rev-parse --short HEAD` # Last commit -LAST_COMMIT_DATE=`git show -s --format=%cd --date=format:"%Y-%m-%d @%H:%M:%S" ${LAST_COMMIT_SHORT}` # YYYY-MM-DD @HH:mm:ss -LAST_COMMIT_DATE_SHORT=`git show -s --format=%cd --date=short ${LAST_COMMIT_SHORT}` # YYYY-MM-DD -LAST_TAG=`git tag --contains ${LAST_COMMIT_SHORT}` # Tag of the last commmit if any - -# Note: If on a detached branch when doing push, CURRENT_BRANCH is empty. - -if [ "${CURRENT_BRANCH}" = "stable" ]; then - VERSION="${CURRENT_BRANCH}, ${LAST_COMMIT_DATE_SHORT}" -else - VERSION="${CURRENT_BRANCH}, ${LAST_COMMIT_DATE}, ${LAST_COMMIT_SHORT}" -fi - -echo "Mise-à-jour de la version d'Abeille: ${VERSION}" -echo "${VERSION}" > plugin_info/AbeilleVersion.inc - -# Add then commit 'AbeilleVersion.inc' -git add plugin_info/AbeilleVersion.inc -git commit -m "Version update with last commit (${LAST_COMMIT_SHORT})" - -# Updating Abeille version -CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD` # Current branch -LAST_COMMIT_SHORT=`git rev-parse --short HEAD` # Last commit -LAST_COMMIT_DATE=`git show -s --format=%cd --date=format:"%Y-%m-%d @%H:%M:%S" ${LAST_COMMIT_SHORT}` # YYYY-MM-DD @HH:mm:ss -LAST_COMMIT_DATE_SHORT=`git show -s --format=%cd --date=short ${LAST_COMMIT_SHORT}` # YYYY-MM-DD -LAST_TAG=`git tag --contains ${LAST_COMMIT_SHORT}` # Tag of the last commmit if any - -# Note: If on a detached branch when doing push, CURRENT_BRANCH is empty. - -if [ "${CURRENT_BRANCH}" = "stable" ]; then - VERSION="${CURRENT_BRANCH}, ${LAST_COMMIT_DATE_SHORT}" -else - VERSION="${CURRENT_BRANCH}, ${LAST_COMMIT_DATE}, ${LAST_COMMIT_SHORT}" -fi - -echo "Mise-à-jour de la version d'Abeille: ${VERSION}" -echo "${VERSION}" > plugin_info/AbeilleVersion.inc - -# Add then commit 'AbeilleVersion.inc' -git add plugin_info/AbeilleVersion.inc -git commit -m "Version update with last commit (${LAST_COMMIT_SHORT})" - -exit 0 diff --git a/.hooks/pre-commit b/.hooks/pre-commit deleted file mode 100755 index 3f68ec7c2b..0000000000 --- a/.hooks/pre-commit +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh -# This hook is called when a 'git commit' is done on local repository - -# It does the following -# - Update Abeille version file - -# Updating Abeille version -CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD` # Current branch -# LAST_COMMIT_SHORT=`git rev-parse --short HEAD` # Last commit -# LAST_COMMIT_DATE=`git show -s --format=%cd --date=format:"%Y-%m-%d %H:%M:%S" ${LAST_COMMIT_SHORT}` # YYYY-MM-DD @HH:mm:ss -# LAST_COMMIT_DATE_SHORT=`git show -s --format=%cd --date=short ${LAST_COMMIT_SHORT}` # YYYY-MM-DD -# LAST_TAG=`git tag --contains ${LAST_COMMIT_SHORT}` # Tag of the last commmit if any -DATE=`date +"%Y-%m-%d %H:%M:%S"` - -# Note: If on a detached branch when doing push, CURRENT_BRANCH is empty. - -# Note: We could put a different version according to branch name -if [ "${CURRENT_BRANCH}" = "stable" ]; then - VERSION="${CURRENT_BRANCH}, ${DATE}" -else - VERSION="${CURRENT_BRANCH}, ${DATE}" -fi - -echo "Mise-à-jour de la version d'Abeille: ${VERSION}" -echo "${VERSION}" > plugin_info/AbeilleVersion.inc - -# Add 'AbeilleVersion.inc' to current commit. -git add plugin_info/AbeilleVersion.inc - -exit 0 diff --git a/.idea/Abeille.iml b/.idea/Abeille.iml deleted file mode 100755 index 41546977b9..0000000000 --- a/.idea/Abeille.iml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.tools/create_branch.sh b/.tools/create_branch.sh deleted file mode 100755 index 4196f58b37..0000000000 --- a/.tools/create_branch.sh +++ /dev/null @@ -1,270 +0,0 @@ -#!/bin/bash -# 'beta'/'stable' version generation & push script - -# How to -# Create 'beta' version from 'master' -# .tools/create_branch.sh beta -# Create 'stable' version from 'beta' -# .tools/create_branch.sh stable - -echo "***" -echo "*** Abeille's beta/stable branch creation script" -echo "***" -echo - -TARG_REPO='origin' -TARG_BRANCH='' -FORCE=0 # Force creation from branch != 'master' & 'beta' - -# Usage: create_branch.sh [-f] [target_branch] -# where -f = force creation from current branch (not master or beta) -# target_branch = 'beta' or 'stable' -if [ $# -gt 0 ]; then - echo "Checking arguments" - while (( "$#" )); do - case "$1" in - -f) - FORCE=1 - echo "- Info: 'forced' source" - shift - ;; - -h) - echo - echo "Usage: create_branch.sh [-f] "; - echo "where"; - echo " -f : force branch creation even if not from master or beta" - echo " target: 'beta' or 'stable'" - echo - exit 0 - ;; - beta) - TARG_BRANCH=$1 - shift - ;; - stable) - TARG_BRANCH=$1 - shift - ;; - *) # unknown option - echo "= ERROR: Only 'beta' or 'master' accepted as argument" - exit 1 - ;; - esac - done -fi - -# Check repo status -# - Ensure that local branch is 'master' (to beta) or 'beta' (to stable) -# - Force a "git pull ff" to be sure local branch is aligned on remote one. -# - Stops if any uncommitted local modifs -echo "Checking current branch & status" -CUR_BRANCH=`git rev-parse --abbrev-ref HEAD` -if [ ${FORCE} -eq 0 ] && [ "${CUR_BRANCH}" != "master" ] && [ "${CUR_BRANCH}" != "beta" ]; then - echo "= ERROR: Current branch must be either 'master' or 'beta'" - exit 10 -fi -git diff-index --quiet HEAD >/dev/null -if [ $? -ne 0 ]; then - echo "= ERROR: Uncommitted local modifications found" - exit 11 -fi -git pull -q --ff-only >/dev/null -if [ $? -ne 0 ]; then - echo "= ERROR: You must do a git pull first to align your local branch with remote one." - exit 12 -fi - -# If TARG_BRANCH is undefined, let's gess -if [ "${TARG_BRANCH}" == "" ]; then - if [ "${CUR_BRANCH}" == "master" ]; then - TARG_BRANCH='beta' - elif [ "${CUR_BRANCH}" == "beta" ]; then - TARG_BRANCH='stable' - else - echo "= ERROR: Missing argument to guess target branch" - exit 13 - fi -fi - -# -# Ok, everything seems ready to create a beta or stable branch -# - -# Final check with user before starting if unusual config -if [ "${CUR_BRANCH}" != "master" ] && [ "${CUR_BRANCH}" != "beta" ]; then - echo - echo " *** !! WARNING !!" - echo " *** This is an unexpected config." - echo " *** You are going to create a '${TARG_BRANCH}' version from '${CUR_BRANCH}'." - echo " *** Are you sure you want to do that ?" - read -p " *** Enter y/n: " ANSWER - if [ "${ANSWER}" != "y" ]; then - echo "= Canceling branch creation" - exit 0 - fi - echo -else - echo " *** You are going to create a '${TARG_BRANCH}' version from '${CUR_BRANCH}'." - echo " *** Are you sure you want to do that ?" - read -p " *** Enter y/n: " ANSWER - if [ "${ANSWER}" != "y" ]; then - echo "= Canceling branch creation" - exit 0 - fi - echo -fi - -# -# On current branch let's do -# - version update -# - MD5 update -# - changelog: add VERSION if required -# - add+commit, then tag + push - -# Updating plugin version -.tools/update_version.sh ${TARG_BRANCH} -if [ $? -ne 0 ]; then - echo "= ERROR" - exit 20 -fi - -# Update changelog if required & target is 'stable' -.tools/update_changelog.sh -if [ $? -ne 0 ]; then - echo "= ERROR" - exit 22 -fi - -# Updating MD5 file -.tools/update_md5.sh -if [ $? -ne 0 ]; then - echo "= ERROR" - exit 21 -fi - -# Add+commit -# Note about changelog: should be pushed to AbeilleDoc too & html generated. -echo "Adding 'Abeille.version', 'info.json', 'Abeille.md5' & 'Changelog.md'" -git add plugin_info/Abeille.version plugin_info/info.json plugin_info/Abeille.md5 docs/fr_FR/Changelog.md -if [ $? -ne 0 ]; then - echo "= ERROR: git add failed" - exit 23 -fi - -VERSION=`cat plugin_info/Abeille.version | tail -1` -echo "Committing" -if [ "${TARG_BRANCH}" == "beta" ]; then - git commit -q -m "Beta ${VERSION}" -else - git commit -q -m "Stable ${VERSION}" -fi -if [ $? -ne 0 ]; then - echo "= ERROR: Commit failed" - exit 24 -fi - -git tag -a "${VERSION}" -m "Version ${VERSION}" >/dev/null -if [ $? -ne 0 ]; then - echo "= ERROR: Tag failed" - exit 25 -fi -git push -q ${TARG_REPO} HEAD ${VERSION} -if [ $? -ne 0 ]; then - echo "= ERROR: git push failed" - exit 26 -fi - - -# Create local temporary branch & switch to it -# Note: Local branch deleted if already exists -TODAY=`date +"%y%m%d"` -LOCAL_BRANCH="${TARG_BRANCH}-temp-${TODAY}" -git show-ref refs/heads/${LOCAL_BRANCH} >/dev/null -if [ $? -eq 0 ]; then - # Note: -D to force delete - echo "Deleting temp '${LOCAL_BRANCH}' branch" - git branch -D ${LOCAL_BRANCH} >/dev/null - if [ $? -ne 0 ]; then - echo "= ERROR" - exit 30 - fi -fi -echo "Switching to ${LOCAL_BRANCH}" -git checkout -q -b ${LOCAL_BRANCH} -if [ $? -ne 0 ]; then - echo "= ERROR" - exit 31 -fi - -# Before creating new 'stable' branch removing items not required -# for Jeedom. Not required for 'master' to 'beta'. -if [ "${TARG_BRANCH}" == "stable" ]; then - echo "Cleaning ${LOCAL_BRANCH}" - IGNORE="core/config/ignore_on_push.txt" - COMMIT_REQUIRED=0 - while IFS= read -r L - do - if [[ ${L} == "#"* ]]; then - continue # Comment - fi - if [ ! -e "${L}" ]; then - echo "= WARNING: ${L} NOT FOUND" - continue - fi - - git rm -rf ${L} 2>/dev/null - if [ $? -ne 0 ]; then - # The file probably no longer exists - continue - fi - - COMMIT_REQUIRED=1 - done <<< `cat ${IGNORE}` - if [ ${COMMIT_REQUIRED} -eq 1 ]; then - git add -u >/dev/null - git commit -q -m "${VERSION} cleanup" - if [ $? -ne 0 ]; then - echo "= ERROR: Commit failed" - echo "= cmd='git commit -q -m \"${VERSION} cleanup\"'" - exit 32 - fi - fi -fi - -# Delete target branch (origin/beta) & push new one -#REM=`git branch -a | grep remotes/${TARG_REPO}/${TARG_BRANCH}` -REM=`git ls-remote ${TARG_REPO} ${TARG_BRANCH}` -#if [ $? -eq 0 ]; then -if [ "${REM}" != "" ]; then - echo "Deleting ${TARG_REPO}/${TARG_BRANCH} branch" - git push -q ${TARG_REPO} --delete ${TARG_BRANCH} - if [ $? -ne 0 ]; then - echo "= ERROR: git push failed" - echo "= cmd='git push -q ${TARG_REPO} --delete ${TARG_BRANCH}'" - echo "= then cmd 'git push --force -q ${TARG_REPO} ${LOCAL_BRANCH}:${TARG_BRANCH}'" - echo "= then cmd 'git checkout -q ${CUR_BRANCH}'" - exit 33 - fi -fi - -# Pushing branch -echo "Creating ${TARG_REPO}/${TARG_BRANCH} branch" -git push --force -q ${TARG_REPO} ${LOCAL_BRANCH}:${TARG_BRANCH} -if [ $? -ne 0 ]; then - echo "= ERROR: git push failed" - echo "= cmd='git push --force -q ${TARG_REPO} ${LOCAL_BRANCH}:${TARG_BRANCH}'" - echo "= then cmd 'git checkout -q ${CUR_BRANCH}'" - exit 34 -fi - -echo "Switching back to '${CUR_BRANCH}' branch" -git checkout -q ${CUR_BRANCH} -if [ $? -ne 0 ]; then - echo "= ERROR: git checkout failed" - echo "= cmd='git checkout -q ${CUR_BRANCH}'" - exit 35 -else - echo "= Ok" -fi - -exit 0 diff --git a/.tools/gen_devices_list.php b/.tools/gen_devices_list.php deleted file mode 100644 index b834ce8ce5..0000000000 --- a/.tools/gen_devices_list.php +++ /dev/null @@ -1,145 +0,0 @@ - $dirEntry, - 'jsonLocation' => $from - ); - - /* Check if config is compliant with other device identification */ - $content = file_get_contents($fullPath); - $devConf = json_decode($content, true); - $devConf = $devConf[$dirEntry]; // Removing top key - $dev['manufacturer'] = isset($devConf['manufacturer']) ? $devConf['manufacturer'] : ''; - $dev['model'] = isset($devConf['model']) ? $devConf['model']: ''; - $dev['type'] = $devConf['type']; - $dev['icon'] = $devConf['configuration']['icon']; - $devicesList[$dirEntry] = $dev; - - if (isset($devConf['alternateIds'])) { - $idList = explode(',', $devConf['alternateIds']); - foreach ($idList as $id) { - echo("getDevicesList(): Alternate ID '".$id."' for '".$dirEntry."'\n"); - $dev = array( - 'jsonId' => $dirEntry, - 'jsonLocation' => $from - ); - $devicesList[$id] = $dev; - } - } - } - closedir($dh); - - return $devicesList; - } - - // Collecting list of supported devices (by their JSON) - $devList = getDevicesList('Abeille'); - foreach ($devList as $jsonId => $dev) { - - $eqList[] = array( - 'manufacturer' => $dev["manufacturer"], - 'model' => $dev["model"], - 'type' => $dev["type"], - 'jsonId' => $jsonId, - 'icon' => $dev["icon"] - ); - - // Collect all information related to Command used by the products - // $path = __DIR__.'/../../core/config/devices/'.$jsonId.'/'.$jsonId.'.json'; - // $contentJSON = file_get_contents($path); - // $content = json_decode($contentJSON, true); - // if (isset($content[$jsonId]['commands'])) { - // $commands = $content[$jsonId]['commands']; - // foreach ($commands as $include) { - // $resultRaw[] = array( - // 'jsonId' => $jsonId, - // 'type' => $content[$jsonId]["type"], - // 'fonction' => $include - // ); - // $result[] = "".$content[$jsonId]["type"]."".$jsonId."".$include.""; - // } - // } - } - - genRst($eqList); -?> diff --git a/.tools/git_merge_driver.txt b/.tools/git_merge_driver.txt deleted file mode 100644 index a12f309d49..0000000000 --- a/.tools/git_merge_driver.txt +++ /dev/null @@ -1,28 +0,0 @@ - -Liens -===== -https://www.julianburr.de/til/custom-git-merge-drivers/ - -How to automatically merge some files -===================================== -# .gitattributes update - -# Automatically solve conflicts for the following files. -# Note: They need to be updated anyway after a merge. -# Note: Using keepMine for MD5 & keepTheir for version -# in order to have different branch name -# and prevent wrong integrity check. -plugin_info/Abeille.md5 merge=keepMine -plugin_info/Abeille.version merge=keepTheir -plugin_info/info.json merge=keepMine - - -# .git/config update -# Add the following lines - -[merge "keepMine"] - name = always keep mine during merge - driver = exit 0 -[merge "keepTheir"] - name = always keep their during merge - driver = cp -f %B %A diff --git a/.tools/git_push.sh b/.tools/git_push.sh deleted file mode 100755 index edfe381714..0000000000 --- a/.tools/git_push.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash -# Git push script -# Do the following steps -# - Update version into 'Abeille.version' -# - Compute MD5 checksums into 'Abeille.md5' -# - Add+commit+push - -OUT=plugin_info/Abeille.md5 -FORCE="" - -# Checks -# Ensure script is launched from Abeille's root -if [ ! -e ".git" ]; then - echo "ERROR: This script must be launched from Abeille's root directory." - exit 1 -fi -if [ "$1" == "--force" ]; then - FORCE="--force" -fi - -# Remote branch identification -REMOTE_BRANCH_FULL=`git rev-parse --abbrev-ref --symbolic-full-name @{u}` -if [ "${REMOTE_BRANCH_FULL}" == "" ]; then - echo "= ERROR: Could not identify remote branch." - exit 2 -fi -echo "- Remote branch: ${REMOTE_BRANCH_FULL}" -IFS='/' -read -ra R <<< "${REMOTE_BRANCH_FULL}" -REMOTE_REPO=${R[0]} # Ex: 'origin' -REMOTE_BRANCH=${R[1]} # Ex: 'master' -echo " REMOTE_SOURCE=${REMOTE_REPO}" -echo " REMOTE_BRANCH=${REMOTE_BRANCH}" - -# Updating plugin version -.tools/update_version.sh ${REMOTE_BRANCH} -if [ $? -ne 0 ]; then - echo "= ERROR" - exit 22 -fi - -# Updating MD5 file -.tools/update_md5.sh -if [ $? -ne 0 ]; then - echo "= ERROR" - exit 23 -fi - -# Add + commit + push -echo "Updating GIT & pushing" -git add plugin_info/Abeille.version plugin_info/info.json plugin_info/Abeille.md5 -if [ $? -ne 0 ]; then - echo "= ERROR: git add failed." - exit 10 -fi -VERSION=`cat plugin_info/Abeille.version | tail -1` -git commit -m "Version ${VERSION}" -if [ $? -ne 0 ]; then - echo "= ERROR: git commit failed." - exit 11 -fi -git push ${FORCE} -if [ $? -ne 0 ]; then - echo "= ERROR: git push failed." - echo "= You may need to do the push with" - echo "= git push --force" - exit 12 -fi -echo "= Ok" diff --git a/.tools/save_changes.sh b/.tools/save_changes.sh deleted file mode 100644 index 59a16fca87..0000000000 --- a/.tools/save_changes.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash - -# Save GIT changes to a given directory - -if [ $# -lt 1 ]; then - echo "ERROR: Missing target directory." - exit 1 -fi -TARGET_DIR=$1 - -GIT_PORCELAIN=git.porcelain - -git status --porcelain > ${GIT_PORCELAIN} -REPO_DIR=$(pwd) -echo "Current dir: $PWD" -echo "Target dir : $TARGET_DIR" -mkdir -p ${TARGET_DIR} -cd ${TARGET_DIR} -while read -r; do - # echo "Line=$REPLY" - ARG2=`echo $REPLY | awk '{print $2}'` - ARG3=`echo $REPLY | awk '{print $3}'` - ARG4=`echo $REPLY | awk '{print $4}'` - if [[ $REPLY = "A"* ]]; then - echo "ADD: ${ARG2}" - mkdir -p $(dirname ${ARG2}) - cp "${REPO_DIR}/${ARG2}" ${ARG2} - continue - fi - if [[ $REPLY = "M"* ]] || [[ $REPLY = " M"* ]]; then - echo "MOD: ${ARG2}" - mkdir -p $(dirname ${ARG2}) - cp "${REPO_DIR}/${ARG2}" ${ARG2} - continue - fi - if [[ $REPLY = "D"* ]] || [[ $REPLY = " D"* ]]; then - echo "DEL: ${ARG2}" - mkdir -p $(dirname ${ARG2}) - cp "${REPO_DIR}/${ARG2}" ${ARG2}".removed" - continue - fi - if [[ $REPLY = "R"* ]]; then - echo "REN: ${ARG2} to ${ARG4}" - mkdir -p $(dirname ${ARG2}) - mkdir -p $(dirname "${ARG4}") - cp "${REPO_DIR}/${ARG4}" ${ARG4} - cp "${REPO_DIR}/${ARG2}" ${ARG2}".removed" - continue - fi - if [[ $REPLY = "??"* ]]; then - if [ "${ARG2}" = "git.porcelain" ] || [ "${ARG2}" = "sftp.cmds" ]; then - echo "?? : '$REPLY' => IGNORED" - continue; - fi - echo "?? : '$REPLY'" - mkdir -p $(dirname ${ARG2}) - cp "${REPO_DIR}/${ARG2}" ${ARG2} - continue - fi - echo "ERROR: Don't know what to do with the line" - echo " '$REPLY'" -done < "${REPO_DIR}/${GIT_PORCELAIN}" diff --git a/.tools/set_git_config.sh b/.tools/set_git_config.sh deleted file mode 100644 index 7ecb365550..0000000000 --- a/.tools/set_git_config.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -USERNAME="Tcharp38" -EMAIL="fabrice.charpentier@laposte.net" - -echo "Configuring user" -git config --local user.name "${USERNAME}" -git config --local user.email "${EMAIL}" - -echo "Configuring CRLF" -git config --local core.autocrlf input diff --git a/.tools/set_git_noproxy.sh b/.tools/set_git_noproxy.sh deleted file mode 100644 index 78f1530132..0000000000 --- a/.tools/set_git_noproxy.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -echo "Remove GIT proxy" -git config --global --unset http.proxy \ No newline at end of file diff --git a/.tools/set_python3.sh b/.tools/set_python3.sh deleted file mode 100644 index fb51a2b2e6..0000000000 --- a/.tools/set_python3.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -# This file must be SOURCED and not executed - - -export PATH=/c/Python37:${PATH} diff --git a/.tools/sync_all.sh b/.tools/sync_all.sh deleted file mode 100644 index 4622f598e7..0000000000 --- a/.tools/sync_all.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -if [ $# -lt 1 ]; then - echo "ERROR: Missing IP address" - exit 1 -fi -ADDR_IP=$1 - -ABEILLE_DIR=/var/www/html/plugins/Abeille -SFTP_SCRIPT=../sftp.cmds -LSFILES=../git.lsfiles - -git ls-files > ${LSFILES} -echo "cd ${ABEILLE_DIR}" > ${SFTP_SCRIPT} -PREVIOUS_DIR="" -while read -r; do - # echo "Line=$REPLY" - - # TODO: Put this part in exclude file - if [[ $REPLY = "core/config/commands/OBSOLETE"* ]]; then - echo "IGN: ${REPLY}" - continue - fi - if [[ $REPLY = "resources/archives"* ]]; then - echo "IGN: ${REPLY}" - continue - fi - # End TODO - - if [[ $REPLY = "."* ]]; then - echo "IGN: ${REPLY}" - continue - fi - REPLY_DIR=$(dirname ${REPLY}) - echo "ADD: ${REPLY}" - if [ "${REPLY_DIR}" != "${PREVIOUS_DIR}" ]; then - # Warning: Could not be sure that all path exists for creation - echo "mkdir ${REPLY_DIR}" >> ${SFTP_SCRIPT} - PREVIOUS_DIR=${REPLY_DIR} - fi - echo "put ${REPLY} ${REPLY}" >> ${SFTP_SCRIPT} -done < ${LSFILES} - -sftp root@${ADDR_IP} < ${SFTP_SCRIPT} diff --git a/.tools/sync_changes.sh b/.tools/sync_changes.sh deleted file mode 100644 index ec450f8a1e..0000000000 --- a/.tools/sync_changes.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash - -if [ $# -lt 1 ]; then - echo "ERROR: Missing IP address" - exit 1 -fi -ADDR_IP=$1 - -ABEILLE_DIR=/var/www/html/plugins/Abeille -SFTP_SCRIPT=../sftp.cmds -GIT_PORCELAIN=../git.porcelain - -git status --porcelain > ${GIT_PORCELAIN} -echo "cd ${ABEILLE_DIR}" > ${SFTP_SCRIPT} -while read -r; do - # echo "Line=$REPLY" - ARG2=`echo $REPLY | awk '{print $2}'` - ARG3=`echo $REPLY | awk '{print $3}'` - ARG4=`echo $REPLY | awk '{print $4}'` - if [[ $REPLY = "A"* ]]; then - echo "ADD: ${ARG2}" - echo "put ${ARG2} ${ARG2}" >> ${SFTP_SCRIPT} - continue - fi - if [[ $REPLY = "M"* ]] || [[ $REPLY = " M"* ]]; then - echo "MOD: ${ARG2}" - echo "put ${ARG2} ${ARG2}" >> ${SFTP_SCRIPT} - continue - fi - if [[ $REPLY = "U"* ]] || [[ $REPLY = " U"* ]]; then - echo "UPD: ${ARG2}" - echo "put ${ARG2} ${ARG2}" >> ${SFTP_SCRIPT} - continue - fi - if [[ $REPLY = "D"* ]] || [[ $REPLY = " D"* ]]; then - echo "DEL: ${ARG2}" - echo "rm ${ARG2}" >> ${SFTP_SCRIPT} - continue - fi - if [[ $REPLY = "R"* ]]; then - echo "REN: ${ARG2} to ${ARG4}" - echo "put ${ARG4} ${ARG4}" >> ${SFTP_SCRIPT} - echo "rm ${ARG2}" >> ${SFTP_SCRIPT} - continue - fi - if [[ $REPLY = "??"* ]]; then - if [ "${ARG2}" = "git.porcelain" ] || [ "${ARG2}" = "sftp.cmds" ]; then - echo "?? : '$REPLY' => IGNORED" - continue; - fi - echo "?? : '$REPLY'" - if [ -d ${ARG2} ]; then - FILES=`find ${ARG2}` - for F in ${FILES}; do - echo " $F" - done - - echo " Creating and transfering directory" - echo "mkdir ${ARG2}" >> ${SFTP_SCRIPT} - for F in ${FILES}; do - echo "put $F $F" >> ${SFTP_SCRIPT} - done - else - echo "put ${ARG2} ${ARG2}" >> ${SFTP_SCRIPT} - fi - continue - fi - echo "ERROR: Don't know what to do with the line" - echo " '$REPLY'" -done < ${GIT_PORCELAIN} - -sftp root@${ADDR_IP} < ${SFTP_SCRIPT} diff --git a/.tools/update_changelog.sh b/.tools/update_changelog.sh deleted file mode 100644 index d89e3bce3f..0000000000 --- a/.tools/update_changelog.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/bash - -# Update changelog to add version - -CL=docs/fr_FR/changelog.md -TMP=docs/fr_FR/changelog.md.tmp - -echo "Updating changelog..." - -VERSION=`cat plugin_info/Abeille.version | tail -1` -STEP=0 -cat ${CL} | -while IFS= read -r L -do - # # ChangeLog (title) - # - # - JSON: Correction setReportTemp (#1918). - - # # ChangeLog (title) - # - # ## VERSION X - # - # - JSON: Correction setReportTemp (#1918). - - # remove trailing whitespace characters - L="${L%"${L##*[![:space:]]}"}" - - if [ ${STEP} -eq 0 ]; then - echo "${L}" >> ${TMP} - if [[ ${L} == "# "* ]]; then - STEP=1 # Title found - fi - elif [ ${STEP} -eq 1 ]; then - # Empty line ? - if [ "${L}" == "" ]; then - echo >> ${TMP} - continue # Continue until version updated - fi - - # Version line - # Note: '## VERSION1' or '## VERSION2, VERSION1' - if [[ "${L}" == "## "* ]]; then - if [[ "${L}" == *"${VERSION}"* ]]; then - echo "- Version is already correct in changelog. Doing nothing" - echo - rm ${TMP} - break - fi - echo "- Updating version to ${VERSION}" - VERSIONOLD=${VERSION### } - echo "## ${VERSION}, ${VERSIONOLD}" >> ${TMP} - STEP=2 # Copy rest of the file - continue - fi - - # Anything but a version line - echo "- Adding version ${VERSION}" - # Adding current version - echo "## ${VERSION}" >> ${TMP} - # Adding current line - echo "" >> ${TMP} - echo "${L}" >> ${TMP} - STEP=2 # Copy rest of the file - - # if [[ "${L}" == "- "* ]] || [[ "${L}" == " "* ]]; then - # # It's a list (starts with '- ') or something starting with space - # # => Need to add version title (# VERSION) - # echo "${VERSION}" >> ${TMP} - # S=${#VERSION} - # UNDER="" - # for (( c=1; c<=$S; c++ )) - # do - # UNDER="${UNDER}-" - # done - # echo ${UNDER} >> ${TMP} - # echo "" >> ${TMP} - # echo "${L}" >> ${TMP} - # else - # if [ "${L}" == "" ]; then - # echo >> ${TMP} - # continue - # fi - # # Assuming 'VERSION' line + '------' - # if [[ "${L}" == "## ${VERSION}"* ]]; then - # echo "- There is already correct version in changelog. Doing nothing" - # echo - # rm ${TMP} - # break - # fi - # # Adding current version - # echo "## ${VERSION}" >> ${TMP} - # fi - # STEP=2 - else # STEP==2: Copy all remaining lines - echo "${L}" >> ${TMP} - fi -done - -if [ -e ${TMP} ]; then - rm ${CL} - mv ${TMP} ${CL} -fi - -exit 0 diff --git a/.tools/update_md5.sh b/.tools/update_md5.sh deleted file mode 100755 index e9f0e37b85..0000000000 --- a/.tools/update_md5.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash - -# Generate 'Abeille.md5' for key files, then add/commit. -# - Requires GIT. -# - Must be executed from Abeille root directory. -# - Must be the LAST commit before the push. - -OUT=plugin_info/Abeille.md5 - -# Commit ready. Generating md5 for versionned files -echo "Updating MD5 checksum..." -echo "# Auto-generated Abeille's MD5 file. DO NOT MODIFY !" >${OUT} -VERSION=`cat plugin_info/Abeille.version | tail -1` -echo "- Version: ${VERSION}" -echo "# VERSION=\"${VERSION}\"" >>${OUT} - -# Note: take care about such following file name -# 'core/config/IAS ACE Cluster IAS Zone & Diagnostics Only_ZHA.xml' - -git ls-files | -while read -r F -do - # Ignoring checksum for the following files - # - plugin_info/Abeille.md5 - # - 'core/config/devices_local' content except README/LISZEMOI - # - 'core/config/commands/OBSOLETE' - # - All '.xxx' or '.bak' files - if [[ "${F}" = *"Abeille.md5" ]] || [[ "${F}" = *"TODO.txt" ]]; then - echo "xxxxxxxxx-md5-skipped-xxxxxxxxxx *${F}" >> ${OUT} - continue - fi - if [[ ${F} = "."* ]] || [[ ${F} = *".bak" ]]; then - echo "xxxxxxxxx-md5-skipped-xxxxxxxxxx *${F}" >> ${OUT} - continue - fi - if [[ "${F}" = "tmp/"* ]] || [[ "${F}" = "docs/dev/"* ]]; then - echo "xxxxxxxxx-md5-skipped-xxxxxxxxxx *${F}" >> ${OUT} - continue - fi - if [[ "${F}" = "resources/archives"* ]]; then - echo "xxxxxxxxx-md5-skipped-xxxxxxxxxx *${F}" >> ${OUT} - continue - fi - # 'core/config/devices_local' fully excluded except the following files - if [[ "${F}" = "core/config/devices_local/"* ]]; then - if [[ "${F}" != *"LISEZMOI.txt" ]] && [[ "${F}" != *"README.txt" ]]; then - echo "xxxxxxxxx-md5-skipped-xxxxxxxxxx *${F}" >> ${OUT} - continue - fi - fi - - # echo "F=$F" - if [ ! -e "${F}" ]; then - echo "- ERROR: File does not exist: ${F}" - continue - fi - md5sum "${F}" >> ${OUT} -done - -# REMINDER: 'Abeille.md5' is now updated but must be added/committed & pushed. - -exit 0 diff --git a/core/config/commands/inf_batteryVoltAndPercent-285-300.json b/core/config/commands/inf_batteryVoltAndPercent-285-300.json index 9d2ac06d10..06442e852e 100644 --- a/core/config/commands/inf_batteryVoltAndPercent-285-300.json +++ b/core/config/commands/inf_batteryVoltAndPercent-285-300.json @@ -1,7 +1,7 @@ { "inf_batteryVoltAndPercent-285-300": { "comment": "Special info cmd for devices that send volt only and convert to %", - "comment2": "Computing battery percent from received voltage, assuming min=2.85V, max=3V", + "comment2": "Computing battery percent from received voltage, assuming min=2.85V, max=3.2V", "type": "info", "subType": "numeric", "configuration": { diff --git a/core/config/commands/inf_zbAttr-0001-BatteryPercent.json b/core/config/commands/inf_zbAttr-0001-BatteryPercent.json index c01bbbceb0..14e812125c 100644 --- a/core/config/commands/inf_zbAttr-0001-BatteryPercent.json +++ b/core/config/commands/inf_zbAttr-0001-BatteryPercent.json @@ -1,7 +1,7 @@ { "inf_zbAttr-0001-BatteryPercent": { - "isVisible": 0, - "isHistorized": 0, + "isVisible": 1, + "isHistorized": 1, "subType": "numeric", "invertBinary": "0", "template": "default", diff --git a/core/config/devices/sensor_magnet.aq2/sensor_magnet.aq2.json b/core/config/devices/sensor_magnet.aq2/sensor_magnet.aq2.json index e88b77eed4..e40bf5077c 100755 --- a/core/config/devices/sensor_magnet.aq2/sensor_magnet.aq2.json +++ b/core/config/devices/sensor_magnet.aq2/sensor_magnet.aq2.json @@ -19,7 +19,8 @@ "template": "door", "genericType": "OPENING", "invertBinary": "1", - "isVisible": 1 + "isVisible": 1, + "isHistorized": 1 }, "Battery-Volt": { "use": "inf_batteryVoltAndPercent-285-300" diff --git a/core/config/devices/weather/weather.json b/core/config/devices/weather/weather.json index 734de9abd3..c33a4f79d0 100755 --- a/core/config/devices/weather/weather.json +++ b/core/config/devices/weather/weather.json @@ -15,10 +15,18 @@ "type": "Xiaomi temp/humidity/pressure sensor", "commands": { "Battery-Volt": { - "use": "inf_batteryVoltAndPercent-285-300" + "use": "inf_batteryVoltAndPercent-285-300", + "isHistorized": 1, + "isVisible": 1, + "configuration": { + "minValue": "2.8", + "maxValue": "3.2" + } }, "Battery-Percent": { - "use": "inf_zbAttr-0001-BatteryPercent" + "use": "inf_zbAttr-0001-BatteryPercent", + "isHistorized": 1, + "isVisible": 1 }, "Temperature": { "use": "inf_zbAttr-0402-MeasuredValue", @@ -27,10 +35,16 @@ }, "Pressure": { "use": "inf_zbAttr-0403-MeasuredValue", - "isVisible": 0 + "isHistorized": 1, + "isVisible": 1, + "configuration": { + "minValue": "960", + "maxValue": "1065" + } }, "Humidity": { "use": "inf_zbAttr-0405-MeasuredValue", + "isHistorized": 1, "isVisible": 1 } }, diff --git a/core/config/rucheCommand.json b/core/config/rucheCommand.json index cd20cca593..a9a62a50dd 100755 --- a/core/config/rucheCommand.json +++ b/core/config/rucheCommand.json @@ -86,6 +86,32 @@ "forceReturnLineAfter": "1" } }, + "Set inclusion mode": { + "name": "Set inclusion mode", + "comment": "Readded this function for case #2476", + "isHistorized": "0", + "isVisible": "1", + "Type": "action", + "subType": "other", + "configuration": { + "topic": "zgSetPermitMode", + "request": "mode=start" + } + }, + "Get Inclusion Status": { + "name": "Get Inclusion Status", + "isHistorized": "0", + "isVisible": "1", + "Type": "action", + "subType": "other", + "configuration": { + "topic": "permitJoin", + "request": "Status" + }, + "display": { + "forceReturnLineAfter": "1" + } + }, "storeScene": { "name": "storeScene", "isVisible": "0", diff --git a/core/scripts/powerCycleUsb.sh b/core/scripts/powerCycleUsb.sh index 1a12d91de4..cf56f76889 100755 --- a/core/scripts/powerCycleUsb.sh +++ b/core/scripts/powerCycleUsb.sh @@ -17,6 +17,11 @@ if [ ${NBARGS} -ne 1 ]; then exit 1 fi +if [ -f /.dockerenv ] ; then + echo "Running inside docker, no kernel message available, exiting" + exit 0 +fi + FULLDEV=$1 echo "USB port=$FULLDEV" diff --git a/desktop/modal/AbeilleNetwork.modal.php b/desktop/modal/AbeilleNetwork.modal.php index d776f47a43..77f5fbc1a4 100644 --- a/desktop/modal/AbeilleNetwork.modal.php +++ b/desktop/modal/AbeilleNetwork.modal.php @@ -79,6 +79,10 @@ function displayNetworks($nbOfZigates, $what="linksTable", $mode="") { height: 100%; width: 100% } + #idLinksGraphTabSVG >svg { + height: 100%; + width: 100% + } .node-item { border: 1px solid; diff --git a/resources/archives/AbeilleInterrogate.php b/resources/archives/AbeilleInterrogate.php deleted file mode 100644 index 4802cf4a8b..0000000000 --- a/resources/archives/AbeilleInterrogate.php +++ /dev/null @@ -1,39 +0,0 @@ -. - */ - - include_once __DIR__.'/../../../core/php/core.inc.php'; - include_once __DIR__.'/../../core/config/Abeille.config.php'; - include_once __DIR__.'/../../core/class/AbeilleTools.class.php'; - - // Exemple d appel: php AbeilleInterrogate.php Abeille1 49d6 - // Sur une demande sans réponse, le zigate en V3.1b envoie 4 demandes. Chaque demande est toutes les 1.6s. - // Sur une demande Abeille, la zigate envoie une demande sur la radio à T0, T0+1.6s, T0+3.2s, T0+4.8s - // Si mes souvenirs sont bons la reco est 7s de buffer sur les routeurs. Donc dernier message plus 7s = T0+4.8s+7s = T0+12s - // Donc envoyer un message toutes les 12s max pour eviter l overflow. - - $timeOut = 60; // min - $timeEnd = time() + $timeOut*60; - - $dest = $argv[1]; - $addressShort = $argv[2]; - - while ( time() < $timeEnd ) { - Abeille::publishMosquitto(queueKeyAbeilleToCmd, priorityInterrogation, "Cmd".$dest."/".$addressShort."/getIeeeAddress", ""); - echo "."; - sleep( 12 ); - } -?> diff --git a/resources/archives/AbeilleLQI_List.php b/resources/archives/AbeilleLQI_List.php deleted file mode 100644 index 61be61e772..0000000000 --- a/resources/archives/AbeilleLQI_List.php +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - - - - - - - - -

Abeille Network Table

- - Array - ( - [NeighbourTableEntries] => 0A - [Index] => 00 - [ExtendedPanId] => 28d07615bb019209 - [IEEE_Address] => 00158d00019f9199 - [Depth] => 01 - [LinkQuality] => 75 - [BitmapOfAttributes] => 1a - [NE] => 0000 - [NE_Name] => Ruche - [Voisine] => df33 - [Voisine_Name] => Test: Temperature Rond Bureau - [Type] => End Device - [Relationship] => Child - [Rx] => Rx-Off - [LinkQualityDec] => 117 - ) - */ - -if (isset($_GET['NE'])) { - $NE = $_GET['NE']; -} else { - $NE = "All"; -} - -if (isset($_GET['NE2'])) { - $NE2 = $_GET['NE2']; -} else { - $NE2 = "None"; -} - -if (isset($_GET['Cache'])) { - $Cache = $_GET['Cache']; -} else { - $Cache = "Cache"; -} - -//require_once("NetworkDefinition.php"); - -$DataFile = "AbeilleLQI_MapData.json"; - -if ($Cache == "Refresh Cache") { - // Ici on n'utilise pas le cache donc on lance la collecte - require_once(__DIR__."/../core/php/AbeilleLQI.php"); -} - -if (file_exists($DataFile)) { - - $json = json_decode(file_get_contents($DataFile), true); - // $LQI = $json->data; - $LQI = $json['data']; - // print_r( $LQI ); - // exit; -} else { - echo "Le cache n existe pas, faites un refresh.
"; -} - -$eqLogics = eqLogic::byType('Abeille'); -foreach ($eqLogics as $eqLogic) { - $name = $eqLogic->getName(); - $shortAddress = str_replace("Abeille/", "", $eqLogic->getLogicalId()); - $shortAddress = ($name == 'Ruche') ? "0000" : $shortAddress; - $knownNE[$name] = $shortAddress; -} - - -?> - - -
- - - - -
- -
- - - - NE - NE Name - Voisine - Voisine Name - Voisine IEEE - Relation - Profondeur - LQI - '; - - // echo "DEBUT: ".date(DATE_RFC2822)."
\n"; - // var_dump( $LQI ); - // var_dump( $NE ); - // $NE="All"; - - // On reset $NE qui est utilisé pour different truc. - if ($Cache == "Refresh Cache") { - $NE = "All"; - } - - foreach ($LQI as $key => $voisine) { - if (($voisine['NE_Name'] == $NE) || ("All" == $NE) || ($voisine['Voisine_Name'] == $NE2)) { - echo " - - " . $voisine['NE'] . "" . $voisine['NE_Name'] . "" . $voisine['Voisine'] . "" . $voisine['Voisine_Name'] . "" . $voisine['IEEE_Address'] . "" . $voisine['Relationship'] . "" . $voisine['Depth'] . "" . $voisine['LinkQualityDec'] . " - \n"; - } - } - - // Formating pour la doc asciidoc - if (0) { - // echo "\n"; - // echo "\n"; - echo "|NE|Voisine|Relation|Profondeur|LQI\n"; - - foreach ($LQI as $key => $voisine) { - // echo ""; - // echo ""; - - echo "|" . $voisine['NE'] . "|" . $voisine['NE_Name'] . "|" . $voisine['Voisine'] . "|" . "|" . $voisine['Voisine_Name'] . "|" . $voisine['Relationship'] . "|" . $voisine['Depth'] . "|" . $voisine['LinkQualityDec'] . "\n"; - - // echo "\n"; - } - // echo "
NEVoisineRelationProfondeurLQI
".$voisine['NE']."".$voisine['Voisine']."".$voisine['Relationship']."".$voisine['Depth']."".$voisine['LinkQualityDec']."
\n"; - } - - // print_r( $NE_All ); - // print_r( $voisine ); - // print_r( $LQI ); - - // deamonlog('debug', 'sortie du loop'); - // echo "FIN: ".date(DATE_RFC2822)."
\n"; - echo ''; - ?> - -
-
- - -
-
- - diff --git a/resources/archives/AbeilleRoutes.ajax.php b/resources/archives/AbeilleRoutes.ajax.php deleted file mode 100644 index c4eb5cc784..0000000000 --- a/resources/archives/AbeilleRoutes.ajax.php +++ /dev/null @@ -1,26 +0,0 @@ -getLogicalId()) || ($_GET['device'] == "All") ) { - if ( $eqLogic->getConfiguration('battery_type', 'none') == 'none' ) - continue; // on n interroge pas les equipements sur batterie - - list($net, $addr) = explode('/', $eqLogic->getLogicalId()); - Abeille::publishMosquitto($queueId, PRIO_NORM, "Cmd".$net."/".$addr."/getRoutingTable", ""); - sleep(3); - } - } -?> diff --git a/resources/archives/AbeilleSupport.php b/resources/archives/AbeilleSupport.php deleted file mode 100644 index f608f84194..0000000000 --- a/resources/archives/AbeilleSupport.php +++ /dev/null @@ -1,340 +0,0 @@ - 200){ - // $alert = '
{{Attention votre niveau de log (event) est inférieur à info, vous ne pouvez donc pas voir de temps réel.}}'; - // $alert .= ' {{Configuration}}'; - // $alert .= '
'; - // echo $alert; - // } - // } - - $tmpDir = jeedom::getTmpFolder("Abeille"); // Jeedom temp directory - $pluginDir = __DIR__."/../../"; // Plugin root dir - echo ''; -?> - - -
-
-
-
- -
- - - - - - - - - - - - -
-
- - -
- - diff --git a/resources/archives/CheckAlive.php b/resources/archives/CheckAlive.php deleted file mode 100644 index 3b626e7942..0000000000 --- a/resources/archives/CheckAlive.php +++ /dev/null @@ -1,65 +0,0 @@ - 1, - ); - - // Variables - $Alarme = 0; // Passe a un si au moins une batterie est sous le seuil. - - // Lib needed - require_once dirname(__FILE__)."/../../../../core/php/core.inc.php"; - - - - - // -- récupère tous les équipements - $eqLogics = new eqLogic(); - $eqLogics = eqLogic::all(); - - if ($debug) echo "Début monitoring\n"; - - // -- Parcours tous les équipements - foreach($eqLogics as $eqLogic) - { - // -- Si l'équipement se trouve dans la liste des équipements à ignorer : on passe au suivant - if ($excludeEq[$eqLogic->getHumanName()] == 1){ - if ($debug) echo '-- Equipement ' . $eqLogic->getHumanName() . ' ignoré' . "\n"; - continue; - } - - $collectBattery = $eqLogic->getStatus("battery"); - $collectDate = $eqLogic->getStatus("lastCommunication"); - if ($debug) echo 'Equipement: ' . $eqLogic->getHumanName() . " - " . $collectDate . ' - ' . $collectBattery . "\n"; - if ($debug) echo "TimeStamp: " . strtotime($collectDate) . "\n"; - if ($debug) echo "TimeStamp: " . time() . "\n"; - - // -- Calcule le temps écoulé entre la date maximun et aujourd'hui (récuptat en minute) - $elapsedTime = time() - strtotime($collectDate); - - if ($elapsedTime > $maxTime){ - // -- le temps est supérieur au temps spécifié : alerte !!! (mail ? log ? sms?) - // -- /!\alert - if ($debug) echo "Alerte\n"; - $Alarme = 1; - } - } - - - // log fin de traitement - if ($debug) echo 'fin monitoring' . "\n"; - - echo $Alarme; - ?> \ No newline at end of file diff --git a/resources/archives/CheckBattery.php b/resources/archives/CheckBattery.php deleted file mode 100644 index f5b9f117e3..0000000000 --- a/resources/archives/CheckBattery.php +++ /dev/null @@ -1,141 +0,0 @@ - 1, - "[Ruche][Abeille-c576]" => 1, - ); - - // Liste des plugin à ignorer - $excludePlugin = array( - "script" => 1, // Couvre l objet du script lui-meme - - ); - - - // Variables - $Alarme = 0; // Passe a un si au moins une batterie est sous le seuil. - $PingCommande = array( - "AmpouleIkea" => "getEtat", - ); - - // Lib needed - require_once dirname(__FILE__)."/../../../../core/php/core.inc.php"; - - // Gestion des parametres fournis lors du lancement du script - // argv[1]: Batterie | Alive | Ping - // argv[1]: Test | List - - if ( !isset( $argv[1] ) ) return; - if ( !isset( $argv[2] ) ) return; - - if ( $debug ) print_r( $argv ); - - // -- récupère tous les équipements - $eqLogics = new eqLogic(); - $eqLogics = eqLogic::all(); - - if ($debug) echo "Début monitoring\n"; - - // -- Parcours tous les équipements - foreach($eqLogics as $eqLogic) - { - $battery = -1; - $lastCommunication = -1; - - if ($debug) echo "\n"; - - if ($debug) echo "-- Equipement " . $eqLogic->getHumanName() . " Type: " . $eqLogic->getEqType_name() . "\n"; - - // -- Si l'équipement se trouve dans la liste des équipements à ignorer : on passe au suivant - if ($excludeEq[$eqLogic->getHumanName()] == 1){ - if ($debug) echo "-- Equipement " . $eqLogic->getHumanName() . " ignoré (car dans la liste des équipements à ignorer)" . "\n"; - continue; - } - - // -- Si l'équipement Type/Plugin se trouve dans la liste des plugin à ignorer : on passe au suivant - - if ($excludePlugin[$eqLogic->getEqType_name()] == 1){ - if ($debug) echo "-- Equipement " . $eqLogic->getHumanName() . " ignoré (car dans la liste des plugin à ignorer): " . $eqLogic->getEqType_name() . "\n"; - continue; - } - - $battery = $eqLogic->getStatus("battery"); - $lastCommunication = $eqLogic->getStatus("lastCommunication"); - if ($debug) echo 'Equipement: ' . $eqLogic->getHumanName() . " - " . $lastCommunication . " - " . $battery . "\n"; - - // -- Si l'équipement ne retourne pas de valeur de batterie alors qu on teste batterie : on passe au suivant - if ( ($argv[1]=="Batterie") && ($battery == "") ) { - if ($debug) echo '-- Equipement ' . $eqLogic->getHumanName() . ' ignoré car pas d info batterie' . "\n"; - continue; - } - - // -- Si l'équipement ne retourne pas de valeur de last communcation : on passe au suivant - if ( ($lastCommunication == "") ) { - if ($debug) echo '-- Equipement ' . $eqLogic->getHumanName() . ' ignoré' . "\n"; - continue; - } - - // -- On verifie le niveau de batterie - if ( $argv[1]=="Batterie" ) { - if ($battery <= $minBattery){ - // -- le niveau batterie est trop bas : alerte !!! (mail ? log ? sms?) - // -- /!\alert - if ($debug) echo "Alerte\n"; - $Alarme = 1; - if ( $argv[2]=="List" ) { - echo "
" . $eqLogic->getHumanName() . " - " . $battery; - } - } - } - - // -- Calcule le temps écoulé entre la date maximun et aujourd'hui (récuptat en minute) - $elapsedTime = time() - strtotime($lastCommunication); - - if ( $argv[1]=="Alive" ) { - if ($elapsedTime > $maxTime){ - // -- le temps est supérieur au temps spécifié : alerte !!! (mail ? log ? sms?) - // -- /!\alert - if ($debug) echo "Alerte\n"; - $Alarme = 1; - if ( $argv[2]=="List" ) { - echo "
" . $eqLogic->getHumanName() ; - } - } - } - - // -- On ping la valeur Etat de tous les équipements qui ne sont pas sur batteries - if ( ($argv[1]=="Ping") && ($battery == "") ) { - $cmdName = '#' . $eqLogic->getHumanName() . '['.$PingCommande[$argv[2]].']#'; - try { // on fait cmd::byString pour trouver une commande mais si elle n'est pas trouvée ca genere une exception et le execCmd n'est pas executé. - $cmd = cmd::byString($cmdName); - $cmd->execCmd(); - } catch (Exception $e) { - if ($debug) echo 'Exception reçue car la commande n est pas trouvee: ', $e->getMessage(), "\n"; - } - - } - } - - - // log fin de traitement - if ($debug) echo 'fin monitoring' . "\n"; - - if ( $argv[2]=="Test" ) { echo $Alarme; } else echo "\n"; - ?> \ No newline at end of file diff --git a/resources/archives/HueCatalogue.json b/resources/archives/HueCatalogue.json deleted file mode 100644 index de299c835a..0000000000 --- a/resources/archives/HueCatalogue.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "LCT001": { - "Nom": "Hue bulb A19", - "Type": "0x0210 (Extended Color Light)" - }, - "LCT007": { - "Nom": "Hue bulb A19", - "Type": "0x0210 (Extended Color Light)" - }, - "LCT002": { - "Nom": "Hue Spot BR30", - "Type": "0x0210 (Extended Color Light)" - }, - "LCT003": { - "Nom": "Hue Spot GU10", - "Type": "0x0210 (Extended Color Light)" - }, - "LST001": { - "Nom": "Hue LightStrips", - "Type": "0x0200 (Color Light)" - }, - "LST002": { - "Nom": "Hue LightStrips Plus", - "Type": "0x0210 (Extended Color Light)" - }, - "LLC010": { - "Nom": "Hue Living Colors Iris", - "Type": "0x0200 (Color Light)" - }, - "LLC011": { - "Nom": "Hue Living Colors Bloom", - "Type": "0x0200 (Color Light)" - }, - "LLC012": { - "Nom": "Hue Living Colors Bloom", - "Type": "0x0200 (Color Light)" - }, - "LLC006": { - "Nom": "Hue Living Colors Gen3 Iris", - "Type": "0x0200 (Color Light)" - }, - "LLC007": { - "Nom": "Hue Living Colors Gen3 Bloom Aura", - "Type": "0x0200 (Color Light)" - }, - "LLC013": { - "Nom": "Hue Disney Living Colors", - "Type": "0x0200 (Color Light)" - }, - "LWB004": { - "Nom": "Hue A19 Lux", - "Type": "0x0100 (Dimmable Light)" - }, - "LWB006": { - "Nom": "Hue A19 Lux", - "Type": "0x0100 (Dimmable Light)" - }, - "LWB007": { - "Nom": "Hue A19 Lux", - "Type": "0x0100 (Dimmable Light)" - }, - "LTW001": { - "Nom": "Hue A19 White Ambience", - "Type": "0x0220 (Color Temperature Light)" - }, - "LLC020": { - "Nom": "Hue Go", - "Type": "0x0210 (Extended Color Light)" - }, - "HBL001": { - "Nom": "Hue Beyond Table", - "Type": "0x0210 (Extended Color Light)" - }, - "HBL002": { - "Nom": "Hue Beyond Pendant", - "Type": "0x0210 (Extended Color Light)" - }, - "HBL003": { - "Nom": "Hue Beyond Ceiling", - "Type": "0x0210 (Extended Color Light)" - }, - "HEL001": { - "Nom": "Hue Entity Table", - "Type": "0x0210 (Extended Color Light)" - }, - "HEL002": { - "Nom": "Hue Entity Pendant", - "Type": "0x0210 (Extended Color Light)" - }, - "HIL001": { - "Nom": "Hue Impulse Table", - "Type": "0x0210 (Extended Color Light)" - }, - "HIL002": { - "Nom": "Hue Impulse Pendant", - "Type": "0x0210 (Extended Color Light)" - }, - "HML001": { - "Nom": "Hue Phoenix Centerpiece", - "Type": "0x0220 (Color Temperature Light)" - }, - "HML002": { - "Nom": "Hue Phoenix Ceiling", - "Type": "0x0220 (Color Temperature Light)" - }, - "HML003": { - "Nom": "Hue Phoenix Pendant", - "Type": "0x0220 (Color Temperature Light)" - }, - "HML004": { - "Nom": "Hue Phoenix Wall", - "Type": "0x0220 (Color Temperature Light)" - }, - "HML005": { - "Nom": "Hue Phoenix Table", - "Type": "0x0220 (Color Temperature Light)" - }, - "HML007": { - "Nom": "Hue Phoenix Downlight", - "Type": "0x0220 (Color Temperature Light)" - } -} \ No newline at end of file diff --git a/resources/archives/IAS ACE Cluster IAS Zone & Diagnostics Only_ZHA.xml b/resources/archives/IAS ACE Cluster IAS Zone & Diagnostics Only_ZHA.xml deleted file mode 100644 index 6b7148023a..0000000000 --- a/resources/archives/IAS ACE Cluster IAS Zone & Diagnostics Only_ZHA.xml +++ /dev/null @@ -1,81 +0,0 @@ - - IAS ACE - 0x0501 - IAS_ACE_CLUSTER - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - TRUE - TRUE - TRUE - TRUE - TRUE - TRUE - TRUE - TRUE - TRUE - - - - Diagnostics - 0x0B05 - DIAGNOSTICS_CLUSTER - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - TRUE - TRUE - - - - IAS Zone - 0x0500 - IAS_ZONE_CLUSTER - TRUE - TRUE - TRUE - TRUE - TRUE - FALSE - FALSE - TRUE - FALSE - FALSE - TRUE - TRUE - - diff --git a/resources/archives/LqiStorage.php b/resources/archives/LqiStorage.php deleted file mode 100644 index 8afeed95a9..0000000000 --- a/resources/archives/LqiStorage.php +++ /dev/null @@ -1,123 +0,0 @@ -open('LqiStorage.db'); - } - } - - function createDB($db) { - // $sql = "CREATE TABLE COMPANY (ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);"; - $sql = "CREATE TABLE voisines ("; - $sql .= "TimeStamp TEXT, "; - $sql .= "NeighbourTableEntries TEXT, "; - $sql .= "Row TEXT, "; - $sql .= "ExtendedPanId TEXT, "; - $sql .= "IEEE_Address TEXT, "; - $sql .= "Depth TEXT, "; - $sql .= "LinkQuality TEXT, "; - $sql .= "BitmapOfAttributes TEXT, "; - $sql .= "NE TEXT, "; - $sql .= "NE_Name TEXT, "; - $sql .= "Voisine TEXT, "; - $sql .= "Voisine_Name TEXT, "; - $sql .= "Type TEXT, "; - $sql .= "Relationship TEXT, "; - $sql .= "Rx TEXT, "; - $sql .= "LinkQualityDec TEXT "; - $sql .= ");"; - echo "SQL: ".$sql."\n"; - - $ret = $db->exec($sql); - if(!$ret){ - echo $db->lastErrorMsg(); - } else { - echo "Table created successfully\n"; - } - } - - function insertData( $db, $fields, $data){ - // $sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );"; - // INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); - // INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'Teddy', 23, 'Norway', 20000.00 ); - // INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 ); - $sql = "insert into voisines ( ".$fields.") values (".$data.");"; - echo "sql insert: ".$sql; - - $ret = $db->exec($sql); - if(!$ret) { - echo $db->lastErrorMsg(); - } else { - echo "Records created successfully\n"; - } - } - - function listData($db) { - $sql = "SELECT * from voisines;"; - - $ret = $db->query($sql); - while($row = $ret->fetchArray(SQLITE3_ASSOC) ) { - foreach ($row as $key=>$data) { - echo $key." = ". $data . " / "; - } - echo "\n"; - } - echo "Operation done successfully\n"; - } - - function deleteData() { - $sql = "DELETE from COMPANY where ID = 2;"; - - $ret = $db->exec($sql); - if(!$ret){ - echo $db->lastErrorMsg(); - } else { - echo $db->changes(), " Record deleted successfully\n"; - } - } - - function updateData() { - $sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1;"; - $ret = $db->exec($sql); - if(!$ret) { - echo $db->lastErrorMsg(); - } else { - echo $db->changes(), " Record updated successfully\n"; - } - - } - - function getJson($db) { - $DataFile = "AbeilleLQI_MapData.json"; - - if ( file_exists($DataFile) ){ - $json = json_decode(file_get_contents($DataFile), true); - $LQI = $json['data']; - } - - $TimeStamp = time(); - - foreach ( $LQI as $row => $voisineList ) { - echo $voisineList['NE_Name']."-".$voisineList['Voisine_Name']."\n"; - $fields = 'TimeStamp, ExtendedPanId, IEEE_Address, Depth, LinkQuality, BitmapOfAttributes, NE, NE_Name, Voisine, Voisine_Name, Type, Relationship, Rx, LinkQualityDec'; - - $data = '"'.$TimeStamp.'", "'.$voisineList['ExtendedPanId'].'", "'.$voisineList['IEEE_Address'].'", "'.$voisineList['Depth'].'", "'.$voisineList['LinkQuality'].'", "'.$voisineList['BitmapOfAttributes'].'", "'.$voisineList['NE'].'", "'.$voisineList['NE_Name'].'", "'.$voisineList['Voisine'].'", "'.$voisineList['Voisine_Name'].'", "'.$voisineList['Type'].'", "'.$voisineList['Relationship'].'", "'.$voisineList['Rx'].'", "'.$voisineList['LinkQualityDec'].'"'; - - insertData( $db, $fields, $data); - } - } - - $db = new MyDB(); - if(!$db) { - echo $db->lastErrorMsg(); - } else { - echo "Opened database successfully\n"; - } - - createDB($db); - // listData($db); - getJson($db); - - $db->close(); - ?> diff --git a/resources/archives/NetworkDefinition.php b/resources/archives/NetworkDefinition.php deleted file mode 100644 index cc60f3235c..0000000000 --- a/resources/archives/NetworkDefinition.php +++ /dev/null @@ -1,161 +0,0 @@ - "Ruche", // 00:15:8d:00:01:b2:2e:24 00158d0001b22e24 -> Production - // 00:01:58:d0:00:19:1b:22 000158d000191b22 -> Test - // Abeille Prod JeedomZwave - "dc15" => "T1", // 00:0B:57:ff:fe:49:0D:bf 000B57fffe490Dbf - "d204" => "T2", // 00:0B:57:ff:fe:c5:38:19 000B57fffec53819 fut 1e8c - "174f" => "T3", // 00:0b:57:ff:fe:49:10:ea - "6766" => "T4", // 000B57fffe3025ad - "1b7b" => "T5", // 000B57fffe8da30A - "8ffe" => "T6", // 000B57fffe8e083c - "2096" => "T7", // 000B57fffe490C2a - "2cd5" => "T8", // 000B57fffe88af72 - - "a0da" => "Gauche", // 000B57fffe3a563b - "60fb" => "Milieu", // 000B57fffe8dbb1a - "46d9" => "Droite", // 00:0b:57:ff:fe:95:2a:69 - "a728" => "Piano", // 00:0b:57:ff:fe:3a:0e:7c - - "345f" => "P-D", // 00158d0001e44ece - "ea8c" => "P-G", // 00:15:8d:00:01:b1:49:a8 00158d0001b149a8 fut 2349 - "fb14" => "P-C", // 00:15:8d:00:01:ab:3f:2f 00158d0001ab3f2f fut f984 - - "8f28" => "P-Entree", // 00158d0001b149a3 - - - "41c0" => "PriseX1", // 00:15:8d:00:01:83:af:7b - "db83" => "PriseX2", // 00:15:8d:00:01:83:af:eb - "d86d" => "PriseXTest", // 00:15:8d:00:01:dc:9c:42 00158d0001dc9c42 - - "498d" => "HueGo", // 00:17:88:01:02:14:ff:6b - - "7714" => "Bois", // 00:0b:57:ff:fe:4b:ab:6a - - "873a" => "IR", // 00158d0001215781 - - "b774" => "Porte Bureau", // 00158d0001d5c421 - "1be0" => "Temperature Bureau", // 00158d0001d6c177 - - "d43e" => "Fenetre SdB G", // 00158d0001e44eac - "28f2" => "Fenetre SdB D", // 00158d0001ab3f20 - - "5571" => "Grad-Bureau", - - "e4c0" => "Ch Parent Ben", // 000B57fffed2af6a - - "eb79" => "Sonnette", // 00158d00016d8d4f - - "fde8" => "Inconnu1", // 90:fd:9f:ff:fe:16:5c:2c 90fd9ffffe165c2c fut 0F7e - - "137f" => "Velux-SdB-Tour", // 00158d0001e4531b - "e311" => "Velux-Lulu", // fut 4c3a - - "c551" => "Old-Off-Network-1", // 00:0B:57:ff:fe:8d:70:73 - - - - // Abeille Test abeille - "c360" => "Test: Temperature Rond Bureau", // 00:15:8d:00:01:9f:91:99 fut df33 - "3b43" => "Test: Door V2 Bureau", // 00:15:8d:00:01:d8:6c:3e fut a008, fdb4 - "26a7" => "Test: Inondation Bureau", // 00:15:8d:00:01:bb:6b:49 00158d0001bb6b49 fut 7bd5 - "5b7a" => "Test: Bouton Carre V2 Bureau", // 00:15:8d:00:01:a6:6c:a3 00158d0001a66ca3 fut dcd9, de4d, d09c - "63b9" => "Test: Door V1 Bureau", // 00:15:8d:00:02:01:47:f9 00158d00020147f9 fut 3950 - "0113" => "Test: IR Pied Bureau", // 00:15:8d:00:01:dd:b1:f7 00158d0001ddb1f7 fut 5dea - "060B" => "Test: Interrupteur Rond", // 00:15:8d:00:01:f3:af:91 00158d0001f3af91 fut 4ebd - "745f" => "Test: Telecommande Ikea", // 00:0B:57:ff:fe:2c:82:e9 000B57fffe2c82e9 fut 633e, 0Ab5, 0Eb5, 76fb, d42d - "8dbb" => "Test: IR V0", // 00:15:8d:00:01:dc:15:88 fut c7c0 - "d45e" => "Test: Ampoule Z Bureau", // 90:fd:9f:ff:fe:69:13:1d 90fd9ffffe69131d - "ceb8" => "Test: Ampoule 2", // 00:0B:57:ff:fe:c0:07:b5 000B57fffec007b5 - "2389" => "Test: Detecteur Smoke", // 00:15:8d:00:01:b7:b2:a2 - "633e" => "Test: Old Address changed 1", // - "c1ba" => "Test: Wall Switch", // 00:15:8d:00:01:f4:6b:79 00158d0001f46b79 - AC Power - Rx When Idle = False - "5ba3" => "Test: NXP Color", // 00:15:8d:00:01:9a:1b:0e 00158d00019a1b0e - - ); - - - - $Abeilles = array( - 'Ruche' => array('position' => array( 'x'=>700, 'y'=>520), 'color'=>'red',), - // Abeille Prod JeedomZwave - // Terrasse - 'T1' => array('position' => array( 'x'=>300, 'y'=>450), 'color'=>'orange',), - 'T2' => array('position' => array( 'x'=>400, 'y'=>450), 'color'=>'orange',), - 'T3' => array('position' => array( 'x'=>450, 'y'=>350), 'color'=>'orange',), - 'T4' => array('position' => array( 'x'=>450, 'y'=>250), 'color'=>'orange',), - 'T5' => array('position' => array( 'x'=>500, 'y'=>200), 'color'=>'orange',), - 'T6' => array('position' => array( 'x'=>600, 'y'=>200), 'color'=>'orange',), - 'T7' => array('position' => array( 'x'=>625, 'y'=>450), 'color'=>'orange',), - 'T8' => array('position' => array( 'x'=>450, 'y'=>500), 'color'=>'orange',), - // Salon - 'Gauche' => array('position' => array( 'x'=>750, 'y'=>300), 'color'=>'orange',), - 'Milieu' => array('position' => array( 'x'=>650, 'y'=>300), 'color'=>'orange',), - 'Droite' => array('position' => array( 'x'=>650, 'y'=>350), 'color'=>'orange',), - 'Piano' => array('position' => array( 'x'=>720, 'y'=>400), 'color'=>'orange',), - - 'P-D' => array('position' => array( 'x'=>625, 'y'=>300), 'color'=>'grey',), - 'P-G' => array('position' => array( 'x'=>625, 'y'=>350), 'color'=>'grey',), - 'P-C' => array('position' => array( 'x'=>500, 'y'=>500), 'color'=>'grey',), - - 'P-Entree' => array('position' => array( 'x'=>625, 'y'=>700), 'color'=>'grey',), - - 'HueGo' => array('position' => array( 'x'=>650, 'y'=>480), 'color'=>'orange',), - 'PriseX1' => array('position' => array( 'x'=>325, 'y'=>525), 'color'=>'orange',), - 'PriseX2' => array('position' => array( 'x'=>750, 'y'=>450), 'color'=>'orange',), - 'PriseXTest' => array('position' => array( 'x'=>725, 'y'=>300), 'color'=>'orange',), - - 'Bois' => array('position' => array( 'x'=>700, 'y'=>480), 'color'=>'orange',), - 'Grad-Bureau' => array('position' => array( 'x'=>700, 'y'=>500), 'color'=>'green',), - - 'IR' => array('position' => array( 'x'=>750, 'y'=>480), 'color'=>'grey',), - 'Temperature Bureau' => array('position' => array( 'x'=>750, 'y'=>500), 'color'=>'grey',), - 'Porte Bureau' => array('position' => array( 'x'=>750, 'y'=>520), 'color'=>'grey',), - - - 'Fenetre SdB G' => array('position' => array( 'x'=>800, 'y'=>400), 'color'=>'grey',), - 'Fenetre SdB D' => array('position' => array( 'x'=>800, 'y'=>425), 'color'=>'grey',), - - - - 'Ch Parent Ben' => array('position' => array( 'x'=>650, 'y'=>275), 'color'=>'yellow',), - - 'Sonnette' => array('position' => array( 'x'=>625, 'y'=>650), 'color'=>'grey',), - - 'Velux-SdB-Tour' => array('position' => array( 'x'=>300, 'y'=>525), 'color'=>'grey',), - 'Velux-Lulu' => array('position' => array( 'x'=>300, 'y'=>575), 'color'=>'grey',), - - 'Inconnu1' => array('position' => array( 'x'=>900, 'y'=>75), 'color'=>'purple',), - 'Old-Off-Network-1' => array('position' => array( 'x'=>900, 'y'=>100), 'color'=>'purple',), - - - // Abeille Test abeille - "Test: Temperature Rond Bureau" => array('position' => array( 'x'=>100, 'y'=>100), 'color'=>'grey',), - "Test: Door V2 Bureau" => array('position' => array( 'x'=>100, 'y'=>150), 'color'=>'grey',), - "Test: Inondation Bureau" => array('position' => array( 'x'=>100, 'y'=>200), 'color'=>'grey',), - "Test: Bouton Carre V2 Bureau" => array('position' => array( 'x'=>100, 'y'=>250), 'color'=>'grey',), - "Test: Door V1 Bureau" => array('position' => array( 'x'=>100, 'y'=>300), 'color'=>'grey',), - "Test: IR Pied Bureau" => array('position' => array( 'x'=>100, 'y'=>350), 'color'=>'grey',), - "Test: Interrupteur Rond" => array('position' => array( 'x'=>100, 'y'=>400), 'color'=>'grey',), - "Test: Telecommande Ikea" => array('position' => array( 'x'=>100, 'y'=>450), 'color'=>'grey',), - "Test: RI V0" => array('position' => array( 'x'=>100, 'y'=>500), 'color'=>'grey',), - "Test: Ampoule Z Bureau" => array('position' => array( 'x'=>050, 'y'=>525), 'color'=>'orange',), - "Test: Ampoule 2" => array('position' => array( 'x'=>150, 'y'=>575), 'color'=>'orange',), - "Test: NXP Color" => array('position' => array( 'x'=>250, 'y'=>550), 'color'=>'orange',), - "Test: Detecteur Smoke" => array('position' => array( 'x'=>100, 'y'=>600), 'color'=>'grey',), - - "Test: Old Address changed 1" => array('position' => array( 'x'=>900, 'y'=>600), 'color'=>'purple',), - "Test: Wall Switch" => array('position' => array( 'x'=>50, 'y'=>700), 'color'=>'orange',), - ); - - // $liaisonsRadio = array( - // 'Ruche-T3' => array( 'source'=>'Ruche', 'destination'=>'T3' ), - // 'T3-T5' => array( 'source'=>'T3', 'destination'=>'T5' ), - // 'T3-Ruche' => array( 'source'=>'T3', 'destination'=>'Ruche' ), - // ); - ?> - - - diff --git a/resources/archives/RadioTraffic.php b/resources/archives/RadioTraffic.php deleted file mode 100644 index d28415596f..0000000000 --- a/resources/archives/RadioTraffic.php +++ /dev/null @@ -1,187 +0,0 @@ - $subarr) { - foreach ($subarr as $subkey => $subvalue) { - echo $subvalue." "; - } - echo "\n"; - } - return $out; - } - - $listOfNE = array(); - $trafficsMap = array(); - $listOfMACTraffic[] = array(); - $listOfNWKTraffic[] = array(); - - - - $traffics = Traffics::getDataFromJson('essai.json'); - - // echo "items:\n"; - // print_r($traffics); - - foreach ($traffics as $key => $NE){ - //commandes - if ( isset( $NE['_source']['layers']['wpan']['wpan.dst16'] ) ) - { - if ( $NE['_source']['layers']['wpan']['wpan.dst16']!="0x0000ffff" ) - { - // print_r($NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']); - - // echo "src: " . $NE['_source']['layers']['zbee_nwk']['zbee_nwk.src'] . "\n"; - $srcMAC = substr( $NE['_source']['layers']['wpan']['wpan.src16'], -4 ); - $dstMAC = substr( $NE['_source']['layers']['wpan']['wpan.dst16'], -4 ); - - $listOfMACTraffic[] = array( $srcMAC => $dstMAC ); - - if ( isset($NE['_source']['layers']['zbee_nwk']['zbee_nwk.dst']) ) { - if ( $NE['_source']['layers']['zbee_nwk']['zbee_nwk.dst']!="0x0000fffc" ){ - $srcNWK = substr( $NE['_source']['layers']['zbee_nwk']['zbee_nwk.src'], -4 ); - $dstNWK = substr( $NE['_source']['layers']['zbee_nwk']['zbee_nwk.dst'], -4 ); - - $listOfNWKTraffic[] = array( $srcNWK => $dstNWK ); - - $Packet[] = array( array( $srcMAC, $dstMAC ), array( $srcMAC, $dstNWK ) ); - } - } - - - - if (0) { - // echo "src IEEE: " . $NE['_source']['layers']['zbee_nwk']['zbee_nwk.src64'] . "\n"; - - // echo "dst: " . $NE['_source']['layers']['zbee_nwk']['zbee_nwk.dst'] . "\n"; - - // print_r($NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']); - - $link_status = $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']; - - // echo "Link_Status: \n"; - // print_r( $link_status ); - - foreach ($link_status as $key => $link){ - - if ( substr( $key, 0, 4) == "Link" ) - { - //echo "Target: " . $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.address'] . "\n"; - - // $target = substr( $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.address'], -4 ); - $target = substr( $link['zbee_nwk.cmd.link.address'], -4 ); - $listOfNE[] = $target; - - // echo "->".substr( $key, 0, 4)."<-\n"; - //echo "Incoming Cost: " . $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.incoming_cost'] . "\n"; - // echo "Incoming Cost: " . $link['zbee_nwk.cmd.link.incoming_cost'] . "\n"; - //echo "Outgoing Cost: " . $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.outgoing_cost'] . "\n"; - // echo "Incoming Cost: " . $link['zbee_nwk.cmd.link.outgoing_cost'] . "\n"; - - // $trafficsMap[$src][$target]['In'] = $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.incoming_cost']; - $trafficsMap[$src][$target]['In'] = $link['zbee_nwk.cmd.link.incoming_cost']; - // $trafficsMap[$src][$target]['Out'] = $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.outgoing_cost']; - $trafficsMap[$src][$target]['Out'] = $link['zbee_nwk.cmd.link.outgoing_cost']; - } - } - } - } - } - } - - // print_r( $listOfMACTraffic ); - - // print_r( $listOfNWKTraffic ); - - if (0) { - // print_r( $trafficsMap ); - // print_r( $listOfNE ); - $listOfNE = array_unique( $listOfNE ); - sort( $listOfNE ); - // print_r( $listOfNE ); - - echo "\n"; - - echo "In "; - foreach ( $listOfNE as $NE_Trg ) - { - echo $NE_Trg." "; - } - echo "\n"; - foreach ( $listOfNE as $NE_Src ) - { - echo $NE_Src.""; - foreach ( $listOfNE as $NE_Trg ) - { - if ( isset($trafficsMap[$NE_Src][$NE_Trg]['In']) ) { echo " ".$trafficsMap[$NE_Src][$NE_Trg]['In']; } else { echo " "; } - } - echo " ".$knownNE[$NE_Src]."\n"; - } - - echo "\n"; - - - echo "Out "; - foreach ( $listOfNE as $NE_Trg ) - { - echo $NE_Trg." "; - } - echo "\n"; - foreach ( $listOfNE as $NE_Src ) - { - echo $NE_Src.""; - foreach ( $listOfNE as $NE_Trg ) - { - if ( isset($trafficsMap[$NE_Src][$NE_Trg]['Out']) ) { echo " ".$trafficsMap[$NE_Src][$NE_Trg]['Out']; } else { echo " "; } - } - echo " ".$knownNE[$NE_Src]."\n"; - } - - print_r( $trafficsMap ); echo "\n"; - } - ?> - - - diff --git a/resources/archives/RadioTrafficMap.php b/resources/archives/RadioTrafficMap.php deleted file mode 100644 index 0fa3858238..0000000000 --- a/resources/archives/RadioTrafficMap.php +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - -

Abeille Network

- -
- - - - -
- - - - - - - - -On dessine un triangle plein - - - - - - - -L ordre d affichage est important - -Maison - - - - - -Abeilles - - $Abeille ) { - echo $AbeilleId . "\n"; - echo ''."\n"; - echo ' '.$AbeilleId .' '."\n"; - } - ?> - -Liaisons Radio - -M pour move to -L pour Line to - $liaisonRadio ) { - // echo ''."\n"; - // } - - - // $voisinesMap - - foreach ( $listOfMACTraffic as $SrcDst ) { - - // print_r( $SrcDst ); - - foreach ( $SrcDst as $Src => $Dst ) { - $sourceIdName = $knownNE[$Src]; - $targetIdName = $knownNE[$Dst]; - // echo $sourceIdName . ' - ' . $targetIdName; echo "\n"; - if ($sourceIdName!=$targetIdName){ - if ( ($sourceIdName==$NE) || ("All"==$NE) || ($sourceIdName==$NE2) ) { - echo ''."\n"; - $midX = ( $Abeilles[$sourceIdName]['position']['x'] + $Abeilles[$targetIdName]['position']['x'] ) / 2; - $midY = ( $Abeilles[$sourceIdName]['position']['y'] + $Abeilles[$targetIdName]['position']['y'] ) / 2; - // echo ''.$link[$InOut].''."\n"; - - // print_r( $InOut ); - // print_r( $link ); - } - } - } - } - ?> - - - - - -Sorry, your browser does not support inline SVG. - - - - - diff --git a/resources/archives/RadioVoisines.php b/resources/archives/RadioVoisines.php deleted file mode 100644 index 0152ba4b2f..0000000000 --- a/resources/archives/RadioVoisines.php +++ /dev/null @@ -1,166 +0,0 @@ - $subarr) { - foreach ($subarr as $subkey => $subvalue) { - echo $subvalue." "; - } - echo "\n"; - } - return $out; - } - - $listOfNE = array(); - $voisinesMap = array(); - - - - - - $voisines = Voisines::getDataFromJson('essai.json'); - - // echo "items:\n"; - // print_r($voisines); - - foreach ($voisines as $key => $NE){ - //commandes - if ( isset( $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status'] ) ) - { - if ( $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['zbee_nwk.cmd.id'] == "0x00000008" ) - { - // print_r($NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']); - - // echo "src: " . $NE['_source']['layers']['zbee_nwk']['zbee_nwk.src'] . "\n"; - $src = substr( $NE['_source']['layers']['zbee_nwk']['zbee_nwk.src'], -4 ); - $listOfNE[] = $src; - - // echo "src IEEE: " . $NE['_source']['layers']['zbee_nwk']['zbee_nwk.src64'] . "\n"; - - // echo "dst: " . $NE['_source']['layers']['zbee_nwk']['zbee_nwk.dst'] . "\n"; - - // print_r($NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']); - - $link_status = $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']; - - // echo "Link_Status: \n"; - // print_r( $link_status ); - - foreach ($link_status as $key => $link){ - - if ( substr( $key, 0, 4) == "Link" ) - { - //echo "Target: " . $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.address'] . "\n"; - - // $target = substr( $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.address'], -4 ); - $target = substr( $link['zbee_nwk.cmd.link.address'], -4 ); - $listOfNE[] = $target; - - // echo "->".substr( $key, 0, 4)."<-\n"; - //echo "Incoming Cost: " . $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.incoming_cost'] . "\n"; - // echo "Incoming Cost: " . $link['zbee_nwk.cmd.link.incoming_cost'] . "\n"; - //echo "Outgoing Cost: " . $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.outgoing_cost'] . "\n"; - // echo "Incoming Cost: " . $link['zbee_nwk.cmd.link.outgoing_cost'] . "\n"; - - // $voisinesMap[$src][$target]['In'] = $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.incoming_cost']; - $voisinesMap[$src][$target]['In'] = $link['zbee_nwk.cmd.link.incoming_cost']; - // $voisinesMap[$src][$target]['Out'] = $NE['_source']['layers']['zbee_nwk']['Command Frame: Link Status']['Link 1']['zbee_nwk.cmd.link.outgoing_cost']; - $voisinesMap[$src][$target]['Out'] = $link['zbee_nwk.cmd.link.outgoing_cost']; - } - } - } - } - } - - if (0) { - // print_r( $voisinesMap ); - // print_r( $listOfNE ); - $listOfNE = array_unique( $listOfNE ); - sort( $listOfNE ); - // print_r( $listOfNE ); - - echo "\n"; - - echo "In "; - foreach ( $listOfNE as $NE_Trg ) - { - echo $NE_Trg." "; - } - echo "\n"; - foreach ( $listOfNE as $NE_Src ) - { - echo $NE_Src.""; - foreach ( $listOfNE as $NE_Trg ) - { - if ( isset($voisinesMap[$NE_Src][$NE_Trg]['In']) ) { echo " ".$voisinesMap[$NE_Src][$NE_Trg]['In']; } else { echo " "; } - } - echo " ".$knownNE[$NE_Src]."\n"; - } - - echo "\n"; - - - echo "Out "; - foreach ( $listOfNE as $NE_Trg ) - { - echo $NE_Trg." "; - } - echo "\n"; - foreach ( $listOfNE as $NE_Src ) - { - echo $NE_Src.""; - foreach ( $listOfNE as $NE_Trg ) - { - if ( isset($voisinesMap[$NE_Src][$NE_Trg]['Out']) ) { echo " ".$voisinesMap[$NE_Src][$NE_Trg]['Out']; } else { echo " "; } - } - echo " ".$knownNE[$NE_Src]."\n"; - } - - print_r( $voisinesMap ); echo "\n"; - } - ?> - - - diff --git a/resources/archives/RadioVoisinesMap.php b/resources/archives/RadioVoisinesMap.php deleted file mode 100644 index 7e9c2757e5..0000000000 --- a/resources/archives/RadioVoisinesMap.php +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - -

Abeille Network

- -
- - - - -
- - - - - - - - -On dessine un triangle plein - - - - - - - -L ordre d affichage est important - -Maison - - - - - -Abeilles - - $Abeille ) { - echo $AbeilleId . "\n"; - echo ''."\n"; - echo ' '.$AbeilleId .' '."\n"; - } - ?> - -Liaisons Radio - -M pour move to -L pour Line to - $liaisonRadio ) { - // echo ''."\n"; - // } - - - // $voisinesMap - - foreach ( $voisinesMap as $sourceId => $voisine ) { - - foreach ( $voisine as $targetId => $link ) { - $sourceIdName = $knownNE[$sourceId]; - $targetIdName = $knownNE[$targetId]; - echo $sourceIdName . ' - ' . $targetIdName; echo "\n"; - if ($sourceIdName!=$targetIdName){ - if ( ($sourceIdName==$NE) || ("All"==$NE) || ($sourceIdName==$NE2) ) { - echo ''."\n"; - $midX = ( $Abeilles[$sourceIdName]['position']['x'] + $Abeilles[$targetIdName]['position']['x'] ) / 2; - $midY = ( $Abeilles[$sourceIdName]['position']['y'] + $Abeilles[$targetIdName]['position']['y'] ) / 2; - echo ''.$link[$InOut].''."\n"; - - print_r( $InOut ); - print_r( $link ); - } - } - } - } - ?> - - - - - -Sorry, your browser does not support inline SVG. - - - - - diff --git a/resources/archives/RouteRecord.json b/resources/archives/RouteRecord.json deleted file mode 100644 index 45cd749bea..0000000000 --- a/resources/archives/RouteRecord.json +++ /dev/null @@ -1,7526 +0,0 @@ -[ - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 21:59:53.716336000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "75593.716336000", - "frame.time_delta": "0.008224000", - "frame.time_delta_displayed": "0.000000000", - "frame.time_relative": "395.402283000", - "frame.number": "746", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "232", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000cb51", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "88", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "644904", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "c9:cb:31:c6", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 21:59:53.720176000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "75593.720176000", - "frame.time_delta": "0.001696000", - "frame.time_delta_displayed": "0.003840000", - "frame.time_relative": "395.406123000", - "frame.number": "748", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "233", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000ada9", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "90", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "644905", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "ec:38:0e:00", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:00:56.055024000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "75656.055024000", - "frame.time_delta": "0.002192000", - "frame.time_delta_displayed": "62.334848000", - "frame.time_relative": "457.740971000", - "frame.number": "871", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "240", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00006c78", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "97", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "644912", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "d1:ab:ce:35", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:14:53.733360000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "76493.733360000", - "frame.time_delta": "0.006368000", - "frame.time_delta_displayed": "837.678336000", - "frame.time_relative": "1295.419307000", - "frame.number": "2157", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "54", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00003395", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "151", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "644982", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "aa:db:41:01", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:14:53.739120000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "76493.739120000", - "frame.time_delta": "0.003616000", - "frame.time_delta_displayed": "0.005760000", - "frame.time_relative": "1295.425067000", - "frame.number": "2159", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "55", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00006e43", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "153", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "644983", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "8f:c8:a9:65", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:24:27.799504000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "77067.799504000", - "frame.time_delta": "0.002464000", - "frame.time_delta_displayed": "574.060384000", - "frame.time_relative": "1869.485451000", - "frame.number": "2850", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "95", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000ccc3", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x0000345f", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "62", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:e4:4e:ce", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645023", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "5f:24:1d:5f", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:29:53.076352000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "77393.076352000", - "frame.time_delta": "0.007648000", - "frame.time_delta_displayed": "325.276848000", - "frame.time_relative": "2194.762299000", - "frame.number": "3977", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "150", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00004749", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "216", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645078", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "b0:94:bf:ae", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:29:53.082112000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "77393.082112000", - "frame.time_delta": "0.003616000", - "frame.time_delta_displayed": "0.005760000", - "frame.time_relative": "2194.768059000", - "frame.number": "3979", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "151", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000425e", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "218", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645079", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "4b:2d:7f:b3", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:30:14.464224000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "77414.464224000", - "frame.time_delta": "0.012768000", - "frame.time_delta_displayed": "21.382112000", - "frame.time_relative": "2216.150171000", - "frame.number": "4042", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "156", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x000008ba", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "99", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645084", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "62:99:a9:36", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:30:14.468704000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "77414.468704000", - "frame.time_delta": "0.002272000", - "frame.time_delta_displayed": "0.004480000", - "frame.time_relative": "2216.154651000", - "frame.number": "4044", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "157", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000f75a", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "100", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645085", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "a4:f4:aa:c7", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:42:47.923648000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78167.923648000", - "frame.time_delta": "0.003920000", - "frame.time_delta_displayed": "753.454944000", - "frame.time_relative": "2969.609595000", - "frame.number": "5024", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "227", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000c98e", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "101", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645155", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "05:2f:3e:56", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:42:47.944448000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78167.944448000", - "frame.time_delta": "0.010848000", - "frame.time_delta_displayed": "0.020800000", - "frame.time_relative": "2969.630395000", - "frame.number": "5030", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "228", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00004a76", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "102", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645156", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "b4:b5:4d:3b", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:42:47.953088000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78167.953088000", - "frame.time_delta": "0.006432000", - "frame.time_delta_displayed": "0.008640000", - "frame.time_relative": "2969.639035000", - "frame.number": "5032", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "229", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00002d5d", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "103", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645157", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "fd:cc:77:eb", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:42:58.236784000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78178.236784000", - "frame.time_delta": "0.001824000", - "frame.time_delta_displayed": "10.283696000", - "frame.time_relative": "2979.922731000", - "frame.number": "5061", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "234", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000672f", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "104", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645162", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "0f:73:2f:5e", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:42:58.241264000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78178.241264000", - "frame.time_delta": "0.004480000", - "frame.time_delta_displayed": "0.004480000", - "frame.time_relative": "2979.927211000", - "frame.number": "5062", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "234", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000672f", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "104", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645162", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "0f:73:2f:5e", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:42:58.244784000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78178.244784000", - "frame.time_delta": "0.001312000", - "frame.time_delta_displayed": "0.003520000", - "frame.time_relative": "2979.930731000", - "frame.number": "5064", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "235", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x000093c7", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "105", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645163", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "90:d9:81:70", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:42:58.257264000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78178.257264000", - "frame.time_delta": "0.012480000", - "frame.time_delta_displayed": "0.012480000", - "frame.time_relative": "2979.943211000", - "frame.number": "5065", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "235", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x000093c7", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "105", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645163", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "90:d9:81:70", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:42:58.261744000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78178.261744000", - "frame.time_delta": "0.004480000", - "frame.time_delta_displayed": "0.004480000", - "frame.time_relative": "2979.947691000", - "frame.number": "5066", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "236", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00008b9c", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "106", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645164", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "55:34:41:88", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:42:58.306864000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78178.306864000", - "frame.time_delta": "0.016192000", - "frame.time_delta_displayed": "0.045120000", - "frame.time_relative": "2979.992811000", - "frame.number": "5075", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "240", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x000017a7", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "105", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645168", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "c7:6b:2d:67", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:44:53.653776000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78293.653776000", - "frame.time_delta": "0.011408000", - "frame.time_delta_displayed": "115.346912000", - "frame.time_relative": "3095.339723000", - "frame.number": "5543", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "8", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x000068ec", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "31", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645192", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "96:89:ad:9d", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:44:53.658256000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78293.658256000", - "frame.time_delta": "0.002336000", - "frame.time_delta_displayed": "0.004480000", - "frame.time_relative": "3095.344203000", - "frame.number": "5545", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "9", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00006ab2", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "33", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645193", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "82:a9:9a:a6", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:44:53.662736000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "78293.662736000", - "frame.time_delta": "0.004480000", - "frame.time_delta_displayed": "0.004480000", - "frame.time_relative": "3095.348683000", - "frame.number": "5546", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "9", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00006ab2", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "33", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645193", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "82:a9:9a:a6", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:59:32.743536000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "79172.743536000", - "frame.time_delta": "0.002768000", - "frame.time_delta_displayed": "879.080800000", - "frame.time_relative": "3974.429483000", - "frame.number": "6856", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "80", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000a0d6", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "107", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645264", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "34:a1:2d:94", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:59:53.141024000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "79193.141024000", - "frame.time_delta": "0.007360000", - "frame.time_delta_displayed": "20.397488000", - "frame.time_relative": "3994.826971000", - "frame.number": "6957", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "86", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000d976", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "93", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645270", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "9e:b9:9d:6b", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 22:59:53.146144000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "79193.146144000", - "frame.time_delta": "0.002992000", - "frame.time_delta_displayed": "0.005120000", - "frame.time_relative": "3994.832091000", - "frame.number": "6959", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "87", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00005ce4", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "95", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645271", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "e6:29:44:90", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:14:17.305152000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "80057.305152000", - "frame.time_delta": "0.001680000", - "frame.time_delta_displayed": "864.159008000", - "frame.time_relative": "4858.991099000", - "frame.number": "8246", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "153", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000902c", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "108", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645337", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "61:b7:fc:8b", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:14:17.327232000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "80057.327232000", - "frame.time_delta": "0.003488000", - "frame.time_delta_displayed": "0.022080000", - "frame.time_relative": "4859.013179000", - "frame.number": "8253", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "153", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000902c", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "108", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645337", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "61:b7:fc:8b", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:14:17.332032000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "80057.332032000", - "frame.time_delta": "0.002592000", - "frame.time_delta_displayed": "0.004800000", - "frame.time_relative": "4859.017979000", - "frame.number": "8255", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "154", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000872c", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "109", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645338", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "c2:8c:bf:f2", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:14:17.336192000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "80057.336192000", - "frame.time_delta": "0.001952000", - "frame.time_delta_displayed": "0.004160000", - "frame.time_relative": "4859.022139000", - "frame.number": "8257", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "155", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00001c8c", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "110", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645339", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "46:37:44:b7", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:14:39.274128000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "80079.274128000", - "frame.time_delta": "0.002016000", - "frame.time_delta_displayed": "21.937936000", - "frame.time_relative": "4880.960075000", - "frame.number": "8432", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "166", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000578a", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x0000345f", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "63", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:e4:4e:ce", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645350", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "9f:93:56:6b", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:14:54.217936000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "80094.217936000", - "frame.time_delta": "0.006176000", - "frame.time_delta_displayed": "14.943808000", - "frame.time_relative": "4895.903883000", - "frame.number": "8569", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "174", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x000060a1", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "159", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645358", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "b6:e0:cb:87", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:14:54.223696000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "80094.223696000", - "frame.time_delta": "0.003616000", - "frame.time_delta_displayed": "0.005760000", - "frame.time_relative": "4895.909643000", - "frame.number": "8571", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "175", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000b660", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "161", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645359", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "85:c3:43:fd", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:39:24.044672000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "81564.044672000", - "frame.time_delta": "0.008640000", - "frame.time_delta_displayed": "1469.820976000", - "frame.time_relative": "6365.730619000", - "frame.number": "10888", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "61", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00006fd4", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "111", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645501", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "e6:ff:53:8f", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:39:24.049152000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "81564.049152000", - "frame.time_delta": "0.004480000", - "frame.time_delta_displayed": "0.004480000", - "frame.time_relative": "6365.735099000", - "frame.number": "10889", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "61", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00006fd4", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "111", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645501", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "e6:ff:53:8f", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:39:24.054912000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "81564.054912000", - "frame.time_delta": "0.003552000", - "frame.time_delta_displayed": "0.005760000", - "frame.time_relative": "6365.740859000", - "frame.number": "10891", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "62", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000733f", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "112", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645502", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "34:9c:f4:eb", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:39:24.059072000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "81564.059072000", - "frame.time_delta": "0.001952000", - "frame.time_delta_displayed": "0.004160000", - "frame.time_relative": "6365.745019000", - "frame.number": "10893", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "63", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000f05d", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "113", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645503", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "6a:24:b5:14", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:44:54.564368000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "81894.564368000", - "frame.time_delta": "0.006304000", - "frame.time_delta_displayed": "330.505296000", - "frame.time_relative": "6696.250315000", - "frame.number": "11697", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "111", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000eeff", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "27", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645551", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "51:b8:09:9c", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:44:54.568208000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "81894.568208000", - "frame.time_delta": "0.001696000", - "frame.time_delta_displayed": "0.003840000", - "frame.time_relative": "6696.254155000", - "frame.number": "11699", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "112", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000c3ba", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "29", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645552", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "44:34:a0:bd", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:54:18.114512000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "82458.114512000", - "frame.time_delta": "0.003568000", - "frame.time_delta_displayed": "563.546304000", - "frame.time_relative": "7259.800459000", - "frame.number": "12661", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "195", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00003500", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "114", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645635", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "39:d5:e1:8c", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:59:53.228384000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "82793.228384000", - "frame.time_delta": "0.008272000", - "frame.time_delta_displayed": "335.113872000", - "frame.time_relative": "7594.914331000", - "frame.number": "13426", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "232", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000b5ee", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "89", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645672", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "c6:31:12:a0", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 23:59:53.233504000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "82793.233504000", - "frame.time_delta": "0.002960000", - "frame.time_delta_displayed": "0.005120000", - "frame.time_relative": "7594.919451000", - "frame.number": "13428", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "233", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x000005e0", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "91", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645673", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "48:38:0a:b2", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:00:00.315968000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "82800.315968000", - "frame.time_delta": "0.001328000", - "frame.time_delta_displayed": "7.082464000", - "frame.time_relative": "7602.001915000", - "frame.number": "13459", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "236", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000422d", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "115", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645676", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "76:f2:ee:7e", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:00:00.325568000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "82800.325568000", - "frame.time_delta": "0.004224000", - "frame.time_delta_displayed": "0.009600000", - "frame.time_relative": "7602.011515000", - "frame.number": "13463", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "237", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00000e64", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "116", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645677", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "41:13:d0:7f", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:00:00.331328000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "82800.331328000", - "frame.time_delta": "0.003536000", - "frame.time_delta_displayed": "0.005760000", - "frame.time_relative": "7602.017275000", - "frame.number": "13465", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "238", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000bb53", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "117", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645678", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "41:e6:32:4b", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:04:52.499552000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "83092.499552000", - "frame.time_delta": "0.002864000", - "frame.time_delta_displayed": "292.168224000", - "frame.time_relative": "7894.185499000", - "frame.number": "13832", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "5", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00005b9b", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x0000345f", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "64", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:e4:4e:ce", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645701", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "8f:06:d9:49", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:04:52.503072000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "83092.503072000", - "frame.time_delta": "0.003520000", - "frame.time_delta_displayed": "0.003520000", - "frame.time_relative": "7894.189019000", - "frame.number": "13833", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "5", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00005b9b", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x0000345f", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "64", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:e4:4e:ce", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645701", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "8f:06:d9:49", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:15:00.565936000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "83700.565936000", - "frame.time_delta": "0.007536000", - "frame.time_delta_displayed": "608.062864000", - "frame.time_relative": "8502.251883000", - "frame.number": "15291", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "99", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x000016ab", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "154", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645795", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "86:97:50:4d", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:15:00.571696000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "83700.571696000", - "frame.time_delta": "0.003616000", - "frame.time_delta_displayed": "0.005760000", - "frame.time_relative": "8502.257643000", - "frame.number": "15293", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "100", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000008d", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "156", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645796", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "7b:60:f0:b7", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:20:45.939200000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84045.939200000", - "frame.time_delta": "0.006976000", - "frame.time_delta_displayed": "345.367504000", - "frame.time_relative": "8847.625147000", - "frame.number": "15777", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "125", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x000081c9", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "118", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645821", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "9d:9c:7c:94", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:20:45.944960000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84045.944960000", - "frame.time_delta": "0.003536000", - "frame.time_delta_displayed": "0.005760000", - "frame.time_relative": "8847.630907000", - "frame.number": "15779", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "126", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000ec28", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "119", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645822", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "f9:9d:f3:f6", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:20:45.948800000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84045.948800000", - "frame.time_delta": "0.001616000", - "frame.time_delta_displayed": "0.003840000", - "frame.time_relative": "8847.634747000", - "frame.number": "15781", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "127", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000bdc2", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "120", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645823", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "c4:7c:f4:22", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.942976000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.942976000", - "frame.time_delta": "0.005952000", - "frame.time_delta_displayed": "552.994176000", - "frame.time_relative": "9400.628923000", - "frame.number": "17096", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "201", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000e313", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "218", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645897", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "6e:c9:67:8a", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.947136000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.947136000", - "frame.time_delta": "0.004160000", - "frame.time_delta_displayed": "0.004160000", - "frame.time_relative": "9400.633083000", - "frame.number": "17097", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "201", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000e313", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "218", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645897", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "6e:c9:67:8a", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.951296000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.951296000", - "frame.time_delta": "0.004160000", - "frame.time_delta_displayed": "0.004160000", - "frame.time_relative": "9400.637243000", - "frame.number": "17098", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "201", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000e313", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "218", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645897", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "6e:c9:67:8a", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.954496000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.954496000", - "frame.time_delta": "0.003200000", - "frame.time_delta_displayed": "0.003200000", - "frame.time_relative": "9400.640443000", - "frame.number": "17099", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "201", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000e313", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "218", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645897", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "6e:c9:67:8a", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.963776000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.963776000", - "frame.time_delta": "0.004608000", - "frame.time_delta_displayed": "0.009280000", - "frame.time_relative": "9400.649723000", - "frame.number": "17102", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "202", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000a7d6", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "220", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645898", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "1c:c2:a2:b8", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.972416000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.972416000", - "frame.time_delta": "0.003824000", - "frame.time_delta_displayed": "0.008640000", - "frame.time_relative": "9400.658363000", - "frame.number": "17104", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "202", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000a7d6", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "220", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645898", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "1c:c2:a2:b8", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.976576000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.976576000", - "frame.time_delta": "0.004160000", - "frame.time_delta_displayed": "0.004160000", - "frame.time_relative": "9400.662523000", - "frame.number": "17105", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "202", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000a7d6", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "220", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645898", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "1c:c2:a2:b8", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.981056000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.981056000", - "frame.time_delta": "0.004480000", - "frame.time_delta_displayed": "0.004480000", - "frame.time_relative": "9400.667003000", - "frame.number": "17106", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "203", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000f150", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "218", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645899", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "fb:10:65:62", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.985536000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.985536000", - "frame.time_delta": "0.004480000", - "frame.time_delta_displayed": "0.004480000", - "frame.time_relative": "9400.671483000", - "frame.number": "17107", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "203", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000f150", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "218", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645899", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "fb:10:65:62", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.992256000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.992256000", - "frame.time_delta": "0.002112000", - "frame.time_delta_displayed": "0.006720000", - "frame.time_relative": "9400.678203000", - "frame.number": "17110", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "203", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000f150", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "218", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645899", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "fb:10:65:62", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:58.997680000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84598.997680000", - "frame.time_delta": "0.005424000", - "frame.time_delta_displayed": "0.005424000", - "frame.time_relative": "9400.683627000", - "frame.number": "17111", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "203", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000f150", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "218", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645899", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "fb:10:65:62", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:59.030640000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84599.030640000", - "frame.time_delta": "0.004944000", - "frame.time_delta_displayed": "0.032960000", - "frame.time_relative": "9400.716587000", - "frame.number": "17119", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "206", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x000080ad", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "220", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645902", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "59:17:61:a1", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:29:59.034800000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "84599.034800000", - "frame.time_delta": "0.002000000", - "frame.time_delta_displayed": "0.004160000", - "frame.time_relative": "9400.720747000", - "frame.number": "17121", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "207", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00004970", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "218", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645903", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "63:0e:99:33", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:42:11.716960000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "85331.716960000", - "frame.time_delta": "0.001136000", - "frame.time_delta_displayed": "732.682160000", - "frame.time_relative": "10133.402907000", - "frame.number": "18338", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "17", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000f107", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "121", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645969", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "fe:3d:fb:82", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:42:11.731680000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "85331.731680000", - "frame.time_delta": "0.009040000", - "frame.time_delta_displayed": "0.014720000", - "frame.time_relative": "10133.417627000", - "frame.number": "18342", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "18", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00003942", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "122", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645970", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "ec:a7:63:e5", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:42:11.736160000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "85331.736160000", - "frame.time_delta": "0.002256000", - "frame.time_delta_displayed": "0.004480000", - "frame.time_relative": "10133.422107000", - "frame.number": "18344", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "19", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00000734", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "123", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "645971", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "5c:66:dd:73", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:44:58.674448000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "85498.674448000", - "frame.time_delta": "0.006416000", - "frame.time_delta_displayed": "166.938288000", - "frame.time_relative": "10300.360395000", - "frame.number": "19075", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "50", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000b7c3", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "26", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646002", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "86:47:8b:70", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:44:58.678288000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "85498.678288000", - "frame.time_delta": "0.001696000", - "frame.time_delta_displayed": "0.003840000", - "frame.time_relative": "10300.364235000", - "frame.number": "19077", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "51", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000c8bd", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "28", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646003", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "d0:85:58:49", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:52:34.648624000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "85954.648624000", - "frame.time_delta": "0.003488000", - "frame.time_delta_displayed": "455.970336000", - "frame.time_relative": "10756.334571000", - "frame.number": "19731", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "85", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00005efe", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "124", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646037", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "40:45:1b:00", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:55:04.014016000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "86104.014016000", - "frame.time_delta": "0.002368000", - "frame.time_delta_displayed": "149.365392000", - "frame.time_relative": "10905.699963000", - "frame.number": "19954", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "99", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000377d", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x0000345f", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "65", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:e4:4e:ce", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646051", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "7e:f8:00:af", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:59:58.062320000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "86398.062320000", - "frame.time_delta": "0.007632000", - "frame.time_delta_displayed": "294.048304000", - "frame.time_relative": "11199.748267000", - "frame.number": "20681", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "134", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000f240", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "89", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646086", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "45:e7:c1:13", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 00:59:58.066480000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "86398.066480000", - "frame.time_delta": "0.002016000", - "frame.time_delta_displayed": "0.004160000", - "frame.time_relative": "11199.752427000", - "frame.number": "20683", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "135", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00000d85", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "91", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646087", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "ae:b5:2b:04", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:19:32.364944000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "87572.364944000", - "frame.time_delta": "0.007440000", - "frame.time_delta_displayed": "1174.298464000", - "frame.time_relative": "12374.050891000", - "frame.number": "22939", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "250", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00004852", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "125", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646202", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "20:bd:58:4b", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:19:32.369744000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "87572.369744000", - "frame.time_delta": "0.002592000", - "frame.time_delta_displayed": "0.004800000", - "frame.time_relative": "12374.055691000", - "frame.number": "22941", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "251", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00004f07", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "126", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646203", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "55:65:49:86", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:19:32.373904000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "87572.373904000", - "frame.time_delta": "0.001952000", - "frame.time_delta_displayed": "0.004160000", - "frame.time_relative": "12374.059851000", - "frame.number": "22943", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "252", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000be12", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "127", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646204", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "de:47:92:50", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:29:59.130784000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "88199.130784000", - "frame.time_delta": "0.007232000", - "frame.time_delta_displayed": "626.756880000", - "frame.time_relative": "13000.816731000", - "frame.number": "24050", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "52", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000fa0d", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "213", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646260", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "26:5a:b4:4a", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:29:59.134304000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "88199.134304000", - "frame.time_delta": "0.001392000", - "frame.time_delta_displayed": "0.003520000", - "frame.time_relative": "13000.820251000", - "frame.number": "24052", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "53", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000f784", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "215", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646261", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "b9:10:58:e7", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:45:15.998448000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "89115.998448000", - "frame.time_delta": "0.002032000", - "frame.time_delta_displayed": "916.864144000", - "frame.time_relative": "13917.684395000", - "frame.number": "25758", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "138", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000e63f", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x0000345f", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "66", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:e4:4e:ce", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646346", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "21:40:4e:5e", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:49:20.290608000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "89360.290608000", - "frame.time_delta": "0.006992000", - "frame.time_delta_displayed": "244.292160000", - "frame.time_relative": "14161.976555000", - "frame.number": "26064", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "155", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000d85e", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "128", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646363", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "25:80:8d:95", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:57:02.991776000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "89822.991776000", - "frame.time_delta": "0.005632000", - "frame.time_delta_displayed": "462.701168000", - "frame.time_relative": "14624.677723000", - "frame.number": "26631", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "187", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00009709", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "129", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646395", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "e6:65:a2:44", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:57:03.007456000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "89823.007456000", - "frame.time_delta": "0.013472000", - "frame.time_delta_displayed": "0.015680000", - "frame.time_relative": "14624.693403000", - "frame.number": "26633", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "188", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00003cf6", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "130", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646396", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "d8:37:ad:83", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:57:03.012576000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "89823.012576000", - "frame.time_delta": "0.002912000", - "frame.time_delta_displayed": "0.005120000", - "frame.time_relative": "14624.698523000", - "frame.number": "26635", - "frame.len": "57", - "frame.cap_len": "57", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "57", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "189", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x00006037", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x00001be0", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "131", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:15:8d:00:01:d6:c1:77", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646397", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "2b:61:18:f5", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "1", - "zbee_nwk.cmd.relay_device": "0x000036a6" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:59:58.544672000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "89998.544672000", - "frame.time_delta": "0.007536000", - "frame.time_delta_displayed": "175.532096000", - "frame.time_relative": "14800.230619000", - "frame.number": "27293", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "228", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000a0c3", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "83", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646436", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "a0:3b:37:f8", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } - , - { - "_index": "packets-2018-06-12", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 2, 1970 01:59:58.553952000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "89998.553952000", - "frame.time_delta": "0.007120000", - "frame.time_delta_displayed": "0.009280000", - "frame.time_relative": "14800.239899000", - "frame.number": "27295", - "frame.len": "55", - "frame.cap_len": "55", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "55", - "wpan.fcf": "0x00008861", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "1", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "229", - "wpan.dst_pan": "0x0000e19d", - "wpan.dst16": "0x00000000", - "wpan.src16": "0x000036a6", - "wpan.src64": "00:0b:57:ff:fe:95:2a:69", - "wpan.src64.origin": "39", - "wpan.fcs": "0x0000865f", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001a09", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "1", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x00000000", - "zbee_nwk.src": "0x000036a6", - "zbee_nwk.radius": "30", - "zbee_nwk.seqno": "85", - "zbee_nwk.dst64": "00:15:8d:00:01:b2:2e:24", - "zbee_nwk.src64": "00:0b:57:ff:fe:95:2a:69", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "646437", - "zbee.sec.src64": "00:0b:57:ff:fe:95:2a:69", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "f6:18:39:56", - "zbee.sec.key": "b3:5c:b1:c2:5f:18:3d:de:cb:94:89:ba:f7:d0:95:56", - "zbee.sec.key.origin": "14279" - }, - "Command Frame: Route Record": { - "zbee_nwk.cmd.id": "0x00000005", - "zbee_nwk.cmd.relay_count": "0" - } - } - } - } - } -] diff --git a/resources/archives/RouteRecord.php b/resources/archives/RouteRecord.php deleted file mode 100644 index a80efaeeb2..0000000000 --- a/resources/archives/RouteRecord.php +++ /dev/null @@ -1,108 +0,0 @@ - $subarr) { - foreach ($subarr as $subkey => $subvalue) { - echo $subvalue." "; - } - echo "\n"; - } - return $out; - } - - $listOfNE = array(); - $trafficsMap = array(); - $listOfMACTraffic[] = array(); - $listOfNWKTraffic[] = array(); - - - - $packets = packets::getDataFromJson('RouteRecord.json'); - // var_dump( $packets ); - - $routes = array(); - - foreach ($packets as $key => $packet){ - //commandes - if ( isset( $packet['_source']['layers']['zbee_nwk']['Command Frame: Route Record'] ) ) - { - // echo $packet['_source']['layers']['zbee_nwk']['zbee_nwk.src']."\n"; - // echo $packet['_source']['layers']['zbee_nwk']['zbee_nwk.dst']."\n"; - // var_dump( $packet['_source']['layers']['zbee_nwk']['Command Frame: Route Record'] ); - // echo "-------------------------------------\n"; - $data = substr($packet['_source']['layers']['zbee_nwk']['zbee_nwk.src'],-4) . "->"; - // echo substr($packet['_source']['layers']['zbee_nwk']['zbee_nwk.src'],-4) . "->"; - - foreach ($packet['_source']['layers']['zbee_nwk']['Command Frame: Route Record'] as $field => $fieldData ) { - if ( $field == "zbee_nwk.cmd.relay_device" ) { - $data = $data . substr($fieldData,-4)."->"; - // echo substr($fieldData,-4)."->"; - } - - } - - $data = $data . substr($packet['_source']['layers']['zbee_nwk']['zbee_nwk.dst'],-4); - // echo substr($packet['_source']['layers']['zbee_nwk']['zbee_nwk.dst'],-4)."\n"; - // echo "-------------------------------------\n"; - // echo "-------------------------------------\n"; - $routes[] = $data; - } - } - - echo "Results : \n"; - $routes = array_unique( $routes ); - - foreach ( $routes as $id => $route ) { - echo $route . "\n"; - // var_dump( $routes ); - } - - ?> - - - diff --git a/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead1OnlyFlashed.bin b/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead1OnlyFlashed.bin deleted file mode 100644 index 4a5e959dbca9dbac5bdcdffc0fb929fa6da3a151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4032 zcmeH{zfQw25XNoCbz2Fk9fHcAszMb5VnIT!5C|k1@c<+R)Pbo33p@ab7hqsz@5qP* z570+oU}j=qj71r`G~BrfpeDjGvmGT)eBaNxeDPTd+BzeI_V#)`5;vOM;1)Ne_J81HQG=eKX+_ZOACc{JZ7N{bbCf51lxF!G_31 zkqJ!*@UF^#iH*$2sXFA2@^8Lac*1v^p1{K&AoR0XcsFHH5BwVD-`)`Qy!`L)l!Pu^ z62i_K$M*!ibId%Hl*j9*Gr)PHD4M_(Z&lMh1Fyb+S0eP=SPwOTld({j3IfuK02=oQ>sq243wy+s)u#^(%S&|Cap=SQDwH%Rv^V`%g{y z)s*(93{oLA0CC{waQ(Gi{~%lR_bAry71Zx_wtB@I$#~J4rDv<1)hNPCjbBd diff --git a/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead2BootGetVersion.bin b/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead2BootGetVersion.bin deleted file mode 100644 index 1dfa77e209c0cbb3ee6693c9df7a32a9c9b0f590..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4032 zcmeH~ze~eF6vyw9G;N{KBGpzcMT&#C2+|^of~`(YCe@O`se%al2Ppmn4z7Y@N5>BR z13Ec7xY|ji}u$JLN&^@I?rZD|^@8?~A<4D5A6 z3vJ*B%hEUR07CAXP-o!N>r@~W;PXk|@a2ENn)zPiwS2@Ldc>H?K8|7Lo1+b1N@ ztc!O3ve3ss(+muEIf2i!{O5$B%NfC-OCr;6I+^I?a8^FNC#apsr=dY5d;QcqIIn4%W4Pi^*22cXv*#a*^{22{FF)`C z>h~@;Qatx{<^oAO($ob-VkWM4g5h?**C}TPuN_BC^P+LWknB*_3{JH^c%_Q zqL)9+20YVmlvG{&M;MEK;GqHu9i`NpDDjgqz)OrztNlq|lrivZ|5>l7f2v?4)xvTx64w4xkd>S(_NNS7E@l8f@EKfxwY;+H9TaTE`n`nuy(+hku+|qmtdR<) diff --git a/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead3SetMask17.bin b/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead3SetMask17.bin deleted file mode 100644 index 2d86083515b88f0144f6b7b2d11b342e3228877b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4032 zcmey!#%Pkpz`z(`8xg?(1&qi5CWwRnz`!V8!N9=uMLX06T?vyw2LmIzAR7MzBNKxX z(0&n?;0Vf(-K<+oy zXOkgTKeG2eGB8Sj(oeQr=n4i<*fEn9h94POpy|hP0m$6{|Ns93k{~7+5aI*%gZ=-7 z+3^Y?wba2Ak_6Nr!XFs${~spA zrxzsmk(mt~ev)i~9|)<%CJ)pP4!@slK`Pkf35fyqgTwD9dl0<*A*2Uc9;hFf0~r{9 zas>4tixbNR>SqD#=L|YPtR7@_K>gtI$5JVXto-|t1sZ?SfjPi5fdP>1!p8o{3MqfY z*#ZSH7ulNz)JN|0M(6A11?s*?t2xtO)b~k=*}+68Fctg@1wQf2>Zb|3U4S qNO7R^!R?p3KS4{iX*<(GLIsLNTNO diff --git a/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead4SetMask23.bin b/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead4SetMask23.bin deleted file mode 100644 index 6c2a963186e6b2d6ea38a0b64e6dc62b23076585..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4032 zcmey!#%Pkpz`z(`8xg?(1&o*gCWS$NU|L}@@%^nrlTpRq++0cU<@!Yer0EUL8@MmdZ2y{ko!&b z*<^^-kL^phzn05bRg|NsAhB!~$Hg!n-HVE=z% zcDzDJEjD?eekM@(eP(mwAjMvoSwQ_Ppzt&2aKgwxFhAg^GsWM%`0pCnu02SRGG$piI+!|x|skP0?=LSjJu;PCs&9t1Cc2$E;>5Cn`dPsGIfD)ms|Q&fP(Qf*u~Z5oEB}6EfySS7U=A=%U;t#hu(3a~LdqX; zwm<<4c|!=6|m(VHptp z7p8*Bkx?)j0;3@?8UmvsK-&-imEXz0^8Zw;)dEQQo0>sN`3q~my($i`f#@#?B~?GD z{`g!R-T~4t&PVMMght+?wN5a=Y{J&@^ss0DG ze^Yja?||rkHJeoZpzzye8-4_$-(H?n{UG~y+lF5N=@(=sO+P67LH6g!hTp+Rsi1}x z5#bMY{|idoAL|zW1)~44I;s8#*&itmOg=#W^E2Q5L8^XG_z69Y;DP9$ag0>`Ap1Am Ni;#fmH$6a#egG2pTvh-8 diff --git a/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead5SetMask24StartNetworkAddXiaomiTempRond.bin b/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead5SetMask24StartNetworkAddXiaomiTempRond.bin deleted file mode 100644 index f25680910fe7790f6e18e45b05e383e527163619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4032 zcmbuCU2F_d6vywKnf+)qs;sop4^2}cM0~ZVDE$x*qS0>c-tm>tTH5TA;)NjL0VO;T zqKFWQ@X$yleUOTT5D{J^JR%hz5g)OeR;Y)LbLQ?{V|Kbbw`Q~5JNMk*J@@?YJ!hr~ zFRk202-RzJog^B+KG>;Ai0atLAu%-SXD(5`-4w`H7Z>ZW7c^mD4am zHLkxW)Q9sLhA{$vQ!cXI18>GZq}IL6HrB}wyn^}-dh7i%e#KnCYpCBMe|=j1q=LxM zNGLSW3jEr<<|bn#{gVMTO$pU&>Nm$1if0?^WCz~VZ`d2GaI$CX1K!kc*cVLIpKOfP z4m@Nap~L>*No&8`Ht?Fs=LGM&Wvt_XH|tMzd2memo6wT`SJWJXGm&;#eL1xg9$tTD z`@$>I?0?fB&180f9r#>4e^r6zbl#czrx){gALQ@;((p!1yFA(aP3HfqzHmF|pP$1z z;`WMrlJ&pBJCG)xrDL@DfH&)B!0+ubtA~Yg)5Q8y4pr;zdGY*Qc9^Ucz#=f zzumgzDw+z_8wg z5)kG;>i@Jt*MBT*=y`DFdwb)p4eu|UI98SgH6K@^ehf@w6UM|R^SARLD;DvKJrr>W zJ)C}pe!CB_8JPctYEz>OkNc1B5Buh_N|=94`;YvKD66&mcUrH#5BCr2-;N@-+HP~T zf64m!EXs6V|Nh2rpU>$Y^~3e6U2H4ok9P?DoW|Sxg#H6ZStsWs?Xo=j|GbAC;CyFD zmPh>t_pmPH3sgB?{QnWX#Ln7dBZpk%Pf|Zv|JDClf5{`(!})91W#dQvw)V3-od0}D zmPh^iYuF>sFP|#QqyM`#>^buJsvIxQf2@SPO4DC)r+;$&pZ;h4n^v+R&cB;38$bGA lSD>5qFi(B`OO{9dCVtR!x&Q9RvON0leWMq0zUsaV{|8_`TV((M diff --git a/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead6ProductionJeedomZwave.bin b/resources/archives/Zigate_Module/ReadJN5168/EEPROMRead6ProductionJeedomZwave.bin deleted file mode 100644 index 2566f3cbc9960edd9eede5e1c3e22a1e1ad82857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4032 zcmbVPU2Icj82-*VJ*8}PR5M{3mEzB+xR_mNqKI01VbTa#y@0r^QbvXu8N1j54mM`z zhWmkm!7U=$mMUhaaa)$5+=xPB)EJi#C1Q+_r6fks-L%Gp#EX7D?{|K7TGy`YS)P3T z&N$lIOdI$<6b>=QIr9R3AOb{z7?1#xoJ$Pw0)8L@L^)3>GVw1QyF`5P z1zK`159f7FZw4A0UubYeg+so-e}4XyZ{hI6L7pl0FRi$h zDi+_g=XPB*GqSnK5`51PldgTUkOol_Sk`;qY|4b_@ z-^DXQ&tGYW!$JJ{KH_tp`S$61h0Fs(uZZ>c9aG}nEjynzbU7#1$rrqIU)Nu|(iW)u zMCec79lCg*c&8ZsCE@?KFTSJu-?XdP75d9E)1u@3y8dLtN-prBf!19zUvWFYpVBUr zsK4U&!2cb$-dloCv0u*rl4lj<_i85>`LI8OOt4&7XrEG5vj6y3ZQ+m!U&VbD_fxehT6Pz!VC#y{K(r3Hh0M+O4Enpl@73Nn^v}_6xjX=$ z@^|5<1zor{-DyCGo{Be7G%RbRR&7L@a z!|1(hHdBv8{9VxhsA<2+Ep`PT`4@lif$4Cs=(#;J9cFJA>&uh-#cK9%l211E%q-A- z%rENyt@G{3A51OrZtbJfVhy@4i`AS78+Ub!{m{8GOFvnz0l#PAd>;Q^9z$CUjx%x zT+kmwryLxK-(gY)d64gN7~dsbpg+~`;XiHjQ|M^)f{dB}h?R(;S${@M!Ke727?!Di z{M*=2j;)8Xd!dN2O+JJ7;lHlA?$YuvCCT?g|BmZtm*}GMyhQBlXQzZIX}w zcYdqr6!y;sv(9fRCap*O`rNxApLpk=c*N{mvZo*6k@WMQSp&IzheGy8zkIjE`gKZA z?qk|%e#Nps0GYNcUl!>15kI|u8uQa0dwOHJeM*)p8!$ir9kt|V3nZTuIDeylDSwWP zH^&I&_ z|9@1sovr`1r1O*FrupAxKYwOBu<#E0Q~z$CK>i?F*2_!jy3}*v;GUvbm< zuUk8wC;pa3OaFlX$p3>S&mYM{=jQ|0ehY`P&RDfMv!XTU4ECM=+=!pAZ8Tg{V*Jp- b;? AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 3; ID : 32; Short Addr : 36a6; IEEE Addr: 000B57fffe952a69; Power Source (0:battery - 1:AC): 01; Link Quality: 67 - - Short Not Found (T7) => AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 4; ID : 33; Short Addr : 2096; IEEE Addr: 000B57fffe490C2a (2 fois); Power Source (0:battery - 1:AC): 01; Link Quality: 36 - - Short Not Found (Lampe Bureau) => AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 5; ID : 34; Short Addr : a714; IEEE Addr: 00158d0001dedc72 (3 fois); Power Source (0:battery - 1:AC): 01; Link Quality: 188 - - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 6; ID : 35; Short Addr : c9f9; IEEE Addr: 000B57fffe88af72; Power Source (0:battery - 1:AC): 01; Link Quality: 112 - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 7; ID : 36; Short Addr : 70fb; IEEE Addr: 000B57fffe3a0E7c; Power Source (0:battery - 1:AC): 01; Link Quality: 44 - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 8; ID : 37; Short Addr : e4c0; IEEE Addr: 000B57fffed2af6a; Power Source (0:battery - 1:AC): 01; Link Quality: 80 - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 9; ID : 38; Short Addr : db83; IEEE Addr: 00158d000183afeb; Power Source (0:battery - 1:AC): 01; Link Quality: 68 - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 10; ID : 39; Short Addr : a0da; IEEE Addr: 000B57fffe3a563b; Power Source (0:battery - 1:AC): 01; Link Quality: 47 - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 11; ID : 3a; Short Addr : 41c0; IEEE Addr: 00158d000183af7b; Power Source (0:battery - 1:AC): 01; Link Quality: 76 - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 12; ID : 3b; Short Addr : d204; IEEE Addr: 000B57fffec53819; Power Source (0:battery - 1:AC): 01; Link Quality: 42 - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 13; ID : 3c; Short Addr : 82a6; IEEE Addr: 000B57fffe4bab6a; Power Source (0:battery - 1:AC): 01; Link Quality: 149 - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 14; ID : 3d; Short Addr : 60fb; IEEE Addr: 000B57fffe8dbb1a; Power Source (0:battery - 1:AC): 01; Link Quality: 67 - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 15; ID : 3e; Short Addr : 6766; IEEE Addr: 000B57fffe3025ad; Power Source (0:battery - 1:AC): 01; Link Quality: 36 - AbeilleParser 2018-09-21 16:13:57[DEBUG]Abeille i: 16; ID : 3f; Short Addr : b807; IEEE Addr: 000B57fffe8e083c; Power Source (0:battery - 1:AC): 01; Link Quality: 34 - */ - -$EEPROM = array(); - -$handle = @fopen("EEPROMRead6ProductionJeedomZwave.bin", "r"); -if ($handle) { - while (!feof($handle)) { - $hex = bin2hex(fread ($handle , 1 )); - array_push($EEPROM, $hex); - print $hex."\n"; - } - fclose($handle); - -} - echo "\n--------------------\n"; - echo "First Octet: "; echo $EEPROM[0x00]; echo "\n"; - - $i = 0x00D8; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 404C - - $i = 0x00F0; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 8c09 - $i = 0x0198; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 404C - $i = 0x01B0; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 8c09 - $i = 0x01B0; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 8c09 - $i = 0x0418; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 404C - $i = 0x0670; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 8c09 - - $i = 0x06B4; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 2096 - - $i = 0x0768; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 873a - $i = 0x06AC; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // - $i = 0x06B4; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // - $i = 0x0850; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 2096 - $i = 0x0C70; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 8c09 - $i = 0x0D58; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 404C - $i = 0x0D70; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 8c09 - $i = 0x0F18; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 404C - $i = 0x0F30; echo "IEEE: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 8c09 - - $i = 0x0952; echo "Short: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 873A - $i = 0x0962; echo "Short: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 8C09 - $i = 0x0A4E; echo "Short: "; echo $EEPROM[$i++]; echo $EEPROM[$i++]; echo "\n"; // 404C - - -?> - diff --git a/resources/archives/addParameterToAllTemplates.php b/resources/archives/addParameterToAllTemplates.php deleted file mode 100644 index 715b35c5ec..0000000000 --- a/resources/archives/addParameterToAllTemplates.php +++ /dev/null @@ -1,73 +0,0 @@ -assertSame( 1, count($output) ); - $this->assertSame( 0, $retval ); - } - - function test_proper_parse_str() { - $str = "X=x&Y=y&Z=z"; - $result = '{"X":"x","Y":"y","Z":"z"}'; - $this->assertSame( $result, json_encode(AbeilleCmdPrepare::proper_parse_str($str)) ); - } - - function prepareCmdTest() { - $message = (object) array( - "topic" => "CmdAbeille1/81F6/OnOff", - "payload" => "Action=On&EP=01", - "priority" => 3, - ); - - $result = '{"onoff":"1","dest":"Abeille1","priority":3,"addressMode":"02","address":"81F6","destinationEndpoint":"01","action":"01"}'; - - $this->assertSame( $result, json_encode(AbeilleCmdPrepare::prepareCmd(1, $message, 1)) ); - } - -} - - -?> - diff --git a/resources/archives/core/class/AbeilleCmdProcessTest.class.php b/resources/archives/core/class/AbeilleCmdProcessTest.class.php deleted file mode 100644 index 06f88dccdc..0000000000 --- a/resources/archives/core/class/AbeilleCmdProcessTest.class.php +++ /dev/null @@ -1,101 +0,0 @@ -result = array( $priority, $net, $cmd, $payload, $addr, $addrMode); - } -} - - - -class AbeilleCmdProcessTest extends TestCase { - - function test_phpSyntax() { - fwrite(STDOUT, "\n\n" . __METHOD__ ); - exec('php AbeilleCmdProcess.class.php', $output, $retval); - $this->assertSame( 1, count($output) ); - $this->assertSame( 0, $retval ); - } - - function test_checkRequiredParams() { - fwrite(STDOUT, "\n\n" . __METHOD__ ); - $required = ['addr']; - $Command_Ok = array( 'addr'=>'1234' ); - $Command_NOk = array( 'zozo'=>'1234' ); - - $this->assertSame( true , AbeilleCmdProcess::checkRequiredParams($required, $Command_Ok) ); - $this->assertSame( false, AbeilleCmdProcess::checkRequiredParams($required, $Command_NOk) ); - } - - function test_sliderToHex() { - // Called to convert '#sliderXX#' - $sliderVal = "#slider34#"; - $type = '28'; - $abeilleCmdProcess = new AbeilleCmdProcess; - $this->assertSame( '22', $abeilleCmdProcess->sliderToHex($sliderVal, $type)); - } - - function test_processCmd() { - $test = new AbeilleCmdProcessKiwi; - - // Test initial checks - $Command = null; - $this->assertSame( null, $test->processCmd($Command)); - - $Command = "Why not"; - $this->assertSame( null, $test->processCmd($Command)); - - $Command = array(); - - // Test commands - $Command = array( "dest" => "Abeille1", 'PDM' =>"", 'req' => "E_SL_MSG_PDM_HOST_AVAILABLE_RESPONSE"); - $test->processCmd($Command); - $this->assertSame( '[4,"Abeille1","8300","00","",null]', json_encode($test->result) ); - - $Command = array( "dest" => "Abeille1", 'PDM' =>"", 'req' => "E_SL_MSG_PDM_EXISTENCE_RESPONSE", 'recordId'=>"" ); - $test->processCmd($Command); - $this->assertSame( '[4,"Abeille1","8208","000000","",null]', json_encode($test->result) ); - - $Command = array( "dest" => "Abeille1", 'abeilleList' => ""); - $test->processCmd($Command); - $this->assertSame( '[4,"Abeille1","0015","","",null]', json_encode($test->result) ); - - $Command = array( "dest" => "Abeille1", 'name' => 'setZgLed', 'value' => 1) ; - $test->processCmd($Command); - $this->assertSame( '[4,"Abeille1","0018","01","",null]', json_encode($test->result) ); - - $Command = array( "dest" => "Abeille1", 'name' => 'setZgLed', 'value' => 0) ; - $test->processCmd($Command); - $this->assertSame( '[4,"Abeille1","0018","00","",null]', json_encode($test->result) ); - - $Command = array( "dest" => "Abeille1", 'setCertificationCE' => "") ; - $test->processCmd($Command); - $this->assertSame( '[4,"Abeille1","0019","01","",null]', json_encode($test->result) ); - - $Command = array( "dest" => "Abeille1", 'setCertificationFCC' => "") ; - $test->processCmd($Command); - $this->assertSame( '[4,"Abeille1","0019","02","",null]', json_encode($test->result) ); - - $Command = array( "dest" => "Abeille1", 'TxPower' => "11") ; - $test->processCmd($Command); - $this->assertSame( '[4,"Abeille1","0806","11","",null]', json_encode($test->result) ); - - // ..... need to continue ..... - - } -} - - -?> - diff --git a/resources/archives/core/class/AbeilleCmdTest.class.php b/resources/archives/core/class/AbeilleCmdTest.class.php deleted file mode 100644 index 363470342b..0000000000 --- a/resources/archives/core/class/AbeilleCmdTest.class.php +++ /dev/null @@ -1,23 +0,0 @@ -assertSame( 1, count($output) ); - $this->assertSame( 0, $retval ); - } - -} - - -?> - diff --git a/resources/archives/core/class/AbeilleParserTest.class.php b/resources/archives/core/class/AbeilleParserTest.class.php deleted file mode 100644 index 4b63c47922..0000000000 --- a/resources/archives/core/class/AbeilleParserTest.class.php +++ /dev/null @@ -1,125 +0,0 @@ -assertSame( 0, count($output) ); - $this->assertSame( 0, $retval ); - } - - // function test_deviceAnnounce() { - // fwrite(STDOUT, "\n\n" . __METHOD__ ); - - // global $log; - - // $net = 'Abeille1'; - // $addr = '81F6'; - // $ieee = '14B457FFFE79EBA9'; - // $capa = '8E'; - // $rejoin = '00'; - - // $abeilleParser = new AbeilleParser; - - // // Standard - // $log = []; - // $abeilleParser->deviceAnnounce($net, $addr, $ieee, $capa, $rejoin); - - // $logExpected = '[" EQ new to parser"," Requesting active end points list"]'; - // $this->assertSame( $logExpected, json_encode($log) ); - - // // Change Addr - // $addr = '8888'; - // $log = []; - // $abeilleParser->deviceAnnounce($net, $addr, $ieee, $capa, $rejoin); - - // $logExpected = '[" EQ already known: Addr updated from 81F6 to 8888"," EQ already known: Status=identifying"," Device identification already ongoing"]'; - // $this->assertSame( $logExpected, json_encode($log) ); - - // // New ieee - // $ieee = 'FFB457FFFE79EBFF'; - // $log = []; - // $abeilleParser->deviceAnnounce($net, $addr, $ieee, $capa, $rejoin); - - // $logExpected = '[" ERROR: There is a different EQ (ieee=14B457FFFE79EBA9) for addr 8888"]'; - // $this->assertSame( $logExpected, json_encode($log) ); - // } - - - // function test_deviceUpdate() { - // fwrite(STDOUT, "\n\n" . __METHOD__ ); - - // global $log; - // global $msgToCmd; - // unset($GLOBALS['eqList']); - - // $net = 'Abeille1'; - // $addr = '81F6'; - // $ep = '01'; - - // $abeilleParserDebug = new AbeilleParserDebug; - - // // No update - // $log = []; $msgToCmd = []; - // $abeilleParserDebug->deviceUpdate($net, $addr, $ep, $updType = null, $value = null); - // $logExpected = '[" deviceUpdate(\'\', \'\'): Unknown device detected"," Requesting IEEE"]'; - // $this->assertSame( $logExpected, json_encode($log) ); - // $cmdExpected = '[["CmdAbeille1\/81F6\/getIeeeAddress","priority=5"]]'; - // $this->assertSame( $cmdExpected, json_encode($msgToCmd) ); - - // $log = []; $msgToCmd = []; - // $abeilleParserDebug->deviceUpdate($net, $addr, $ep, $updType = null, $value = null); - // $logExpected = '[" Requesting IEEE"]'; - // $this->assertSame( $logExpected, json_encode($log) ); - // $cmdExpected = '[["CmdAbeille1\/81F6\/getIeeeAddress","priority=5"]]'; - // $this->assertSame( $cmdExpected, json_encode($msgToCmd) ); - - // $GLOBALS['eqList'][$net][$addr]['ieee'] = '14B457FFFE79EBA9'; - - // // update Ep List - // $updType='epList'; - // $value='07'; - // $log = []; $msgToCmd = []; - // $abeilleParserDebug->deviceUpdate($net, $addr, $ep, $updType, $value); - // $this->assertSame( $value, $GLOBALS['eqList'][$net][$addr]['epList'] ); - // $cmdExpected = '[["CmdAbeille1\/81F6\/readAttribute","ep=07&clustId=0000&attrId=0004,0005,0010"]]'; - // $this->assertSame( $cmdExpected, json_encode($msgToCmd) ); - - // // Check status - // $GLOBALS['eqList'][$net][$addr]['status'] = "identifying"; - // $log = []; $msgToCmd = []; - // $return = $abeilleParserDebug->deviceUpdate($net, $addr, $ep, $updType, $value); - // $this->assertSame( false, $return ); - - // } - -} - - -?> - diff --git a/resources/archives/core/class/AbeilleParserTestDB.class.php b/resources/archives/core/class/AbeilleParserTestDB.class.php deleted file mode 100644 index 4f908a2221..0000000000 --- a/resources/archives/core/class/AbeilleParserTestDB.class.php +++ /dev/null @@ -1,93 +0,0 @@ -run(); - sleep(2); - $abeilleParser = new AbeilleParser; - - $group = '4343'; - - $msg = array( - 'src' => 'parser', - 'type' => 'attributeReport', - 'net' => 'Abeille1', - 'addr' => '81F6', - 'ep' => '01', - 'name' => 'Group-Membership', - 'value' => $group, - 'time' => time(), - 'lqi' => '00', - ); - - $abeilleParser->msgToAbeille2($msg); - - sleep(2); - $cmdInfoGroup = cmd::byId(27303); - - $this->assertSame( $group, $cmdInfoGroup->execCmd() ); - } - - // function test_deviceCreate() { - // fwrite(STDOUT, "\n\n" . __METHOD__ ); - - // global $log; - // global $msgToCmd; - // unset($GLOBALS['eqList']); - - // $net = "Abeille1"; - // $addr = "AAAA"; - // $GLOBALS['eqList'][$net] = array(); - // $GLOBALS['eqList'][$net][$addr] = array(); - - // $eq = &$GLOBALS['eqList'][$net][$addr]; - - // // $eq['ieee'] = "FFB457FFFE79EBFF"; - // // $eq['epFirst'] = "01"; - // // $eq['modelIdentifier'] = ""; - // // $eq['manufacturer'] = ""; - // // $eq['jsonId'] = ""; - // // $eq['jsonLocation'] = ""; - // // $eq['capa'] = ""; - - // $abeilleParser = new AbeilleParser; - - // $net = "Abeille1"; - // $addr = "AAAA"; - // $abeilleParser->deviceCreate($net, $addr); - - // sleep(2); - // $eq = Abeille::byLogicalId($net.'/'.$addr, 'Abeille'); - - // $this->assertSame( true, is_object($eq) ); - - // } -} - - -?> - diff --git a/resources/archives/core/class/AbeilleTemplateCmd.class.php b/resources/archives/core/class/AbeilleTemplateCmd.class.php deleted file mode 100644 index 88cc932009..0000000000 --- a/resources/archives/core/class/AbeilleTemplateCmd.class.php +++ /dev/null @@ -1,137 +0,0 @@ -getId(); - return AbeilleCmd::byEqLogicIdAndLogicalId( $eqLogicalId, $logicalId, false )->getConfiguration('uniqId', '-1'); - } - - /** - * Will collect all Cmd with a specific template (uniqId) - * - * @return Return all Cmd with a specific template (uniqId) - */ - public static function getCmdByTemplateUniqId( $uniqId ) { - $return = array(); - $allCmdWithUniqId = AbeilleCmd::searchConfiguration( 'uniqId' ); - - foreach ( $allCmdWithUniqId as $key=>$cmdWithUniqId ) { - if ( $cmdWithUniqId->getConfiguration('uniqId', '') == $uniqId ) { - $return[] = $cmdWithUniqId; - } - } - - return $return; - } - - /** - * Will return the 'main' parameter for the device stored in the template - * @param uniqId Id du template que l selectionne - * @param param un des paramatres principaux comme: name, isVisible, order, type, subtype, invertBinary, template... - * - * @return Return the 'main' parameter for the device stored in the template - */ - public static function getMainParamFromTemplate( $uniqId, $param ) { - $jsonArray = AbeilleTemplateCommon::getJsonForUniqId( $uniqId ); - if ($jsonArray == -1) return -1; - $keys = array_keys ( $jsonArray ); - if (count($keys)!=1) return 0; - if (!isset($jsonArray[$keys[0]][$param])) return 0; - return $jsonArray[$keys[0]][$param]; - } - - /** - * Will return the configuration item for the device stored in the template - * @param uniqId of the template that we want to use - * @param item in the configuration that we want - * - * @return Return return the configuration item for the device stored in the template if exist otherwise '' - */ - public static function getConfigurationFromTemplate( $uniqId, $item ) { - $configurationArray = self::getMainParamFromTemplate( $uniqId, 'configuration' ); - - if (isset($configurationArray[$item])) return $configurationArray[$item]; - else return ''; - } - - - - /** - * - * - */ - public static function compareAllCmdWithTemplateHtmlEnteteTable() { - echo ""; - echo "\n"; - } - - /** - * - * - */ - public static function compareAllCmdWithTemplateHtmlPiedTable() { - echo "
Cmd NameParamJeedom VauleTemplate Value


"; - } - - /** - * Will compare cmd from Abeille to their template - * - * @return Return no, Will compare cmd from Abeille to their template and will echo the result during execution in html format. - */ - public static function compareAllCmdWithTemplate($abeille) { - $items = array( 'isVisible'=>'getIsVisible', - 'name'=>'getName', - 'isHistorized'=>'getIsHistorized', - 'Type'=>'getType', - 'subType'=>'getSubType', - ); - - // 'order'=>'getOrder' - // invertBinary setDisplay('invertBinary' - // 'template'=>'getTemplate', - - // Take Abeile and check if Template value is identical - self::compareAllCmdWithTemplateHtmlEnteteTable(); - - foreach ( $abeille->getCmd() as $cmd ) { - - $uniqId = $cmd->getConfiguration( 'uniqId', -1 ); - - if ( $uniqId == -1 ) { - echo "".$cmd->getName().": This cmd doesn t have a uniqId, I can t identify it s template !\n"; - return; - } - - if (AbeilleTemplateCommon::getJsonFileNameForUniqId($uniqId)==-1) { - echo "".$cmd->getName().": This uniqId (".$uniqId."), doesn t correspond to any template !\n"; - return; - } - - foreach ( $items as $item=>$fct ) { - $templateValue = AbeilleTemplateCmd::getMainParamFromTemplate($uniqId, $item); - if ( $templateValue == -1 ) { - echo "".$cmd->getName().": Error template not found for this parameter (".$uniqId."->".$item.") !\n"; - continue; - } - if ($cmd->$fct() != $templateValue) { - echo "".$cmd->getName()."".$item."".$cmd->$fct().''.$templateValue."\n"; - // var_dump(AbeilleTemplateCommon::getJsonFileNameForUniqId( $uniqId )); - } - } - - } - self::compareAllCmdWithTemplateHtmlPiedTable(); - } - -} - - -?> diff --git a/resources/archives/core/class/AbeilleTemplateCommon.class.php b/resources/archives/core/class/AbeilleTemplateCommon.class.php deleted file mode 100644 index ceb558bc87..0000000000 --- a/resources/archives/core/class/AbeilleTemplateCommon.class.php +++ /dev/null @@ -1,98 +0,0 @@ -"; - } - - /** - * - * - */ - public static function compareTemplateHtmlPiedDePage() { - echo ""; - } - - /** - * Will return the json file name for a template uniqId - * Will return the first file found in the search. - * As uniqId is supposed to be uniq it should be the one. - * - * @return Return the json file name for a template uniqId or -1 if not found - */ - public static function getJsonFileNameForUniqId( $uniqId ) { - $templateFiles = glob('/var/www/html/plugins/Abeille/core/config/devices/*/*.json'); - foreach( $templateFiles as $templateFile ) { - $json = file_get_contents( $templateFile ); - if ( strpos($json, '"'.$uniqId.'"') > 1 ) { - return $templateFile; - } - } - return -1; - } - - /** - * Will return the json array for a template uniqId - * - * @return Return the json array for a template uniqId or -1 if not found - */ - public static function getJsonForUniqId( $uniqId ) { - $file = self::getJsonFileNameForUniqId( $uniqId ); - if ( $file == -1 ) return -1; - $jsonText = file_get_contents( $file ); - $jsonArray = json_decode($jsonText, true); - return $jsonArray; - } - - /** - * Will return all uniqId - * - * @return Return return all uniqId - */ - public static function getAllUniqId( ) { - $uniqIdList = array(); - $templateFiles = glob('/var/www/html/plugins/Abeille/core/config/devices/*/*.json'); - foreach( $templateFiles as $templateFile ) { - $jsonText = file_get_contents( $templateFile ); - $jsonArray = json_decode($jsonText, true); - if (!isset($jsonArray)) continue; - $keys = array_keys ( $jsonArray ); - if (count($keys)!=1) { - echo "Skipping file: ".$templateFile." as can t read it.\n"; - continue; - } - $key = $keys[0]; - if (isset($jsonArray[$key]['configuration'])) { - if (isset($jsonArray[$key]['configuration']['uniqId'])) - $uniqIdList[] = $jsonArray[$key]['configuration']['uniqId']; - else - echo "File: ".$templateFile." has no uniqId.\n"; - } - else { - echo "Configuration chapter not set in json.\n"; - } - } - return $uniqIdList; - } - - /** - * Will return all uniqId duplicated in the template - * - * @return Return return all uniqId duplicated - */ - public static function duplicatedUniqId() { - $doublon = array_count_values (AbeilleTemplateCommon::getAllUniqId()); - foreach ($doublon as $uniqId=>$nb) { - if ($nb>1) { - echo $uniqId." -> ".$nb."\n"; - } - } - } -} - -?> diff --git a/resources/archives/core/class/AbeilleTemplateEq.class.php b/resources/archives/core/class/AbeilleTemplateEq.class.php deleted file mode 100644 index ebe99ccba8..0000000000 --- a/resources/archives/core/class/AbeilleTemplateEq.class.php +++ /dev/null @@ -1,155 +0,0 @@ -getConfiguration('uniqId', ''); - } - - /** - * Will collect all Abeille with a specific template (uniqId) - * @param uniqId identify the json template - * - * @return Return all abeille with a specific template (uniqId) - */ - public static function getEqLogicsByTemplateUniqId( $uniqId ) { - - $allAbeillesWithUniqId = Abeille::byTypeAndSearhConfiguration( 'Abeille', 'uniqId' ); - - foreach ( $allAbeillesWithUniqId as $key=>$abeillesWithUniqId ) { - if ( $abeillesWithUniqId->getConfiguration('uniqId', '') == $uniqId ) { - $return[] = $abeillesWithUniqId; - } - } - - return $return; - } - - /** - * Will return the name o fthe device store n the template - * @param uniqId identify the json template - * - * @return Return the name o fthe device store n the template - */ - public static function getNameJeedomFromTemplate( $uniqId ) { - $jsonArray = self::getJsonForUniqId( $uniqId ); - foreach ( $jsonArray as $key=>$data ) { - return $jsonArray[$key]["type"]; - } - } - - /** - * Will return the timeout for the device stored in the template - * @param uniqId identify the json template - * - * @return Return return the timeout for the device stored in the template - */ - public static function getTimeOutFromTemplate( $uniqId ) { - $jsonArray = AbeilleTemplateCommon::getJsonForUniqId( $uniqId ); - foreach ( $jsonArray as $key=>$data ) { - return $jsonArray[$key]["timeout"]; - } - } - - /** - * Will return the categories for the device stored in the template - * @param uniqId identify the json template - * - * @return Return the categories (array) for the device stored in the template - */ - public static function getCategorieFromTemplate( $uniqId ) { - $jsonArray = AbeilleTemplateCommon::getJsonForUniqId( $uniqId ); - foreach ( $jsonArray as $key=>$data ) { - return $jsonArray[$key]["category"]; - } - } - - /** - * Will return the configuration for the device stored in the template - * @param uniqId identify the json template - * @param item field defined in configuration part of the template - * - * @return Return the configuration item for the device stored in the template if exist otherwise '' - */ - public static function getConfigurationFromTemplate( $uniqId, $item ) { - $jsonArray = AbeilleTemplateCommon::getJsonForUniqId( $uniqId ); - foreach ( $jsonArray as $key=>$data ) { - if (isset($jsonArray[$key]["configuration"][$item])) { - return $jsonArray[$key]["configuration"][$item]; - } - else { - return ''; - } - - } - } - - /** - * - * - */ - public static function compareAllParamWithTemplateHtmlEnteteTable() { - echo "\n"; - echo ''."\n"; - } - - /** - * - * - */ - public static function compareAllParamWithTemplateHtmlPiedTable() { - echo "
{{Paramètre}}Jeedom{{Modèle}}

\n"; - } - - /** - * Will return commands for the device stored in the template - * @param uniqId identify the json template - * - * @return Return the commands (array) for the device stored in the template - */ - public static function getCommandesFromTemplate( $uniqId ) { - $jsonArray = AbeilleTemplateCommon::getJsonForUniqId( $uniqId ); - foreach ( $jsonArray as $key=>$data ) { - return $jsonArray[$key]["commands"]; - } - } - - public static function compareAllParamWithTemplate($abeille) { - echo "
\n"; - echo "
\n"; - echo "

".$abeille->getHumanName()."

\n"; - - $logicalId = $abeille->getLogicalId(); - $uniqId = AbeilleTemplateEq::uniqIdUsedByAnAbeille($logicalId); - - self::compareAllParamWithTemplateHtmlEnteteTable(); - - if ( $uniqId!='') { - $items = array( - 'TimeOut' => array( 'getTimeout', 'getTimeOutFromTemplate' ), - 'icone' => array( 'getConfiguration', 'getConfigurationFromTemplate' ), - 'mainEP' => array( 'getConfiguration', 'getConfigurationFromTemplate' ), - 'poll' => array( 'getConfiguration', 'getConfigurationFromTemplate' ), - ); - - foreach ( $items as $item=>$fcts ) { - $fct0 = $fcts[0]; - $fct1 = $fcts[1]; - - if ($abeille->$fct0($item)==AbeilleTemplateEq::$fct1($uniqId, $item)) $color="green"; else $color="red"; - - echo ''.$item.' ' .$abeille->$fct0($item) . '' . AbeilleTemplateEq::$fct1($uniqId, $item) . "\n"; - } - } - - self::compareAllParamWithTemplateHtmlPiedTable(); - } - -} - -?> diff --git a/resources/archives/core/class/AbeilleTest.class.php b/resources/archives/core/class/AbeilleTest.class.php deleted file mode 100644 index 172a4b466b..0000000000 --- a/resources/archives/core/class/AbeilleTest.class.php +++ /dev/null @@ -1,30 +0,0 @@ -assertSame( 0, count($output) ); - $this->assertSame( 0, $retval ); - } - - function test_volt2pourcent() { - fwrite(STDOUT, "\n\n" . __METHOD__ ); - $this->assertSame( 0, Abeille::volt2pourcent(2700) ); - $this->assertSame( 60.0, Abeille::volt2pourcent(3000) ); - $this->assertSame( 100, Abeille::volt2pourcent(4000) ); - } - -} - - -?> - diff --git a/resources/archives/core/class/AbeilleTestDB.class.php b/resources/archives/core/class/AbeilleTestDB.class.php deleted file mode 100644 index 477d73f3c0..0000000000 --- a/resources/archives/core/class/AbeilleTestDB.class.php +++ /dev/null @@ -1,74 +0,0 @@ -assertSame( $result, json_encode(Abeille::health()) ); - } - - function test_deamon_info() { - fwrite(STDOUT, "\n\n" . __METHOD__ ); - $result = '{"state":"ok","launchable":"ok","launchable_message":""}'; - $this->assertSame( $result, json_encode(Abeille::deamon_info()) ); - } - - function test_getIEEE() { - fwrite(STDOUT, "\n\n" . __METHOD__ ); - - $address = "Abeille1/81F6"; - $IEEE_Result = "14B457FFFE79EBA9"; - - $abeille = new Abeille; - - $this->assertSame( $IEEE_Result, $abeille->getIEEE($address) ); - } - - function test_getEqFromIEEE() { - fwrite(STDOUT, "\n\n" . __METHOD__ ); - - $IEEE_Ok = "14B457FFFE79EBA9"; - $IEEE_NOk = "0000000000000000"; - - $abeille = new Abeille; - - $this->assertSame( "Ampoule1", $abeille->getEqFromIEEE($IEEE_Ok)->getName() ); - $this->assertSame( null, $abeille->getEqFromIEEE($IEEE_NOk) ); - } - - function test_checkInclusionStatus() { - fwrite(STDOUT, "\n\n" . __METHOD__ ); - $destOk = "Abeille1"; - $detNok = "AbeilleY"; - - $abeille = new Abeille; - - $this->assertSame( 0, $abeille->checkInclusionStatus($destOk) ); - $this->assertSame(-1, $abeille->checkInclusionStatus($detNok) ); - } - - function test_createRuche() { - fwrite(STDOUT, "\n\n" . __METHOD__ ); - $dest = "AbeilleX"; - - $abeille = new Abeille; - - $this->assertSame( "1303", $abeille->byLogicalId("Abeille1/0000","Abeille")->getId() ); - $this->assertSame( false, $abeille->byLogicalId($dest."/0000","Abeille") ); - $abeille->createRuche($dest); - $this->assertSame( "Ruche-".$dest, $abeille->byLogicalId($dest."/0000","Abeille")->getName() ); - } -} - - -?> - diff --git a/resources/archives/core/config/commands/Identify.json b/resources/archives/core/config/commands/Identify.json deleted file mode 100644 index 09d8c5a675..0000000000 --- a/resources/archives/core/config/commands/Identify.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "Identify": { - "subType": "other", - "logicalId": "identify", - "template": "", - "configuration": { - "topic": "identifySend", - "request": "EP=#EP#&duration=0010", - "visibilityCategory": "additionalCommand" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/Lift.json b/resources/archives/core/config/commands/Lift.json deleted file mode 100644 index 3a3b59c184..0000000000 --- a/resources/archives/core/config/commands/Lift.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "Lift": { - "isVisible": 1, - "name": "Lift", - "isHistorized": "1", - "subType": "numeric", - "invertBinary": "0", - "template": "", - "configuration": { - "minValue": "1", - "maxValue": "254", - "historizeRound": "0", - "calculValueOffset": "", - "visibilityCategory": "All" - }, - "type": "info", - "logicalId": "Lift", - "unit": "%" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/LivoloSwitchTrick1.json b/resources/archives/core/config/commands/LivoloSwitchTrick1.json deleted file mode 100644 index 87937e27aa..0000000000 --- a/resources/archives/core/config/commands/LivoloSwitchTrick1.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "LivoloSwitchTrick1": { - "subType": "other", - "template": "", - "logicalId": "LivoloSwitchTrick1", - "configuration": { - "topic": "cmd-0006", - "request": "ep=#EP#&cmd=02", - "visibilityCategory": "All", - "execAtCreation": "Yes", - "execAtCreationDelay": 9 - }, - "display": { - "forceReturnLineAfter": "0" - }, - "type": "action", - "genericType": "LIGHT_TOGGLE" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/LivoloSwitchTrick2.json b/resources/archives/core/config/commands/LivoloSwitchTrick2.json deleted file mode 100644 index 2216ab9e6d..0000000000 --- a/resources/archives/core/config/commands/LivoloSwitchTrick2.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "LivoloSwitchTrick2": { - "subType": "other", - "template": "", - "logicalId": "LivoloSwitchTrick2", - "configuration": { - "topic": "cmd-0006", - "request": "ep=#EP#&cmd=01", - "visibilityCategory": "All", - "execAtCreation": "Yes", - "execAtCreationDelay": 10 - }, - "type": "action", - "genericType": "LIGHT_ON" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/LivoloSwitchTrick3.json b/resources/archives/core/config/commands/LivoloSwitchTrick3.json deleted file mode 100644 index 37bba81a3c..0000000000 --- a/resources/archives/core/config/commands/LivoloSwitchTrick3.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "LivoloSwitchTrick3": { - "subType": "other", - "logicalId": "LivoloSwitchTrick3", - "template": "", - "configuration": { - "topic": "cmd-0006", - "request": "ep=#EP#&cmd=01", - "visibilityCategory": "All", - "execAtCreation": "Yes", - "execAtCreationDelay": 11 - }, - "type": "action", - "genericType": "LIGHT_ON" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/LivoloSwitchTrick4.json b/resources/archives/core/config/commands/LivoloSwitchTrick4.json deleted file mode 100644 index 4ba52ad09a..0000000000 --- a/resources/archives/core/config/commands/LivoloSwitchTrick4.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "LivoloSwitchTrick4": { - "subType": "other", - "logicalId": "LivoloSwitchTrick4", - "template": "", - "configuration": { - "topic": "cmd-0006", - "request": "ep=#EP#&cmd=01", - "visibilityCategory": "All", - "execAtCreation": "Yes", - "execAtCreationDelay": 12 - }, - "type": "action", - "genericType": "LIGHT_ON" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/PuissanceCurrentPrise.json b/resources/archives/core/config/commands/PuissanceCurrentPrise.json deleted file mode 100644 index 927735fcd1..0000000000 --- a/resources/archives/core/config/commands/PuissanceCurrentPrise.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "PuissanceCurrentPrise": { - "isVisible": 1, - "invertBinary": "0", - "isHistorized": "1", - "name": "Current", - "subType": "numeric", - "template": "badge", - "configuration": { - "repeatEventManagement": "always", - "historizeRound": "0", - "maxValue": "300", - "minValue": "0", - "visibilityCategory": "All" - }, - "type": "info", - "logicalId": "0B04-#EP#-0508", - "unit": "mA", - "genericType": "" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/PuissanceVoltagePrise.json b/resources/archives/core/config/commands/PuissanceVoltagePrise.json deleted file mode 100644 index 36a247a8cd..0000000000 --- a/resources/archives/core/config/commands/PuissanceVoltagePrise.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "PuissanceVoltagePrise": { - "isVisible": 1, - "invertBinary": "0", - "isHistorized": "1", - "name": "Voltage", - "subType": "numeric", - "template": "badge", - "configuration": { - "repeatEventManagement": "always", - "historizeRound": "0", - "maxValue": "300", - "minValue": "0", - "visibilityCategory": "All" - }, - "type": "info", - "logicalId": "0B04-#EP#-0505", - "unit": "V", - "genericType": "" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/Tilt.json b/resources/archives/core/config/commands/Tilt.json deleted file mode 100644 index 49fe9cb3c5..0000000000 --- a/resources/archives/core/config/commands/Tilt.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "Tilt": { - "subType": "numeric", - "template": "", - "configuration": { - "minValue": "0", - "maxValue": "90", - "historizeRound": "0", - "visibilityCategory": "All" - }, - "type": "info", - "logicalId": "Tilt", - "unit": "deg" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/Xiaomi-ff01.json b/resources/archives/core/config/commands/Xiaomi-ff01.json deleted file mode 100644 index 0eeceb5915..0000000000 --- a/resources/archives/core/config/commands/Xiaomi-ff01.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "Xiaomi-ff01": { - "isVisible": 0, - "name": "Specific", - "isHistorized": "0", - "subType": "string", - "invertBinary": "0", - "template": "", - "configuration": { - "visibilityCategory": "additionalCommand" - }, - "type": "info", - "logicalId": "0000-#EP#-ff01-removed", - "comment": "changed ff01 to ff01removed to avoid homebridge to crash as Hex data are in this command info." - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/act_tuyaEF00-Set-Setpoint-Mult.json b/resources/archives/core/config/commands/act_tuyaEF00-Set-Setpoint-Mult.json deleted file mode 100644 index 65a51c934e..0000000000 --- a/resources/archives/core/config/commands/act_tuyaEF00-Set-Setpoint-Mult.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "act_tuyaEF00-Set-Setpoint-Mult": { - "comment": "Tuya set setpoint with multiply", - "logicalId": "#EP#-TuyaEF00-Set-Setpoint-Mult", - "subType": "slider", - "template": "", - "configuration": { - "topic": "cmd-tuyaEF00", - "request": "ep=#EP#&cmd=setValueMult&mult=#mult#&data=#slider#", - "minValue": 5, - "maxValue": 30 - }, - "type": "action", - "genericType": "THERMOSTAT_SET_SETPOINT" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/act_tuyaEF00-Set-Setpoint.json b/resources/archives/core/config/commands/act_tuyaEF00-Set-Setpoint.json deleted file mode 100644 index c681a173de..0000000000 --- a/resources/archives/core/config/commands/act_tuyaEF00-Set-Setpoint.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "act_tuyaEF00-Set-Setpoint": { - "logicalId": "#EP#-TuyaEF00-Set-Setpoint", - "subType": "slider", - "template": "", - "configuration": { - "topic": "cmd-tuyaEF00", - "request": "ep=#EP#&cmd=setValue&data=#slider#", - "minValue": 5, - "maxValue": 30 - }, - "type": "action", - "genericType": "THERMOSTAT_SET_SETPOINT" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/act_tuyaEF00-SetThermostatMode.json b/resources/archives/core/config/commands/act_tuyaEF00-SetThermostatMode.json deleted file mode 100644 index 7074d4b35b..0000000000 --- a/resources/archives/core/config/commands/act_tuyaEF00-SetThermostatMode.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "act_tuyaEF00-SetThermostatMode": { - "subType": "other", - "template": "", - "configuration": { - "topic": "cmd-tuyaEF00", - "request": "ep=#EP#&cmd=setThermostat-Mode" - }, - "type": "action", - "genericType": "GENERIC_ACTION" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/act_zbConfigureReporting.json b/resources/archives/core/config/commands/act_zbConfigureReporting.json deleted file mode 100644 index 62cc1cd3fc..0000000000 --- a/resources/archives/core/config/commands/act_zbConfigureReporting.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "act_zbConfigureReporting": { - "comment": "Generic configure reporting command", - "comment2": "#MININTERVAL#, #MAXINTERVAL# & #CHANGEVAL# are expected in HEXA with proper formatting", - "subType": "other", - "logicalId": "configReport-#EP#-#CLUSTID#-#ATTRID#", - "configuration": { - "topic": "configureReporting", - "request": "ep=#EP#&clustId=#CLUSTID#&attrType=#ATTRTYPE#&attrId=#ATTRID#&minInterval=#MININTERVAL#&maxInterval=#MAXINTERVAL#&changeVal=#CHANGEVAL#" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/danfossTemperatureConsigneGet.json b/resources/archives/core/config/commands/danfossTemperatureConsigneGet.json deleted file mode 100644 index 10378c396b..0000000000 --- a/resources/archives/core/config/commands/danfossTemperatureConsigneGet.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "danfossTemperatureConsigneGet": { - "isVisible": 0, - "logicalId": "#EP#-danfossTemperatureConsigneGet", - "isHistorized": "0", - "subType": "other", - "invertBinary": "0", - "template": "", - "configuration": { - "topic": "readAttribute", - "request": "ep=01&clustId=0201&attrId=0012", - "visibilityCategory": "additionalCommand" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/danfossTemperatureConsigneValue.json b/resources/archives/core/config/commands/danfossTemperatureConsigneValue.json deleted file mode 100644 index a9136841c6..0000000000 --- a/resources/archives/core/config/commands/danfossTemperatureConsigneValue.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "danfossTemperatureConsigneValue": { - "isVisible": 1, - "logicalId": "#EP#-danfossTemperatureConsigneValue", - "isHistorized": "1", - "subType": "numeric", - "template": "badge", - "invertBinary": "0", - "configuration": { - "visibilityCategory": "All" - }, - "type": "info", - "logicalId": "0201-01-0012", - "unit": "\u00b0C", - "genericType": "TEMPERATURE" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/inf_time-Timestamp.json b/resources/archives/core/config/commands/inf_time-Timestamp.json deleted file mode 100644 index 93f54890a1..0000000000 --- a/resources/archives/core/config/commands/inf_time-Timestamp.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "inf_time-Timestamp": { - "subType": "numeric", - "template": "badge", - "configuration": { - "visibilityCategory": "Time" - }, - "type": "info", - "logicalId": "Time-TimeStamp", - "genericType": "GENERIC_INFO" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/inf_zbAttr-0000-SWBuildID.json b/resources/archives/core/config/commands/inf_zbAttr-0000-SWBuildID.json deleted file mode 100644 index 2ed2ad0722..0000000000 --- a/resources/archives/core/config/commands/inf_zbAttr-0000-SWBuildID.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "inf_zbAttr-0000-SWBuildID": { - "type": "info", - "subType": "string", - "genericType": "GENERIC_INFO", - "configuration": { - "visibilityCategory": "All" - }, - "logicalId": "0000-#EP#-4000" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/levelVolet.json b/resources/archives/core/config/commands/levelVolet.json deleted file mode 100644 index ecb24d8e8d..0000000000 --- a/resources/archives/core/config/commands/levelVolet.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "levelVolet": { - "isVisible": 1, - "name": "Level", - "isHistorized": "1", - "subType": "numeric", - "invertBinary": "0", - "template": "", - "configuration": { - "minValue": "0", - "maxValue": "100", - "historizeRound": "0", - "calculValueOffset": "#value#\/255*100", - "visibilityCategory": "All" - }, - "type": "info", - "logicalId": "0008-01-0000", - "unit": "%", - "genericType": "FLAP_SLIDER" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/moveToLiftAndTiltBSO_Lift.json b/resources/archives/core/config/commands/moveToLiftAndTiltBSO_Lift.json deleted file mode 100644 index a2515834b1..0000000000 --- a/resources/archives/core/config/commands/moveToLiftAndTiltBSO_Lift.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "moveToLiftAndTiltBSO_Lift": { - "isVisible": 1, - "logicalId": "#EP#-SetBSOLift", - "subType": "slider", - "value": "Lift", - "template": "", - "configuration": { - "minValue": "1", - "maxValue": "254", - "topic": "moveToLiftAndTiltBSO", - "request": "EP=01&lift=#slider#&inclinaison=#cmdInfo_Tilt_#&duration=10", - "visibilityCategory": "All" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/moveToLiftAndTiltBSO_Tilt.json b/resources/archives/core/config/commands/moveToLiftAndTiltBSO_Tilt.json deleted file mode 100644 index 036599b198..0000000000 --- a/resources/archives/core/config/commands/moveToLiftAndTiltBSO_Tilt.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "moveToLiftAndTiltBSO_Tilt": { - "isVisible": 1, - "logicalId": "#EP#-SetBSOTilt", - "subType": "slider", - "value": "Tilt", - "template": "", - "configuration": { - "minValue": "0", - "maxValue": "90", - "topic": "moveToLiftAndTiltBSO", - "request": "EP=01&inclinaison=#slider#&duration=10", - "visibilityCategory": "All" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/offGroup.json b/resources/archives/core/config/commands/offGroup.json deleted file mode 100644 index b48ab528ee..0000000000 --- a/resources/archives/core/config/commands/offGroup.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "offGroup": { - "isVisible": 1, - "logicalId": "#EP#-OffGroup", - "subType": "other", - "template": "", - "configuration": { - "topic": "CmdAbeille\/#addrGroup#\/OnOffGroup", - "request": "Off", - "visibilityCategory": "All" - }, - "display": { - "icon": "<\/i>" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/offGroupBroadcast.json b/resources/archives/core/config/commands/offGroupBroadcast.json deleted file mode 100644 index a0f7b5e018..0000000000 --- a/resources/archives/core/config/commands/offGroupBroadcast.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "offGroupBroadcast": { - "logicalId": "#EP#-offGroupBroadcast", - "isVisible": 1, - "subType": "other", - "template": "", - "configuration": { - "topic": "CmdAbeille\/#addrGroup#\/offGroupBroadcast", - "request": "Off", - "visibilityCategory": "All" - }, - "display": { - "icon": "<\/i>" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/offVolet.json b/resources/archives/core/config/commands/offVolet.json deleted file mode 100644 index 17d9ef915f..0000000000 --- a/resources/archives/core/config/commands/offVolet.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "offVolet": { - "isVisible": 1, - "logicalId": "#EP#-offVolet", - "subType": "other", - "template": "", - "configuration": { - "topic": "OnOff", - "request": "Off", - "visibilityCategory": "All" - }, - "type": "action", - "genericType": "FLAP_DOWN" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/onGroup.json b/resources/archives/core/config/commands/onGroup.json deleted file mode 100644 index b5825ee759..0000000000 --- a/resources/archives/core/config/commands/onGroup.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "onGroup": { - "isVisible": 1, - "logicalId": "#EP#-OnGroup", - "subType": "other", - "template": "", - "configuration": { - "topic": "CmdAbeille\/#addrGroup#\/OnOffGroup", - "request": "On", - "visibilityCategory": "All" - }, - "display": { - "icon": "<\/i>" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/onGroupBroadcast.json b/resources/archives/core/config/commands/onGroupBroadcast.json deleted file mode 100644 index 7622ff5e21..0000000000 --- a/resources/archives/core/config/commands/onGroupBroadcast.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "onGroupBroadcast": { - "logicalId": "#EP#-onGroupBroadcast", - "isVisible": 1, - "subType": "other", - "template": "", - "configuration": { - "topic": "CmdAbeille\/#addrGroup#\/onGroupBroadcast", - "request": "On", - "visibilityCategory": "All" - }, - "display": { - "icon": "<\/i>" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/onVolet.json b/resources/archives/core/config/commands/onVolet.json deleted file mode 100644 index e4ccc0e1ff..0000000000 --- a/resources/archives/core/config/commands/onVolet.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "onVolet": { - "isVisible": 1, - "logicalId": "#EP#-onVolet", - "subType": "other", - "template": "", - "configuration": { - "topic": "OnOff", - "request": "On", - "visibilityCategory": "All" - }, - "type": "action", - "genericType": "FLAP_UP" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/poll-0B04-0505-0508-050B.json b/resources/archives/core/config/commands/poll-0B04-0505-0508-050B.json deleted file mode 100644 index f944ed961c..0000000000 --- a/resources/archives/core/config/commands/poll-0B04-0505-0508-050B.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "poll-0B04-0505-0508-050B": { - "isVisible": 0, - "logicalId": "#EP#-poll-0B04-0505-0508-050B", - "isHistorized": "0", - "subType": "other", - "invertBinary": "0", - "template": "", - "configuration": { - "topic": "readAttribute", - "request": "ep=#EP#&clustId=0B04&attrId=0505,0508,050B", - "Polling": "cron", - "PollingOnCmdChange": "0006-#EP#-0000", - "PollingOnCmdChangeDelay": "5" - }, - "type": "action", - "comment": "Triggered by 0006-#EP#-0000 & every minutes" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/setReportLightColorSpectre.json b/resources/archives/core/config/commands/setReportLightColorSpectre.json deleted file mode 100644 index 0b277ea855..0000000000 --- a/resources/archives/core/config/commands/setReportLightColorSpectre.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "setReportLightColorSpectre": { - "logicalId": "#EP#-setReportLightColorSpectre", - "subType": "other", - "template": "", - "configuration": { - "topic": "setReport", - "request": "targetEndpoint=#EP#&ClusterId=0300&AttributeId=0007&AttributeType=21", - "visibilityCategory": "Network", - "execAtCreation": "Yes", - "execAtCreationDelay": 11 - }, - "type": "action", - "nextLine": "after" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/setReportPuissanceLegrand.json b/resources/archives/core/config/commands/setReportPuissanceLegrand.json deleted file mode 100644 index c542b9b6f0..0000000000 --- a/resources/archives/core/config/commands/setReportPuissanceLegrand.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "setReportPuissanceLegrand": { - "logicalId": "#EP#-setReportPuissanceLegrand", - "subType": "other", - "template": "", - "configuration": { - "topic": "setReport", - "request": "targetEndpoint=#EP#&ClusterId=0B04&AttributeId=050B&AttributeType=29", - "visibilityCategory": "Network", - "execAtCreation": "Yes", - "execAtCreationDelay": 11 - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/spiritBatterie-Pourcent.json b/resources/archives/core/config/commands/spiritBatterie-Pourcent.json deleted file mode 100644 index b88f37f37e..0000000000 --- a/resources/archives/core/config/commands/spiritBatterie-Pourcent.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "spiritBatterie-Pourcent": { - "isVisible": 0, - "name": "BatteriePourcent", - "isHistorized": "1", - "subType": "numeric", - "invertBinary": "0", - "template": "vuMeter", - "configuration": { - "minValue": "0", - "maxValue": "100", - "historizeRound": "1", - "visibilityCategory": "Network", - "calculValueOffset": "#value#\/2" - }, - "type": "info", - "logicalId": "0001-01-0021", - "unit": "%", - "genericType": "BATTERY" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/spiritTemperature.json b/resources/archives/core/config/commands/spiritTemperature.json deleted file mode 100644 index a2a53733d9..0000000000 --- a/resources/archives/core/config/commands/spiritTemperature.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "spiritTemperature": { - "isVisible": 1, - "logicalId": "#EP#-spiritTemperature", - "isHistorized": "1", - "subType": "numeric", - "invertBinary": "0", - "template": "tempIMG", - "configuration": { - "calculValueOffset": "#value#\/100", - "historizeRound": "1", - "visibilityCategory": "All" - }, - "type": "info", - "logicalId": "0201-#EP#-0000", - "unit": "\u00b0C", - "genericType": "TEMPERATURE" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/spiritUnknown1.json b/resources/archives/core/config/commands/spiritUnknown1.json deleted file mode 100644 index 560effbbea..0000000000 --- a/resources/archives/core/config/commands/spiritUnknown1.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "spiritUnknown1": { - "isVisible": 0, - "logicalId": "#EP#-spiritUnknown1", - "isHistorized": "0", - "subType": "numeric", - "invertBinary": "0", - "template": "badge", - "configuration": { - "calculValueOffset": "#value#", - "historizeRound": "1", - "visibilityCategory": "All" - }, - "type": "info", - "logicalId": "0201-#EP#-0012", - "unit": "", - "genericType": "" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/spiritUnknown2.json b/resources/archives/core/config/commands/spiritUnknown2.json deleted file mode 100644 index e2279c7802..0000000000 --- a/resources/archives/core/config/commands/spiritUnknown2.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "spiritUnknown2": { - "isVisible": 0, - "logicalId": "#EP#-spiritUnknown2", - "isHistorized": "0", - "subType": "numeric", - "invertBinary": "0", - "template": "badge", - "configuration": { - "calculValueOffset": "#value#", - "historizeRound": "1", - "visibilityCategory": "All" - }, - "type": "info", - "logicalId": "0201-#EP#-0014", - "unit": "", - "genericType": "" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/temperatureLight.json b/resources/archives/core/config/commands/temperatureLight.json deleted file mode 100644 index 45e2a73511..0000000000 --- a/resources/archives/core/config/commands/temperatureLight.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "temperatureLight": { - "isVisible": 1, - "name": "temperatureLight", - "isHistorized": "0", - "subType": "numeric", - "invertBinary": "0", - "template": "badge", - "configuration": { - "visibilityCategory": "All", - "minValue": "2000", - "maxValue": "6500", - "visibiltyTemplate": "1", - "calculValueOffset": "intval(1000000\/#value#)" - }, - "type": "info", - "logicalId": "0300-#EP#-0007", - "unit": "K", - "genericType": "LIGHT_COLOR_TEMP" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/temperatureLight1.json b/resources/archives/core/config/commands/temperatureLight1.json deleted file mode 100644 index a9ab04fac2..0000000000 --- a/resources/archives/core/config/commands/temperatureLight1.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "temperatureLight1": { - "isVisible": 1, - "name": "temperatureLight", - "isHistorized": "1", - "subType": "numeric", - "invertBinary": "0", - "template": "badge", - "configuration": { - "visibilityCategory": "All", - "minValue": "2700", - "maxValue": "5000", - "visibiltyTemplate": "1" - }, - "type": "info", - "logicalId": "Temperature-Light", - "unit": "K", - "genericType": "LIGHT_COLOR_TEMP" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/temperatureLight2.json b/resources/archives/core/config/commands/temperatureLight2.json deleted file mode 100644 index 3124f06463..0000000000 --- a/resources/archives/core/config/commands/temperatureLight2.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "temperatureLight2": { - "isVisible": 1, - "name": "temperatureLight", - "isHistorized": "1", - "subType": "numeric", - "invertBinary": "0", - "template": "badge", - "configuration": { - "visibilityCategory": "All", - "minValue": "2000", - "maxValue": "6500", - "visibiltyTemplate": "1" - }, - "type": "info", - "logicalId": "Temperature-Light", - "unit": "K", - "genericType": "LIGHT_COLOR_TEMP" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/temperatureLightV2.json b/resources/archives/core/config/commands/temperatureLightV2.json deleted file mode 100644 index af73e103bb..0000000000 --- a/resources/archives/core/config/commands/temperatureLightV2.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "temperatureLightV2": { - "isVisible": 1, - "name": "TemperatureLight", - "isHistorized": "1", - "subType": "numeric", - "invertBinary": "0", - "template": "", - "configuration": { - "historizeRound": "0", - "visibilityCategory": "All" - }, - "type": "info", - "logicalId": "0300-#EP#-0007", - "unit": "K", - "nextLine": "after" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/testSmoke.json b/resources/archives/core/config/commands/testSmoke.json deleted file mode 100644 index f4f059b638..0000000000 --- a/resources/archives/core/config/commands/testSmoke.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "testSmoke": { - "isVisible": 1, - "logicalId": "#EP#-testSmoke", - "subType": "other", - "configuration": { - "topic": "WriteAttributeRequestVibration", - "request": "Proprio=115f&clusterId=0500&attributeId=fff1&attributeType=23&value=03010000&repeat=3", - "visibilityCategory": "Network" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/toggleGroup.json b/resources/archives/core/config/commands/toggleGroup.json deleted file mode 100644 index f44d83eed5..0000000000 --- a/resources/archives/core/config/commands/toggleGroup.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "toggleGroup": { - "logicalId": "#EP#-ToggleGroup", - "isVisible": 1, - "subType": "other", - "template": "", - "configuration": { - "topic": "CmdAbeille\/#addrGroup#\/OnOffGroup", - "request": "Toggle", - "visibilityCategory": "All" - }, - "display": { - "icon": "<\/i>", - "forceReturnLineAfter": "0" - }, - "type": "action" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/commands/zb-CustomInfo.json b/resources/archives/core/config/commands/zb-CustomInfo.json deleted file mode 100644 index edce01a40d..0000000000 --- a/resources/archives/core/config/commands/zb-CustomInfo.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "zb-CustomInfo": { - "name": "Custom info", - "subType": "numeric", - "configuration": [], - "type": "info", - "logicalId": "#CLUSTID#-#EP#-#ATTRID#" - } -} \ No newline at end of file diff --git a/resources/archives/core/config/setAffichage.php b/resources/archives/core/config/setAffichage.php deleted file mode 100644 index 7f396ffefd..0000000000 --- a/resources/archives/core/config/setAffichage.php +++ /dev/null @@ -1,174 +0,0 @@ - {}.new" \;'."\n"; - echo 'Pour remplacer les anciens par les nouveaux:find . -name "[!.]*.json" -print -exec mv {}.new {} \;'."\n"; - exit; - } - - // $NE="LWB010"; - // $NE="LWB006"; - $file=$argv[1]; - - if ( $debug ) echo "File to process: ".$file."\n"; - - -$commands = array( - "0000-0000"=>"Network", // ZCL Version - "0000-0001"=>"Network", // SW / Appli Version - "0000-0002"=>"Network", // Stack Version - "0000-0003"=>"Network", // HW Version - "0000-0004"=>"Network", // Manufacturer Name - "0000-0005"=>"Network", // Model Identifier - "0000-0006"=>"Network", // Date Code - "0000-0010"=>"Network", // Location Description - "0000-03-0001"=>"Network", // SW / Appli Version - "0000-03-0004"=>"Network", // Manufacturer Name - "0000-03-0005"=>"Network", // Model Identifier - "0000-03-4000"=>"All", - "0000-0B-0004"=>"Network", // Manufacturer Name - "0000-0B-0005"=>"Network", // Model Identifier - "0000-0B-4000"=>"Network", - "0000-4000"=>"Network", - - "0000-ff01"=>"additionalCommand", // Proprio Xiaomi - - "0001-0021"=>"Network", // Batterie % based on Ikea sniff - - "0006-0000"=>"All", // On/Off Cluster - OnOff - "0006-02-0000"=>"All", // On/Off Cluster - OnOff - "0006-03-0000"=>"All", // On/Off Cluster - OnOff - "0006-04-0000"=>"All", // On/Off Cluster - OnOff - "0006-05-0000"=>"All", // On/Off Cluster - OnOff - "0006-0B-0000"=>"All", // On/Off Cluster - OnOff - "0006-8000"=>"All", // Multi Press on Xiaomi Switch - "0008-0000"=>"All", // CurrentLevel - "0008-03-0000"=>"All", // CurrentLevel - "0008-0B-0000"=>"All", // CurrentLevel - "000C-03-0055"=>"All", // Rotation angle cube ? - "000C-03-ff05"=>"All", // Rotation cube ? - "000c-ff05"=>"All", // Rotation cube ? - "0012-0055"=>"All", // Mouvement Cube - "0012-02-0055"=>"All", // Mouvement Cube - "0101-0055"=>"All", // Sensor Vibration: 1: Vibration, 2: rotation, 3: chute - "0101-0503"=>"All", // Sensor Vibration: angle - "0300-0003"=>"All", // colorX: Ampoule Ikea - "0300-0004"=>"All", // colorY: Ampoule Ikea - "0400-0000"=>"All", // Luminosite - "0402-0000"=>"All", // Temperature - "0403-0000"=>"All", // Pression - "0403-0010"=>"Network", // Pression - "0403-0014"=>"Network", // Pression Scale - "0405-0000"=>"All", // Humidite - "0406-0000"=>"All", // Presence - "0500-0000"=>"All", // Smoke - - "2200K"=>"All", - "2700K"=>"All", - "4000K"=>"All", - "Batterie-Pourcent"=>"Network", - "Batterie-Volt"=>"Network", - "BindShortToZigateEtat"=>"Network", - "BindShortToZigateLevel"=>"Network", - "BindToZigateEtat"=>"Network", - "BindToZigateLevel"=>"Network", - "Blanc"=>"All", - "Bleu"=>"All", - "Cancel"=>"All", - "Colour"=>"All", - "DownGroup"=>"All", - "getBattery"=>"All", - "getColorX"=>"additionalCommand", - "getColorY"=>"additionalCommand", - "getEtat"=>"additionalCommand", - "getLevel"=>"additionalCommand", - "getManufacturerName"=>"additionalCommand", - "getModelIdentifier"=>"additionalCommand", - "getSWBuild"=>"additionalCommand", - "Group-Membership"=>"Network", - "High"=>"Network", - "Identify"=>"additionalCommand", - "IEEE-Addr"=>"Network", - "Level Stop"=>"All", - "Level"=>"All", - "Link-Quality"=>"Network", - "Low"=>"Network", - "Medium"=>"Network", - "Off"=>"All", - "Off1"=>"All", - "Off2"=>"All", - "On"=>"All", - "On1"=>"All", - "On2"=>"All", - "online"=>"Network", - "Power-Source"=>"Network", - "Rouge"=>"All", - "Sc1"=>"All", - "Sc2"=>"All", - "Sc3"=>"All", - "Sensivity High"=>"Network", - "Sensivity Low"=>"Network", - "Sensivity Medium"=>"Network", - "setReportEtat"=>"Network", - "setReportLevel"=>"Network", - "Short-Addr"=>"Network", - "Start"=>"All", - "Stop"=>"All", - "tbd---conso--"=>"All", - "tbd---puissance--"=>"All", - "tbd---puissance-"=>"All", - "Temperature"=>"All", - "Test"=>"Network", - "Time-Time"=>"Time", - "Toggle"=>"All", - "Toggle1"=>"All", - "Toggle2"=>"All", - "UpGroup"=>"All", - "Var-Duration"=>"All", - "Var-ExpiryTime"=>"All", - "Var-RampUpDown"=>"All", - "Vert"=>"All", - ); - - - // $string = file_get_contents("./".$NE."/".$NE.".json"); - $string = file_get_contents($file); - $json = json_decode($string, true); - - $fileExploded = explode("/",$file); - // var_dump( $fileExploded ); - $NE = $fileExploded[1]; - // var_dump( $json[$NE]["Commandes"] ); - - foreach ( $json as $id=>$equipment ) { - if ( $debug ) var_dump( $id ); - foreach ( $equipment["commands"] as $key=>$command ) { - // var_dump($command["configuration"]); - // var_dump($command["configuration"]["visibilityCategory"]); - if ( isset( $command["configuration"] ) ) { - if ( isset( $command["configuration"]["visibilityCategory"] ) ) { - if ( $debug ) echo $key.'->'.$command["configuration"]["visibilityCategory"]."\n"; - } - else { - if ( $debug ) echo $key . "\n"; - $json[$id]["commands"][$key]["configuration"]["visibilityCategory"] = $commands[$key]; - } - } - else { - if ( $debug ) echo $key . "\n"; - $json[$id]["commands"][$key]["configuration"] = array( "visibilityCategory" => $commands[$key] ); - // $json[$NE]["Commandes"][$key]["configuration"]["visibilityCategory"] = $commands[$key]; - } - } - } - - - if ( $debug==0 ) echo json_encode($json); -?> diff --git a/resources/archives/core/php/AbeilleTest.php b/resources/archives/core/php/AbeilleTest.php deleted file mode 100644 index a684901f65..0000000000 --- a/resources/archives/core/php/AbeilleTest.php +++ /dev/null @@ -1,549 +0,0 @@ -sendCmdToZigate( 'Abeille1', '0092', '0006', "0283E4010102" ); - } - - if ($test==2) { - echo "ON / OFF with no effects: Toggle avec command zigate 0530 idem as test == 1\n"; - - $addressMode = "02"; // 01 pour groupe, 02 pour NE - $targetShortAddress = $argv[2]; - $sourceEndpoint = "01"; - $destinationEndpoint = "01"; - $profile = "0104"; - $cluster = "0006"; - $securityMode = "02"; - $radius = "30"; - // $dataLength = "16"; - - $FrameControlField = "11"; - $SQN = "00"; - $cmd = "02"; // Toggle - - $data2 = $FrameControlField . $SQN . $cmd; - $dataLength = sprintf("%02s",dechex(strlen( $data2 )/2)); - - $data1 = $addressMode . $targetShortAddress . $sourceEndpoint . $destinationEndpoint . $cluster . $profile . $securityMode . $radius . $dataLength; - - $data = $data1 . $data2; - $lenth = sprintf("%04s",dechex(strlen( $data )/2)); - - $cmdQueue->sendCmdToZigate( 'Abeille1', '0530', $lenth, $data ); - } - - if ($test==3) { - echo "Windows Covering test for Store Ikea: Up\n"; - - $addressMode = "02"; // 01 pour groupe, 02 pour NE - $targetShortAddress = $argv[2]; - $sourceEndpoint = "01"; - $destinationEndpoint = "01"; - $profile = "0104"; - $cluster = "0102"; - $securityMode = "02"; - $radius = "30"; - // $dataLength = "16"; - - $FrameControlField = "11"; - $SQN = "00"; - $cmd = "00"; // 00: Up, 01: Down, 02: Stop, 04: Go to lift value (not supported), 05: Got to lift pourcentage. - - $data2 = $FrameControlField . $SQN . $cmd; - $dataLength = sprintf("%02s",dechex(strlen( $data2 )/2)); - - $data1 = $addressMode . $targetShortAddress . $sourceEndpoint . $destinationEndpoint . $cluster . $profile . $securityMode . $radius . $dataLength; - - $data = $data1 . $data2; - $lenth = sprintf("%04s",dechex(strlen( $data )/2)); - - $cmdQueue->sendCmdToZigate( 'Abeille1', '0530', $lenth, $data ); - - } - - if ($test==4) { - echo "Windows Covering test for Store Ikea: lift to %\n"; - - $addressMode = "02"; // 01 pour groupe, 02 pour NE - $targetShortAddress = $argv[2]; - $sourceEndpoint = "01"; - $destinationEndpoint = "01"; - $profile = "0104"; - $cluster = "0102"; - $securityMode = "02"; - $radius = "30"; - // $dataLength = "16"; - - $FrameControlField = "11"; - $SQN = "00"; - $cmd = "05"; // 00: Up, 01: Down, 02: Stop, 04: Go to lift value (not supported), 05: Got to lift pourcentage. - $liftValue = $argv[3]; - - $data2 = $FrameControlField . $SQN . $cmd . $liftValue . $liftValue; - $dataLength = sprintf("%02s",dechex(strlen( $data2 )/2)); - - $data1 = $addressMode . $targetShortAddress . $sourceEndpoint . $destinationEndpoint . $cluster . $profile . $securityMode . $radius . $dataLength; - - $data = $data1 . $data2; - $lenth = sprintf("%04s",dechex(strlen( $data )/2)); - - $cmdQueue->sendCmdToZigate( 'Abeille1', '0530', $lenth, $data ); - - } - - if ($test==5) { - echo "Curtain test Up\n"; - - $Command['addr']="727C"; - $Command['ep']="01"; - - $cmd = "0530"; - - //
- // - // - // - // - // - // - // - // - - // ZCL Control Field - // ZCL SQN - // Command Id - // .... - - $addrMode = "02"; - $addr = $Command['addr']; - $srcEp = "01"; - $dstEp = $Command['ep']; - $profId = "0104"; - $clustId = 'EF00'; - $secMode = "02"; - $radius = "1E"; - - /* ZCL header */ - $fcf = "11"; // Frame Control Field - $sqn = "23"; - $cmdId = "00"; - - $field1 = "00"; - $counterTuya = "01"; // Set to 1, in traces increasse all the time. Not sure if mandatory to increase. - $field3 = "01"; - $field4 = "04"; - $field5 = "00"; - $field6 = "01"; - $cmdIdTuya = "01"; // $Command['cmd']; - - $data2 = $fcf.$sqn.$cmdId.$field1.$counterTuya.$field3.$field4.$field5.$field6.$cmdIdTuya; - $dataLen2 = sprintf("%02s", dechex(strlen($data2) / 2)); - - $data1 = $addrMode.$addr.$srcEp.$dstEp.$clustId.$profId.$secMode.$radius.$dataLen2; - $data = $data1.$data2; - // $lenth = sprintf("%04x", strlen($data) / 2); - - echo $data."\n"; - $cmdQueue->sendCmdToZigate( 'Abeille1', $cmd, $data ); - - } - } - - // Send a L2 Command to the queue to be processed - if ( (100<=$test) && ($test<200) ) { - echo "To execute this test Abeille Daemon has to run.\n"; - - $msg = array(); - // $msgAbeille->priority = 1; - - if ($test==100) { - echo "Test pour BSO\n"; - echo "php AbeilleTest.php 100 adrese lift inclinaison duree\n"; - echo "adresse: 4 digit\n"; - echo "lift: 2 digit\n"; - echo "inclinaison: 2 digit\n"; - echo "duree: 4 digit, FFFF pour vitesse max\n"; - - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/moveToLiftAndTiltBSO'; - $msg['payload'] = 'EP=01&lift='.$argv[3].'&inclinaison='.$argv[4].'&duration='.$argv[5]; - } - - if ($test==108) { - echo "On Off Test\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/OnOff'; - $msg['payload'] = 'Action=Toggle&EP='.$argv[3]; - } - - if ($test==109) { - echo "On Off Test\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/OnOff'; - $msg['payload'] = 'Toggle'; - } - - if ($test==110) { - echo "Reset Ruche\n"; - $msg['topic'] = 'CmdAbeille1/0000/reset'; - $msg['payload'] = 'reset'; - } - - if ($test==111) { - echo "Used to Test PDM messages and dev the PDM feature\n"; - $msg['topic'] = 'CmdAbeille1/0000/PDM'; - $msg['payload'] = 'E_SL_MSG_PDM_HOST_AVAILABLE'; - } - - if ($test==112) { - echo "Test envoie Cmd With Tempo\n"; - $msg['topic'] = 'Tempo'.'CmdAbeille1/'.$argv[2].'/readAttribute' . '&time=' . (time() + 3); - $msg['payload'] = 'ep=01&clustId=0B04&attrId=050B'; - } - - // All Cluster 0000 - attribut 0 to 7 - if ($test==113) { - echo "Test envoie Cmd to get ZCL version\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0000&attrId=0000'; - } - - if ($test==114) { - echo "Test envoie Cmd to get Application version\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0000&attrId=0001'; - } - - if ($test==115) { - echo "Test envoie Cmd to get Stack version\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0000&attrId=0002'; - } - - if ($test==116) { - echo "Test envoie Cmd to get HW version\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0000&attrId=0003'; - } - - if ($test==117) { - echo "Test envoie Cmd to get ManufacturerName\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0000&attrId=0004'; - } - - if ($test==118) { - echo "Test envoie Cmd to get ModelIdentifier\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0000&attrId=0005'; - } - - if ($test==119) { - echo "Test envoie Cmd to get DateCode\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0000&attrId=0006'; - } - - if ($test==120) { - echo "Test envoie Cmd to get PowerSource\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0000&attrId=0007'; - } - - if ($test==121) { - echo "Test envoie Cmd to get batterie voltage\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0001&attrId=0021'; - } - - if ($test==122) { - echo "Test envoie Cmd to bind a cluster\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/bindShort'; - $msg['payload'] = 'targetExtendedAddress=00158D0001FFD6E9&targetEndpoint=01&ClusterId=0102&reportToAddress=00158D0001B22E24'; - } - - if ($test==123) { - echo "Test envoie Cmd to setReport an attribut\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/setReport'; - $msg['payload'] = 'targetEndpoint=01&ClusterId=0102&AttributeId=0008&AttributeType=20'; - } - - if ($test==124) { - echo "Test envoie Cmd to DiscoverAttributesCommand\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/discoverAttributes'; - $msg['payload'] = 'ep=01&clustId='.$argv[3].'&startAttrId=0000&maxAttrId=FF'; - } - - if ($test==125) { - echo "Test envoie Cmd to Discover IEEE\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/getIeeeAddress'; - $msg['payload'] = ''; - } - - if ($test==126) { - echo "Test recuperation parametre Scene Count\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0005&attrId=0000'; - } - - if ($test==127) { - echo "Test recuperation parametre Scene Current\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0005&attrId=0001'; - } - - if ($test==128) { - echo "Test recuperation parametre Group Current for scene\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0005&attrId=0002'; - } - - if ($test==129) { - echo "Test recuperation parametre scene active\n"; - $msg['topic'] = 'CmdAbeille1/'.$argv[2].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0005&attrId=0003'; - } - - if ($test==130) { - echo "Remove Group Tele Innr EP 1, 3-8\n"; - $msg['topic'] = 'CmdAbeille1/0000/removeGroup'; - $msg['payload'] = 'address='.$argv[2].'&DestinationEndPoint='.$argv[3].'&groupAddress='.$argv[4]; - } - - if ($test==131) { - echo "Read white spectre color of an Ikea bulb\n"; - $msg['topic'] = 'CmdAbeille2/'.$argv[2].'/readAttribute'; - $msg['payload'] = 'ep=01&clustId=0300&attrId=0007'; - } - - if ($test==132) { - echo "Set Time to Zigate\n"; - $msg['topic'] = 'CmdAbeille' . $argv[2] . '/0000/zgSetTimeServer'; - $msg['payload'] = ''; - } - - if ($test==133) { - echo "Get Time from Zigate\n"; - $msg['topic'] = 'CmdAbeille' . $argv[2] . '/0000/zgGetTimeServer'; - $msg['payload'] = ''; - } - - // Send the command to the queue for processing - $queueKeyAbeilleToCmd = msg_get_queue(queueKeyAbeilleToCmd); - if ( $queueKeyAbeilleToCmd ) { - if (msg_send($queueKeyAbeilleToCmd, priorityUserCmd, json_encode($msg), false, false)) { - echo "Msg sent: " . json_encode($msg) . "\n"; - } else { - echo "Could not send Msg\n"; - } - } - else { - echo "Can t connect to the queue !\n"; - } - } - - // Send a message to Abeille's queue - if ( (200<=$test) && ($test<300) ) { - switch($test) { - case 200: - echo "Send a Systeme Message to the Ruche to be used by a scenario by the user\n"; - // public static function publishMosquitto($queueId, $priority, $topic, $payload) - Abeille::publishMosquitto($abQueues["xToAbeille"]["id"], PRIO_NORM, "Abeille1/0000/SystemMessage", "Le message"); - break; - case 201: - echo "Send a Systeme Message to the Ruche1 and clean it after 5 sec\n"; - AbeilleTools::sendMessageToRuche("daemonTest1","this is test message from zigate1"); - sleep( 5); - AbeilleTools::sendMessageToRuche("daemonTest1",""); - break; - case 202: - echo "Send a Systeme Message to the Ruche3 and clean it after 5 sec\n"; - AbeilleTools::sendMessageToRuche("daemonTest3","this is test message from zigate3"); - sleep( 5); - AbeilleTools::sendMessageToRuche("daemonTest3",""); - break; - case 203: - echo "Send a Systeme Message to the Ruche1 and 2 and clean them after 5 sec\n"; - AbeilleTools::sendMessageToRuche("daemonTest1","this is test message from zigate1"); - AbeilleTools::sendMessageToRuche("daemonTest2","this is test message from zigate2"); - sleep( 5); - AbeilleTools::clearSystemMessage($parameters); - break; - case 204: - echo "Send a Systeme Message to the Ruche1 and 2 and clean zigate 1 after 5 sec\n"; - AbeilleTools::sendMessageToRuche("daemonTest1","this is test message from zigate1"); - AbeilleTools::sendMessageToRuche("daemonTest2","this is test message from zigate2"); - sleep( 5); - AbeilleTools::clearSystemMessage($parameters,'1'); - break; - case 205: - echo "Send a Systeme Message to the Ruche to create an eq based on a template\n"; - Abeille::publishMosquitto($abQueues["xToAbeille"]["id"], PRIO_NORM, "Abeille1/FFFF/0000-01-0005", "BSO"); - break; - } - } - - // Test Methode/Function - if ( (300<=$test) && ($test<400) ) { - switch ($test) { - case 300: - echo "Test Cron function\n"; - Abeille::cron(); - break; - case 301: - echo "Test Cron15 function\n"; - Abeille::cron15(); - break; - case 302: - echo "Test CronHourly function\n"; - Abeille::cronHourly(); - break; - case 303: - echo "Test CronDaily function\n"; - Abeille::cronDaily(); - break; - case 310: - echo "Test getIEEE\n"; - var_dump(Abeille::getIEEE('Abeille1/B529')); - break; - case 311: - echo "Test getEqFromIEEE\n"; - var_dump(Abeille::getEqFromIEEE('842E14FFFE1396F5')); - break; - case 320: - echo "Test AbeilleParser::execAtCreationCmdForOneNE(logicalId)\n"; - AbeilleParser::execAtCreationCmdForOneNE($argv[2]); - break; - case 330: - echo "Decodage trame prise Xiaomi a l adressse: 4AAE\n"; - $trame = "8002005495000104FCC00101024AAE0200001C5F11E40AF700413D64100103281A9839FE542C429539F187773E963900200F459739A8223C43052101009A20100821160107270000000000000000092100040B20009B100199"; - $abeilleParser = new AbeilleParser; - $abeilleParser->protocolDatas("Abeille1", $trame); - break; - case 331: - echo "Test daemon monitoring\n"; - - echo "Parameters:\n"; - // $parameters = Abeille::getParameters(); - $json = '{"parametersCheck":"ok","parametersCheck_message":"","ab::defaultParent":"125","ab::zgType1":"USB","ab::zgPort1":"\/dev\/ttyUSB3","ab::zgIpAddr1":"192.168.4.1:23","ab::zgEnabled1":"Y","ab::zgType2":"WIFI","ab::zgPort2":"\/dev\/zigate2","ab::zgIpAddr2":"192.168.4.106:23","ab::zgEnabled2":"Y","ab::zgType3":"USB","ab::zgPort3":"\/dev\/ttyUSB2","ab::zgIpAddr3":"192.168.4.119:23","ab::zgEnabled3":"Y","ab::zgType4":"WIFI","ab::zgPort4":"\/dev\/zigate4","ab::zgIpAddr4":"192.168.4.107:23","ab::zgEnabled4":"Y"}'; - $parameters = json_decode($json,1); - // var_dump($parameters); - // echo "Parameters: ".json_encode($parameters)."\n"; - // echo "Nb zigate: ".$parameters['zigateNb']."\n"; - - // $running = AbeilleTools::getRunningDaemons(); - // Kiwi Pro Simu - $running[] = "845 /usr/bin/php /var/www/html/plugins/Abeille/core/class/../php/AbeilleSocat.php /tmp/zigateWifi2 debug 192.168.4.106:23"; - $running[] = "847 /usr/bin/php /var/www/html/plugins/Abeille/core/class/../php/AbeilleSocat.php /tmp/zigateWifi4 debug 192.168.4.107:23"; - $running[] = "873 /usr/bin/php /var/www/html/plugins/Abeille/core/class/../php/AbeilleSerialRead.php Abeille1 /dev/ttyUSB3 debug"; - $running[] = "878 /usr/bin/php /var/www/html/plugins/Abeille/core/class/../php/AbeilleSerialRead.php Abeille2 /tmp/zigateWifi2 debug"; - $running[] = "883 /usr/bin/php /var/www/html/plugins/Abeille/core/class/../php/AbeilleSerialRead.php Abeille3 /dev/ttyUSB2 debug"; - $running[] = "892 /usr/bin/php /var/www/html/plugins/Abeille/core/class/../php/AbeilleSerialRead.php Abeille4 /tmp/zigateWifi4 debug"; - $running[] = "896 /usr/bin/php /var/www/html/plugins/Abeille/core/class/AbeilleParser.php debug"; - $running[] = "899 /usr/bin/php /var/www/html/plugins/Abeille/core/class/../../core/class/AbeilleCmd.php debug"; - - echo "Running: ".json_encode($running)."\n"; - echo "\n"; - - $diff = AbeilleTools::diffExpectedRunningDaemons($parameters, $running); - echo "Diff: ".json_encode($diff)."\n"; - echo "\n"; - - break; - } - } - - // Test core function of Jeedom - if ( (400<=$test) && ($test<500) ) { - switch ($test) { - case 400: - echo "Cmd ByValue: retourne les commandes qui ont value ou #value# dans le champ value.\n"; - $newVal = 53; - $cmdAction = cmd::byId(23897); - echo "Cmd Action : ".$cmdAction->getName()."\n"; - $cmdInfo = $cmdAction->getCmdValue(); - echo "Cmd Info associée : ".$cmdInfo->getName()." - ".$cmdInfo->execCmd()."\n"; - $cmdInfo->event($newVal); - echo "Cmd Info associée : ".$cmdInfo->getName()." - ".$cmdInfo->execCmd()."\n"; - break; - } - } - - // Test DIY - if ( (500<=$test) && ($test<600) ) { - - if ($test==500) { - echo "Test envoie Cmd to get ZCL version\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep=08&clustId=0000&attrId=0000'; - } - - if ($test==504) { - echo "Test envoie Cmd to get ManufacturerName\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep='.$argv[4].'&clustId=0000&attrId=0004'; - } - - if ($test==505) { - echo "Test envoie Cmd to get ModelIdentifier\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/readAttribute'; - $msg['payload'] = 'ep='.$argv[4].'&clustId=0000&attrId=0005'; - } - - // php AbeilleTest.php 510 2 F0C0 08 - // Led Red DIO6: toglle et visiblement un PWM to control level. - if ($test==510) { - echo "On Off Test\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/OnOff'; - $msg['payload'] = 'Action=Toggle&EP='.$argv[4]; - } - - // Control level Led Rouge - // Minimum puissance - // php AbeilleTest.php 511 2 F0C0 08 02 - // Toute puissance - // php AbeilleTest.php 511 2 F0C0 08 99 - if ($test==511) { - echo "Level Test\n"; - $msg['topic'] = 'CmdAbeille'.$argv[2].'/'.$argv[3].'/setLevel'; - $msg['payload'] = 'EP='.$argv[4].'&Level='.$argv[5].'&duration=10'; - } - - // Send the command to the queue for processing - $queueKeyAbeilleToCmd = msg_get_queue(queueKeyAbeilleToCmd); - if ( $queueKeyAbeilleToCmd ) { - if (msg_send($queueKeyAbeilleToCmd, priorityUserCmd, json_encode($msg), false, false)) { - echo "Msg sent: " . json_encode($msg) . "\n"; - } else { - echo "Could not send Msg\n"; - } - } - else { - echo "Can t connect to the queue !\n"; - } - } - - echo "End of the test.\n"; -?> diff --git a/resources/archives/core/scripts/installPiGpio.abeille.php b/resources/archives/core/scripts/installPiGpio.abeille.php deleted file mode 100644 index 03766a584f..0000000000 --- a/resources/archives/core/scripts/installPiGpio.abeille.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ -if (!isConnect('admin')) { - throw new Exception('{{401 - Accès non autorisé}}'); -} -?> - - {{Pause}} - -


-
-Lancement des operations.
-
- - diff --git a/resources/archives/core/scripts/installPiGpio.sh b/resources/archives/core/scripts/installPiGpio.sh deleted file mode 100644 index 54a3dfca50..0000000000 --- a/resources/archives/core/scripts/installPiGpio.sh +++ /dev/null @@ -1,29 +0,0 @@ -#! /bin/bash - -### -### PiGpio installation script -### Note: This assumes standard plateform (ex: RPI) with supported package -### - -NOW=`date +"%Y-%m-%d %H:%M:%S"` -echo "[${NOW}] Démarrage de '$(basename $0)'" - -echo "Mise-à-jour de la liste des packages" -sudo apt-get -y update -if [ $? -ne 0 ]; then - echo "= ERREUR: 'apt-get update'" - echo "= Problème de droits ?" - exit 1 -fi -echo "= Ok" - -echo "Installation du package 'PiGpio'" -sudo apt-get -y install python-pigpio python3-pigpio python-setuptools python3-setuptools -if [ $? -ne 0 ]; then - echo "= ERREUR: L'installation n'a pas aboutie." - echo "= Il se peut que le package PiGpio ne soit pas supporté sur votre plateforme." - exit 2 -fi -echo "= Ok" - -exit 0 \ No newline at end of file diff --git a/resources/archives/core/scripts/installSocat.sh b/resources/archives/core/scripts/installSocat.sh deleted file mode 100644 index 8c229f731b..0000000000 --- a/resources/archives/core/scripts/installSocat.sh +++ /dev/null @@ -1,29 +0,0 @@ -#! /bin/bash - -# Usage: ? - -NOW=`date +"%Y-%m-%d %H:%M:%S"` -echo "[${NOW}] Démarrage de '$(basename $0)' $@" - -echo "Mise-à-jour de la liste des packages" -sudo apt-get -y update - -echo "Installation de Socat" -sudo apt-get install socat -if [ $? -ne 0 ]; then - echo "= ERREUR: L'installation n'a pas aboutie." - echo "= Il se peut que le package 'socat' ne soit pas supporté sur votre plateforme." - exit 2 -fi -echo "= Ok, package installé." - -echo "Vérification finale de 'socat'" -command -v socat -if [ $? -ne 0 ]; then - echo "= ERREUR: Commande 'socat' manquante !" - echo "= Le package 'socat' semble être mal installé." - exit 3 -fi -echo "= Ok" - -exit 0 diff --git a/resources/archives/core/scripts/installWiringPi.sh b/resources/archives/core/scripts/installWiringPi.sh deleted file mode 100644 index 7676bab444..0000000000 --- a/resources/archives/core/scripts/installWiringPi.sh +++ /dev/null @@ -1,50 +0,0 @@ -#! /bin/bash - -### -### WiringPi installation script -### Note: This assumes standard plateform (ex: RPI) with supported package -### Note: WiringOPI is the equivalent for OrangePi -### - -NOW=`date +"%Y-%m-%d %H:%M:%S"` -echo "[${NOW}] Démarrage de '$(basename $0)'" - -echo "Mise-à-jour de la liste des packages" -sudo apt-get -y update -if [ $? -ne 0 ]; then - echo "= ERREUR: 'apt-get update'" - echo "= Problème de droits ?" - exit 1 -fi -echo "= Ok" - -# sudo apt-get -y upgrade - -# echo "installation de git" -# sudo apt-get -y install git-core - -# echo "installation de make" -# sudo apt-get -y install make - -# echo "installation de gcc" -# sudo apt-get -y install gcc - -echo "Installation du package 'WiringPi'" -sudo apt-get -y install wiringpi -if [ $? -ne 0 ]; then - echo "= ERREUR: L'installation n'a pas aboutie." - echo "= Il se peut que le package WiringPi ne soit pas supporté sur votre plateforme." - exit 2 -fi -echo "= Ok" - -echo "Vérification finale" -command -v gpio -if [ $? -ne 0 ]; then - echo "= ERREUR: Commande 'gpio' manquante !" - echo "= Le package WiringPi semble être mal installé." - exit 3 -fi -echo "= Ok" - -exit 0 diff --git a/resources/archives/core/scripts/updateFirmwareDIN.sh b/resources/archives/core/scripts/updateFirmwareDIN.sh deleted file mode 100644 index 577c8fd59f..0000000000 --- a/resources/archives/core/scripts/updateFirmwareDIN.sh +++ /dev/null @@ -1,103 +0,0 @@ -#! /bin/bash -# Zigate-DIN flash programmation script -# updateFirmwareDIN.sh [fwfile] -# where action = flash, check, eraseeeprom - -# NOW=`date +"%Y-%m-%d %H:%M:%S"` -# echo "[${NOW}] Démarrage de '$(basename $0)' $@" -echo "Démarrage de '$(basename $0)' $@" - -# Note: Startup directory is the one from the caller (ajax) -# It is then '/var/www/html/plugins/Abeille/core/ajax' -PROG=${PWD}/../../tmp/JennicModuleProgrammer -BUILD_DIR=${PWD}/../../resources/prog_jennic-0.7/build -FW_DIR=${PWD}/../../resources/fw_zigate -DIN_SCRIPT=${PWD}/../scripts/flash_ZiGate-DIN.py - -# Qq tests preliminaires -echo "Vérifications préliminaires" -error=0 -if [ $# -lt 2 ]; then - echo "= ERREUR: Argument(s) manquant(s) !" - echo "= updateFirmwareDIN.sh [fwfile]" - error=1 -fi -ACTION=$1 -ZGPORT=$2 -FW="" -if [ ${ACTION} != "flash" ] && [ ${ACTION} != "check" ] && [ ${ACTION} != "eraseeeprom" ]; then - echo "= ERREUR: Action '${ACTION}' non supportée." - echo "= Choix=flash/check/eraseeeprom" - error=1 -else - if [ ${ACTION} == "flash" ]; then - FW=$3 - if [ ! -e ${FW_DIR}/${FW} ]; then - echo "= ERREUR: le FW choisi n'existe pas !" - echo "= FW: ${FW}" - error=1 - fi - fi - if [ ! -e ${ZGPORT} ]; then - echo "= ERREUR: le port tty choisi n'existe pas !" - echo "= Port: ${ZGPORT}" - error=1 - fi - command -v python3 >/dev/null - if [ $? -ne 0 ]; then - echo "= ERREUR: 'python3' manquant ou non exécutable !" - echo "= Le package 'python3' est probablement mal installé." - error=1 - fi - if [ ! -e ${PROG} ]; then - # Compiling Jennic programmer since v0.7 - echo "Compilation du programmateur" - pushd ${BUILD_DIR} >/dev/null - sudo make - if [ $? -ne 0 ]; then - echo "= ERREUR: Compilation ratée !" - error=1 - fi - # echo "= ERREUR: Programmateur Jennic manquant !" - # echo "= ${PROG}" - # error=1 - popd >/dev/null - fi - if [ ! -x ${PROG} ]; then - # Attempting to correct execution right - sudo chmod +x ${PROG} >/dev/null - fi - if [ ! -x ${PROG} ]; then - echo "= ERREUR: Le programmateur Jennic n'est pas exécutable !" - echo "= ${PROG}" - error=1 - fi -fi -if [ $error != 0 ]; then - exit 1 -fi -echo "= Ok" - -status=0 - -# Si check seulement on quitte ici -if [ ${ACTION} == "check" ]; then - exit 0 -# elif [ ${ACTION} == "eraseeeprom" ]; then -# echo "Effacement de l'EEPROM" -# echo "- Port tty: ${ZGPORT}" -else - echo "Lancement de la programmation du firmware" - echo "- Port tty: ${ZGPORT}" - echo "- Firmware: ${FW}" - sudo python3 ${DIN_SCRIPT} -s ${ZGPORT} -b 250000 -f ${FW_DIR}/${FW} 2>&1 -fi - -if [ $? -eq 0 ]; then - echo "= Tout s'est bien passé. Vous pouvez fermer ce log." -else - echo "= ATTENTION !!! " - echo "= Quelque chose s'est mal passé." - echo "= Veuillez vérifier le log ci-dessus." -fi -exit $status diff --git a/resources/archives/desktop/Abeille-Js.php b/resources/archives/desktop/Abeille-Js.php deleted file mode 100644 index 24e9e42844..0000000000 --- a/resources/archives/desktop/Abeille-Js.php +++ /dev/null @@ -1,830 +0,0 @@ - - - - diff --git a/resources/archives/desktop/AbeilleEq-Advanced-Common.php b/resources/archives/desktop/AbeilleEq-Advanced-Common.php deleted file mode 100644 index 93ee61333b..0000000000 --- a/resources/archives/desktop/AbeilleEq-Advanced-Common.php +++ /dev/null @@ -1,76 +0,0 @@ - - -
- - - -
- -
- -
-
- -
- -
- - '; ?> -
-
- -
- - '; - echo ''; - addJsUpdateFunction($eqId, 'Time-Time', 'idLastComm'); - ?> -
- - -
- -
- -
-
- -
- -
- - / - -
-
- -
- -
- getConfiguration('ab::eqModel', null); - $jsonId = $eqModel ? $eqModel['id'] : ''; - if ($jsonId != '') { - echo 'Voir ici si présente'; - } - ?> -
-
- -
- -
- execCmd(); - else - $groups = ""; - echo ''.$groups.''; - ?> -
-
\ No newline at end of file diff --git a/resources/archives/desktop/AbeilleEq-Advanced-Device.php b/resources/archives/desktop/AbeilleEq-Advanced-Device.php deleted file mode 100644 index 214e28cd90..0000000000 --- a/resources/archives/desktop/AbeilleEq-Advanced-Device.php +++ /dev/null @@ -1,188 +0,0 @@ - - -
- - - -
- -
- getConfiguration('ab::signature', []); - $model = isset($sig['modelId']) ? $sig['modelId'] : ''; - $manuf = isset($sig['manufId']) ? $sig['manufId'] : ''; - // $location = isset($sig['location']) ? $sig['location'] : ''; - echo ''; - echo ''; - // echo ''; - ?> -
-
- - $ep2) { - if (!isset($ep2['servClusters'])) - continue; - if (strpos($ep2['servClusters'], '0000') === false) - continue; // Basic cluster not supported - - echo '
'; - echo ''; - echo '
'; - - $model2 = isset($ep2['modelId']) ? $ep2['modelId'] : ''; - $manuf2 = isset($ep2['manufId']) ? $ep2['manufId'] : ''; - $location2 = isset($ep2['location']) ? $ep2['location'] : ''; - if (($manuf2 != $manuf) || ($model2 != $model) || ($location2 != $location) ) { - echo ''; - echo ''; - echo ''; - if ($manuf == '') - $manuf = $manuf2; // Saving 1st - if ($model == '') - $model = $model2; // Saving 1st - if ($location == '') - $location = $location2; // Saving 1st - } - - echo '
'; - echo '
'; - } - } -?> - -
- -
- '; - echo ' Source:'; - if (($jsonLocation == '') || ($jsonLocation == "Abeille")) - $title = "Le modèle utilisé est celui fourni par Abeille"; - else - $title = "Le modèle utilisé est un modèle local/custom"; - echo ''; - - if ($jsonId == "defaultUnknown") { - if ($sig) { - $id1 = $sig['modelId'].'_'.$sig['manufId']; - $id2 = $sig['modelId']; - $customP = __DIR__."/../../core/config/devices_local/"; - $officialP = __DIR__."/../../core/config/devices/"; - if (file_exists($customP.$id1."/".$id1.".json") || - file_exists($customP.$id2."/".$id2.".json")) { - echo ' INFO: Modèle local/custom disponible.'; - // echo 'Utiliser'; - } else if (file_exists($officialP.$id1."/".$id1.".json") || - file_exists($officialP.$id2."/".$id2.".json")) { - echo ' INFO: Modèle officiel disponible.'; - // echo 'Utiliser'; - } - } - } else { - if ($jsonLocation != 'Abeille') { - echo ' ATTENTION: Issu d\'un modèle local '; - if (file_exists(__DIR__."/../../core/config/devices_local/".$jsonId."/".$jsonId.".json")) - echo 'Supprimer version locale'; - } - } - - echo '{{Mise-à-jour}}'; - echo '{{Réinitialiser}}'; - ?> -
-
- - - - -
- -
- Télécharger'; - ?> -
-
- - -
- -
- Ouvrir'; - ?> -
-
- -
- -
- '; - ?> -
-
- -
- - '; - echo ''; - addJsUpdateFunction($eqId, $cmdLogicId, 'idSwBuild', true); - echo '
'; - ?> - - - -
- -
- {{Réparer}}'; - ?> -
-
- diff --git a/resources/archives/desktop/AbeilleEq-Advanced-Interrogations.php b/resources/archives/desktop/AbeilleEq-Advanced-Interrogations.php deleted file mode 100644 index b4584bde82..0000000000 --- a/resources/archives/desktop/AbeilleEq-Advanced-Interrogations.php +++ /dev/null @@ -1,357 +0,0 @@ - - -
- - - -
-
-
-

{{Interrogation de l'équipement.}}

-
-
-

{{Sortie dans 'AbeilleParser.log' si mode 'debug' actif.}}

-
- - -
- -
- {{Interroger}}'; - ?> -
-
-
- -
- {{Interroger}}'; - ?> -
-
-
- -
- {{Interroger}}'; - ?> - -
-
-
- -
- {{Interroger}}'; - ?> -
-
-
- -
- {{Interroger}}'; - addEpInput("idEpSDR", $mainEP); - ?> -
-
-
- -
- {{Interroger}}'; - ?> -
-
-
- -
- {{Interroger}}'; - ?> -
-
-
- -
- {{Interroger}}'; - ?> - - -
-
- -
- -
- {{Bind}}'; - addEpInput("idEpE", $mainEP); - addClusterButton("idClustIdE"); - // - echo ' TO'; - addIeeeListButton("idIeeeE", true); - addEpInput("idEpE2", $mainEP); - ?> -
-
- -
- -
- {{Unbind}}'; - addEpInput("idEpSrc-UBD", $mainEP); - addClusterButton("idClustId-UBD"); - echo ' TO'; - addIeeeListButton("idAddr-UBD", true); - addEpInput("idEpDst-UBD", $mainEP); - ?> -
-
- -
- -
- {{Bind}}'; - addEpInput("idEpF", $mainEP); - addClusterButton("idClustIdF"); - echo ' TO'; - addGroupInput('idGroupF', 'Destination group'); - ?> -
-
- -
- -
- {{Unbind}}'; - addEpInput("idEpSrc-UBG", $mainEP); - addClusterButton("idClustId-UBG"); - echo ' TO'; - addGroupInput('idGroup-UBG', 'Destination group'); - ?> -
-
- -
- -
- {{Leave}}'; - // addIeeeListButton("idIeeeLR"); - // addClusterButton("idClustIdF"); - // echo ' TO'; - ?> - -
-
- - -
-
- -
- {{Lire}}'; - // echo ''; - addEpInput("idEpA", $mainEP); - addClusterButton("idClustIdA"); - addAttrInput("idAttrIdA"); - addManufCodeInput("idManufIdRA"); // Optional - ?> -
-
-
- -
- {{Ecrire}}'; - addEpInput("idEpWA", $mainEP); - addClusterButton("idClustIdWA"); - addAttrInput("idAttrIdWA"); - addTypeList("idAttrTypeWA"); - ?> - - - -
-
-
- -
- {{Ecrire}}'; - addEpInput("idEpWA2", $mainEP); - addClusterButton("idClustIdWA2"); - addDirInput("idDirWA2"); - addAttrInput("idAttrIdWA2"); - addTypeList("idAttrTypeWA2"); - ?> - - -
-
- -
- -
- {{Interroger}}'; - addEpInput("idEp", $mainEP); - addClusterButton("idClustId"); - addAttrInput("idAttrId"); - ?> -
-
-
- -
- {{Interroger}}'; - addEpInput("idEpB", $mainEP); - addClusterButton("idClustIdB"); - ?> -
-
-
- -
- {{Interroger}}'; - addEpInput("idEpD", $mainEP); - addClusterButton("idClustIdD"); - ?> -
-
-
- -
- {{Interroger}}'; - addEpInput("idEpC", $mainEP); - addClusterButton("idClustIdC"); - ?> -
-
-
- -
- {{Configurer}}'; - addEpInput("idEpCR", $mainEP); - addClusterButton("idClustIdCR"); - addAttrInput("idAttrIdCR"); - addTypeList("idAttrTypeCR"); - ?> - - - - - -
-
- -
- -
- -
- {{Reset}}'; - addEpInput("idEpG", $mainEP); - ?> -
-
-
- -
- {{Add}}'; - addEpInput("idEp-AG", $mainEP); - addGroupInput('idGroup-AG', 'Destination group'); - ?> -
-
-
- -
- {{Get}}'; - addEpInput("idEp-GGM", $mainEP); - // addGroupInput('idGroup-AG', 'Destination group'); - ?> -
-
-
- -
- {{Remove}}'; - addEpInput("idEp-RAG", $mainEP); - // addGroupInput('idGroup-AG', 'Destination group'); - ?> -
-
-
- -
- {{Modifier}}'; - addEpInput("idEpC0201-00", $mainEP); - ?> - -
-
-
- -
- {{Appliquer}}'; - addEpInput("idEp-MTC", $mainEP); - ?> - - -
-
-
- -
- {{Appliquer}}'; - addEpInput("idEp-SW", $mainEP); - addWarningModesList("idMode-SW"); - addCheckbox("idStrobe-SW", "Strobe"); - addSirenLevelList("idSirenL-SW"); - addInput("idDuration-SW", "Duration in sec", "Duration"); - ?> -
-
-
- -
- {{Interroger}}'; - addEpInput("idEpC1000-41", $mainEP); - ?> -
-
-
- -
- {{Interroger}}'; - addEpInput("idEpC1000-42", $mainEP); - ?> -
-
diff --git a/resources/archives/desktop/AbeilleEq-Advanced-Specific.php b/resources/archives/desktop/AbeilleEq-Advanced-Specific.php deleted file mode 100644 index b7c090b540..0000000000 --- a/resources/archives/desktop/AbeilleEq-Advanced-Specific.php +++ /dev/null @@ -1,130 +0,0 @@ - - - - -getConfiguration('paramType', '') == "telecommande") { -?> -
- -
-
-

{{Télécommande}}

-
- -
- -
- -
-
- -
- -
- -
-
-
-getConfiguration('paramType', '') == "telecommande7groups") { -?> -
- -
-
-

{{Télécommande}}

-
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
-getConfiguration('paramType', '') == "paramABC") { -?> -
- -
-
-

{{Calibration (y=ax2+bx+c)}}

-
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- diff --git a/resources/archives/desktop/AbeilleEq-Advanced-Zigate.php b/resources/archives/desktop/AbeilleEq-Advanced-Zigate.php deleted file mode 100644 index 18c1d3c0f6..0000000000 --- a/resources/archives/desktop/AbeilleEq-Advanced-Zigate.php +++ /dev/null @@ -1,230 +0,0 @@ - - -
- - - -
-
-

{{Zigate}} - -

-
- -
- -
- '; - ?> -
-
- -
- -
- '; - echo ''; - echo ""; - echo '
'; - ?> -
- - -
- -
- '; - if (isset($dbgDeveloperMode)) { - echo '{{Démarrer}}'; - // echo '{{Démarrer scan}}'; - } - ?> -
-
- -
-
- -
-
- '; - echo ''; - addJsUpdateFunction($eqId, 'Network-Channel', 'idChannel', true); - ?> - - {{Appliquer}} -
-
- - -
-
- -
-
- '; - echo ''; - addJsUpdateFunction($eqId, 'permitJoin-Status', 'idInclusionMode', true); - ?> - {{Démarrer}} - {{Arrêter}} -
-
- - -
-
- - -
-
- '; - ?> - '; - addJsUpdateFunction($eqId, 'ZiGate-Time', 'idZgTime', true); - ?> - Lire - Mettre à l'heure -
-
- - -
- -
- '; - echo ''; - addJsUpdateFunction($eqId, 'PAN-ID', 'idPanId'); - echo '
'; - ?> -
- - -
-
- - -
-
- '; - echo ''; - addJsUpdateFunction($eqId, 'Ext_PAN-ID', 'idExtPanId'); - ?> -
- -
- - -
-
- - -
-
- Lire - '.$txPower.''; - addJsUpdateFunction($eqId, 'ZiGate-Power', 'idZgPower'); - ?> - -
-
- -
- -
- ON - OFF -
-
- -
- -
- CE - FCC -
-
- - -
- -
- Normal - Hybride - Raw -
-
- - -
- -
- Effacer -
-
- -
- - -
- - -
- - -
- - -
\ No newline at end of file diff --git a/resources/archives/desktop/AbeilleEq-Advanced.php b/resources/archives/desktop/AbeilleEq-Advanced.php deleted file mode 100644 index df0ae57c3f..0000000000 --- a/resources/archives/desktop/AbeilleEq-Advanced.php +++ /dev/null @@ -1,155 +0,0 @@ - - - ?'; - } - - // /* Returns current cmd value identified by its Jeedom name */ - // function getCmdValueByName($eqId, $cmdName) { - // $cmd = AbeilleCmd::byEqLogicIdCmdName($eqId, $cmdName); - // if (!is_object($cmd)) - // return ""; - // return $cmd->execCmd(); - // } - - // /* Returns cmd ID identified by its Jeedom name */ - // function getCmdIdByName($eqId, $cmdName) { - // $cmd = AbeilleCmd::byEqLogicIdCmdName($eqId, $cmdName); - // if (!is_object($cmd)) - // return ""; - // return $cmd->getId(); - // } - - // Add end point input - function addEpInput($id, $defEp) { - echo ''; - } - - function addClusterButton($id) { - global $zbClusters; - echo ''; - } - - // Add direction input - function addDirInput($id) { - echo ''; - } - - // Add manufacturer code input - function addManufCodeInput($id) { - echo ''; - } - - // Create drop down list of IEEE addresses, excluding zigate by default - function addIeeeListButton($id, $withZigate = false) { - echo ''; - } - - function addAttrInput($id) { - echo ''; - } - - // Add a group address input - function addGroupInput($id, $title = 'Group') { - echo ''; - } - - // Create drop down list of Zigbee possible attribute types - function addTypeList($id) { - echo ''; - } - - // Create drop down list of 'Warning modes' (cluster 0502/Start Warning) - function addWarningModesList($id) { - echo ''; - } - - // Create drop down list of 'Siren levels' (cluster 0502/Start Warning) - function addSirenLevelList($id) { - echo ''; - } - - function addCheckbox($id, $title = '', $ph = '') { - // Note: CHECKED by default - echo ''; - } - - function addInput($id, $title = '', $ph = '') { - echo ''; - } - - function addJsUpdateFunction($eqId, $cmdLogicId, $spanId, $isInput = false) { - echo ""; - } -?> - -
- -
diff --git a/resources/archives/desktop/AbeilleEq-Cmds.php b/resources/archives/desktop/AbeilleEq-Cmds.php deleted file mode 100644 index 791abd6f94..0000000000 --- a/resources/archives/desktop/AbeilleEq-Cmds.php +++ /dev/null @@ -1,38 +0,0 @@ - - -
- - -
-
- - -
- - - - - - - - - - - - - - - - - - - - -
{{ID}}{{Cmde Jeedom}}{{Type}}{{Cmde Abeille/logicalId}}{{Cmde Abeille/topic}}{{Paramètres cmde Abeille}}{{Unité/Cron}}{{Options}}{{Supprimer}}
-
-
diff --git a/resources/archives/desktop/AbeilleEq-Js-Cmds.php b/resources/archives/desktop/AbeilleEq-Js-Cmds.php deleted file mode 100644 index ce46c632e7..0000000000 --- a/resources/archives/desktop/AbeilleEq-Js-Cmds.php +++ /dev/null @@ -1,191 +0,0 @@ - - - \ No newline at end of file diff --git a/resources/archives/desktop/AbeilleEq-Js.php b/resources/archives/desktop/AbeilleEq-Js.php deleted file mode 100644 index 0cf5eeb371..0000000000 --- a/resources/archives/desktop/AbeilleEq-Js.php +++ /dev/null @@ -1,804 +0,0 @@ - - - - - \ No newline at end of file diff --git a/resources/archives/desktop/AbeilleEq-Main-Generic.php b/resources/archives/desktop/AbeilleEq-Main-Generic.php deleted file mode 100644 index 136ace17ca..0000000000 --- a/resources/archives/desktop/AbeilleEq-Main-Generic.php +++ /dev/null @@ -1,113 +0,0 @@ - - -
- - - -
- -
- -
-
- -
- -
- -
-
- -
- -
- $value) { - echo ''; - } - ?> -
-
- -
- -
- - -
-
- -
- -
- '; - ?> -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- getConfiguration('battery_type', '') != "") { - echo '{{Batterie}} '; - echo ''; - } else - echo '{{Secteur}}'; - ?> -
-
- -
- -
- '; - ?> -
-
- -
- -
- -
-
- diff --git a/resources/archives/desktop/AbeilleEq-Main-Icon.php b/resources/archives/desktop/AbeilleEq-Main-Icon.php deleted file mode 100644 index a79ce61f0e..0000000000 --- a/resources/archives/desktop/AbeilleEq-Main-Icon.php +++ /dev/null @@ -1,67 +0,0 @@ - - -
- - - -
- -
- -
-
- - - -
-
-
-
- - -
-
\ No newline at end of file diff --git a/resources/archives/desktop/AbeilleEq-Main-Others.php b/resources/archives/desktop/AbeilleEq-Main-Others.php deleted file mode 100644 index d730b8eee9..0000000000 --- a/resources/archives/desktop/AbeilleEq-Main-Others.php +++ /dev/null @@ -1,40 +0,0 @@ - - -
- - - -
-
- -
- - - - - - \ No newline at end of file diff --git a/resources/archives/desktop/AbeilleEq-Main.php b/resources/archives/desktop/AbeilleEq-Main.php deleted file mode 100644 index 7fdc4b53d4..0000000000 --- a/resources/archives/desktop/AbeilleEq-Main.php +++ /dev/null @@ -1,18 +0,0 @@ - - - - -
-
- -
-
diff --git a/resources/archives/desktop/AbeilleEq.php b/resources/archives/desktop/AbeilleEq.php deleted file mode 100644 index 0a121f887d..0000000000 --- a/resources/archives/desktop/AbeilleEq.php +++ /dev/null @@ -1,117 +0,0 @@ - - -var js_dbgDeveloperMode = '.$dbgDeveloperMode.';'; // PHP to JS - /* Dev mode: enabling PHP errors logging */ - error_reporting(E_ALL); - ini_set('error_log', __DIR__.'/../../../../log/AbeillePHP.log'); - ini_set('log_errors', 'On'); - } - - if (!isset($_GET['id'])) - exit("ERROR: Missing 'id'"); - if (!is_numeric($_GET['id'])) - exit("ERROR: 'id' is not numeric"); - - $eqId = $_GET['id']; - $eqLogic = eqLogic::byId($eqId); - if (!$eqLogic) - exit("L'équipement dont l'ID est ".$eqId." n'existe plus. Merci de raffraichir votre page."); - - $eqLogicId = $eqLogic->getLogicalid(); - list($eqNet, $eqAddr) = explode("/", $eqLogicId); - $zgId = substr($eqNet, 7); // Extracting zigate number from network - $zgType = config::byKey('ab::zgType'.$zgId, 'Abeille', '', 1); // USB, WIFI, PI, DIN - $zgChan = config::byKey('ab::zgChan'.$zgId, 'Abeille', 11); // Zigbee channel - $config = []; - $config['ab::zgChan'.$zgId] = $zgChan; - $mainEP = $eqLogic->getConfiguration('mainEP', '01'); - $eqIeee = $eqLogic->getConfiguration('IEEE', ''); - $batteryType = $eqLogic->getConfiguration('battery_type', ''); - $eqName = $eqLogic->getName(); - - $eqModel = $eqLogic->getConfiguration('ab::eqModel', []); - $eqZigbee = $eqLogic->getConfiguration('ab::zigbee', []); - // $eqSettings = $eqLogic->getConfiguration('ab::settings', []); - - echo ''; // PHP to JS - echo ''; // PHP to JS - echo ''; // PHP to JS - echo ''; // PHP to JS - echo ''; // PHP to JS - $abQueues = $GLOBALS['abQueues']; - echo ''; // PHP to JS - echo ''; // PHP to JS - // sendVarToJS('js_eqSettings', $eqSettings); - sendVarToJS('js_config', $config); - - /* Returns cmd ID identified by its Jeedom logical ID name */ - function getCmdIdByLogicId($eqId, $cmdLogicId) { - $cmd = cmd::byEqLogicIdAndLogicalId($eqId, $cmdLogicId); - if (!is_object($cmd)) - return ""; - return $cmd->getId(); - } - - /* Returns current cmd value identified by its Jeedom logical ID name */ - function getCmdValueByLogicId($eqId, $logicId) { - $cmd = AbeilleCmd::byEqLogicIdAndLogicalId($eqId, $logicId); - if (!is_object($cmd)) - return ""; - return $cmd->execCmd(); - } -?> - - -
-
- - - - - diff --git a/resources/archives/desktop/health.js b/resources/archives/desktop/health.js deleted file mode 100644 index 22405ef6c6..0000000000 --- a/resources/archives/desktop/health.js +++ /dev/null @@ -1,5 +0,0 @@ - - -$(function() { - $("#table_healthAbeille").tablesorter(); -}); diff --git a/resources/archives/desktop/modal/installPiGpio.abeille.php b/resources/archives/desktop/modal/installPiGpio.abeille.php deleted file mode 100644 index 9813e59a75..0000000000 --- a/resources/archives/desktop/modal/installPiGpio.abeille.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ -if (!isConnect('admin')) { - throw new Exception('{{401 - Accès non autorisé}}'); -} -?> - - {{Pause}} - -


-
-Lancement des operations.
-
- - \ No newline at end of file diff --git a/resources/archives/desktop/modal/installSocat.abeille.php b/resources/archives/desktop/modal/installSocat.abeille.php deleted file mode 100644 index cfb1c33717..0000000000 --- a/resources/archives/desktop/modal/installSocat.abeille.php +++ /dev/null @@ -1,56 +0,0 @@ -. - */ - if (!isConnect('admin')) { - throw new Exception('{{401 - Accès non autorisé}}'); - } -?> - - {{Pause}} - -


-
-Lancement des operations.
-
- - diff --git a/resources/archives/desktop/modal/installWiringPi.abeille.php b/resources/archives/desktop/modal/installWiringPi.abeille.php deleted file mode 100644 index db0f902c58..0000000000 --- a/resources/archives/desktop/modal/installWiringPi.abeille.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ -if (!isConnect('admin')) { - throw new Exception('{{401 - Accès non autorisé}}'); -} -?> - - {{Pause}} - -


-
-Lancement des operations.
-
- - diff --git a/resources/archives/docs/fr_FR/Changelog.rst b/resources/archives/docs/fr_FR/Changelog.rst deleted file mode 100644 index 003d315695..0000000000 --- a/resources/archives/docs/fr_FR/Changelog.rst +++ /dev/null @@ -1,3285 +0,0 @@ -ChangeLog -========= - -240409-BETA-1 -------------- - -- Groupes: Améliorations ajout/suppression de groupe. -- Page santé: - - - Travaille en cours pour amélioration avec thème 'dark'. - - Ajout ID Jeedom. - - Corrections internes. - -240403-BETA-2 -------------- - -- Interne: Parser: Correction regression support Xiaomi. -- Page santé: Amélioration robustesse. -- Affichage des groupes: Equipement barré et pas d'action possible si désactivé. - -240329-BETA-2 -------------- - -- Interne: Support Tuya: Amélioration msg debug. -- Tuya compteur d'énergie: Mise-à-jour du modèle (2691). -- Philips LWA021_SignifyNetherlandsBV: Ajout support préliminaire (2693). -- Interne: Abeille.js: Corrections erreur lors du changement de nom. -- Ampoule E27 TS0505B__TZ3210_mja6r5ix: Ajout support (2694). -- Interne: Parser: Correction mineure. -- Réparation d'équipement: Améliorations. -- Equipement/avancé/interrogations: Améliorations cluster 1000. -- Interne: Cmd: Ajout support vers client pour 'discoverCommandsReceived'. -- Equipement/avancé/interrogations: Découverte des commandes reçues vers client possible. -- powerCycleUsb: Améliorations du script de reboot USB. -- Correction status équipement 'Zigate' si désactivé sur page de config. -- Page santé: Correction: Equipements montrés désactivés si Zigate désactivée. -- Dev: Améliorations 'switch_branch'. -- Page santé: Une couleur par réseau pour plus de clareté. - -240319-BETA-3 -------------- - -- SonOff ZbminiL2: Modèle revu. -- Profalux 2nd gen: Mise-à-jour mineure du modèle. -- Syntaxe modèle d'équipement: Ajout section 'variables' pour support '#groupEPx#'. -- Interne: Parser: Améliorations mineures. -- Interne: 'check_json': Améliorations. -- Interne: eqLogic/configuration: groupEPx => eqModel['variables']. -- Page EQ/avancé: Ajout d'une section 'variables'. Suppression cas 'telecommande7groups'. -- Tuya compteur d'énergie: Modèle préliminaire (2691). -- Page EQuipement: 'variables' migrées sur onglet principal. -- Interne: Configuration sur 'device announce' déplacée de Parser vers Cmd. -- Réseau: Affichage table des liens Zigate 1 à l'ouverture. -- SonOff ZbminiL2: Correction 'mac capa' incorrect => 'RxOnWhenIdle'. -- Interne: Mises-à-jour 'check_json' + 'update_json' pour changement 'tuyaEF00/fromDevice' => 'private/EF00/type=tuya'. -- Modèles d'équipement: Suppression 'tuyaEF00/fromDevice' => remplacé par 'private/EF00/type=tuya'. -- Modèles d'équipement: Suppression 'fromDevice/ED00' => remplacé par 'private/ED00/type=tuya-zosung'. -- Collecte LQI: Traitement messages 'Management LQI response' revu pour clareté. - -240308-BETA-1 -------------- - -- Script: Améliorations 'checkZigate' -- Placement réseau: Améliorations support multi-niveaux. -- Profalux BSO: Mise-à-jour du modèle pour retour level (2689). -- SonOff SNZB-01: Modèle revu: 'Click-Middle' remplacé par 'Click' (valeur 'single', 'double' ou 'long'). - -240223-BETA-2 -------------- - - .. warning:: **Mise-à-jour de modèles** - - - Malgré la volonté de faire des évolutions les plus transparentes possibles, il se peut que certains équipements nécessitent d'être mis-à-jour à partir de leur dernier modèle pour à nouveau fonctionner correctement. Si ils sont sur batterie, réinclusion nécessaire. Si sur secteur, aller à la page 'avancé' et bouton 'mise-à-jour'. - .. warning:: **Zigates v2/+** - - - FW **v3.22 OBLIGATOIRE**. - - La maturité de la v2 n'est pas au niveau de la v1. Le FW qui semble le plus stable n'est PAS le dernier dispo (3.A0) mais le précédent (**3.22**). Nous vous conseillons de faire la mise-à-jour vers celui ci. - .. warning:: **Zigates v1** - - - FW **v3.23 OPDM** recommandé. La version minimale est la '3.1E' mais ne sera bientot plus supportée. - - Le dernier FW officiel est le v3.23. Il est recommandé de basculer dessus pour ne pas faire façe à des soucis déja corrigés. - - D'autre part si vous n'êtes pas en version OPDM (Optimized PDM), il est fortement recommandé de basculer dessus dans les cas suivants: - - - Toute nouvelle installation. - - Dès lors qu'un réappairage complet est nécéssaire. - - La version OPDM corrige bon nombre de potentielles corruptions et supporte un plus grand nombre d'équipements. - - Les firmwares avant 3.1e sont forcement 'legacy'. - - Mais **ATTENTION** si vous migrez d'une version 'legacy' vers 'OPDM' il vous faudra **effacer la PDM et réapparairer tous vos équipements**. - -- Ikea RODRET dimmer: Mise-à-jour du modèle par défaut pour ON/OFF (2684). -- Mise-à-jour FW PiZiGate: Amélioration scripts & support préliminaire PIv2 (2638). -- Dump Zigate: Support préliminaire. -- Scripts: Utilisation de 'python3' et non pas 'python'. -- Scripts/checkTTY: Arret forcé du processus si port utilisé. -- Scripts: updateFirmware => updateZigate. -- Scripts: Nettoyage. Suppression 'installWiringPi' + 'installPiGpio' => 'installPackage' -- Page de config: Correction visuelle mineure. -- Placement réseau: changements en cours. -- Scripts: Correction droits 'installPackage.sh' -- Interne: Abeille: setPIGpio(). -- Support PiGpio: Corrections. - -240216-BETA-1 -------------- - -- Modèle forcé: Correction. -- Réparation d'équipement: Améliorations. -- Interne: Zigbee const: Ajout FC20 + FC21 (Profalux). -- Interne: Cmd: Amélioration 'configureReporting2'. -- Profalux BSO: Mise-à-jour du modèle (2687). -- Interne: Parser: Corrections pour support modèle avec variante ([-variantX]). -- Interne: AbeilleModels: Amélioration pour robustesse. -- Affichage commandes: min/max affiché si slider. 'Inverser' affiché si info binaire. - -240213-BETA-1 -------------- - -- Interne: Cmd: Suppression 'Network_Address_request' => 'getNwkAddress'. -- Page équipment/avancé: Ajout support 'Network_Address_request'. -- Interne: Cmd: 'cmd-Private' revisité. -- Modèle forcé: Corrections. -- Profalux: Cmd: Corrections. -- Réparation d'équipement: Améliorations. -- Interne: Corrections pour meilleur support des modèles avec variante. -- Interne: eqLogic: 'ab::signature' supprimé => 'ab::zigbee'. - -240209-BETA-1 -------------- - -- Modèles: Ajout fabricant & type generic sur certains modèles Philips. -- Ikea RODRET dimmer: Ajout modèle variante 'direct' (2684). -- Interne: Parser+Cmd: Messages en attente supprimés si équipement change de réseau. -- Page config: Bouton 'libérer' visible en mode dev seulement. Pas robuste pour utilisateur final. -- Outils: Script de test en ligne de cmd préliminaire (resources/scripts/checkZigate.sh) -- Profalux BSO tilt: Correction regression (2687). -- Interne: Cmd: Meilleur support '#cmdInfo_xxx'. -- Interne: Cmd: Ajout 'AbeilleCmd-Profalux.php' pour nettoyage modeles. - -240201-BETA-1 -------------- - -- Interne: Amélioration latence. Si equipement sans réponse (NO-ACK), passe en basse priorité. -- Interne: Qq corrections + ajout support 'readAttribute2()' pour test. -- Ikea RODRET dimmer: Mise-à-jour du modèle (2684). -- Ikea capteur qualité de l'air VINDSTYRKA: Mise-à-jour du modèle (2681). -- Interne: Cmd ignorée si déja 'pending' qq soit la priorité. -- Interne: Amélioration 'check_json'. - -240124-BETA-1 -------------- - -- Ikea capteur qualité de l'air VINDSTYRKA: Mise-à-jour du modèle (2681). -- Interne: Cmd: Amélioration formatAttribute() pour type x39/single precision + int8/int24/int32. -- Placement réseau: En cours de revue. -- Interne: Zigbee: Ajout support clusters 040C/CO, 040D/CO2, 042A/PM2.5 -- Page config: Firmwares renommés. -- Page config: Corrections test de port + mise-à-jour FW. -- Page config: Correction canal Zigbee (? = auto) + correction erreur changement. -- Assitant modèle: Ajout support clusters 040C/CO, 040D/CO2 & 042A/PM2.5 -- Ikea RODRET dimmer: Suppport préliminaire (2684). -- Interne: Cmd: getSimpleDescriptor = commande avec ACK. -- Interne: Parser: Correction mauvais EP enregistré lors d'une réponse 'simple descriptor'. -- Remplacement d'équipement: Corrections (2683). - -240116-BETA-1 -------------- - -- Interne: Cmd: clearPending(). -- Zlinky: Mise-à-jour du modèle (2678). -- Placement réseau: Corrections. -- Interne: Suppression fichiers obsoletes => archives. -- Capteur lumière AQARA GZCGQ11LM: Ajout support (2679). -- Ikea Capteur qualité de l'air: Support préliminaire (2681). -- Assistant modèles: Correction cluster 0008. -- Ikea Trafri E27: Support préliminaire (2680). -- Lidl detecteur de mouvement: Correction modèle (2674). -- Page réseau: Revisitée. - -240107-BETA-1 -------------- - -- Réseau: Rework en cours 'graph des liens'. -- Interne: Corrections suite debug 2675 (Modèle 'rucheCommand' inconnu). -- Interne: Parser: Correction 2678 ('getSimpleDescriptor': Paramètre 'ep' vide !). -- ZG-003-RF: Support préliminaire (2408). -- Zlinky: Mise-à-jour du modèle (2678). -- Interne: Cmd: Suppression des messages pending suite changement adresse. - -240104-BETA-1 -------------- - -- Interne: Cmd: Regulation revue. -- Profalux BSO: Modèle revu. Suppression 'lift' (idem 'Set Level'). -- Interne: Cmd: Plus que 3 niveaux de priorités. -- Owon-THS317-ET: Ajout d'un modèle pour les vieux équipements (EP=03 au lieu de 01, voir 2319). -- Interne: Nouvelle lib 'AbeilleModels.php'. -- Page compatibilité: Mise-à-jour. -- Interne: Abeille.class: Utilisation lib 'AbeilleModels.php'. -- Interne: AbeilleTools/getDevicesList() remplacé par AbeilleModels/getModelsList() - -231231-STABLE-1 ---------------- - -Abeille continue son petit chemin, même si exclusivement dédié aux Zigates aujourd'hui. Toujours dans l'idée de rendre son utilisation plus robuste et simple. - - .. warning:: **Mise-à-jour de modèles** - - - Malgré la volonté de faire des évolutions les plus transparentes possibles, il se peut que certains équipements nécessitent d'être mis-à-jour à partir de leur dernier modèle pour à nouveau fonctionner correctement. Si ils sont sur batterie, réinclusion nécessaire. Si sur secteur, aller à la page 'avancé' et bouton 'mise-à-jour'. - .. warning:: **Zigates v2/+** - - - FW **v3.22** recommandé. - - La maturité de la v2 n'est pas au niveau de la v1. Le FW qui semble le plus stable n'est PAS le dernier dispo (3.A0) mais le précédent (**3.22**). Nous vous conseillons de faire la mise-à-jour vers celui ci. - .. warning:: **Zigates v1** - - - FW **v3.23 OPDM** recommandé. La version minimale est la '3.1E' mais ne sera bientot plus supportée. - - Le dernier FW officiel est le v3.23. Il est recommandé de basculer dessus pour ne pas faire façe à des soucis déja corrigés. - - D'autre part si vous n'êtes pas en version OPDM (Optimized PDM), il est fortement recommandé de basculer dessus dans les cas suivants: - - - Toute nouvelle installation. - - Dès lors qu'un réappairage complet est nécéssaire. - - La version OPDM corrige bon nombre de potentielles corruptions et supporte un plus grand nombre d'équipements. - - Les firmwares avant 3.1e sont forcement 'legacy'. - - Mais **ATTENTION** si vous migrez d'une version 'legacy' vers 'OPDM' il vous faudra **effacer la PDM et réapparairer tous vos équipements**. - -231209-BETA-2 -------------- - -- Interne: Correction NPDU regulation. - -231208-BETA-1 -------------- - -- Interne: Mise-à-jour powerCycleUsb pour récuperer sortie 'dmesg' si erreur. -- Interne: AbeilleCmd: Pas de ACK sur requete LQI vers Zigate. -- Placement réseau: Utilisation image par défaut si plan n'existe plus. -- Interne: AbeilleCmd: Correction perte de commandes si trop dans la queue à la fois. -- Interne: AbeilleCmd: Amélioration 'throughput regulation'. - -231207-BETA-2 -------------- - -- Modèles: - - - Tous les modèles utilisent 'act_zbConfigureReporting2'. - - Correction de certains mauvais type d'attribut pour configureReporting2. - - Améliorations outil de check. -- Page santé: Réactivation raffraichissement toutes les 2 sec. -- Interne: Configuration des Zigates au démarrage revue. Déplacée dans AbeilleCmd. -- Rappel: Le mode 'normal' de la Zigate n'est plus supporté donc FW >= 3.1E requis. -- Timeout: Correction pouvant expliquer le passage en timeout de certains équipements. -- Interne: Autre corrections du parser. -- Support Xiaomi: Améliorations internes. - -231205-BETA-6 -------------- - -- Interne: Cmd: Réactivation régulation NPDU pour éviter erreurs x85. -- Assistant modèle: Correction. -- Tuya detecteur de présence ZG-205Z: Support préliminaire. -- Page EQ/avancé: correction suppression modèle local. -- Modèles de commandes: Normalisation noms. -- Correction regression Tuya: 'Call to undefined function tuyaGenSqn()' -- Tuya IH-K009: Mise-à-jour modèle 'TS0201__TZ3000_dowj6gyi'. -- Page santé: Amélioration: Equipements désactivités barrés. -- Support de clusters privés: - - - Syntaxe des modèles revue (mot clef 'private'). - - Support limité à Xiaomi seulement. - - Tous les modèles Xiaomi mis-à-jour. -- Xiaomi Aqara smart plug EU: Mise-à-jour du modèle (2665). -- Tuya/Moes universal remote: Séparation des modèles pour versions batterie et USB. -- Page maintenance/infos clefs: Amélioration affichage. -- Modèles - - - Plusieurs mis-à-jour pour utiliser 'configureReporting2' au lieu de 'configureReporting'. - - Plusieurs corrigés pour reporting cluster 0008. Mauvais type d'attribut. - - Plusieurs corrigés pour reporting cluster 0102. Mauvais type d'attribut ou mauvais attribut. -- Multiprise Lidl HG6338-FR: Mise-à-jour du modèle. - -231202-BETA-3 -------------- - -- Page EQ/avancé: Traductions US. -- Modèles: Nettoyage 'poll=0' -- Modèles: Amélioration 'trigOut' pour support multiples actions. -- Attribut 0000/LocalTemp du cluster 0201 divisé par 100 par défaut. -- Interne: Cmd: Correction 'writeAttribute0530()' -- Interne: Cmd: Corrections 'writeAttribute()' -- Attribut 0012/OccupiedHeatingSetpoint du cluster 0201 divisé par 100 par défaut. -- Danfoss eTRV010x: Modèle en cours de changements (2662). -- Page EQ/avancé: Améliorations écriture attribut. -- Danfoss eTRV010x: Qq commandes cachées par défaut car sans interet (2662). -- Interne: Améliorations constantes Zigbee cluster 0201. - -231130-BETA-2 -------------- - -- Interne: Parser: decode8002, monitoring revu => parserLog2(). -- Danfoss eTRV010x: Modèle en cours de changements (2662). -- Suppression de modèles de commandes obsoletes: - - - spiritBatterie-Pourcent - - spiritTemperature - - spiritUnknown1 - - spiritUnknown2 -- Interne: Cmd: execute() revue préliminaire. -- Modele 'TS0601__TZE200_e3oitdyu' (Moes MS105B): Ajout de signatures alternatives (2473). -- Modele 'TS0601__TZE200_e3oitdyu' (Moes MS105B): Mise-à-jour du modèle pour canal 2 (2473). -- Support Tuya, commandes action: - - - Ajout 'setEnum' - - Ajout support optionnel 'mult' & 'div' pour 'setValue'. - - 'setValueMult' & 'setValueDiv' sont obsoletes => 'setValue' + mult/div - - Modeles obsoletes: act_tuyaEF00-Set-Setpoint, act_tuyaEF00-Set-Setpoint-Mult, act_tuyaEF00-SetThermostatMode -- Page EQ/avancé: Ajout support 'manufCode' sur commande générique. - -231128-BETA-1 -------------- - -- Interne: Cmd: 'configureReporting2' completement revu. -- Ikea Tradfri E27 LED2102G3: Correction image (2626). -- Icones: Qq images renommées - - - 'eTRV0100' => 'Danfoss-Ally-Thermostat' - - 'IkeaTradfriBulbE14WSOpal400lm' => 'Ikea-BulbE14-Globe' - - 'ProfaluxLigthModule' => 'Profalux-LigthModule' - - 'Ikea-BulbE14CandleWhite' => 'Ikea-BulbE14-Candle' - - 'TRADFRIbulbE14Wopch400lm' => 'Ikea-BulbE14-Candle', - - 'TRADFRIbulbE14WS470lm' => 'Ikea-BulbE14-Candle', - - 'TRADFRIbulbE27WSopal1000lm' => 'Ikea-BulbE27', - - 'TRADFRIbulbE27WW806lm' => 'Ikea-BulbE27', -- Interne: Cmd: Mise-à-jour formatAttribute(). -- Interne: Cmd: Correction formatAtrtibute() pour type 0x30/enum8. -- Page 'compatibilité' revue. - -231127-BETA-3 -------------- - -- Page EQ/avancé: - - - Réparation équipement: Améliorations. - - Fonctionalité maintenant accessible à tous. -- Interne: Normalisation infos modèle: 'modelSig'/'modelName'/'modelSource' -- Interne: Normalisation infos modèle: forcedByUser => modelForced -- eTRV0103: Mise-à-jour du modèle. -- Legrand micromodule switch: Mise-à-jour du modèle (2663). -- Tuya double dimmer module QS-Zigbee-D02-TRIAC-2C-LN: Ajout support préliminaire (2664). -- Assistant modèle: Améliorations. -- Xiaomi wall switch sensor_86sw1 & sensor_86sw2: Support+modeles revus. -- Tuya detecteur fumée TS0205__TZ3210_up3pngle: Mise-à-jour du modèle (2658). -- Blitzwolf BW-SHP13: Mise-à-jour du modèle. -- Modèles: Suppression commandes obsolètes: - - - PuissanceVoltagePrise => inf_zbAttr-0B04-RMSVoltage - - PuissanceCurrentPrise => inf_zbAttr-0B04-RMSCurrent - - poll-0B04-0505-0508-050B => act_poll-0B04-0505-0508-050B - - poll-0702-0000 => act_poll-0702-0000 -- Mise-à-jour de qq modèles TS0121. -- SilverCrest-HG08673-FR: Mises-à-jour du modèle (2635). -- Interne: AbeilleCmd: Mises-à-jour 'cmd-0201'. -- Interne: Constante Zigbee cluster 0201: Améliorations. -- Interne: Cmd: configureReporting2, changeVal mis à 0 par défaut. - -231124-BETA-2 -------------- - -- Support commande utilisateur: Amélioration. -- Moes télécommande universelle IR: Mise-à-jour du code (2607). -- Page equipement: Traductions US. -- Réparation équipement: Améliorations. - -231123-BETA-1 -------------- - -- Page équipement - - - Ajout affichage fabricant & modèle. - - Correction affichage dernier LQI. - - Correction traductions US. - - Onglet commandes legèrement revu. - - Onglet commandes: ajout saut de ligne avant/apres. -- Danfoss thermostat eTRV0103: Ajout support (2662). -- Ajout support cmdes utilisateur (ID logique = xxxidxxx::parametres). Utile pour telecommande universelle. -- Moes télécommande universelle IR: Mise-à-jour du code & modèle (2607). - -231119-BETA-1 -------------- - -- SilverCrest-HG08673-FR: Mises-à-jour du modèle (2635). -- ORVIBO CM10ZW: Mises-à-jour du modèle (2024 & 2648). -- Page EQ: Affichage signature du modèle pour support modèles multi-signatures. -- Page EQ: Affichage 'DateCode' (cluster 0000, attrib 0006). -- Ikea wireless dimmer (ICTC-G-1): Modèle revisité. -- Interne: Cmd: 'getRoutingTable' + 'getBindingTable' attendent ACK. -- Interne: Status 'NO-ACK' ne fait du sens que pour équipements en écoute permanente. -- Page EQ/avancé: Traductions US. -- Page EQ/avancé: Réparation de l'état de l'équipement... en cours de revue. -- Interne: AbeilleCmd: Corrections autour de la mise-à-jour d'un équipement. -- Tuya detecteur fumée TS0205__TZ3210_up3pngle: Ajout support préliminaire (2658). -- Page maintenance/infos clefs: Amélioration. -- Interne: Abeille.class: Corrections 'deviceUpdates'. -- Suppression équipement: Correction incompatibilité core '4.3.19' vs '4.4.0' -- Ikea 'TRADFRIcontroloutlet': Mise-à-jour du modèle. - -231110-BETA-1 -------------- - -- Owon-THS317-ET: Mise-à-jour du modèle (2319). -- Page réseau: Amélioration message durant collecte LQI. -- Gledopto GL-SD-001: Mise-à-jour du modèle. -- Tuya ZS08 télécommande universelle alimentée par USB: Ajout support. -- Meilleur support des modèles avec signature alternative. -- Abeille remote control: Commandes 'on all' & 'off all' cachées par défaut. Trop dangereux. -- Interne: Mise-à-jour 'getDevicesList()' + 'getDeviceModel()'. -- Reset de modele: Correction pour signatures alternatives. -- Suppression d'un équipement: Correction permettant d'afficher comment il est utilisé avant suppression (2652). -- Page EQ/avancé: Correction interrogations quand adresse IEEE nécessaire (2653). -- Interne: Correction: AbeilleCmd informé si changement d'adresse via 'device announce' ou migration de réseau. - -231107-BETA-2 -------------- - -- Heiman water sensor (WaterSensor-EM): Mises-à-jour mineures du modèle mais toujours pas de retour d'alarme. -- Interne: AbeilleCmd: Correction regression 'cmd-0006'. -- Tuya 1ch switch module: Correction modèle. -- Découverte d'équipements absents de Jeedom améliorée lors du raffraichissement réseau. - -231106-BETA-5 -------------- - -- IKEA TRADFRIbulbE27opal1000lm: Correction modèle (2644). -- TRV06: Correction modèle. -- Xiaomi Aqara Opple 4 boutons: Mises-à-jour du modèle (2636). -- Modèles: Cmde 'onGroupBroadcast'/'offGroupBroadcast' remplacée (cmd-0006 + addrMode=04). -- Télécommande virtuelle: Correction pour 'onGroupBroadcast'/'offGroupBroadcast'. -- SilverCrest-HG08673-FR: Mises-à-jour du modèle (2635). -- Gledopto Spectre Blanc & RGBW GU10: Correction modèles (2646). -- Profalux volets gen2: Mises-à-jour du modèle MOT-C1Z06C. -- Profalux BSO gen2: Mises-à-jour du modèle. -- Trafri remote control: Mises-à-jour du modèle. -- Modèles: Suppression commande 'toggleGroup' => 'act_zbCmdC-0006-ToggleGroup'. - -231104-BETA-2 -------------- - -- Interne: Cmd: Correction 'cmd-0006'. -- Interne: Zigbee const: Améliorations cluster 0702. - -231103-BETA-1 -------------- - -- Interne: Zigbee const: Correction support cluster 0012, 13 & 14. -- Modèles de cmdes: Ajout 'act_zbCmdC-0006-OffGroup' & 'act_zbCmdC-0006-OnGroup' -- Télécommande virtuelle: revue pour utilisation 'OnOffGroup'. -- Modèles: Cmde 'OnOffGroup' remplacée (cmd-0006 + addrMode=01). -- Modèles d'équipements: Correction retour d'état (bind) sur de nombreux modeles. - -231027-BETA-2 -------------- - -- Interne: Tools/check_json: Améliorations. -- Modèles d'équipement: Correction d'erreurs sur qq modèles. -- Assistant modèles: Améliorations. -- SilverCrest-HG08673-FR: Support préliminaire (2635). -- Page EQ: Corrections pour forçage de modele. -- Xiaomi Aqara Opple 4 boutons: Support préliminaire (2636). - -231023-BETA-2 -------------- - -- Loratap télécommande 6 boutons: Support préliminaire (2631). -- Moes 3 boutons (TS0043__TZ3000_gbm10jnj): Ajout support (2630). -- Interne: Cmd: Ajout 'cmd-0006' pour suppression vieilles commandes 'OnOffX'. -- Interne: Cmd: Suppression support cmds 'OnOff'/'OnOffRaw'/'OnOff2'/'OnOffOSRAM'/'OnOff3'/'OnOff4'/'OnOffHue' - -231020-BETA-2 -------------- - -- Heiman HS1SA: Mise-à-jour modèle. Ajout de signatures alternatives. -- Interne: Mises-à-jour support Tuya-Zosung. -- Sirene iAlarm: Mises-à-jour du modèle (2629). -- Moniteur: Amélioration interne pour support gros messages. -- Moes télécommande universelle IR: Mise-à-jour du code pour ce support particulier (2607). -- Page de config: Vérification adresse IP remplie si type WIFI. - -231012-BETA-1 -------------- - -- Interne: Nettoyage DB 'config' pour clefs zigates 7 à 10. -- Cmd info 'Online': Correction (passage par 0 inattendu). -- Profalux BSO: Modèle revisité. - -231010-BETA-2 -------------- - -- Interne: Msg 8012 n'est plus transmis à 'AbeilleCmd'. -- Interne: Cmd: Correction changement adresse lors d'une nouvelle annonce. -- Interne: Correction status 'NO-ACK' + 'ab::noack' => 'ab::txAck'. -- Interne: Cmd: Mise-à-jour 'ieeeOk' à revisiter. - -231009-BETA-1 -------------- - -- Interne: AbeilleCmd: Nouvelles modifs pour support Tuya Zosung (universal remote). -- Interne: Tuya parser: Support cmd EF00-06 (TY_DATA_SEARCH ?) revue. -- Interne: Cmd & parser: Amélioration fonction de 'monitoring. -- Assistant modèle: Corrections suite changement noms modèles de commandes. -- Sirene iAlarm: Support préliminaire (2629). -- Tuya temp/humidité/afficheur: Mise-à-jour du modèle (2619). - -231004-BETA-1 -------------- - -- Aeotec range extender: Ajout support (2627). - -231002-BETA-1 -------------- - -- Moes télécommande universelle IR: Mise-à-jour du code pour ce support particulier (2607). -- Interne: Parser: Message 'deviceUpdates' seulement si IEEE connue. -- Logs: 'AbeilleSerialReadX.log' déplacé dans '/tmp'. -- Page maintenance: Correction erreur à l'affichage. -- Page maintenance: Amélioration infos clefs. -- Interne: AbeilleSerialRead: Changements mineurs. -- Modeles: Ajout support 'disableTitle' pour cmd action de type 'message'. -- Interne: AbeilleCmd revisité. Variables 'zigates' sorties de la classe. -- Interne: Cmd: 'getNetworkStatus' => 'zgGetNetworkStatus'. -- Interne: Cmd: Suppression message erreur 'Unknown device'. - -230919-BETA-1 -------------- - -- Interne: Parser: Cluster FC00 traité par message 8002 pour future migration mode 'raw'. -- Interne: Ajout surveillance 'NOACK' en plus de 'Timeout'. -- Page santé: Status amélioré => 'Time-out', ''no-ack' ou 'time-out&no-ack' - -230918-BETA-1 -------------- - -- Philips Hue Candle WA: Support preliminaire (2622). - -230915-BETA-1 -------------- - -- Modèles commandes: - - - Suppresssion 'act_zbCmdC-XXXX-Custom.json' - - Ajout 'act_zbCmdC-Generic.json' -- Interne: Cmd: Correction 'cmd-Generic'/'manufCode'. -- Interne: Parser: Generation d'une info 'inf_EP-CLUST-cmdXX' pour toute commande inconnue spécifique cluster. -- Moes télécommande universelle IR: Mise-à-jour du modèle & code (2607). -- Interne: Cmd: Mise-à-jour 'setTemperature'. -- Interne: Parser: Correction mauvaise interprétation 'ColorTempMired' (2544). -- Livarno Home floor lamp: Mise-à-jour du modèle (2544). -- Page updates OTA: Améliorations aspect & traductions US. -- Interne: Cmd+Parser: Améliorations pour support 'restore PDM'. -- Interne: Install: Correction constante nbre de Zigates. -- Nbre de Zigates: 6 supportées au max au lieu de 10. -- Traductions US: Qq corrections concernant la programmation du FW Zigate. -- Interne: Modeles & Parser: Support nouveau format cluster privés. -- Interne: Amélioration support err 14 Zigate. - -230907-BETA-2 -------------- - -- Page maintenance: Amélioration affichage JSON. -- Page maintenance: Affichage JSON du répertoire local 'tmp'. -- Interne: Parser: Support dump/backup tables PDM (msg 'AB00' + 'AB01', FW 'AB01-0000'). -- Page Zigate/avancé: Correction 'Reset HW'. -- Interne: Parser: Support restoration tables PDM (msg 'AB02' + 'AB03', FW 'AB01-0000'). -- Interne: Changement nommage firmwares (zigatevX-YY.ZZ-legacy/opdm.bin). -- Tuya afficheur température & humidité: Support préliminaire (2619). - -230830-BETA-2 -------------- - -- Page EQ/avancé: Correction traductions US. -- Page EQ/avancé: Ajout bouton lecture version FW. -- FW Zigates v1: Suppression FW officiels autres que 3.23. -- Page santé: Correction tri du tableau après raffraichissement. -- Page santé: Corrections traduction US. - -230822-BETA-1 -------------- - -- Ledvance 'PlugValue': Ajout support (2610). -- Modèle de commande: - - - 'inf_zbCmdR-XXXX-Yyyyy' => 'inf_zbCmdC-XXXX-Yyyyy' -- Smart Switch ZG-005-RF: Mise-à-jour du modèle (2608). -- Page EQ/avancé: Possibilité de forcer le modèle d'équipement. -- Page de config: Correction mineure pour mode dev. -- Page de config: Support préliminaire FW custom (mode dev uniquement). -- Lexman LDSENK01F: Ajout support (2613). -- Ajout support préliminaire pour FW Zigate v1 'Abeille'. -- Interne: Pas de polling si équipement désactivé. -- Interne: Amélioration collecte LQI. -- Cmde manquante: Amélioration messages d'erreurs. -- Page EQ/avancé: Correction regression bouton suppression modèle local. -- Interne: Commandes Zigates prefixées par 'zg'. -- Interne: Correction adresse commande 'identifySend'. -- Interne: 'check_json' amélioré. -- Interne: Parser: Correction mineure. -- Page de gestion: Correction pb de selection pour les groupes. - -230811-BETA-1 -------------- - -- Assistant modèle: Mise-à-jour. -- Page santé: Revue pour raffraichissement automatique toutes les 2sec. -- Interne: Suppression 'health.js'. -- Interne: Suppression lecture attrib 0006-0000 & 0008-0000 suite à 'setLevelRaw'/'onoff'/'OnOffTimed'. - -230810-BETA-1 -------------- - -- Interne: Parser: Nettoyage. -- Page de l'équipement: Mise-à-jour traductions 'en_US'. -- Smart Switch ZG-005-RF: Ajout support (2608). -- Interne: Suppression 'Abeille-Js.php' -- Page EQ: Correction mauvais raffraichissement des infos sur recharge de page. -- Interne: Cmd 'identifySend' revisité. -- Page EQ: Ajout support 'identifySend'. -- Modèle de commande: - - - ' Identify.json' => 'act_zbCmdC-Identify' - - 'act_zbCmdG-XXXX-YYYY' => 'act_zbCmdC-XXXX-YYYY' - -230804-BETA-1 -------------- - -- Interne: AbeilleCmd: Ajout support 'cmd-Generic'. -- Page EQ/avancé: Ajout support 'Commande générique'. - -230803-BETA-2 -------------- - -- Page de l'équipement: Corrections translation 'en_US'. -- Interne: jeedom.eqLogic.builSelectCmd() => buildSelectCmd(). Core v4.0 min. -- Interne: Mise-à-jour AbeilleNoise. -- Interne: Ajout cmd 'configureReporting2' (minInterval/maxInterval/changeVal = nombres). -- Page EQ/avancé: Ajout support 'configureReporting2'. -- Nous smart socket A1Z: Mise-à-jour du modèle pour réduire reporting (2460). -- Livarno Home floor lamp: Mise-à-jour du modèle (2544). -- Assistant modèle: Amélioration pour cluster 0300/Color control. - -230730-BETA-1 -------------- - -- Interne: Correction redémarrage Zigate Wifi. -- Maintenance/infos clefs: Ajout nb lignes de log. -- Profalux volet: Template par défaut = shutter pour 'Current Level'. -- Page de config: Corrections translation 'en_US'. -- Page de gestion: Corrections translation 'en_US'. -- Modèles de commandes: - - - Suppression 'zb-CustomInfo.json' obsolète. - - Suppression cmde obsolète 'temperatureLight.json' => 'inf_zbAttr-0300-ColorTemperatureMireds'. - - Suppression cmde obsolète 'temperatureLight1.json' => 'inf_zbAttr-0300-ColorTemperatureMireds'. - - Suppression cmde obsolète 'temperatureLight2.json' => 'inf_zbAttr-0300-ColorTemperatureMireds'. - - Suppression cmde obsolète 'temperatureLightV2.json' => 'inf_zbAttr-0300-ColorTemperatureMireds'. - - attr-XXXX => inf_XXXX -- Moes télécommande universelle IR: Support préliminaire (2607). -- Interne: Suppression fichier 'inconnu.php' obsolète. - -230721-BETA-2 -------------- - -- Page maintenance: Infos clefs: Mise-à-jour. -- Interne: Mise-à-jour 'info.json'. Version minimale du core = 4.0. -- Dependances: Mise-à-jour du code. Unique dépendance de base = python3. -- Zigate WIFI: Socat relancé au bout de 2 mins si pas de signe de la Zigate. -- Affichage commandes: Correction possibilité de les réordonner par drag & drop (2602). - -230718-BETA-1 -------------- - -- Interne: Parser: Améliorations pour reconnaissance fantomes. -- Page équipement: Corrections d'affichage 'type' & 'icone'. -- Blitzwolf temp/humidité/display: Correction signature pour 'TS0201__TZ2000_hjsgdkfl'. -- Volet Profalux: Changement catégorie => 'ouvrant'. -- Interne: AbeilleTools::getParameters() => getConfig(). -- Zigate USB/+: Cycle power off/on si sans réponse depuis plus de 2mins. -- Interne: Supression de qq fichiers obsoletes. -- Page de config: Ajout option avancée pour empecher cycle power OFF/ON sur Zigates USB plantées. -- Page de config: Qq améliorations de traductions US. -- Interne: Améliorations 'powerCycleUsb.sh'. -- Zigate PI/+: HW reset si sans réponse depuis plus de 2mins. - -230711-BETA-1 -------------- - -- Interne: Parser: Corrections d'identification cas Profalux. -- Aubess TS044 _TZ3000_wkai4ga5: Mise-à-jour du modèle pour eviter annonces multiples (2594). -- Controlleur d'arrosage WOX: Mise-à-jour du modèle pour remontée batterie (2599). -- Page maintenance: Mise-à-jour infos clefs. -- Interne: Parser: Support prélim. EF00 cmd 06/TY_DATA_SEARCH. -- Schneider Wiser plug: Support préliminaire (2601). - -230618-BETA-1 -------------- - -- Modeles équipement: Suppression commande 'Xiaomi-ff01'. -- Correction changement de canal Zigate. - -230613-BETA-1 -------------- - -- Modèle équipement: 'value' peut etre surchargé. -- Profalux volet: Valeur par défaut 'Set Level' ajustée sur 'CurrentLevel'. - -230528-STABLE-1 -------------- - -- Tuya garage door controller: Mise-à-jour du modèle (2581). -- Trafri shortcut: Mise-à-jour modèle pour 'Click-Middle'. - -230521-BETA-1 -------------- - - .. important:: Zigates v2 - - - La maturité de la v2 n'est pas au niveau de la v1. Il est donc recommandé de suivre autant que possible les mises-à-jour du firmware (v3.A0 à ce jour). - .. important:: Zigates v1 - - - Le dernier FW officiel est le v3.23. Il est recommandé de basculer dessus pour ne pas faire façe à des soucis déja corrigés. - - Dans tous les cas un FW >= 3.1e est nécéssaire. - - D'autre part si vous n'êtes pas en version OPDM (Optimized PDM), il est fortement recommandé de basculer dessus dans les cas suivants: - - - Toute nouvelle installation. - - Dès lors qu'un réappairage complet est nécéssaire. - - La version OPDM corrige bon nombre de potentielles corruptions et supporte un plus grand nombre d'équipements. - - Les firmwares avant 3.1e sont forcement 'legacy'. - - Mais **ATTENTION** si vous migrez d'une version 'legacy' vers 'OPDM' il vous faudra **effacer la PDM et réapparairer tous vos équipements**. - -- Placement réseau: - - - Affichage de tous les réseaux avec possibilité de masquer. - - Corrections. - - Ajout mode config. -- Interne: Parser: genZclHeader() -- Interne: Cmd: genZclHeader() sur 'discoverCommandsReceived'/'discoverCommandsGenerated'/'discoverAttributesExt'. -- Sonoff SNZB-02D: Support préliminaire (2592). - -230511-BETA-1 -------------- - -- Loratap telecommande 3 boutons: Ajout support (2589). -- Réparation (beta): Améliorations. -- Disjoncteur intelligent Tongou: Mise-à-jour image (2583). -- Tuya: Support message 0x11. -- Tuya garage door controller: Mise-à-jour du modèle (2581). -- Page EQ avancé: Corrections affichage identifiant & modele. -- Placement réseau: Corrections regressions. - -230509-BETA-1 -------------- - -- Page EQ/cmdes: Correction boutons ajouter cmde (mode dev). -- Placement réseau: Ajout bouton d'analyse réseau. -- Placement réseau: Choix du niveau à afficher. -- Garage door controller: Mise-à-jour du modèle (2581). -- Support Tuya: Ajout support message 0x25/INTERNET_STATUS. -- Page de gestion: Correction regression passage en mode inclusion non fonctionnel. -- Page avancé: Correction regression boutons 'Réparer'/'Mise-à-jour'/'Réinit'/'Assistant'. - -230505-BETA-2 -------------- - -- Interne: AbeilleUpload: Crée toute la hierarchie de destination. -- Placement réseau: Possibilité de charger nouveau plan + divers. -- Matsee Plus single phase power meter: Modèle préliminaire (2588). -- Capteur temp & humidité: Modèle préliminaire (2579). - -230503-BETA-2 -------------- - -- OTA: Fichier non FW ignoré. -- OTA: Amélioration msg de debug. -- Page équipement: Correction absence boutons 'sauvegarder'... -- Placement réseau: - - - Améliorations choix de niveaux. - - Couleur des liens en fonction du LQI. - -230502-BETA-1 -------------- - -- Placement réseau: - - - Taille du texte passée à 12px. - - Possibilité de ne pas afficher les liens pour faciliter le positionnement des équipements. - - Les cartes sont stockées en interne dans 'Abeille/tmp/network_maps'. - - Sauvegarde automatique de la position d'un équipement. - - Support préliminaire d'un plan par étage. -- Blitzwolf SHP15: Mise à jour modèle. -- Zigate: Canal Zigbee configuré à chaque démarrage. -- Garage door controller: Support préliminaire (2581). -- Disjoncteur intelligent: Support préliminaire (2583). -- Interne: Prelim. Organisation page 'desktop' revue + nettoyage pour compatibilité core v4.4. -- Interne: Merge 'SW-SDK' + 'SW-Application' => 'FW-Version'. -- Prise murale Tuya: Support préliminaire (2584). - -230426-BETA-1 -------------- - -- Ikea E14 WS globe 470lm: Mise-à-jour modèle (2578). -- Xiaomi 'sensor_ht': Modification modele pour ajout section 'xiaomi'. -- Module volet roulant LoraTap SC500ZB-v2: Mise-à-jour modèle (2552). -- Trafri remote control: Mise-à-jour modele (2576). -- Nouvelles commandes pour cluster 0008. -- Interne: Parser: Correction bugs cluster 0006 & 0008. - -230422-BETA-1 -------------- - -- Network graph: Possibilité de sauver la position d'un équipement. -- Network graph: Renommé en 'Placement réseau'. -- Interne: Placement réseau: Ajout config 'ab::userMap'. -- Plaement réseau: Limitation aux dimensions du plan. -- Interne: Parser: Correction message cluster 0006 dupliqué (2574). -- Placement réseau: Couleur de lien fonction du LQI. -- Interne: Parser: Cmd Ikea cluster 0005 cmd 07 revue. -- Trafri remote control: Mise-à-jour modele (2576). -- Interne: Parser: Correction 'decodeDataType()' pour type 41/42. -- Interne: Parser: Correction 'Attribut report'. -- Ikea E14 WS globe 470lm: Support préliminaire (2578). -- OTA: Correction regression. - -230416-BETA-1 -------------- - -- Modeles: Ajout/correction 'logicalId'. -- Sonoff ZBMINIL2: Mise-à-jour du modèle & image (2569). -- Blitzwolf BW-IS4: Correction type batterie & timeout. -- Tuya temp & humidity display: Ajout support 'TS0201__TZ2000_a476raq2' (2570). -- Interne: Cmd: moveToLiftAndTiltBSO(), correction PHP warning. -- Interne: Parser: Support type 4C pour Xiaomi. -- PaulmannLichtGmbH 500.44: Ajout image. Modele non confirmé (2516). -- Network graph: Modifications internes préliminaires. -- Interne: Correction perte de cmdes lors de la mise-à-jour. -- Interne: Parser: Correction decodeDataType(). -- Interne: Parser: Correction pour inclusion. -- Interne: Suppression des 'comment' durant mise-à-jour des cmdes. -- Interne: Correction 'ep manquant'. - -230408-BETA-5 -------------- - -- Bouton IP55 Moes: Mise-à-jour du modèle (2562). -- Xiaomi sensor_switch.aq2/remote.b1acn01: Mise-à-jour des modèles. -- Interne: Parser: Suppression decodeFF01(). -- Assistant découverte: Améliorations. -- Xiomi plug: Mise-à-jour du modèle. -- Sonoff ZBMINIL2: Ajout support préliminaire (2569). -- Interne: Parser: Extension support attribut non standard. -- TS201 (TS0201__TZ3000_ywagc4rj): Modele specifique pour '%' non standard (2567). -- Curtain module (TS130F__TZ3210_dwytrmda): Ajout support (2568). -- Modele cmd 'click' renommé en 'inf_click'. -- Livolo TI0001: Correction modele (cmds logicalId). -- Modeles: Ajout/correction 'logicalId'. - -230405-BETA-2 -------------- - -- Groupes: Ajout 'suppression de tous les groupes'. -- Image: 'node_TRADFRIonoffswitch.png' => 'node_Ikea-OnOffSwitch.png' -- Loratap roller shutter touch switch v2: Mise-à-jour image (2561). -- Interne: Amélioration process de réparation. -- RDM001: Mise-à-jour du modèle (2185). -- Xiaomi vibration: Mise-à-jour du modèle. -- Xiaomi smoke (sensor_smoke): Modele géré par section 'xiaomi'. -- Interne: Parser: decodeDataType() ne s'arrete plus si erreur de taille. -- Prise Aubess TS011F, _TZ3000_gvn91tmx: Mise-à-jour du modèle (2558). -- TS201: Ajout signature TS0201__TZ3000_ywagc4rj (2567). -- Assistant modele: Mise-à-jour. -- Bouton IP55 Moes: Ajout support préliminaire (2562). -- Fonction 'réparation' préliminaire accessible à tous. - -230328-BETA-2 -------------- - -- Interne: Parser: Correction detection support de groupes. -- Page avancé/réparation: Support préliminaire. -- Page avancé: Ajout 'localisation' pour identifiant Zigbee (cas Profalux). -- Interne: Parser: Suppression support 8085/Level update pour compatibilité mode raw. -- Page avancé: Affichage des differents identifiants Zigbee si plusieurs. -- Loratap roller shutter touch switch v2: Mise-à-jour du modèle (2561). -- Mise-à-jour modèle TS130F__TZ3000_1dd0d5yi. -- Interne: Cmd: Amélioration mesg d'erreurs. -- Modèles: - - - Ajout 'act_setLevel-Light' pour remplacer 'setLevel'. - - Remplacement 'setLevel' => 'act_setLevel-Light' - - Suppression des cmdes info 'Groups' -- Ikea Trafri 470lm E27: Ajout support (2564). -- Groupes: Amélioration pour suppression d'un groupe. -- Page de config: Mise-à-jour des traductions anglaise. - -230326-STABLE-1 ---------------- - -230325-BETA-2 -------------- - -- Legefirm repeteur zigbee: Ajout support (2560). - -230324-BETA-2 -------------- - -- Legrand shutter switch: Correction modèle (2559). -- Interne: Constantes Zigbee, amélioration support cluster 0102. -- Interne: Parser: Ajout support 'unbind response'. -- Interne: createDevice(): Mise-à-jour pour éviter conflit de commandes. -- TRADFRIonoffswitch: Mise-à-jour du modèle. -- Modele de commandes: Suppression de cmde obsoletes. - - - current_position_lift_percentage - - getcurrent_position_lift_percentage -- Interne: Cmd: Changement msg debug. -- Interne: Parser: Correction support 'Node Descriptor Response'. -- Interne: Parser: Amélioration inclusion (ajout lecture 'manufCode'). -- Loratap roller shutter touch switch v2: Support préliminaire (2561). - -230322-BETA-3 -------------- - -- Girier curtain module: Mise-à-jour du modèle (2526). -- Interne: Parser: Correction warning PHP 'Binding table response'. -- Modele TS201 renommage automatique vers 'TS0201__TYZB01_hjsgdkfl'. -- Page avancé: Support préliminaire 'unbind'. -- Interne: Cmd: Support préliminaire 'unbind0031'. -- Interne: Cmd: Ajout support 'remove all groups'. -- Gestion des groupes: Amélioration affichage mineure. -- Groupes de la Zigate: Correction regression. -- Prise Aubess TS011F, _TZ3000_gvn91tmx: Mise-à-jour du modèle (2558). - -230320-BETA-3 -------------- - -- Image: 'Shutterswitchwithneutral' => 'Legrand-ShutterSwitch'. -- Image: 'Xiaomiwleak_aq1' => 'Xiaomi-LeakSensor'. -- Interne: Amélioration remplacement '#addrIEEE#', '#IEEE#' ou '#ZigateIEEE#'. -- 'sensor_wleak.aq1': Mise-à-jour du modèle. -- Page maintenance: Amélioration infos clefs. -- Package de logs: Ajout log 'event'. -- Aqara Motion Sensor P1 RTCGQ14LM/MS-S02: Mise-à-jour modèle (2463). -- Xiaomi 'plug': Mise-à-jour du modèle. - -230319-BETA-1 -------------- - -- Interne: Parser: Correction regression inclusion. -- Interne: Plusieurs correctifs 'deviceUpdates'. -- Page avancé: Ajout 'siren level' pour cmde 'Start Warning' (cluster 0502). -- Sirène M0L0-HS2WD-TY: Ajout info pourcentage batterie (2550). -- Support préliminaire 'pigiod' pour Pi-Zigates. -- Interne: Parser: Amélioration support cmdes specifiques cluster 0008. -- Modele TS201 renommé => TS0201__TYZB01_hjsgdkfl. -- Aubess prise TS011F: Ajout support préliminaire (2558). - -230314-BETA-1 -------------- - -- Loratap shutter: Nouveau modele: TS130F, _TZ3000_femsaaua (2552) -- MOES ZK-FR16M-WH: Mise-à-jour modèle 'TS011F__TZ3000_cphmq0q7' (2554). -- Interne: Cmd 0502: Amélioration pour support 'siren level'. -- Sirène M0L0-HS2WD-TY: Mise-à-jour modèle (2550). -- Commandes: Suppression 'VoltagePrise'. - -230311-BETA-1 -------------- - -- Xiaomi Aqara 2 way control module: Mise-à-jour modèle (2551). -- Page avancé/Mise-à-jour: Amélioration correction icone si invalide. -- Sirène M0L0-HS2WD-TY: Mise-à-jour modèle (2550). -- Interne: parser: correction crash decode8002_MgmtRtgRsp(). -- Image: Renommage 'HS2WD' => 'Heinman-IndoorSiren'. - -230308-BETA-1 -------------- - -- Interne: Parser: Décodage single/double precision revu. -- WarningDevice: Modèle supprimé. Supporté via 'WarningDevice-EF-3.0'. -- Interne: AbeilleTools: Suppression des 'commentX'. -- Page avancé: Cluster 0502/IAS WD, cmd 00/Start warning: Ajout 'duration'. - -230306-BETA-1 -------------- - -- Ikea telecommande 5 boutons: Mise-à-jour modèle (2547). -- Affichage groupes: Petite mise-à-jour. -- Interne: Cmd: Correction 'cmd-0502'. -- Interne: Parser: Msg 8095 désactivé pour support mode 'raw'. -- Page avancé: Support 'cluster 0502/IAS WD, cmd 00/Start warning'. -- Xiaomi Aqara 2 way control module: Mise-à-jour modèle (2551). - -230301-BETA-1 -------------- - -- Interne: Parser: Erreur 'msgToLQICollector' masquée pour FW 0005-03A0 (2546). -- Interne: Parser: Erreur 'msgToRoutingCollector' masquée pour FW 0005-03A0 (2546). - -230228-BETA-1 -------------- - -- Page maintenance/infos clefs: Amélioration mineure. -- Interne: Parser: Amélioration mineure msg debug. -- Nodon SIN-4-2-20: Mise-à-jour modele (2541). -- Innr RC110: Mise-à-jour modèle + renommé 'RC110' => 'RC110_innr'. -- Interne: Cmd: 'addGroup' revu. -- Modèles: 'groupEPx' pour définir une constante de groupe par end point. -- Interne: Configuration équipement faite par AbeilleCmd. -- Interne: getGroupMembership() revu. -- Interne: Parser: Ajout support 'addGroupResponse'/'removeGroupResponse' + zigbee['groups']. -- Interne: Parser: Interrogation des groupes lors de l'inclusion. -- Interne: Groupes: Utilisation eqLogic/config/zigbee/groups au lieu cmde info. - -230219-BETA-1 -------------- - -- Interne: Parser: Changement support clust 0000, attr 0004/5/10. -- Nodon SIN-4-2-20: Correction image (2541). -- Interne: Cmd: Timeout 8s si ACK. -- Xiaomi switch (switch.n0agl1): Correction regression modele (2517). -- Frient keypad: Mise-à-jour modele (2525). - -230215-BETA-2 -------------- - -- Interne: Parser: Améliorations mineures cluster 0004. -- Interne: Abeille.class: 'repeatEventManagement' seulement si reset équipement. -- Frient keypad: Mise-à-jour modele (2525). - -230214-BETA-1 -------------- - -- Interne: Cmd: Correction 'bind0030'. -- Eurotronic SPZB0001: Mise-à-jour modèle. -- Interne: Parser: Optimisation correction valeur suivant spec ZCL. -- Interne: Parser: Correction regression clean location. Peut impacter Profalux. -- Interne: Parser: Suppression progressive decode8100_8102(). -- Interne: Parser: Suppression support messages 80A0/80A3/80A4 pour compatibilité 'raw'. -- Interne: Parser: Optimisations pour compatiblité futur mode 'raw'. -- Frient keypad: Mise-à-jour modele (2525). -- Nodon SIN-4-2-20: Support préliminaire (2541). -- Interne: Parser: Optimisations. -- Page maintenance/infos clefs: Amélioration mineure. -- Interne: Abeille.class: Suppression 'volt2pourcent()'. -- Interne: Parser: Revue decode 8001/logs. -- Interne: SW reset si erreur 06 sur msg 8000 (2490). - -230207-BETA-3 -------------- - -- Interne: SerialRead: Filtrage des msgs de mauvaise longueur. -- Livarno Home floor lamp: Support préliminaire (2544). -- LoraTap Zigbee 3 gang remote: Ajout support (2542). -- Interne: Page maintenance/logs. Correction mineure. -- Interne: Cmd: 004E/LQI attend ACK. -- Interne: Cmd: Timeout 7s si ACK. -- Xiaomi relay (relay.c2acn01): Mise-à-jour modèle. -- Frient keypad: Mise-à-jour modele (2525). -- Interne: Parser: Améliorations support cluster 0501 pour 'Emergency'/'Fire'/'Panic'. -- Interne: Parser: Support 0501/Arm code. -- Page des équipements: Groupes par Zigate (967). - -230204-BETA-2 -------------- - -- Interne: Parser: Nettoyage 'ModelIdentifier' revue; 0 devient caractère de fin. -- Interne: Cmd: Améliorations support clusters 0500 & 0501. -- Interne: Parser: Msg 8401 désactivé. -- Modèles: Correction nom 'inf_zbAttr-0500-ZoneStatus..' => 'inf_zbCmdS-0500-ZoneStatus...'. -- Frient keypad: Mise-à-jour modele (2525). - -230202-BETA-3 -------------- - -- Interne: AbeilleCmd: Mise-à-jour 'getRoutingTable'. -- Interne: Collecte des tables de routage revue. -- Interne: Parser: Amélioration affichage cmds cluster. -- Interne: Zigbee const: Amélioration support cluster 0501. -- Interne: Parser: Amélioration 'getDevice()' si IEEE pas défini. -- Interne: Parser: Amélioration 'cleanModelId()' pour caracteres speciaux. -- Interne: Suppression 'routingTable' de la table 'eqLogic'. -- Réseau/graph des liens: Mise-à-jour. - -230130-BETA-2 -------------- - -- Interne: Parser: Ajout infos debug pour support Xiaomi. -- Modeles: Mise-à-jour 'sensor_cube' + 'sensor_cube.aqgl01'. -- Reseau: Mise-à-jour graphique des liens. -- Perte formule au redémarrage: Correction (2540). -- Interne: Parser: Correction décodage 'routing table response'. - -230126-BETA-2 -------------- - -- Heiman water leakage sensor: Mise-à-jour modèle (2527). -- Xiaomi water leak sensor: Mise-à-jour modèle. -- Interne: Parser: Nettoyage support Xiaomi pour 'magnet.aq2', 'weather'. -- Interne: Parser: Corrections decode 'Mgmt_NWK_Update_notify'. -- Interne: DB config: Ajout 'ab::zgChan' pour sauver choix de canal Zigbee. -- Page de config: Canal Zigbee affiché. -- Interne: Sauvegarde choix du canal Zigbee (11 par défaut). -- Interne: Parser: Correction crash Xiaomi. -- Modele Xiaomi 'sensor_swith' revu. -- Interne: AbeilleCmd: timeout passé de 3 à 4sec avant de déclarer cmd perdue. -- Interne: Correction mise-à-jour (au lieu de reset) équipements au démarrage. -- Interne: AbeilleCmd: Correction setChannel. -- Interne: Changement de canal Zigbee revu (broadcast mgmtNwkUpdateRequest). -- Interne: Parser: Correction erreurs PHP. - -230124-BETA-1 -------------- - -- Page avancé: Ajout version SW du device (clust 0000, attr 4000). -- Interne: Parser: Supression utilisation msg OTA 8503 pour compatibilité raw. -- Xiaomi Aqara QBKG26LM: Mise-à-jour modèle (2174). -- Interne: Parser: Cluster 000C géré par decode8002(). -- Modèles: Suppression cmdes obsoletes 'puissance1', 'puissance', & 'puissanceEP15'. - -230121-BETA-2 -------------- - -- Interne: Parser: Support cluster 0500 cmd 00/Zone status change notif. -- Interne: Parser: Correction regression. -- Interne: Cmd: Changement cosmetique msg debug. - -230120-BETA-1 -------------- - -- Interne: Mise-à-jour équipement revue pour éviter la perte de commandes. -- Réseau: Mise-à-jour graph réseau. -- Aqara Motion Sensor P1 RTCGQ14LM/MS-S02: Mise-à-jour modèle (2463). -- Owon PIR323: Mise-à-jour modèle (2533). -- Interne: Reset SW de la Zigate si pas de réponse depuis plus de 2mins. -- Sonoff ZBMini-L: Ajout support (2539). -- Interne: Parser: Support préliminaire cluster 0020, cmde 'check-in'. -- Interne: Cmd: Support préliminaire cluster 0500 zone enroll response. -- Interne: Reinit à partir du modele revue pour ne pas perdre modifs utilisateur. - -230113-BETA-2 -------------- - -- Xiaomi RTCGQ11LM: Mise-à-jour modele et image. -- Interne: Correction support Xiaomi. -- Owon PIR323: Image (2533). -- Frient keypad: Mise-à-jour modele (2525). - -230112-BETA-3 -------------- - -- Legrand micromodule switch: Mise-à-jour modele et image. -- Interne: Parser: Amélioration mess monitor cas Xiaomi. -- Modèles: Qq nettoyage + ajout logicalId sur certaines actions. -- Lexman smart plug: Support préliminaire (2531). -- Assistant modeles: Mise-à-jour suite renommage des commandes. -- Tuya 1Ch switch module (TS0001__TZ3000_tqlv4ug4): Mise-à-jour modèle. -- Modeles pour Xiaomi: Amélioration syntaxe. -- Page EQ/avancé: Liste pour les types possibles d'attribut. -- Interne: Parser: rxOn n'est plus mis à jour par 'Mgmt_lqi_rsp' (pas fiable). -- Owon PIR323: Ajout support (2533). -- Interne: Parser: 'rxOnWhenIdle' peut etre mis-à-jour par 'node descriptor'. -- Modeles: 'minValue', 'maxValue', 'calculValueOffset' mis a jour seulement si reset. - -230106-BETA-2 -------------- - -- Modeles EQ: Ajout prise en charge 'genericType'. -- Modèles: Ajout du type generique sur qq modeles. - -230106-BETA-1 -------------- - -- Interne: Parser: Correction 'single precision'. -- Modeles commandes: Normalisation de certains noms (inf_zbAttr-XXXX-YYYY). -- Interne: Parser: Correction support Xiaomi. -- Xiaomi Door Sensor MCCGQ11LM: Mise-à-jour du modèle pour restauration 'Battery-Volt'. -- Xiaomi Temp-humidité-pression WSDCGQ11LM: Mise-à-jour du modèle pour restauration 'Battery-Volt'. - -230103-BETA-5 -------------- - -- Modèles: Suppression support ancienne syntaxe 'include'. -- Girier curtain module: Support préliminaire (2526). -- Assistant modèle: Mise-à-jour. -- Maintenance/infos clefs: Amélioration. -- Heiman water sensor: Support préliminaire (2527). -- Interne: Parser: Support de certains devices Xiaomi via decode8002 pour compatibilité mode 'raw'. -- Loratap roller shutter module: Support préliminaire (2528). -- Moes thermostat BRT-100: Mise-à-jour modèle (2467). -- Modèles commandes: 'Short-Addr' & 'IEEE-Addr' => 'inf_addr-Short'/'inf_addr-Ieee'. -- Modèles commandes: 'Link-Quality'/'online' => 'inf_linkQuality'/'inf_online'. -- Modèles commandes: 'Time-Time'/'Time-TimeStamp' => 'inf_time-String'/'inf_time-Timestamp'. -- Modèles EQ: Surcharge possible de 'Polling'. -- Tuya TV02: Mise-à-jour du modèle (2175). -- Xiami RTCGQ11LM: Mise-à-jour du modèle. - -230102-BETA-1 -------------- - -- Interne: Constantes Zigbee: Améliorations. -- Interne: Parser: Update mineure msg debug Xiaomi. -- Interne: Parser: Suppression support 8041, 8043 & 8045 pour compatibilité mode 'raw'. -- Interne: Parser: Suppression support 804A pour compatibilité mode 'raw'. -- Interne: Parser: Suppression support 8030 pour compatibilité mode 'raw'. -- Interne: Parser: Suppression support 8060, 8062 & 8063 pour compatibilité mode 'raw'. -- Profalux shutter: Correction modele pour retour de 'Level'. -- Interne: Parser: decodeDataType(), ajout support type 39/single. -- Frient keypad: Support préliminaire (2525). - -230102-STABLE-1 ---------------- - - .. important:: Zigates v2 - - - Doivent être à jour du dernier firmware disponible (v3.21 à ce jour). - .. important:: Zigates v1 - - - Doivent avoir un firmware >= 3.1e pour un fonctionnement optimal mais la dernière en date (3.21) est fortement recommandée. - - L'équipe Zigate recommande FORTEMENT d'utiliser un firmware **Optimized PDM** (OPDM) dans les cas suivants: - - - Toute nouvelle installation. - - Dès lors qu'un réappairage complet est nécéssaire. - - La version OPDM corrige bon nombre de potentielles corruptions et supporte un plus grand nombre d'équipements. - - Les firmwares avant 3.1e sont forcement 'legacy'. - - Mais **ATTENTION** si vous migrez d'une version 'legacy' vers 'OPDM' il vous faudra **effacer la PDM et réapparairer tous vos équipements**. - -221215-BETA-3 -------------- - -- Interne: Amélioration infos en mode surveillance (AbeilleMonitor.log). -- Zemismart ZW-EC-01 curtain switch: Modèle revu mais équipement déconseillé. -- Interne: AbeilleCmd: Optimisation & nettoyage. -- Heiman HS1HT: Mise-à-jour image (2520). -- Heiman HS1MS-EF: Mise-à-jour image (2521). -- Tuya 1Ch switch module: Ajout support préliminaire 'TS0001__TZ3000_tqlv4ug4'. -- Interne: Correction pour équipement inconnu pendant raffraichissement réseau. - -221214-BETA-9 -------------- - -- Interne: Cmd: 'setLevelVolet' utilise 'cmd-0008'. -- Interne: Cmd: 'setLevel': Suppression 'readAttribute' consecutifs. -- Modèle EQ: Surcharge possible de 'listValue'. -- Interne: Support cmde action de type 'liste'. -- Interne: Parser: Mise à jour 'node descriptor'. -- Heiman HS1HT: Mise-à-jour modèle (2520). -- Interne: Cmd: Mise-à-jour 'writeAttribute' pour '#select#'. -- Moes thermostat BRT-100: Mise-à-jour modèle (2467). -- Maintenance/infos clefs: Amélioration. -- Heiman HS1MS-EF: Support préliminaire (2521). - -221213-BETA-6 -------------- - -- Modele EQ: Support 'trigOut' pour cmde action. -- Tuya TV02: Mise-à-jour. -- Philips SML004: Mise-à-jour modele (2437). -- Moes thermostat BRT-100: Mise-à-jour modèle (2467). -- Tuya: Amélioration support. -- Assistant modèle: Améliorations. -- Aubess 4 buttons switch: Support préliminaire (2512). -- Aqara Motion Sensor P1 RTCGQ14LM/MS-S02: Mise-à-jour modèle (2463). - -221212-BETA-2 -------------- - -- Heiman HS1HT: Support préliminaire (2520). -- Reinitialisation: Remise en cause du modele utilisé chaque fois. -- Interne: Améliorations support Tuya. -- Tuya TV02: Mise-à-jour du modèle (2175). -- Interne: Support cluster FCC0 Xiaomi générique. -- Moes temp/humidity sensor: Mise-à-jour du modèle (2500). -- Tuya mini smart switch: Correction image (2438). -- Aqara Motion Sensor P1 RTCGQ14LM/MS-S02: Mise-à-jour modèle (2463). -- Paulmann 50044: Ajout support préliminaire (2516). - -221209-BETA-4 -------------- - -- Moes thermostat BRT-100: Mise-à-jour modèle (2467). -- Assistant découverte: Améliorations. -- Assistant découverte: Ajout suffixe identiant (ex: discovery-TS0121__TZ3000_rdtixbnu.json) -- Modele TS011F: Ajout de plusieurs marques blanches. -- Icasa ICZB-IW11SW: Ajout support préliminaire (2515). -- Icasa ICZB-IW11D: Ajout support préliminaire (2514). -- Icasa ICZB-DC11: Ajout support préliminaire (2513). -- Interne: Parser: Corrections regressions. - -221208-BETA-1 -------------- - -- Moes thermostat BRT-100: Mise-à-jour modèle (2467). -- Interne: Parser: Amélioration mineure. -- Interne: Abeille.class: Amélioration sur reception msg trop grand. -- Suppression ancien log 'AbeilleConfig' (sans .log) au démarrage. -- Interne: Taille queue xToAbeille étendue. -- Interne: Parser: Affichage nPDU/aPDU avec extended error. - -221204-BETA-1 -------------- - -- Images: Normalisation de noms. -- Interne: Abeille.class: Correction findModel (2509). - -221202-BETA-2 -------------- - -- Suppression chiffres après virgule sur pourcentage batterie. -- Interne: Parser: Nettoyage fonctions obsoletes. -- Interne: Cmd: Activation ACK pour 'setLevelRaw' + 'cmd-0008'. -- Interne: Support préliminaire 'Mgmt Nwk Update Req'. -- Modeles commandes: Amélioration 'valueOffset' pour support ID logique. -- Moes curtain module: Mise-à-jour modèle (2464). -- Aqara Motion Sensor P1 RTCGQ14LM/MS-S02: Mise-à-jour modèle (2463). - -221130-BETA-1 -------------- - -- Syntaxe cmdes: Ajout support 'valueOffset' pour cmde 'action'/'slider'. -- Moes curtain module: Mise-à-jour modèle (2464). -- Renitialiser: Amélioration si équipement etait inconnu mais qu'un modèle existe maintenant. -- Moes BHT-002-GCLZBW: Ajout support préliminaire (2485). -- Livolo TI0001: Mise-à-jour modèle (2476). -- Interne: Améliorations AbeileCmd. -- Interne: AbeilleCmd: Limitation de débit activé. -- Interne: Améliorations préliminaires pour support générique Xiaomi. -- Interne: Parser: Correction pour SW reset sur NDPU bloqué. -- Interne: Collecte LQI: Améliorations mineures. -- Xiaomi Door Sensor MCCGQ11LM: Mise-à-jour du modèle. -- Interne: Parser: decodeDataType(): Ajout support 2B/int32. -- Xiaomi Temp-humidité-pression WSDCGQ11LM: Mise-à-jour du modèle. - -221122-BETA-1 -------------- - -- Page Zigate/avancé: Reset HW possible sur Piv2. -- Page Zigate/avancé: Amélioration selection du canal. -- Modèles EQ: Support customization 'rxOn'. -- Livolo TI0001: Mise-à-jour modèle (2476). -- Moes BRT-100: Mise-à-jour modèle (2467). -- Images: Qq mises-à-jour & renomages. -- Interne: Parser/cleanManufId(): '.' ignoré. -- Philips E27 LWA017: Ajout support (2503). -- Interne: Cmd: Ajout support 'move to level' (cmd-0008). - -221119-BETA-2 -------------- - -- Zigate PI v2: Correction controle GPIO (rc.local n'est plus nécessaire). -- Repeteur Loratap: Ajout support (2498). -- Interne: AbeilleCmd: Pas de renvoi si message 8000 status 06. -- Interne: Abeille.class: 'customization' & 'macCapa'. Encore une update. -- Interne: Reinitialisation d'un équipement: delai interne avant relecture DB par parser. -- Moes temp/humidity sensor: Ajout support (2500). -- Interne: Petite update page santé. -- Maintenance/infos clefs: Ajout status (timeout) de chaque équipement. -- Interne: Abeille.class: Amélioration mineure msg debug executePollCmds(). -- Moes BRT-100: Mise-à-jour modèle (2467). -- Interne: Support Tuya amélioré: Cmd: Ajout 'setValue', 'setValueMult' & 'setValueDiv'. -- GLEDOPTO GL-FL-004P: Support préliminaire (2501). -- Page Zigate/avancé: Modification choix canal zigbee. - -221114-BETA-2 -------------- - -- Interne: Parser: Optimisation. -- Interne: Cmd: Modification gestion ACK. 8702 ignoré au profit de 8011. -- Interne: Parser: Amélioration messages dbg Xiaomi. -- Interne: Parser: Nettoyage 'manufacturer' revu (cleanManufId()). -- Interne: Parser: Correction 'customization' + 'macCapa'. -- Interne: Parser: Divers correctifs & améliorations. - -221110-BETA-2 -------------- - -- Interne: Parser: Surveillance NPDU, timeout 4mins. - -221110-BETA-1 -------------- - -- Interne: Install: Correction 'Batterie Volt' (0001-01-0020). Suppression 'calculValueOffset'. -- Interne: Parser: Check NPDU and force SW reset if stuck for more than 3 mins. -- Modèles: Ajout 'customization' optionnelle pour corriger/forcer infos. - -221108-BETA-1 -------------- - -- Modèles: Nettoyage. Suppression cmds obsoletes setLevelVoletUp/setLevelVoletDown. -- Modèles: Correction 'sensor_86sw1' pour 'Battery-Percent'. -- Modèles: Ajout qq 'manufacturer' manquants. -- Interne: AbeilleCmd: Ajout support 'cmd-0102' + suppression 'WindowsCovering'. -- Moes curtain module: Mise-à-jour modèle (2464). - -221107-BETA-1 -------------- - -- Interne: Parser: 'Batterie-Pourcent' => '0001-01-0021'. -- Interne: install/DB cmd: 'Batterie-Pourcent' => '0001-01-0021' - -221105-BETA-1 -------------- - -- Interne: Parser: Xiaomi tags decode update. -- Modèles: Historisation activée par défaut pour 0400/0402/0403 & 0405 clusters attr 0000. -- Modèles: Surcharge possible de 'isHistorized'. - -221104-BETA-1 -------------- - -- Support: Infos clefs: Affichage type de Zigate. -- Interne: Suppression 'uniqId' DB eqLogic/configuration. -- Interne: Message zigate 804E plus utilisé. Pas assez robuste => decode8002(). - -221103-BETA-2 -------------- - -- Equipements: Qq modeles revus. -- Modèle de commandes: 'Batterie-Volt' remplacé par '0001-01-0020'. -- Interne: Constantes Zigbee: Ajout data types cluster 0000. -- Page EQ/avancé: Message d'erreur si champ manquant. -- Interne: AbeilleCmd: Meilleur support type 'string' pour 'writeAttribute()'. -- Interne: Parser: Cluster 0001 (batterie) traité par 'decode8002()'. -- Modeles: Commandes obsoletes: 'Batterie-Hue', 'Batterie-Pourcent' & 'Batterie-Volt-Konke'. -- Interne: Suppression 'bindShort' obsolete. -- Modèle équipements: Syntaxe 'alternateIds' améliorée. -- Ruche: Cmde 'Set inclusion mode' est de retour pour cas 2476 non résolu. -- Page EQ/avancé pour Zigate: Correction 'Reset HW' pour PI-Zigate. -- Interne: Qq changements autour du séquencement du démarrage des démons. -- Interne: Remplacement cmd obsolete 'levelVoletStop' + nettoyage code. -- Modeles: Support 'notStandard' pour les commandes 'illuminance' qui ne respectent pas la spec ZCL. - -221029-BETA-1 -------------- - -- Interne: Zigbee const: Ajout 0403/pressure. -- Interne: Parser: Attribut '0403-xx-0000' (pressure) directement décodé par 8002. -- Interne: Parser+install+modele: Attribut '0402-xx-0000' (temperature) directement décodé par parser/8002. -- H1 dual wall switch: Mise-à-jour du modèle (2474). -- Interne: Parser+install+modele: Attribut '0400-xx-0000' (illuminance) directement décodé par parser/8002. -- Ajout des FW 3.23 pour les Zigates v1. -- Interne: Optimisation suppression des queues lors de l'arret des démons. -- Interne: Blocage relance des démons si mise-à-jour FW ou test de port. -- Démons start & stop: Amélioration. Devrait limiter les cas 'port toujours utilisé'. - -221024-BETA-1 -------------- - -- Interne: Parser: Correction decodeDataType() impactant types longs (ex: uint48). -- Interne: Parser: Types 18, 19, 28 & 29 maintenant traités par decodeDataType(). -- Interne: Parser+install+modele: Attribut '0405-xx-0000' (humidity) directement décodé par parser. -- Interne: Parser: Cluster 0405 traité par decode8002(). -- Philips E27 white bulb: Mise-à-jour du modèle (2421). -- Page EQ/avancé: amélioration mineure. -- Page maintenance: Correction regression sur 'Telecharger tout'. -- Interne: Parser: Améliorations support cluster 'FCC0' Xiaomi. - -221023-BETA-1 -------------- - -- Interne: Correction regression constantes Zigbee. - -221022-BETA-1 -------------- - -- Moes curtain module: Mise-à-jour modèle (2464). -- Moes 2 gang dimmer module: Modele preliminaire (2473). -- Interne: Premier fichier 'packages.json' pour installation de dependances. -- H1 dual wall switch: Support preliminaire (2474). -- Interne: Cmd: sliderToHex(), ajout support enum8 & 16. -- Nous A1Z smart plug: Mise-à-jour du modèle (2460). -- Page maintenance/logs: Message si pas en mode 'debug' lors du téléchargement. -- Interne: Constantes Zigbee: Definitions des types. -- Philips E14 white bulb: Modele preliminaire (2422). -- Philips E27 white bulb: Modele preliminaire (2421). - -221019-STABLE-1 ---------------- - - .. important:: Les zigates v2 doivent être à jour du dernier firmware disponible (v3.21 à ce jour). - .. important:: Pour les zigates v1, l'équipe Zigate recommande FORTEMENT d'utiliser un firmware **Optimized PDM** (OPDM) dans les cas suivants: - - - Toute nouvelle installation. - - Dès lors qu'un réappairage complet est nécéssaire. - - La version OPDM corrige bon nombre de potentielles corruptions et supporte un plus grand nombre d'équipements. - - Les firmwares avant 3.1e sont forcement 'legacy'. - - Mais **ATTENTION** si vous migrez d'une version 'legacy' vers 'OPDM' il vous faudra **effacer la PDM et réapparairer tous vos équipements**. - - .. important:: Les zigates v1 doivent avoir un firmware >= 3.1e pour un fonctionnement optimal mais la dernière en date (3.21) est fortement recommandée. - -221014-BETA-1 -------------- - -- Aqara Motion Sensor P1 MS-S02: Support preliminaire (2463). -- Silvercrest smart button: Mise-à-jour modèle (2468). -- Page maintenance/logs: Correction ascenseur partie gauche. -- Interne: Arret des démons: Correction mineure & améliorations. - -221010-BETA-1 -------------- - -- Xiaomi D1 wall switch single: Support préliminaire (2466). -- Moes BRT-100: Support préliminaire (2467). -- Silvercrest smart button: Support préliminaire (2468). -- Interne: Cmd+Parser: Ajout support 'discoverCommandsGenerated'. -- Assistant découverte: Amélioration: Ajout recherche commandes generées. -- Network graph: Temporairement masqué. En cours de refonte. -- Moes - Smart Brightness Thermometer: Support préliminaire (2469). -- Assistant découverte: Correction pour support multi EP. - -221007-BETA-1 -------------- - -- Interne: Parser: Amélioration msg debug. -- Network graph: Correction. -- Network graph: Nombreux changements internes.. normalisation, nettoyage. -- Interne: DB eqLogic: 'positionX' => 'ab::settings[physLocationX]'. -- Interne: DB eqLogic: 'positionY' => 'ab::settings[physLocationY]'. -- Interne: Nettoyage DB au démarrage revu. -- Page EQ/avancé d'une Zigate: Ajout boutons 'démarrer/arrêter' pour inclusion. -- Moes curtain module: Support preliminaire (2464). -- Interne: DB config: Suppression clefs obsoletes 'blocageRecuperationEquipement' + 'blocageTraitementAnnonce'. -- Interne: DB config: 'DbVersion' => 'ab::dbVersion'. - -220930-BETA-1 -------------- - -- Interne: Suppression queue 'ctrlToCmd' au profil de 'xToCmd' + améliorations 'CliToQueue'. -- Interne: Mise à jour generation doc. -- Nous A1Z smart plug: Ajout support préliminaire (2460). -- Livarno Home HG07834B: Mise-à-jour modele (2448). -- Philips SML004: Mise-à-jour modele (2437). -- Maintenance/télécharger tout: Ajout alerte si moins de 5000 lignes de logs. -- Interne: Parser: Clusters supportés par 8100/8102 revus à la baisse (=> 8002). - -220928-BETA-1 -------------- - -- Interne: Suppression queue 'assistToCmd' + nettoyage 'assistToParser'. -- Interne: AbeilleCmd: Amélioration 'sliderToHex()'. -- Tuya vibration sensor TS0210: Mise-à-jour modèle (2452). - -220927-BETA-1 -------------- - -- Orvibo CM10ZW: Ajout affichage 'Status X' (2024). -- Livarno Home HG07834B: Mise-à-jour modele (2448). -- Firmware zigate: Recommandation d'utiliser la v3.21. -- Firmwares v1: Suppression des versions < '3.21'. -- Page maintenance/infos clefs: Ajout canal. -- Interne: DB config: Suppression clef obsolete 'agressifTraitementAnnonce'. -- Interne: DB config: 'monitor' => 'ab::monitorId'. -- Interne: Abeille.class: Le manque de déclaration de 'batteryType' ne permet plus de dire que le device est en écoute. -- Interne: Nettoyage code obsolete 'SetPermit' + 'xmlhttpMQTTSend.php'. -- Interne: ZigbeeConst: Mise à jour cluster 0500. - -220924-BETA-1 -------------- - -- Page équipement: Amélioration affichage. -- Tuya vibration sensor TS0210: Mise-à-jour modèle (2452). -- Syntaxe modele EQ: Ajout possibilité surcharge 'repeatEventManagement'. -- Syntaxe modele EQ: Ajout possibilité surcharge 'returnStateTime' & 'returnStateValue'. - -220923-BETA-1 -------------- - -- Interne: Suppression cmde obsolete 'luminositeHue.json'. -- Interne: Normalisation de qq icones Philips. -- Interne: Normalisation de qq icones Iluminize. -- Tuya vibration sensor TS0210: Ajout support préliminaire (2452). -- Interne: DB config: Nettoyage clefs obsoletes. -- Interne: Suppression erreurs PHP sur 'AbeilleEQ-xxx.php' -- Commandes JSON: Suppression cmde obsolete 'PuissanceLegrandPrise' => 'zb-0B04-ActivePower'. -- Assistant modèle: Mise-à-jour pour cluster 0500/IAS zone. -- Assistant modèle: Correction génération 'category'. -- Interne: DB config: 'preventLQIRequest' => 'ab::preventLQIAutoUpdate'. - -220922-BETA-1 -------------- - -- Page EQ/avancé: Affichage code fabricant. -- Interne: Ajout fabricant dans qq modeles JSON. -- Livarno Home: Ajout modele préliminaire (2448). -- Philips SML004: Ajout 'Sensitivity' (2437). -- Interne: Parser: Support cluster 1000 cmd 41 & 42. -- Tuya PIR & illuminance: Mise-à-jour du modele (2409). -- Interne: DB config: 'AbeilleIEEEX' => 'ab::zgIeeeAddrX' -- Interne: DB config: 'AbeilleIEEE_OkX' => 'ab::zgIeeeAddrOkX' -- Interne: Parser: isDuplicated() timeout = 2sec au lieu de 10sec. -- Tuya PIR+illuminance: Mise-à-jour modèle pour 'Illuminance' (2409). - -220916-BETA-1 -------------- - -- Interne: Liste des 'end points' enregistrée dans DB eqLogic. -- Interne: 'manufCode' enregistré dans DB eqLogic. -- Page EQ/avancé: Ajout possibilité d'envoyer une 'Node descriptor request'. - -220916-STABLE-1 ---------------- - - .. important:: Les zigates v2 doivent être à jour du dernier firmware disponible (v3.21 à ce jour). - .. important:: Pour les zigates v1, l'équipe Zigate recommande FORTEMENT d'utiliser un firmware **Optimized PDM** (OPDM) dans les cas suivants: - - - Toute nouvelle installation. - - Dès lors qu'un réappairage complet est nécéssaire. - - La version OPDM corrige bon nombre de potentielles corruptions et supporte un plus grand nombre d'équipements. - - Les firmwares avant 3.1e sont forcement 'legacy'. - - Mais **ATTENTION** si vous migrez d'une version 'legacy' vers 'OPDM' il vous faudra **effacer la PDM et réapparairer tous vos équipements**. - - .. important:: Les zigates v1 doivent avoir un firmware >= 3.1e pour un fonctionnement optimal mais la dernière en date (3.21) est fortement recommandée. - -220914-BETA-1 -------------- - -- Philips SML003 motion sensor: Support préliminaire (2440). -- Tuya smart plug: Support préliminaire (2443). -- Interne: Normalisation du nom de qq icones. -- Tuya iHSW02/WHD02 mini smart plug: Ajout modele (2438). -- Electrovanne Saswell SAS980SWT: Correction modele (2388). -- Silvercrest motion sensor: Support préliminaire (2445). - -220906-BETA-1 -------------- - -- Moes smart dimmer MS105Z: Mise-à-jour modèle pour partie dimmer (2363). -- Interne: Parser: Ajout info msg 8139. -- Interne: Abeille.class: Correction mise-à-jour cmde info (duplicate entry). -- Thermostat Schneider Wiser: Support préliminaire (2436). -- Philips HUE Smart plug LOM008: Mise-à-jour du modèle (2431). -- Interne: Suppression ancienne syntaxe 'tuyaEF00' dans modèles JSON. -- OSRAM Classic A60 TW: Support préliminaire (2435). -- OSRAM Classic B40 TW: Mise-à-jour modèle (2023). -- Philips SML004: Support préliminaire (2437). -- Assistant modèle EQ: Ajout support cluster 0406 (Occupancy) + amélioration 0400. -- Interne: Parser: Cluster 0406 supporté par decode8002() et non plus 8102(). - -220901-BETA-1 -------------- - -- Interne: Suppression queue obsolete 'parserToAbeille'. -- Interne: Optimisation queues 'xmlToAbeille'/'cmdToAbeille'/'abeilleToAbeille' => 'xToAbeille'. -- Page config: Test de port: Amélioration mineure. -- Interne: Optimisation queues dans deamon(): 'parserToAbeille2' => 'xToAbeille'. -- Page santé: Affichage du type d'équipement au lieu de son icone. -- Interne: Ajout type 'Zigate' à l'équipement 'Ruche'. -- Interne: Format JSON eq: Mise-à-jour 'Identify' & 'Groups'. -- Interne: Support Tuya: Amélioration 'transId' + 'setPercent1000'. - -220829-BETA-1 -------------- - -- Page maintenance: Récupération fantomes préliminaire, pour les eq sur secteur (mode dev). -- Philips HUE Smart plug LOM008: Support préliminaire (2431). -- Interne: Nettoyage images: 'LOM001'/'LOM002' => 'PhilipsSignify-Plug' - -220824-BETA-1 -------------- - -- Interne: Mise-à-jour page maintenance. -- Aeotec Multi purpose sensor: Mise-à-jour du modèle pour 'vibration' (2376). -- Page support: Remplacée par page 'maintenance' + améliorations. -- Volet Profalux: Ajout cmde info 'Not Closed' (2429). -- Ikea on/off switch: Correction modele pour batterie à mi valeur (2056). -- JSON équipement: Ajout possibilité surcharge 'calculValueOffset'. -- Interne: 'AbeilleLQI_MapDataAbeilleX.json.lock' => 'AbeilleLQI-AbeilleX.json.lock'. -- Interne: Arret generation ancien format 'AbeilleLQI_MapDataAbeilleX.json'. -- Interne: Recup équipements fantomes. - -220817-BETA-1 -------------- - -- Interne: Boutons 'vider' & 'supprimer' page support. -- Interne: Modifications clefs DB 'config' - - - 'AbeilleActiverX' => 'ab::zgEnabledX'. - - 'AbeilleTypeX' => 'ab::zgTypeX'. - - 'AbeilleSerialPortX' => 'ab::zgPortX'. - - 'IpWifiZigateX' => 'ab::zgIpAddrX'. - - 'AbeilleParentId' => 'ab::defaultParent' -- Gledopto GL-C-008P: Mise-à-jour icone. -- Aubess detecteur de fumée: Ajout support préliminaire (2426). -- Interne: Parser: Read Attributes Response, correction crash cluster ID 0005. - -220810-BETA-2 -------------- - -- Interne: Correction regression DB eqLogic pour 'icone' => 'ab::icon'. -- Zlinky: Amélioration modèle. - -220810-BETA-1 -------------- - -- Orvibo ST30: Correction modèle pour humidité (2193). -- Page de config: Changements mineurs. -- Page zigate/avancé: Choix du canal Zigbee amélioré. -- Page équipement/avancé: Améliorations visuelles mineures. -- Aeotec Multi purpose sensor: Mise-à-jour du modèle pour 'vibration' (2376). -- Gledopto GL-C-007P: Support préliminaire. -- Interne: Nettoyage entrées 'Polling' + 'RefreshData' sur mise-à-jour d'une commande. -- Zlinky: Mise-à-jour modèle (2418). -- Interne: msg_send()/msg_receive() avec json_encode()/json_decode() partout. -- Interne: DB eqLogic, 'icone' => 'ab::icon'. -- INNR RC250: Support préliminaire (2420). - -220714-STABLE-1 ---------------- - - .. important:: Les zigates v2 doivent être à jour du dernier firmware disponible (3.21 à ce jour). - .. important:: Pour les zigates v1, l'équipe Zigate recommande FORTEMENT d'utiliser un firmware **Optimized PDM** (OPDM) dans les cas suivants: - - - Toute nouvelle installation. - - Dès lors qu'un réappairage complet est nécéssaire. - - La version OPDM corrige bon nombre de potentielles corruptions et supporte un plus grand nombre d'équipements. - - Les firmwares avant 3.1e sont forcement 'legacy'. - - Mais **ATTENTION** si vous migrez d'une version 'legacy' vers 'OPDM' il vous faudra **effacer la PDM et réapparairer tous vos équipements**. - - .. important:: Les zigates v1 doivent avoir un firmware >= 3.1e pour un fonctionnement optimal mais la dernière en date (3.21) est fortement recommandée. - -220713-BETA-1 -------------- - -- Profalux: Ajout support volet MOT-C1Z06F (2411). -- Interne: Exclusion de 'resources/archives' des signatures MD5 (2413). - -220707-BETA-1 -------------- - -- Interne: Parser: Amélioration msg monitor si équipement Tuya. -- Ampoule E27 Ledvance white: Mise-à-jour modèle (2400). - -220628-BETA-1 -------------- - -- Mhcozy ZG-0005-RF: Ajout support préliminaire (2408). -- Gledopto GL-C-008P: Ajout support préliminaire (2402). -- Tuya PIR+illuminance: Ajout support préliminaire (2409). - -220625-BETA-1 -------------- - -- Interne: Parser: Fix mineur msg debug. -- Modèles d'équipements: Possibilité de surcharger 'historizeRound'. -- Interne: Parser: Ajout support msg '8001/Log message'. - -220622-BETA-1 -------------- - -- Interne: 'Device Announce' filtré pour Zigate v2 seulement (2404). - -220619-STABLE-1 ---------------- - -- Interne: Support Tuya amélioré (ajout 'rcvValueMult'). -- Tuya TV02: Mise-à-jour du modèle. -- Page EQ: Suppression des boutons 'Recharger' & 'Reconfigurer' pour ne garder que 'Reinitialiser'. -- Ampoule E27 Ledvance couleur: Ajout support préliminaire (2400). -- Smart Air Box: Modèle revu pour utilisation commandes internes génériques (2329). - -220606-BETA-1 -------------- - -- Interne: Parser: Amélioration mineure. -- Nom d'un nouvel équipement = type issu du modèle + Jeedom ID (ex: 'Tuya smoke sensor - 12') (2393). -- Interne: Support Tuya amélioré. -- Moes smart dimmer MS105Z: Mise-à-jour modèle pour partie dimmer (2363). -- Interne: Ajout support préliminaire 'usbreset'. -- Blitzwolf SHP13: Ajout support signature TS011F _TZ3000_amdymr7l (2396). - -220531-BETA-1 -------------- - -- Interne: Suppression code obsolete (xmlhttpConfChange). -- Page santé: Amélioration mineure. -- Mise-à-jour OTA: Amélioration mineure & correction pour support FW Legrand. -- Electrovanne Saswell SAS980SWT: Support préliminaire (2388). -- Ikea Tredanson rideau occultant: Ajout support préliminaire (2392). -- Nom d'un nouvel équipement = type issu du modèle + Jeedom ID (ex: 'Tuya smoke sensor - 12') (2393). -- Réseau: Changement visuel mineur table des liens + utilisation 'AbeilleLQI-AbeilleX.json'. - -220518-BETA-1 -------------- - -- E27 RGB Eglo/Awox (id = TLSR82xx, AwoX): Mise-à-jour du modèle (2384). -- Images: Nettoyage & standardisation des noms (ex: node_Generic-BulbXXX.png). -- Page EQ/avancé: Ajout possibilité de changer la couleur (cluster 0300, move to color). -- Interne: Support Tuya amélioré pour plus de flexibilité. -- Moes smart dimmer MS105Z: Mise-à-jour modèle (2363). -- Aeotec Multi purpose sensor: Mise-à-jour du modèle (2376). -- Page des équipements: Affichage grisé si équipement désactivé. -- Support OTA: Correction regression. -- Page EQ/commandes: Amélioration mineure (2178). - -220515-BETA-1 -------------- - -- Legrand Cable outlet: Mise-à-jour du modèle (850). -- Interne: Cmd: Revue 'commandLegrand'. -- Moes smart dimmer MS105Z: Mise-à-jour modèle (2363). -- Nom d'un nouvel équipement = type issu du modèle (ex: 'Tuya smoke sensor') plutot que 'AbeilleX-Y'. -- Interne: Corrections utilisation obsolete de 'RxOnWhenIdle'. -- E27 RGB Eglo/Awox (id = TLSR82xx, AwoX): Ajout support préliminaire (2384). -- Lidl Dimmable HG07878C: Ajout support préliminaire (2383). -- Interne: Parser: Support revu pour 8002/'configure reporting response'. 8120 n'est plus utilisé. -- Interne: Constantes zigbee. Ajout clusters privés EF00, FC01 & FC40. -- Images: Nettoyage & standardisation des noms (ex: node_Generic-BulbXXX.png). -- Interne: Abeille.class: Optimisation. -- Interne: AbeilleCmd: Ajout support 'manufId' pour 'configureReporting'. -- Page EQ/avancé: 'Configure reporting': Ajout support code fabricant (manufId). -- Page EQ/avancé: Affichage des groupes Zigbee auxquels l'équipement appartient (1713). -- Woox controleur d'arrosage: Ajout support préliminaire (2385). -- Interne: Parser: FC01/FC02 supporté par decode8002. -- Interne: AbeilleCmd: Correction readAttribute() pour 'manufId' renseigné. -- Page EQ/avancé: 'Read attribute': Ajout support code fabricant (manufId). - -220509-BETA-1 -------------- - -- Tuya smoke detector: Support préliminaire (2380). -- Heiman COSensor EF-3.0: Mise-à-jour modèle (2312). -- Interne: Parser: Support cmd 01 générée par cluster 0500 (#EP#-0500-cmd01). -- Aeotec Multi purpose sensor: Mise-à-jour modèle pour vibration (2376). -- Nettoyage cmdes JSON obsolètes: - - - 'etatSwitchLivolo' => 'zb-0006-OnOff' - - 'etatVolet' => 'zb-0006-OnOff' -- Interne: Nettoyage partiel du répertoire 'Network'. -- Interne: Nettoyage 'Abeille.class'. -- Reseau/bruit: Corrections. -- Interne: Optimisation AbeilleCmd autour de 'managementNetworkUpdateRequest'. -- Interne: Parser: Support type 'array'. -- Interne: Parser: Decode 'write attribute response' pour cluster 'private'. - -220428-BETA-1 -------------- - -- Interne: check_json: Améliorations. -- Aeotec Multi purpose sensor: Mise-à-jour modèle (2376) & correction cmde 'zb-0500-ZoneStatus'. -- Modèles de commandes JSON: Mise-à-jour cosmetique. -- Interne: Ajout date derniere mise-à-jour à partir du modèle (ab::eqModel['lastUpdate']). -- Interne: Parser: Optimisation lecture DB 'config'. -- Interne: Parser: Mise-à-jour support cluster 0005/scenes (peut etre cassé). -- Interne: Parser: Corrections regressions. -- Owon multi-sensor THS317-ET: Ajout support. -- Xiaomi sqare sensor: Mise-à-jour modèle pour ne garder qu'une info 'Pressure' = '0403-01-0000' (2370). -- Moes smart dimmer MS105Z: Mise-à-jour modèle (2363). -- Interne: Parser: Correction 'read attribute' pour 'Time cluster'. - -220425-BETA-1 -------------- - -- Interne: Mise-à-jour DB eqLogic - - - 'ab::jsonId' + 'ab::jsonLocation' => 'ab::eqModel['id'/'location]' - - 'MACCapa' => 'ab::zigbee['macCapa']' - - 'RxOnWhenIdle' => 'ab::zigbee['rxOnWhenIdle']' - - 'AC_Power' => 'ab::zigbee['mainsPowered']' -- Interne: Parser: decode8002() monitoring migré en fin de fonction. -- Interne: Parser: Suppression fonction obsolete msgToAbeille(). -- Page EQ/avancé: Correction regressions. -- Aeotec Multi purpose sensor: Ajout support préliminaire (2376). -- Page EQ/avancé: Corrections 'Réinitialiser'. -- Assistant EQ/modèle: Améliorations pour clusters 0402, 0405 & 0500. - -220421-BETA-1 -------------- - -- Interne: Version DB, date = 20220407. -- Analyse/santé: Correction affichage ports utilisés. -- Interne: Nettoyage fonctions obsolètes. -- Interne: Suppression de plusieurs commandes obsolètes (dispos sur page avancée) 'Ruche': - - - 'replaceEquipement' - - 'Get Time' - - 'SystemMessage' (provoque mise à jour erronnée date de communication Zigate) -- Interne: Page EQ/avancé. Qq optimisations. -- Interne: Mise-à-jour controle/redémarrage des démons. -- Zigate v2/apparition équipements inconnus: Ajout verrue (2368). -- Interne: Plus qu'une seule queue d'entrée au parser. -- Interne: Tuya: Support préliminaire TV02. -- Interne: Grosse mise-à-jour pour meilleur support des équipements Tuya. -- Philips LOM007 smart plug: Ajout support (2374). -- JSON commandes: 'forceReturnLineAfter/Before' is obsolete. Replaced by 'nextLine' = 'after/before'. -- Interne: Sauvegarde des infos du modele dans la DB eqLogic => 'ab::eqModel'. -- Page EQ: Ajout affichage type d'équipement. - -220407-BETA-1 -------------- - -- Parser: Amélioration decode routing table. -- WarningDevice-EL-3.0: Mise-à-jour modèle + merge 'WarningDevice'. -- SML002: Mise-à-jour modèle (2309). -- Affichage 'Humidity': Suppression du chiffre apres la virgule. -- Page EQ/avancé: Amélioration (mineure) affichage modèle -- Commande interne IAS WD ('cmd-0502') revue pour flash seul. -- Interne: Constantes Zigbee: Ajout support cluster 0402. -- Nettoyage cmdes JSON obsolètes: - - - 'etatEpXXout' => 'zb-0006-OnOff' + 'ep=XX' - - 'etatEpXXin' => 'zb-0006-OnOff' + 'ep=XX' - - 'etatEp08' => 'zb-0006-OnOff' + 'ep=08' - -220406-STABLE-1 ---------------- - -- Moes MS105Z: Ajout support préliminaire (2363). -- Legrand switch 067723: Mise-à-jour modèle (2361). -- Lidl ampoule livarno lux led gu10 HG08131A: Mise-à-jour modèle (2356). -- Tuya TS011F__TZ3000_cphmq0q7: Mise-à-jour modèle pour support autres signatures. -- Page des équipements: Changement icone si non définie. -- Interne: Mise-à-jour des commandes suite reinclusion/reinit revue. -- Page équipement: Choix icone revu. Affichage du nom du PNG selectionné et non plus une interprétation de ce que c'est. -- Interne: Grosse mise-à-jour des commandes, et suppression des 'info' en doublon. -- Tuya IH-K009: Ajout image. -- Modèles équipement: Correction regression config reporting 0008-0000 (mauvais type). - -220329-BETA-2 -------------- - -- Legrand switch 067723: Mise-à-jour modèle (2361). -- Page EQ/avancé: Amélioration mineure affichage ID Zigbee. -- Interne: Amélioration récupération équipements fantomes. -- Interne: Timeout n'est plus écrasé si réannonce de l'équipement. -- Package de logs: Masquage de la clef 'api' de la table 'config'. -- Package de logs: Masquage des URL. - -220324-BETA-1 -------------- - -- Network graph: Corrections diverses (1820). -- Page de gestion: Suppression du 'Changement de zigate' en double. -- Interne: Cmd 00 cluster 0502/IAS-WD: corrections. -- Frient smoke alarm (SMSZB-120, frientAS): Mise-à-jour modèle (2242). -- Interne: Mise-à-jour à partir du modèle revu pour éviter de créer des cmdes orphelines. -- Interne: Collecte LQI génère nouveau format (AbeilleLQI-AbeilleX.json). -- Réseau/graph des liens: Revu et utilise nouveau format interne + ajout icone équipement. -- Interne: Parser: Amélioration filtrage mauvais paquets LQI/804E. -- Page support: Affiche tout fichier JSON du repertoire temporaire. -- Interne: network.js => AbeilleNetwork.js - -220320-BETA-1 -------------- - -- Interne: Mise-à-jour script de generation de la liste des eq supportés. -- Interne: Mise-à-jour support Tuya EF00 cmd 01. -- Lidl ampoule livarno lux led gu10 HG08131A: Ajout support (2356). -- Interne: Ajout support cmde 00 cluster 0502/IAS WD pour controle sirene. -- Frient smoke alarm (SMSZB-120, frientAS): Mise-à-jour modele (2242). - -220316-BETA-1 -------------- - -- Interne: AbeilleCmdPrepare: nettoyage code obsolete. -- Interne: AbeilleCmdQueue: Timeout étendu à 3sec. -- Philips RWL021: Mise-à-jour modèle pour report battery (1243). -- Evology 4 buttons (3450-Geu_CentraLite): Mise-à-jour modèle (2318). -- Tuya Smart Air Box: Ajout support préliminaire (2329). -- Interne: Parser: Suppression car '/' pour identifiant fabricant (ex 'frient A/S', 2242). -- Correction DB pour erreur getPlugVAW, mauvaise taille d'attribut (508 au lieu de 0508). -- Interne: Ajout support cluster EF00/cmd 02 pour Smart Air Box. -- Frient smoke alarm (SMSZB-120, frientAS): Ajout support (2242). -- JSON équipements: Suppression mots clef obsoletes: 'lastCommunicationTimeOut' & 'type' -- Interne: AbeilleCmd: Akout support cmd 00 pour cluster 0502/IAS WD. -- Interne: Code specifique Tuya isolé. -- Interne: Qq fixes. - -220310-BETA-3 -------------- - -- Interne: SerialRead: Suppression warning fopen(). -- JSON équipements: Suppression cmdes obsoletes - - - 'etatLight' => 'zb-0006-OnOff' - - 'WindowsCoveringUp' => 'zbCmd-0102-UpOpen' - - 'WindowsCoveringDown' => 'zbCmd-0102-DownClose' - - 'WindowsCoveringStop' => 'zbCmd-0102-Stop' -- Philips RWL021: Mise-à-jour modèle (1243). -- Evology 4 buttons (3450-Geu_CentraLite): Ajout support (2318). -- Interne: Parser: Clust 0007 supporté par decode8002(). -- Tradfri GU10 340lm White, LED2005R5: Ajout support (2344). -- Ampoule Lexman Gu10 460lm (ZBEK-4, Adeo): Ajout support (2348). -- Interne: AbeilleCmd: Corrections & améliorations. -- Page EQ/avancé: Configurer le reporting: Ajout type attribut. - -220307-BETA-1 -------------- - -- Interne: AbeilleCmd: Mises-à-jour, corrections, améliorations (dont vitesse) & nettoyage. -- Interne: AbeilleCmd: Gestion mode ACK etendu aux commandes internes suivantes: - - - bind0030 - - configureReporting - - getActiveEnpoints - - writeAttibute - - writeAttribute0530 - - sendReadAttributesResponse - - readReportingConfig -- Legrand double switch (NLIS-Doublelightswitch_Legrand): Ajout support (2343). -- Interne: AbeilleCmd: Suppression cmds obsoletes 'ReadAttributeRequestXX'. -- JSON équipements: Suppression cmdes obsoletes - - - 'getBattery' => 'readAttribute' + 'attrId=0021' - - 'getBatteryVolt' => 'readAttribute' + 'attrId=0020' - - 'getPlugA' => 'poll-0B04-0508' - - 'getPlugPower' => 'poll-0B04-050B' - - 'getPlugV' => 'poll-0B04-0505' -- Interne: AbeilleCmd: Correction génération SQN pour cmds 0530. -- Liste compatibilité: Correction pour suppression affichage 'discovery'. -- Mise à jour OTA: Correction queue. -- Hue outdoor motion sensor SML002: Mise-à-jour modèle (2309). -- Volets Profalux: Correction types génériques pour appli mobiles. -- Analyse équipements/niveau batterie: Correction regression (2345). -- Interne: Parser->Abeille: optimisation msg - - - attributeReport => attributesReportN. - - reportAttributes => attributesReportN. - - readAttributesResponse => readAttributesResponseN. - -220228-BETA-2 -------------- - -- Remplacement d'équipements: Nouvelle mise-à-jour + doc (2337). -- Interne: Parser: Certains messages dupliqués sont ignorés. -- Récupération des fantômes: Amélioration. -- Interne: Migration codes obsoletes vers 'archives': LqiStorage.x, RouteRecord.x, Jennic binary. -- Mini smart socket (TS011F__TZ3000_5f43h46b): Mise-à-jour modèle (2334). -- Interne: Amélioration analyse réseau (collecte LQI). -- Remplacement d'équipements: Correction fonctionalité (2337). - -220223-BETA-1 -------------- - -- Interne: Parser: Correction erreur PHP decode8043(). -- Moes 4 boutons, scene switch, TS004F__TZ3000_xabckq1v: Mise-à-jour modèle (2278). -- Mini smart socket (TS011F__TZ3000_5f43h46b): Ajout support préliminaire (2334). -- JSON équipements: Suppression cmdes obsoletes - - - 'etatSW1', 'etatSW2', 'etatSW3' - - 'etatSwitch' - - 'etatSwitchKonke' -- JSON équipements: Mise-à-jour 'zb-0702-CurrentSummationDelivered'. -- Aqara TVOC moniteur d'air AAQS-S01 (airmonitor.acn01): Mise-à-jour modele (2279). - -220223-STABLE-1 ---------------- - -- Page EQ/avancé: Ajout bouton 'leave request'. -- JSON commandes: Remplacement 'ReadAttributeRequest' => 'readAttribute'. -- Interne: AbeilleCmd/readAttribute(): Ajout support 'manufId'. -- Tuya capteur rond temp & humidité (TS0201__TZ3000_dowj6gyi): Ajout support. -- Ikea E27 bulb (TRADFRIbulbE27CWS806lm): Ajout support (2328). -- Migration d'équipements: Mise-à-jour séquence + ajout doc. -- Réseau/routes: Correction regression fonctionnement. - -220215-BETA-1 -------------- - -- Interne: Amélioration msg debug. -- Interne: Changement gestion cas nouvelle zigate/échange de port. -- Interne: Lecture version zigate (bouton tester) améliorée. -- Mise-à-jour FW zigate: Effacement automatique PDM si passage 'legacy' vers 'OPDM'. -- Page gestion: Mise-à-jour remplacement de zigate suite Jeedom 2.4.X. -- Page zigate/avancé: Selection du canal/masque revue (1683). -- Interne: AbeilleCmd: setChannelMask => setZgChannelMask + améliorations. - -220211-BETA-1 -------------- - -- Profalux v2: Amélioration support. -- Auto-découverte équipement inconnu: Correction format json & améliorations. -- Lexman E27 RGB bulb: Ajout support préliminaire (2295). -- Heiman COSensor EF-3.0: Ajout support (2312). -- Suppression des repertoires vides au démarrage dans 'devices_local'. -- Erreur sur 'exclusion' d'équipement: Nouvelle correction (2305) -- Interne: SerialRead: Message corrompu (err CRC) n'est plus transmis au parser. -- Page équipements/migration: Revu & corrigé pour Jeedom 4.2.x (2322). - -220206-BETA-1 -------------- - -- Erreur sur 'exclusion' d'équipement: Correction (2305) -- Interne: AbeilleSerialRead: msg erreurs masqués (2306). -- Regression controle de 'level' (setLevel): Corrrection (1994). - -220204-BETA-1 -------------- - -- Interne: Correction erreur 'prepareCmd(): Mauvais format de message' (2302). -- Aucun équipement sélectionné: correction (2305). - -220202-BETA-1 -------------- - -- Page config: Changement mineur. Type 'WIFI' => 'WIFI/ETH'. -- Page config: Liste des ports revue + info 'Orange Pi Zero'. -- Aqara TVOC moniteur d'air AAQS-S01: Mise-à-jour modèle (2279). -- Assistant JSON: mise-à-jour. -- Modèle commande JSON: 'getPlugVAW' => 'poll-0B04-0505-0508-050B'. -- Interne: AbeilleCmd: Message debug & améliorations controle de flux envoie. -- Message d'erreur remonté à l'utilisateur si erreur dans log. -- Page gestion: Controle des groupes revu suite core 2.4.7 (2284). -- Legrand 20AX: Mise-à-jour modèle (2213). -- Interne: Correction AbeilleTools sendMessageToRuche(). -- Interne: SerialRead: Suppression mess d'err sur première trame corrompue. -- Mauvaise taille de modale parfois: correction (2177). - -220130-BETA-1 -------------- - -- LivarnoLux applique murale HG06701: Correction modèle (2256). -- Blitzwolf SHP15: Support preliminaire (2277). -- Assistant EQ/JSON: Update. -- Interne: AbeilleCmd: Correction priorité getActiveEndpoints. -- Interne: Parser: Interrogation de tous les EP pour support des eq qui s'identifient via un EP different du premier. -- Interne: Nettoyage config cmdes 'PollingOnCmdChange' & 'PollingOnCmdChangeDelay' lors mise-à-jour équipement. -- Interne: AbeilleCmd: Suppression 'Management_LQI_request' obsolete. -- Tuya 4 buttons (TS004F__TZ3000_xabckq1v): Mise-à-jour modèle (2155). -- Aqara TVOC moniteur d'air AAQS-S01: Mise-à-jour modèle (2279). -- Modeles commandes (JSON): modifications syntaxe - - - 'unite' obsolete => 'unit' - - 'generic_type' obsolete => 'genericType' - - 'trig' obsolete => 'trigOut' - - 'trigOffset' obsolete => 'trigOutOffset' -- Modèles équipements (JSON): améliorations - - - Surcharge possible de 'logicalId' - - Surcharge possible de 'trigOut' - - Surcharge possible de 'trigOutOffset' - - Surcharge possible de 'invertBinary' -- Interne: DB eqLogic, config, ab::trig ou trigOffset => ab::trigOut ou trigOutOffset. -- Xiaomi Aqara MCCGQ14LM (magnet.acn001): Correction modèle (2257). -- Interne: checkGpio() revu pour suppression faux message 'PiZigate inutilisable'. -- Page de config: Ajout bouton vers doc & doc préliminaire correspondante. -- Page de config: Bouton 'activer' renommé en 'libérer'. Trompeur. N'active pas la zigate. -- Xiaomi door: Correction etat inversé (regression 220110-BETA-1). -- Interne: CmdQueue: erreur si message trop gros dans queue 'ParserToCmdAck'. -- Interne: AbeilleCmd: Correction regression suite mise-à-jour 'setLevel'. -- Tuya GU10 color bulb (TS0505B__TZ3210_it1u8ahz): Ajout support (2280). - -220123-BETA-1 -------------- - -- Gledopto GU10 buld GL-S-007Z: Ajout support préliminaire (2270). -- Interne: AbeilleCmd: SimpleDescriptorRequest => getSimpleDescriptor. -- Page EQ/avancé: Ajout support 'Simple descriptor request'. -- Interne: AbeilleCmd: IEEE_Address_request => getIeeeAddress. -- Equipement sur secteur en time-out: Correction. -- Interne: Correction msg debug 'IEEE addr mismatch' au démarrage. -- Orvibo CM10ZW: Support signature alternative (2275). -- Interne: AbeilleCmd: Correction pour espace dans valeur slider. -- Interne: AbeilleCmd: Suppression prepare 'setLevel'. - -220122-BETA-1 -------------- - -- Interne: format message queues vers AbeilleCmd modifié. -- Interne: Fusion de plusieurs queues vers AbeilleCmd. -- Erreur getLevel/getEtat inattendue: Correction (2239). -- Xiaomi Aqara MCCGQ14LM (magnet.acn001): Correction modèle (2257). -- Interne: Parser vers Abeille. Attributs groupés pour optimisation. -- Interne: Qq améliorations page EQ/avancé/Zigate. -- Page de config: Amélioration messages mise-à-jour FW. -- Page support/infos clefs: Affichage revu. -- Interne: Parser: Optimisations & nettoyage. -- Interne: Queues revues. -- Page EQ/avancé: possibilité de télécharger discovery 'automatique'. -- Interne: Abeille.class: Vérification de l'état des queues amélioré. -- Xiaomi H1 double rocker: Mise-à-jour modèle + image (2253). -- Interne: Abeille.class: Suppression interrogateUnknowNE(). -- Page EQ/avancé: Correction regression bouton "Réinitialiser". -- Page EQ/avancé: Réinit 'defaultUnknown' si modèle officiel existe. -- Interne: Commande 'setColor' (cluster 0300) revue. - -220114-BETA-1 -------------- - -- Interne: Ajout support cmd 00/Setpoint, cluster 0201/thermostat. -- Acova Alcantara: Mise à jour modele pour controle temp (2180). -- 'Graph' visible seulement en mode dev. -- Interne: Gestion des queues: log & suppression msg trop gros. A completer. -- Interne: Gestion des queues en cas de msg trop gros. - -220113-BETA-1 -------------- - -- Xiaomi Aqara wall switch D1 (switch.b1nacn02): Mise-à-jour modèle (2262). -- Profalux Zoe: Identifiant 'TG1' = 'TS' (1066). -- Réseau/bruit: fonctionalité masquée sauf mode dev. -- Interne: Parser: 8401/IAS zone status change revisité. -- RH3040 PIR sensor: Mise-à-jour modèle (2252). -- Gledopto GL-SD-001 AC dimmer: Ajout support (2258). -- Tuya télécommande 4 boutons (TS0044): Ajout support (2251). - -220110-BETA-1 -------------- - -- Interne: Début refonte/nettoyage AbeilleCmd pour amélioration controle de flux. -- Interne: Parser: Support nPDU/aPDU sur messages 8000/8012 & 8702 (FW>=3.1e). -- Interne: Cmd: Ajout support optionnel 'manufId' pour 'writeAttribute'. -- Page EQ/avancé: Ecriture attribut améliorée. Ajout support 'direction' & 'manufId'. -- Xiaomi H1 double rocker: Ajout support (2253). -- JSON équipements: Nettoyage commandes obsolètes - - - 'etat' => 'zb-0006-OnOff' - - 'etatCharge0' => 'zb-0006-OnOff' + 'ep=01' - - 'etatCharge1' => 'zb-0006-OnOff' + 'ep=02' - - 'etatCharge2' => 'zb-0006-OnOff' + 'ep=03' - - 'etatCharge6' => 'zb-0006-OnOff' + 'ep=07' - - Ajout surcharge de 'genericType' - - 'etatInter0' => 'zb-0006-OnOff' + 'ep=01' - - 'etatInter1' => 'zb-0006-OnOff' + 'ep=02' - - 'etatInter2' => 'zb-0006-OnOff' + 'ep=03' - - 'etatDoor' => 'zb-0006-OnOff' -- TRADFRIbulbE14WScandleopal470lm LED1949C5: Mise-à-jour modèle (2250). -- Interne: AbeilleCmd: Suppression prepare readReportingConfig() + getBindingTable(). -- Package support: ajout du log 'update'. -- LivarnoLux applique murale HG06701, TS0505A, _TZ3000_5bsf8vaj: Ajout support preliminaire (2256). -- Assistant modèle JSON: Améliorations. -- Interne: Abeille.class: Nettoyage fonctionalités obsolètes. -- Xiaomi Aqara MCCGQ14LM (magnet.acn001): Ajout support préliminaire (2257). -- Lidl HG07878A TS0502A: Correction modèle (2198). -- Interne: Suppression des cmdes Ruche obsolètes au démarrage des démons. -- QS-zigbee-C01 nouvelle version: ajout support (2260). -- Xiaomi Aqara wall switch (switch.b1nacn02): Ajout support (2262). - -220108-STABLE-1 ---------------- - -- Tuya TV02: Ajout image (2175). -- JSON équipements: Correction support params optionnels. -- TRADFRIbulbE14WScandleopal470lm LED1949C5: Ajout support (2250). -- Tuya RH3040 PIR: Ajout support (2252). -- ZBMini: Ajout polling toutes les 15mins pour vérifier toujours en vie. -- Sixwgh WH025/TS011F__TZ3000_cphmq0q7: Ajout polling 0006 + 0702 (2211). -- Interne: Gestion 'PollingOnCmdChange' revue. -- Interne + page EQ/avancé: Ajout support writeAttribute via cmd 0530. -- Page de config: Affichage version connue du firmware. -- Page EQ/avancé: Affichage version complète FW (ex: 0004-0320). - -211214-BETA-3 -------------- - -- dOOwifi DWF-0205ZB-PN-2: Ajout PNG (2241). -- JSON équipements: Nettoyage commandes obsolètes - - - 'spiritSetReportBatterie' => 'zbConfigureReporting' + 'clustId=0001&attrType=20&attrId=0021' - - 'setReportIlluminance' => 'zbConfigureReporting' + 'clustId=0400&attrType=21&attrId=0000' - - 'setReportTemperature' => 'zbConfigureReporting' + 'clustId=0402&attrType=29&attrId=0000' - - 'setReportOccupancy' => 'zbConfigureReporting' + 'clustId=0406&attrType=18&attrId=0000' -- QS-Zigbee-C01: Correction modele pour cmde 'Position'. -- Ajout support Module volet Roulant dOOwifi DWF-0205ZB-PN-2 (2241). -- Firmware: Ajout version 3.21 OPDM+legacy. Suppression versions antérieures à 3.1d. -- Xiaomi Aqara QBKG26LM: Mise-à-jour modèle (2174). - -211210-BETA-1 -------------- - -- Réseau Abeille/routes: Correction erreur si équipement sans parent. -- Support: Mise-à-jour infos clefs. -- JSON équipements - - - Fin de support noms obsoletes: nameJeedom/Categorie/icone/battery_type/Commandes. - - Support surcharge de parametres optionnels. - -211209-BETA-1 -------------- - -- Interne: Création/mise-à-jour ruche revue. -- Interne: Suppression mode 'hybride' forcé. -- Message si FW plus vieux que 3.1D (nécessaire pour certains équipements). - -211208-BETA-2 -------------- - -- Ruche: page équipement/avancé: Correction regression bouton 'setMode'. -- SPLZB-131: RMSVoltage, reporting si variation >= 2V (2109). -- Xiaomi Aqara SSM-U01: Ajout support 'ActivePower' (2234). -- JSON équipements: Nettoyage commandes obsolètes - - - 'setReportBatterie' => 'zbConfigureReporting' + 'clustId=0001&attrType=20&attrId=0021' - - 'setReportBatterieVolt' => 'zbConfigureReporting' + 'clustId=0001&attrType=20&attrId=0020' - - 'setReportEtat' => 'zbConfigureReporting' + 'clustId=0006&attrType=10&attrId=0000' - - 'setReportLevel' => 'zbConfigureReporting' + 'clustId=0008&attrType=10&attrId=0000' - - 'setReportCurrent_Position_Lift_Percentage' => 'zbConfigureReporting' + 'clustId=0102&attrType=10&attrId=0008' - - 'setReportHumidity' => 'zbConfigureReporting' + 'clustId=0405&attrType=20&attrId=0000' -- Récupération équipements fantomes (toujours sur le réseau mais plus dans Jeedom): Améliorations. - -211208-BETA-1 -------------- - -- Interne: AbeilleDebug.log déplacé dans répertoire temporaire Jeedom. -- Support: Generation infos clefs pour support à la création du package. -- Identification équipement: Interrogation EP01 en plus du premier. -- Sonoff S26R2ZB: Ajout support (2221). - -211207-BETA-3 -------------- - -- Acova Alcantara: Version temporaire 'Set-OccupiedHeatingPoint' (2180). -- Tuya/Sixwgh TS011F__TZ3000_cphmq0q7: Cluster 0B04 migré en polling (2211). - -211207-BETA-2 -------------- - -- Interne: Amélioration création ruche vs démarrage. Mode forcé en 'hybride' qq soit FW. -- Philips wall switch module/RDM001: Mise-à-jour modèle & support cluster FC00 (2185). -- JSON équipements: Nettoyage commandes obsolètes - - - 'BindToPowerConfig' => 'zbBindToZigate' + 'clustId=0001' - - 'BindToZigateTemperature' => 'zbBindToZigate' + 'clustId=0402' - - 'BindToZigateRadiateur' => 'zbBindToZigate' + 'clustId=0201' - - 'BindToZigateEtatLegrand' => 'zbBindToZigate' + 'clustId=FC41' - - 'BindToZigatePuissanceLegrand' => 'zbBindToZigate' + 'clustId=0B04' - - 'BindToZigateLightColor' => 'zbBindToZigate' + 'clustId=0300' - - 'BindToZigateOccupancy' => 'zbBindToZigate' + 'clustId=0406' - - 'BindToZigateCurrent_Position_Lift_Percentage' => 'zbBindToZigate' + 'clustId=0102' - - 'BindShortToSmokeHeiman' => 'zbBindToZigate' + 'clustId=0500' - - 'BindShortToZigateBatterie' => 'zbBindToZigate' + 'clustId=0001' -- Interne: AbeilleCmd: Traitement status 8000 groupé + ... -- Xiaomi Aqara SSM-U01: Ajout support (2227). -- Interne: AbeilleCmd: Ajout support cmd 0201/Thermostat. -- Interne: AbeilleCmd: writeAttribute(): Correction direction. -- Interne: Parser: Requetes lecture attributs groupées lors d'une annonce. -- Effacement PDM: Correction regression interne. - -211205-BETA-1 -------------- - -- Orvibo ST30: Mise-à-jour modèle + icone (2193). -- Tuya/Sixwgh TS011F__TZ3000_cphmq0q7: Mise-à-jour modèle + icone (2211). -- Récupération équipements fantomes (toujours sur le réseau mais plus dans Jeedom): Mise-à-jour -- Aqara Smart Wall Switch H1 EU (No Neutral, Double Rocker) (WS-EUK02): Support préliminaire (2224). - -211205-STABLE-1 ---------------- - -- Page EQ/avancé: Ajout bouton reset SW zigate (2176). -- Appairage équipement: correction regression. - -211202-BETA-1 -------------- - -- Récupération équipements fantomes (toujours sur le réseau mais plus dans Jeedom): Partiel. -- Tuya/Sixwgh TS011F__TZ3000_cphmq0q7: Ajout support (2211). -- Page EQ/avancé: Ajout bouton récupération adresse IEEE. -- Message si mode debug et moins de 5000 lignes de log. - -211130-BETA-2 -------------- - -- Dimmer-Switch-ZB3.0_HZC: Mise-à-jour reporting CurrentLevel (2200). -- Philips wall switch module/RDM001: Mise-à-jour modèle (2185). -- Zigate WIFI: Amélioration serial read pour meilleur support coupures de connexion. -- Interne: AbeilleCmd: Nouveau support #slider# appliqué à 'writeAttibute'. - -211129-BETA-2 -------------- - -- Interne: Zigbee const: Ajout cluster 0406. -- Dimmer-Switch-ZB3.0_HZC: Ajout image PNG (2200). -- Interne: Zigbee const: Mise à jour attributs cluster 0300. -- Livarno HG07834C E27 bulb: Ajout support préliminaire (2203). -- Profalux MAI-ZTS: Ajout support telecommande gen 2 (2205). -- Profalux volets 2nd gen: Meme config pour MOT-C1Z06C & MOT-C1Z10C. -- JSON équipements: Nettoyage commandes obsolètes - - - 'xxxxK' => 'zbCmd-0300-MoveToColorTemp' - - 'dateCode' => cmde supprimée - - 'BasicApplicationVersion' => cmde supprimée - - 'Rouge' => 'zbCmd-0300-MoveToColor' - - 'Blanc' => 'zbCmd-0300-MoveToColor' - - 'Bleu' => 'zbCmd-0300-MoveToColor' - - 'Vert' => 'zbCmd-0300-MoveToColor' - -211126-BETA-2 -------------- - -- Interne: Améliorations assistant JSON. -- JSON équipements: Nettoyage commandes obsoletes - - - 'colorX' => 'zb-0300-CurrentX' - - 'colorY' => 'zb-0300-CurrentY' - - 'location' => cmde supprimée - - 'Get-ColorX' => 'zbReadAttribute' + 'clustId=0300&attrId=0003' - - 'Get-ColorY' => 'zbReadAttribute' + 'clustId=0300&attrId=0004' - - 'Level' => 'zb-0008-CurrentLevel' -- Interne: Parser: Data type 30/enum8 décodé comme nombre au lieu de string hex. -- Port interne Zigate Wifi déplacé de /dev/zigateX => /tmp/zigateWifiX pour contourner pb de "read-only file system". - -211125-BETA-1 -------------- - -- Assistant de découverte: Texte de rappel si batterie. -- Tuya RH3001 door sensor: Mise-à-jour JSON (1226). -- Lidl HG07878A TS0502A: Ajout support préliminaire (2198). -- JSON équipements: Nettoyage commandes obsoletes - - - 'BindToZigateEtat' => 'zbBindToZigate' - - 'BindToZigateLevel' => 'zbBindToZigate' - - 'BindToZigateButton' => 'zbBindToZigate' - - 'BindToZigateIlluminance' => 'zbBindToZigate' - - 'levelLight' => 'zb-0008-CurrentLevel' - - 'getLevel' => 'zbReadAttribute' + 'clustId=0008&attrId=0000' -- Démarrage sans Zigate active: Ajout message + démarrage démons annulé. -- Page de config: Zigate Wifi: Correction message 'Port série de la zigate X INVALIDE ! Zigate désactivée'. -- Tuya TS0501B Led controller: Ajout support préliminaire (2199). -- Dimmer-Switch-ZB3.0_HZC: Support préliminaire (2200). - -211122-BETA-1 -------------- - -- Illuminance: Correction cmde JSON 'zb-0400-MeasuredValue.json'. -- Mise-à-jour OTA: Support préliminaire. -- zb-0400/0402/0405-MeasuredValue.json: Correction calcul valeur. -- Philips Hue Wall switch: Ajout support préliminaire (2185). -- Equipements inconnus: Generation d'un "discovery.json" pendant l'inclusion. Suppression d'AbeilleDiscover.log. -- Programmateur Zigate: Correction: Compilation echoue si "tmp" n'existe pas. -- Orvibo ST30: Ajout support préliminaire (2193). -- Acova Alcantara: Mise-à-jour JSON pour 'Set-OccupiedHeatingPoint' (2180). -- JSON équipements: Nettoyage commandes obsoletes - - - 'temperature' => 'zb-0402-MeasuredValue' - - 'bindToZigate' => 'zbBindToZigate' - - 'luminositeXiaomi' => 'zb-0400-MeasuredValue' - - 'getEtat' => 'zbReadAttribute' - - 'humidite' => 'zb-0405-MeasuredValue' - - 'on' => 'zbCmd-0006-On' - - 'off' => 'zbCmd-0006-Off' -- JSON équipements: Ajout possibilité de surcharger 'minValue' & 'maxValue' pour widget slider. -- 1 chan switch module (TS0011, _TZ3000_ji4araar): Ajout JSON sur base TS0011 (2196). - -211121-STABLE-1 ---------------- - -- Acova Alcantara: Ajout support préliminaire (2180). -- Interne: Nettoyage AbeilleZigateConst. -- Interne: Correction CmdPrepare/WriteAttributeRequestGeneric. Impacte Danfoss Ally (1881). -- Ikea bulb E27 White Spectre opal 1055lm: Ajout support (2187). -- Moes ZSS-ZK-THL-C: Ajout support (2191). - -211115-BETA-2 -------------- - -- Moniteur: Suppression message sur équipement inexistant (2186). -- Moniteur: Correction lancement démon. - -211115-BETA-1 -------------- - -- Page de config: Correction bug écriture impossible adresse Wifi. - -211107-BETA-1 -------------- - -- Page Abeilles: Fonctionalité 'scenes' cachée. Scénaris offrent l'équivalent. -- Identification modèles Tuya: Correction. -- Interne: AbeilleCmd, bind0030: Supression fonction prepare. -- Interne: AbeilleCmdPrepare: Correctif pour nmbre de params impair. -- Interne: getVersion => getZgVersion. -- JSON équipements: Amélioration syntaxe permettant de surcharger 'execAtCreationDelay'. -- Sonoff SNZB-02: JSON revu. 'TH01.json' supporte identifiants 'TH01' & '66666'. -- JSON équipements: Correction valeur minInterval & maxInterval (décimal => hexa). -- Page EQ/avancé: Support préliminaire cmds 41 & 42, cluster 1000/Commissioning. -- Silvercrest HG06106C light bulb: Ajout support (2050). -- Legrand 16AX: Mise-à-jour icone. - -211030-BETA-1 -------------- - -- Tuya ZM-CG205 door sensor: Mise-à-jour JSON. Ajout 'ZoneStatus' (2165). -- Interne: Parser: Support réponse cluster 000A/Time, attrib 0007 + ... -- Xiaomi Aqara QBKG26LM: Ajout support (2174). -- Interne: - - - setTimeServer => setZgTimeServer. - - getTimeServer => getZgTimeServer. - - zgSetMode => setZgMode. -- Prise connectée TS0121 _TZ3000_8nkb7mof: Mise-à-jour JSON (2167). -- Interne: Parser: - - - Msg 0006-FD, msgAbeille() supprimé. - - Msg 8030/bind response: revu. -- Tuya QS-Zigbee-C01 volet roulant: Correction image (2169). -- Identification modeles Tuya: modifié. Fabricant/vendeur obligatoire pour éviter de prendre mauvais JSON identifié par modèle seul. -- Silvercrest HG06337-FR: Mise-à-jour JSON pour groups & identify. - -211030-STABLE-2 ---------------- - -- JSON équipement: Amélioration syntaxe permettant de surcharger 'subType' ou 'unite'. -- Zlinky TIC: Diverses corrections dont lecture option tarifaire. -- Tuya repeteur zigbee RP280: Ajout support. -- Page de config - - - Options avancées: Nettoyage autorisé si test d'intégrité ok. - - Partie mise-à-jour (vérification) caché. Pas assez fiable. A revoir. - - Partie 'zigates' revue. -- Tuya ZM-CG205 door sensor: Mise-à-jour JSON (2165). -- Interne: Suppression entrée 'zigateNb' de la DB config. -- eWeLink ZB-SW01: Support préliminaire (2172). - -211022-BETA-1 -------------- - -- **ATTENTION**: Format DB interne modifié. Restaurer sauvegarde si besoin de revenir à une version antérieure. -- Interne: DB équipement: 'modeleJson' => 'ab::jsonId'. -- Interne: Suppression 'archives'. -- Page config: Affichage version firmware complète (ex: 0004-0320). -- Commandes JSON: Suppression 'zbWriteAttribute-Temp'. -- Interne: Parser vers cmd: queues revisitées. -- Silvercrest HG06337: Mise-à-jour JSON (2168). -- Assistant de découverte: Améliorations. -- Tuya QS-Zigbee-C01 volet roulant: Ajout support (2169). -- JSON commandes: Suppression commandes obsoletes 'OnEpXX' & 'OffEpXX'. -- Prise Tuya TS0121__TZ3000_rdtixbnu: Correction RMS Voltage. -- Interne: 'configureReporting' revu pour support 'reportableChange'. -- Page EQ/avancé: Amélioration configureReporting pour support min, max & changeVal. -- Prise NIKO: JSON revisité pour réduire le nombre de reporting RMSvoltage (2003). -- Prise TS0121 _TZ3000_8nkb7mof: Mise-à-jour JSON (2167). - -211019-BETA-1 -------------- - -- JSON commandes: Nettoyage. Suppression commandes obsolètes. -- Interne: decodeDataType(): ajout support enum8/enum16 + ieee. -- Interne: Parser: Support read attributes clusters 0015 & 0100. -- Tuya ZM-CG205 door sensor: Ajout support (2165). -- Test d'intégrité et nettoyage automatique à la mise-à-jour. - -211019-STABLE-1 ---------------- - -- Interne: Correction 'writeAttribute' + mise-à-jour reponse 8110. -- Tuya 4 buttons (TS004F__TZ3000_xabckq1v): Mise-à-jour support (2155). -- Commandes JSON: Suppression 'binToZigate-EPXX-0006' => obsolètes. -- JSON équipements: Ajout support multiple identifiants (ex: 'signalrepeater' & 'SignalRepeater'). -- UseeLink prise SM-SO306: Mise-à-jour (2160). -- Zigate: plusieurs commandes supprimées => supportées dans page équipement/avancé. -- Interne: Parser: Améliorations decodeDataType(). -- UseeLink prise SM-SO306: Ajout support (2160). -- Syntaxe JSON équipement: Ajout possibilité surcharge 'template'. -- Zlinky TIC: Mise-à-jour JSON + icone. -- Niko connected socket outlet: Mise-à-jour image. -- Page EQ/avancé: Ajout possibilité de configurer le reporting. -- Interne: Parser: Support 'configure reporting response' pour 0B04. -- TRADFRI bulb GU10 CWS 345lm: Correction icone E14 => GU10 (2137). -- Ikea Tradfri LED 470lm E14: Mise-à-jour config JSON (2111). -- Tuya 4 boutons: Mise-à-jour (2155). -- Interne: AbeilleCmd: Correction bin0030 vers groupe. -- SPLZB-131: Mise-à-jour JSON. Reporting activé. (2109). -- Page EQ/avancé: Ajout possibilité d'écrire un attribut. -- Interne: AbeilleCmd: Message d'erreur si pb lecture queues. -- Interne: Commandes JSON 'getEtatEpXX' deviennent obsoletes. -- Page EQ/avancé: correction bouton 'reconfiguer' + amélioration message. -- Interne: Zigbee const: corrections pour éviter warning PHP. -- Page équipements: Suppression zone developpeur (bas de page). -- Page EQ/avancé: Ajout interrogation des 'Active end points'. -- Interne: Parser: decodeDataType() revu pour types 41 & 42. -- Interne: Procedure d'inclusion avec support "cas speciaux". -- Suppression log obsolete AbeilleParser (sans '.log') lors de la mise-à-jour/installation. -- Page équipement: Message si équipement à disparu depuis l'ouverture de la page. -- Interne: Parser: Support remontée commandes du cluster 0300 en provenance d'un équipement. -- Osram smart switch mini: Mise-à-jour. Ne supporte que le controle vers Jeedom. - -211004-STABLE-1 ---------------- - -- Correction mauvaise config lors de l'inclusion si #IEEE# ou #ZigateIEEE# utilisé. -- Page santé: correction IEEE manquante pour Ruche. -- Inclusion: Correction pour vieux équipements type Xiaomi (ne repond pas à lecture attribut manufacturer). -- Interne: Identification périph revisitée. -- Assistant Zigbee: Correction & amélioration. -- Interne: Modification astuce identification vieux modeles Xiaomi basé sur IEEE. Non compatible ZLinky. -- Correction regression 'setModeHybride' + mise-à-jour commande interne. -- Assistant Zigbee: Ajout forcage EP01. -- Commandes JSON: nettoyage. -- Assistant Zigbee: Améliorations: ajout découverte etendue des attributs. -- ZLinky TIC: Support préliminaire. -- Interne: Parser: Nettoyage. -- Aqara SSM-U02: Correction icone. -- Xiaomi Mijia Honeywell Détecteur de Fumée: Tentative correction bouton test (2143). -- Ruban LED Lidl: Mise à jour JSON (1737). -- TRADFRIbulbGU10CWS345lm: Mise a jour (2137). -- Interne: Correction erreur PHP: Undefined index: battery_type in AbeilleLQI_Map.php -- Interne: Correction crash inclusion dans cas ou "value" pointe sur commande inexistante. -- Xiaomi smoke detector: bouton test genere crash d'AbeilleCmd (2143). -- Aqara TVOC moniteur d'air AAQS-S01: Support préliminaire (2135). - -210922-STABLE-1 ---------------- - -- Interne: Correction requete "discover attributes extended". -- Loratap 3 boutons: Correction regression (2138). -- Interne: Restoration support historique cmd 0006-FD special Tuya. -- TRADFRIbulbGU10CWS345lm support preliminaire. -- TRADFRIbulbE14CWS470lm support preliminaire. -- SPLZB-132: Correction EP. -- SPLZB-131: Correction RMSVoltage (2109). -- Interne: Tools: check_json amélioré. -- Interne: Parser: Support prélim data type 41, 42, E0, E1, E2. -- Suppression des messages de "réannonce" si équipement connu et activé. - Attention. Si l'équipement quitte (leave) puis revient, le message est toujours présent. -- Legrand dimmer: Mise à jour JSON (983). -- Monitor: Correction bug (Device announce loupé). -- JSON équipements: Mise-à-jour setReport-EPxx => zbConfigureReporting. -- JSON équipements: Nettoyage setReport-EPxx => zbConfigureReporting. -- Assistant de découverte: améliorations et mise à jour doc. -- Interne: Parser: Amélioration pour découverte cluster 0005/Scenes. -- Interne: Correction warning pour "bind to group". -- Page EQ/avancé: ajout bouton "reset to factory". -- Interne: AbeilleCmdPrepare + Process updates. -- JSON équipements: Mise à jour des commandes du type 'toggle'. -- Page EQ/avancé: ajout possibilité de faire un "bind" vers équipement ou groupe. -- Parser: Correction table de binding. - -210916-STABLE-1 ---------------- - -- JSON commandes: 'trig' revu + 'trigOffset' ajouté. -- Niko connected socket: ajout support (2003). -- JSON commandes: suppression de qq cmds obsoletes. -- Interne: Optimisation parser: transfert groupé d'attributs. -- Interne: Link-Quality mis à jour sur attribut report. -- JSON équipements: Mise-à-jour commandes pourcentage batterie. -- Tuya inter 4 buttons: mise-à-jour support 'click' (2122). -- Interne: Améliorations parser + robustesse. -- Correction regression: crash pendant l'inclusion (2125). -- Zemismart TS0042 2 buttons (1272). -- Interne: Parser: Modificaiton support custom single/double/long click pour Tuya. -- Tuya 4 buttons scene switch: Mise-à-jour modèle (2122). -- Ajout FW 3.1e Optimized PDM + 3.20 legacy + 3.20 Optimized PDM -- Osram CLA60 TW: Correction end point par défaut (2117). -- Tuya contact sensor TS0203: Ajout reporting batterie (1270). -- Tuya 4 buttons scene switch: Ajout support (2122). -- Correction mauvais message: "ATTENTION: config locale utilisée ...". -- Interne: Améliorations parser. - -210905-STABLE-1 ---------------- - -- Améliorations assistant EQ. -- Interne: Séquence de démarrage revisitée pour #2093. -- Améliorations assistant EQ. -- Interne: SerialRead, mise-à-jour pour "permission denied". -- Frient SPLZB-131: Support préliminaire. -- Legrand Cable outlet: Ajout support préliminaire (850). Manque controle fil pilote. -- All JSON: 'configuration:battery_type' => 'configuration:batteryType'. -- Assistant: Ajout doc préliminaire pour découverte Zigbee. -- Interne: Séquence de démarrage revisitée pour #2093. -- Page config/options avancées: possibilité de bloquer requetes LQI journalieres. -- Assistant de découverte: améliorations. -- Interne: Collecte LQI: Mise-à-jour mineure. -- Interne: Parser: Amélioration robustesse. -- Ajout support Controleur Tuya LED DC5-24V (2082). -- Ajout Ampoule YANDHI E27 (2087) -- JSON équipements: tous modifiés - - SW & getSWBuild => SWBuildID & Get-SWBuildID -- Interne: Ajout commande générique 'configureReporting'. -- Page gestion: Bouton 'exclure' pour tous. -- JSON commandes: suppression de commandes obsolètes. -- GL-S-003Z: Fichier JSON. Correction end point + divers (2104). -- Page EQ/avancé: ajout possibilité interroger LQI (Mgmt_Lqi_req). - -210824-STABLE-1 ---------------- - -- Xiaomi plug EU: JSON revisité (1578). -- Interne: SerialRead: Ouverture de port améliorée. -- Silvercrest HG06337-FR: Ajout prise Lidl (2053). -- JSON équipements: amélioration nouvelle syntaxe (ajout 'isVisible' & 'nextLine'). -- Page EQ/avancé: mise-à-jour de l'assistant de découverte. -- Page config/options avancées: Support defines. -- Commande JSON 'temperatureLight': correction EP. -- Aqara Opple 6 boutons (2048). -- JSON équipements: tous mis à jour. - - 'Categorie' remplacé par 'category'. - - 'nameJeedom' remplacé par 'type'. - - 'configuration:icone' remplacé par 'configuration:icon'. - - mainEP #EP# remplacé par '01'. - - 'uniqId' supprimé. - - 'Commandes' => 'commands' -- Profalux: Ajout support nouvelle génération volet (id=MOT-C1Z06C/10C, #2091). -- Aqara WS-EUK01 H1 wall switch: ajout support préliminaire (2054). -- Interne: optimisations AbeilleCmdQueue. -- Page santé: ajout dernier niveau batterie. -- Gledopto GL-B-008Z: Correction main EP dans modèle JSON (2096). -- Gledopto GL-C-006: Modèle préliminaire (2092). -- Interne: Taille queue parser->LQI augmentée à 2048. -- Interne: Nettoyage: suppression queue obsolete 'queueKeyLQIToAbeille'. -- Interne: cron15: Lecture ZCLVersion au lieu d'un attribut pas toujours supporté. -- Page EQ/avancé: ajout bouton lecture attribut. -- Interne: tools: Amélioration check_json + update_json -- Modèle JSON telecommande profalux: correction syntaxe type batterie. -- Collecte LQI: Correctif parser pour routeur avec plus de 10 childs. -- Interne: Nettoyage: suppression fichier obsolète 'function.php'. -- JSON: Correction nom 'Konke multi-function button' pour id 3AFE170100510001. -- Ajout support 'Konke multi-function button' avec id 3AFE280100510001. - -210719-STABLE-1 ---------------- - -- ATTENTION: Format JSON des fichiers de commande modifié ! -- Osram classic B40TW: support préliminaire. -- Xiaomi Luminosite: Ajout pourcentage batterie basé sur retour tension (1166). -- Interne: cron15 amélioré. Pas d'interrogation si eq appartient à zigate inactive. -- Inclusion: support revu pour périph qui quitte puis revient sur le réseau. -- Moniteur: Disponible pour tous et plus seulement en mode dev. -- Firmware 3.1e disponible pour tous. -- JSON commandes: Mise-à-jour syntaxe fichier de commande - - 'order' supprimé (obsolète) - - 'uniqId' supprimé (obsolète) - - 'Type' renommé en 'type' - - Ajout 'topic' si manquant pour commandes 'info'. - - Correction clef top commandes 'info' (clef = nom de fichier). -- JSON équipements: Support préliminaire pour directive "use" - - Ex: "cmd_jeedom_name": { "use": "cmd_file_name", "params": "EP=01" } -- Page EQ/avancé: ajout du bouton "reconfigurer". -- Page gestion: suppression du bouton "Apply Settings to NE". -- Page EQ/avancé: version préliminaire de l'assistant de découverte. -- Correction ecrasement widget commande (2075). -- Interne: plusieurs améliorations pour robustesse et support d'erreurs. -- Page EQ/avancé: Ajout bouton "interroger table routage" -- Page EQ/avancé: Ajout bouton "interroger table binding" -- Page EQ/avancé: Ajout bouton "interroger config reporting" -- JSON: Syntaxe commandes modifiée. Type 'execAtCreationDelay' changé en 'nombre' et non plus 'string'. - Devrait corriger le pb de config de certains equipements à l'inclusion. -- Correction perte categorie & icone si equipement se réannonce. -- Correction perte état historisation & affichage des commandes si equipement se réannonce. -- Correction mise-à-jour commandes IEEE-Addr, Short-Addr & Power-Source sur réannonce. -- Page santé: Ajout "dernier LQI" à la place de "Date de création". -- Interne: Meilleur support des JSON avec mainEP=#EP#. - -210704-STABLE-1 ---------------- - -- Modifications syntaxe JSON équipement (avec support rétroactif temporaire): - - 'commands' au lieu de 'Commandes'. - - 'category' au lieu de 'Categorie' - - 'icon' au lieu de 'icone' - - 'batteryType' au lieu de 'battery_type' -- Support JSON equipement: correction pour support multiple categories. -- Page EQ/avancé: recharger JSON accessible à tous. -- Page EQ: type de batterie déplacé vers principale. -- Interne: plusieurs améliorations de robustesse. -- Interne: Parser: Support des messages longs. -- Zigate WIFI: Correction & amélioration arret/démarrage démon. -- Equipement/categories: correction. Effacement categorie résiduelle. -- Trafri motion sensor: Mise-à-jour JSON pour controle de groupe. -- Gestion des démons: correctif sur arret forcé (kill). -- Interne: Parser: affichage erreurs msg_receive(). -- Interne: SerialRead: affichage erreur msg_send(). -- Interne: Serial to parser: Messages trop grands ignores pour ne plus bloquer la pile + message d'erreur. -- Batterie %: Parser renvoi valeur correcte pour 0001-EPX-0021 + Abeille.class + update JSON (2056). - Peut nécessiter de recharger JSON. -- Batterie %: Report dans Jeedom de tous les "end points" et pas seulement 01. - -210620-STABLE-1 ---------------- - -- SPLZB-132: Correction icone + ajout somme conso. -- Correction remontée cluster 0B04 (mauvais EP). -- Orvibo CM10ZW multi functional relay: mise-à-jour icone. -- Nettoyage de vieux fichiers log au démarrage. -- Socat: Amélioration pour avoir les messages d'erreur. -- Interne: Restauration option avancées de récupération des équipements inconnus. -- Xiaomi v1: Correction regression inclusion. Trick ajouté pour Xiaomi. -- Orvibo CM10ZW multi functional relay: support préliminaire. -- Page santé: Correction mauvais affichage du status des zigates. -- Page equipement/avancé: Possibilité de recharger dernier JSON (et mettre à jour les commandes) sans refaire d'inclusion. -- Interne: Suppression AbeilleDev.js (mergé dans Abeille.js). -- Page équipement: Correction rapport d'aspect image (icone). -- Interne: Parser: Support msg 9999/extended error. -- Interne: Parser: Qq améliorations découverte nouvel équipement. -- Interne: SerialRead: Boucle et attend si port disparait au lieu de quitter (2040). -- Page gestion: Correction regression groupes. - -210610-STABLE-3 ---------------- - -- Philips E27 single filament bulb: Ajout modele LWA004 -- Interne: Correction ReadAttributRequest multi attributs -- Interne: Correction 'zgGetZCLStatus()' -- Frient SPLZB-132 Smart Plug Mini: Ajout support préliminaire. -- Interne: Correction eqLogic/configuration. Suppression des champs obsolètes lors de la mise-à-jour de l'équipement. -- Tuya 4 buttons light switch (ESW-0ZAA-EU): support préliminaire (1991). -- Tuya smart socket: Ajout support modele générique 'TS0121__TZ3000_rdtixbnu'. -- Telecommande virtuelle: Correction regression. Plusieurs télécommandes par zigate à nouveau possible (2025). -- Lancement de dépendances: correction erreur (2026). -- Exclusion d'un équipement du réseau: En mode dev uniquement. Nouvelle version. -- Zigate wifi: correction regression. - -210607-STABLE-1 ---------------- - -- ATTENTION: Regression sur les telecommandes virtuelles. Une seule possible avec cette version. -- ATTENTION: Faire un backup pour pouvoir revenir à la precedente "stable". Structure DB eqLogic modifiée: "Ruche" remplacé par "0000" -- Interne: Parser: revue params decodeX() + cleanup -- Zemismart ZW-EC-01 curtain switch: mise-à-jour modèle. -- Interne: Correction timeout. -- Reinclusion: L'equipement et ses commandes sont mis à jour. Seules les commandes obsolètes sont détruites. - Ca permet de ne plus casser le chemin des scénaris et autres utilisateurs des commandes. -- Firmware: Suppression des FW 3.0f, 3.1a & 3.1b. 3.1d = FW suggéré. -- JennicModuleProgrammer: Mise-à-jour v0.7 + améliorations. Compilé avant utilisation. -- Zigate DIN: Ajout support pour mise-à-jour FW. -- Page equipement: section "avancé", mise à jour des champs en temps réel (1839). -- Gestion des groupes: correction regression (2011). -- Telecommande virtuelle: correction regression (2011). -- Interne: Revue decode 8062 (Group membership). -- JSON: Correction setReportTemp (1918). -- Innr RB285C: correction modele corrompu. -- Innr RB165: modele préliminaire. -- Tuya GU10 ZB-CL01: ajout support. -- Hue motion sensor: mise-à-jour JSON. -- Interne: correction message 8120. -- Page config: correction installation WiringPi (1979). -- Introduction de "core/config/devices_local" pour les EQ non supportés par Abeille mais locaux/en cours de dev. -- Zemismart ZW-EC-01 curtain switch: ajout du modèle JSON -- Nouvelle procédure d'inclusion. -- Support des EQ avec identifiants 'communs'. -- Création du log 'AbeilleDiscover.log' si inclusion d'un équipement inconnu. -- Profalux volet: Revue modele JSON. Utilisation cluster 0008 au lieu de 0006 + report. -- Page EQ/commandes: pour mode developpeur, possibilité charger JSON. -- Ordre apparition des cmdes: Suit maintenant l'ordre d'utilisation dans JSON equipement. -- Un équipement peut maintenant être invisible par defaut ('"isVisible":0' dans le JSON). -- Profalux telecommande: S'annonce mais inutilisable côté Jeedom. Cachée à la création. - -210510-STABLE-1 ---------------- - -- Page compatibilité: revisitée + ajout du tri par colonne -- Page santé: ajout de l'état des zigate au top -- Sonoff SNZB-02: support corrigé + support 66666 (ModelIdentifier) (1911) -- Xiaomi GZCGQ01LM: ajout support tension batterie + online (1166) -- Page EQ/params: ajout de l'identifiant zigbee -- Correction "#1908: AbeilleCmd: Unknown command" -- Correction "#1951: pb affichage heure "Derniere comm." -- Correction blocage du parser dans certains cas de démarrage. -- Diverses modifications pour améliorer la robustesse et les messages d'erreurs. -- Monitor (pour developpeur seulement pour l'instant) -- Gestion des démons: revisitée pour éviter redémarrages concurrents. -- Correction "#1948: BSO, lift & tilt" -- JSON: Emplacement des commandes changé de "core/config/devices/Template" vers "core/config/commands" -- Innr RB285C support preliminaire - -11/12/2020 ----------- - -- Prise Xiaomi: fonctions de base dans le master (On/Off/Retour etat). En cours retour de W, Conso, V, A et T°. -- LQI collect revisited & enhanced #1526 -- Ajout du modale Template pour afficher des differences entre les Abeilles dans Jeedom et leur Modele. -- Ajout d un chapitre Update dans la page de configuration pour verifier que certaines contraintes sont satisfaites avant de faire la mise a jour. -- Ajout Télécommande 3 boutons Loratap #1406 -- Contactor 20AX Legrand : Pilotage sur ses fonctions ON/OFF et autre -- Prise Blitzwolf -- Detecteur de fumée HEIMAN HS1SA-E -- TRADFRIDriver30W IKEA - -Beta 24/11/2010 ---------------- - -Surtout faites un backup pour pouvoir revenir en arrière. - -- Premiere version Abeille qui prend en charge le firmware Zigate 3.1d. -- J'ai passé toutes mes zigates en 3.1D (Je ne vais plus tester les evolutions d'Abeille avec les anciennes versions du firmware). -- Essayez de passer sur le firmware 3.1D quand vous pourrez. Perso je vous recommande de faire un erase EEPROM lors de la mise à jour puis de faire un re-inclusion de tout les modules. Attention c'est une operation assez lourde. Assurez vous d'avoir l'adresse IEEE dans la page santé avant de faire cette operation. -- Dans la page de configuration il y a un nouveau paramètre: "Blocage traitement Annonces". Par défaut il doit être sur Non. Il semble qui ai une certaine tendance à ce mettre sur Oui. Mettez le bien sur Non et redémarrer le Démon. -- si vous restez avec une zigate en firmware inférieur à 3.1d, ne surtout pas passer la zigate en mode hybride. - -- Tous les details dans: -https://github.com/KiwiHC16/Abeille/commits/beta?after=61b027c84f673f484073d6f0a73ad0bad08fef0d+34&branch=beta - -12/2019 => 03/2020 ------------------- - -:: - - !!!! Le plugin a été testé avec 1 ou 5 Zigate dans le panneau de configuration !!!! - !!!! Avec d'autres valeur 2, 3, 4, 6... il est for possible que tout !!!! - !!!! ne fonctionne pas comme prévu. Si vous avez 2 zigate, mettez le nombre de !!!! - !!!! zigate à 5 et activer uniquement les zigates presentent. !!!! - -:: - - !!!! Ne pas faire ces manipulations sans avoir fait de backup !!!! - -Attention: cette nouvelle version apporte: - -* le multi-zigate -* la gestion de queue de message avec priorité -* quelques équipements supplémentaires -* corrections de bugs - -Mais comme les changements sont importants et que j'ai pas beaucoup de temps pour tester il peut y avoir des soucis. Donc faites bien une sauvegarde pour revenir en arrière si besoin. - -A noter: - -* La partie graphs n'a pas été complètement vérifiée et il reste des soucis -* les timers ne sont plus dans le Plugin -* un bug critique si vous faites l inclusion d'un type d equipement inconnu par Abeille, il faut redemarrer le demon. - - -06/2019 => 11/2019 ------------------- - -Rien de spécifique à faire. Juste a faire la mise à jour depuis jeedom. - -03/2019 => 06/2019 ------------------- - -Rien de spécifique à faire. - -02/2019 => 03/2019 ------------------- - -Rien de spécifique à faire. Pour les évolution voir le changelog ci dessous. - -01/2019 => 02/2019 ------------------- - -Cette version est en ligne avec le firmware 3.0f de la Zigate -Vous pouvez utiliser un firmware plus vieux mais tout ne fonctionnera pas. (98% fonctionnera) - -Comment procéder: - -* Mettre à jour le plugin Abeille -* Flasher la Zigate avec le firmware 3.0f (*bien faire un erase de l'EEPROM*) -* Connecter la Zigate et démarrer le deamon abeille -* démarrer le réseau Zigbee depuis abeille -* mettre la Zigate en inclusion -* inclure vos routeurs en partant des plus proches au plus lointain -* Vérifier que tout fonctionne -* Inclure les équipements sur piles (dans l'ordre que vous voulez) - -:: - - !!!! Ne pas faire ces manipulations sans avoir fait de backup !!!! - -11/2018 => 01/2019 ------------------- - -Cette mise à jour est importante et délicate. Pour facilité l'intégration de nouveaux équipements par la suite une standardisation des modèles doit être faite. -Cela veut dire que tous les modèles changent et que le objets dans Abeille/Jeedom doivent être mis à jour. -Prévoir du temps, avoir bien fait les backup, et prévoir d'avoir à faire quelques manipulations à la main. Les situations rencontrées vont dépendre de l'historique des équipements dans Jeedom. - -:: - - !!!! Ne pas faire ces manipulations sans avoir fait de backup !!!! - -Solution pour les petits systèmes - -* Cela suppose que vous aller effacer (objets, historiques,...) toutes les données puis re-créer le réseau. -* supprimer le plug in Abeille -* Installer le plug in Abeille depuis le market (ou github) -* Activer et faire la configuration du plugin -* Démarrer le plugin -* Mettre en mode inclusion -* Appairer les devices. - -Solution pour les gros systèmes - -Si la solution précédente demande trop de travail, on peut faire la mise à jour de la façon suivante. Attention, je ne peux pas tester toutes les combinaisons et des opérations supplémentaires seront certainement nécessaires. 90% aura été fait automatiquement. -Il n'y a pas de moyen infaillible pour faire la correspondance entre une commande dans un modèle et une commande dans Jeedom. Le lien est fait soit par le nom dans la commande nom ou quand pas disponible par le nom de l'image utilisée pour le device. De même pour les commande le nom est le moyen de faire le lien. Si vous avez fait des changements de nom, les commandes sortiront en erreur et cela demandera de mettre le nom de la commande dans le modèle le temps de la conversion. -Dans les versions suivantes, nous ne devrions plus avoir ce problème car les commandes auront un Id unique et spécifique. - -* Mettre à jour la plugin avec le market (ou github) -* Vérifier la configuration du plugin et démarrer le plugin en mode debug. -* Demander la mise à jour des objets depuis les templates, bouton: "Appliquer nouveaux modèles" -* 90% des objets devraient être à jour maintenant. -* Tester vos équipements. - -Si un équipement ne fonctionne pas, appliquer de nouveau la mise a jour sur cet équipements uniquement. Pour ce faire dans la page Plugin->Protocol Domotique->Abeille, sélectionnez le device et clic sur bouton: "Apply Template". Ensuite regarder le log "Abeille_updateConfig" pour avoir le détails des opérations faites et éventuellement voir ce qui n'est pas mis à jour. - -vous allez trouver des messages: - -* "parameter identical, no change" qui indique que rien n'a été fait sur ce paramètre (déjà à jour). -* "parameter is not in the template, no change" qui indique que le paramètre de l'objet n'est pas trouvé dans le template. Soit il n'est plus nécessaire et ne sera donc pas utilisé, soit vous l'avez changé et on le garde, soit Jeedom a défini une valeur par défaut et c'est très bien ... -* "Cmd Name: nom ===================================> not found in template" qui indique qu'on ne trouve pas le template pour la commande et que donc la commande n'est pas mise à jour. Ça doit être les 10% à gérer manuellement. Dans ce cas, soit effacer l'objet et le recréer soit me joindre sur le forum. - -Équipements qui sont passés sans soucis sur ma prod: - - * Door Sensor V2 Xiaomi - * Xiaomi Smoke - * Télécommande Ikea 5 boutons - * Xiaomi Présence V2 - * Xiaomi Bouton Carré V2 - * Xiaomi Température Carré - * ... - -Cas rencontrés: - -* plug xiaomi, une commande porte le nom "Manufacturer", doit être remplacé par "societe" et appliquer de nouveau "Apply Template" -* interrupteurs muraux Xiaomi: si la mise a jour ne se fait, il faut malheureusement, supprimer et recréer. -* door sensor xiaomi V2 / xiaomi presence V1: une commande porte le nom "Last", doit être remplacé par "Time-Time", et "Last Stamp" par "Time-Stamp" -* ... - -Secours - -* Si rien n'y fait, aucune des deux solutions précédentes ne résout le soucis, vous pouvez probablement exécuter la méthode suivante sur un équipement (je ne l'ai pas testée): -* supprimer la commande IEEE-Addr de votre objet. -* Zigate en mode inclusion et re-appairage de l'équipement -* un nouvel objet doit être créé. -* Transférer les commandes de l'ancien objet vers le nouveau avec le bouton "Remplacer cette commande par la commande" -* Transférer l'historique des commandes avec le bouton "Copier l'historique de cette commande sur une autre commande" -* Vous testez le nouvel équipement -* si ok vous pouvez supprimer l'ancien. - -2019-11-25 ----------- - -Ce dernières semaines le focus a été sur: -- Compatibilité avec Jeedom V4 et Buster (Debian 10) -- mise en place de la gestion des messages envoyés à la zigate avec creation de fil d'attente. -- Repetition d'un message vers la zigate si elle dit n'avoir pas réussi à le gérer -- Refonte de la détection de équipements lors de l inclusion -- Store et Télécommande Store Ikea -- Demarrage automatique du réseau Zigbee -- Iluminize Dimmable 511.201 -- Iluminize 511.202 -- Osram Smart+ Motion Sensor -- Télécommande OSRAM -- Ajout ampoules INNR RF263 et RF265 -- Corrections de bugs -- ..... - -2019-03-19 ----------- - -* Motion Hue Outdoor integration -* Doc Hue Motion -* Hue Motion Luminosite - -2019-03-18 ----------- - -* Plus de doc sur la radio -* Modification modele sur EP - -2019-03-17 ----------- - -* Resolution sur un systeme en espagnole - -2019-03-16 ----------- - -* start to track APS failures -* dependancy_info debut des modifications - -2019-03-15 ----------- - -* Moved all doc to asciidoc format -* Few correction around modele folder - -2019-03-11 ----------- - -* Ajout capteur IR Motion Hue Indoor - -2019-03-01 ----------- - -* Inclusion de la PiZiGate -* Possibilité de programmer le PiZiGate - -2019-02-27 ----------- - -* OSRAM SMART+ Outdoor Flex Multicolor -* Eurotronic Spirit - -2019-02-15 ----------- - -* Correction probleme volet profalux - - -2019-02-14 ----------- - -* Amelioration de la doc -* Inclusion dans appli web mobile - -2019-02-11 ----------- - -* Amelioration de la doc. -* Reduction log sur annonce -* Prise Xiaomi Encastrée - -2019-02-07 ----------- - -* Mise en place de la cagnotte -* Correction de l affichage des icones sur filtre -* Amélioration retour Tele Ikea - -2019-02-06 ----------- - -* Récupération des groupes dans la Zigate -* Configuration du groupe de la remote ikea On/off depuis abeille -* Formatting of Livolo Switch -* Groupe commande Chaleur ampoule -* GUI to set group to Zigate -* TxPower Command -* Channel setMask and setExtendedPANID added -* Télécommande Ikea Bouton information to Abeille -* Certification configuration -* Led On/Off - -2019-02-04 ----------- - -* Get Group Membership response modification avec source address for 3.0.f -* Fix Sur mise a jour des templates il manque la mise a jour des icônes -* OSRAM Spot LED dimmable connecté Smart+ - Culot GU5.3 -* Now default Zigbee object type could be used to create object in Abeille -* TRADFRIbulbE27WSopal1000lm -* MQTT loop improvement so Abeille should be more reactive -* nom du NE qui fait un Leave dans le message envoyé à la ruche -* Ampoule Hue Flame E14 -* Info move from Ruche to Config page -* A bit more decoding of Xiaomi Fields -* channel mak and ExtPAN setting -* Ajout du Switch Livolo 2 boutons -* Affichage Commande au démarrage -* ClassiA60WClear second modèle added -* setTimeServer / getTimeServer - -2019-01-25 ----------- - -* Ajout commande scene -* Deux petites vidéos pour les docs -* Ajout des scènes et groupes de scènes -* Ajout ampoule LWB004 -* Osram - flex led rgbw -* Osram - garden led rgbw -* GLEDOPTO Controller RGB+CCT -* Ajout de gestion du time server (cluster) - -2019-01-15 ----------- - -* retrait de pause pour avoir un plugin plus réactif -* LCT001 modèle ajouté -* LTW013 Philips Hue modèle ajouté -* Ajout modèle lightstripe philips hue plus modèle ajouté -* doc télécommande Hue -* Ajout LTW010 ampoule Hue White Spectre -* Ajout de la liste des Abeille ayant un groupe avec leur groupe -* LCT015 Bulb Added -* Add Address IEEE in health table - -2018-12-15 ----------- - -* Graph LQI par distance -* télécommande carré Ikea On/Off -* fix température carré xiaomi -* Télécommande Hue retour Boutons vers Abeille (scénario) - -2018-12-11 ----------- - -* Toute la doc sous le format Jeedom - -2018-12-10 ----------- - -* Ampoule Couleur Standard ZigBee -* Ampoule Dimmable Standard ZigBee - -2018-12-09 ----------- - -* Ampoule Spectre Blanc Standard ZigBee -* Blanche Ampoule GLEDOPTO GU10 Couleur/White GLEDOPTO avec hombridge -* Spectre Blanc Ampoule GLEDOPTO GU10 GL-S-004Z avec hombridge -* Retour des volets profalux en automatique -* Poll Automatique -* Ajout/Suppression/Get des groupes depuis l interface Abeille - -2018-12-08 ----------- - -* Couleur Ampoule GLEDOPTO GU10 Couleur/White GL-S-003Z avec hombridge - -2018-12-07 ----------- - -* Couleur Ampoule Ikea avec Homebridge -* Couleur Ampoule OSRAM avec Homebridge -* Couleur Ampoule Hue Go avec Homebridge - -2018-12-05 ----------- - -* Ajout d un paramètre Groupe dans la configuration des devices pour avoir la groupe a commander. Il n'est plus besoin de changer les commandes une à une. - -2018-12-04 ----------- - -* passage aux modèles standardisés (avec include) -* les modèles standardisés permettent de modifier les équipements dans Jeedom sans les effacer et donc sans perdre historique, scénarios associés,... -* ajout des boutons pour appliquer de nouveau les modèles de device -* introduction d'Id unique dans les template pour ne pas confondre les devices par la suite. - -2018-01-12 ----------- - -* Ampoule GLEDOPTO White intégrée - -2018-11-30 ----------- - -* Prise Ikea intégrée -* Ajout des groupes aux devices sélectionnés - -2018-11-26 ----------- - -* Ikea Transformer 30W intégré - -2018-11-24 ----------- - -* Correction TimeOut (en min) - -2018-11-16 ----------- - -* Activation/Désactivation d'un équipement suivant qu'il joint le réseau ou le quitte. -* Rafraichi les informations de la page Health à l'ouverture. - -2018-11-05 ----------- - -* Ajout OSRAM GU10 - -2018-06-14 ----------- - -* Ajout de la connectivité en Wifi. -* Ajout des LQI remontant des trames Zigate - -2018-06-12 ----------- - -* Ajout du double interrupteur mural sur pile xiaomi. -* Network modal (graph automatique du reseau) -* Ajout aqara Cube - -2018-06-11 ----------- - -* Stop for Volet Profalux =253 - -2018-06-01 ----------- - -* Profalux Volets Calibration - -2018-05-30 ----------- - -* Inclusion status dans le widget mis à jour en fonction de l’etat de la Zigate - -2018-05-28 ----------- - -* Ajout des equipements DIY - -2018-01-19 ----------- - -* first version posted on github -* inclus la création des objets IKEA Bulb et Xiaomi Plug, Température Carre/rond, bouton et InfraRouge diff --git a/resources/archives/essai.json b/resources/archives/essai.json deleted file mode 100644 index a5566d11bc..0000000000 --- a/resources/archives/essai.json +++ /dev/null @@ -1,92 +0,0 @@ -[ - { - "_index": "packets-2018-05-10", - "_type": "pcap_file", - "_score": null, - "_source": { - "layers": { - "frame": { - "frame.interface_id": "0", - "frame.encap_type": "104", - "frame.time": "Jan 1, 1970 01:01:32.875056000 CET", - "frame.offset_shift": "0.000000000", - "frame.time_epoch": "92.875056000", - "frame.time_delta": "9.597627000", - "frame.time_delta_displayed": "9.597627000", - "frame.time_relative": "9.597627000", - "frame.number": "2", - "frame.len": "47", - "frame.cap_len": "47", - "frame.marked": "0", - "frame.ignored": "0", - "frame.protocols": "zbparams1:wpan:zbee_nwk", - "frame.coloring_rule.name": "___conversation_color_filter___07", - "frame.coloring_rule.string": "zbee_nwk.cmd.id == 0x08" - }, - "_ws.lua.fake": "", - "wpan": { - "wpan.frame_length": "47", - "wpan.fcf": "0x00008841", - "wpan.fcf_tree": { - "wpan.frame_type": "0x00000001", - "wpan.security": "0", - "wpan.pending": "0", - "wpan.ack_request": "0", - "wpan.pan_id_compression": "1", - "wpan.seqno_suppression": "0", - "wpan.ie_present": "0", - "wpan.dst_addr_mode": "0x00000002", - "wpan.version": "0", - "wpan.src_addr_mode": "0x00000002" - }, - "wpan.seq_no": "149", - "wpan.dst_pan": "0x0000f0ef", - "wpan.dst16": "0x0000ffff", - "wpan.src16": "0x00000304", - "wpan.src64": "00:0b:57:ff:fe:c0:d7:3f", - "wpan.src64.origin": "2", - "wpan.fcs": "0x0000cc3e", - "wpan.fcs_ok": "1" - }, - "zbee_nwk": { - "zbee_nwk.fcf": "0x00001209", - "zbee_nwk.fcf_tree": { - "zbee_nwk.frame_type": "0x00000001", - "zbee_nwk.proto_version": "2", - "zbee_nwk.discovery": "0x00000000", - "zbee_nwk.multicast": "0", - "zbee_nwk.security": "1", - "zbee_nwk.src_route": "0", - "zbee_nwk.ext_dst": "0", - "zbee_nwk.ext_src": "1", - "zbee_nwk.end_device_initiator": "0" - }, - "zbee_nwk.dst": "0x0000fffc", - "zbee_nwk.src": "0x00000304", - "zbee_nwk.radius": "1", - "zbee_nwk.seqno": "97", - "zbee_nwk.src64": "00:0b:57:ff:fe:c0:d7:3f", - "ZigBee Security Header": { - "zbee.sec.field": "0x00000028", - "zbee.sec.field_tree": { - "zbee.sec.key_id": "0x00000001", - "zbee.sec.ext_nonce": "1" - }, - "zbee.sec.counter": "2425182", - "zbee.sec.src64": "00:0b:57:ff:fe:c0:d7:3f", - "zbee.sec.key_seqno": "0", - "zbee.sec.mic": "d2:d3:da:b7", - "zbee.sec.key": "0d:75:0a:06:bf:80:68:ad:fe:40:6a:23:9a:5d:40:ac", - "zbee.sec.decryption_key": "" - }, - "Command Frame: Link Status": { - "zbee_nwk.cmd.id": "0x00000008", - "zbee_nwk.cmd.link.last": "1", - "zbee_nwk.cmd.link.first": "1", - "zbee_nwk.cmd.link.count": "0" - } - } - } - } - } - ] diff --git a/resources/archives/fw_DIY/DIYRuZRT.zip b/resources/archives/fw_DIY/DIYRuZRT.zip deleted file mode 100644 index d21a2b6b9f62db4cbeddd00c23a9d9c01606dd7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213434 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

IP?t z7R1zaANqnF*D4P!X2p>uc^`3!?!j;}4))|@k(<3nsKUuPvrT{^l3epe+h z{i$i#e$V(Y^QopTY?yzd&_3i)(l8U<;0iyRL(!0@5e@I^8xi1k=9U*ZFJi_YqXA*U z7_n&oz<*-FCXu<>O)EQz7=+>{neqk6_xC$_%4^OxJrN5-3wd0+cpsx)0hHRzuj~gW(X+K^-sg-Rg)bj&gcR%xY645#ln6EFnT~{9`_32| znOL2o2bmaJ-g*AC7k`S*iAf_0I{!pO2HKn^tME0Z4OEh2QiX4i%ji$Dce_YH7v2TM zh)e}C{Ewom46AYp!oa1ZyQE8y4nexRq)WQHyG3bfq&q~qJESEKDc#-Ob=RLf2M+t~ zH@iDK^M;Ozq1aP^#YpNoZyBtO@)>c8umjyV5dg3nQ0-bJ-0V&Ksz1wKsXd_GVY;A~ zU0Fo%)yjICl>D(2?473!-=;hlb8S)bcT&wSeK#ANS>;&Au&R(?=8SH}`(iKc^J##) zghj1Gm$jF7r;3+4c~W6~b5GwQ1w{QeClpR2zpf|ZlJKVgl^DM6~bAOL}DFiQ*O$$iKuGIx} zSZcumbXAL1!%0EOr?ij*asbMSNANH`@C`B_ypxK?;a8^0jWy;sSF=FOq7(FasJl3NcfQ5nl$|$@f$s4lEGrpxe&*{j z`kORr7C~^!sRb?W32dgVCGDXGECT^`%TimaYZo09-P0vg_Pn%x$SwXmM2xvarSZgt ztYTaQm8D(t@XdaMh9jvr98jd{MxJ*Z-ag>QW}_t{BIojcteNQfw2K_1mv4KU4YkT9GTB zWDEJZ+nVIkw#r9HiGd0HFh~VO?k~RAhZ+fGS7g_R!X@{7bmxbP{t*XQCWL0RCpJC4 zEwN?vGeJvPRIXsp46t*_xC$%5eEpn^23gUU3q`qV?<-njezJHXvbWDgqxgWAO}qlG z!+q#SSV_vK?zu@>-P*#@^+fMZ`rE7x{__0$mJj^y`Gcb0tqM0rehhO|O@U72fI4^!>U9KCeY!mdz_%V08+0i1`Tk zwI3ctAN&SVnik?FUNl@cfrp5%zJ=w-TAlA}$AKI6B zG16Z))Q4utskX}IID069LqGXB8t&*leJ*bWc1KGuJ@MA>!Q}X;jU1P;tPPd{i6IaM z4y;wg`eu4UWZfXugtx+p@)Enj98!59_oBe>NoEq-*a7?@@Rj# zNmeY;yI1r!^yYIvPkcBiS;6Y+S{!9*1umBndU*>Q% zj$$i}&OLU|wrEu7@v=|3w4aVIeihU57j)pA3mNP)GK;rvdJ)8LMLL8PTAs1fd227y zFD&m&=|J-XxfV60@w$iy8MCPYDR6Vp<0vI$|Ifj?6B4DW-lbhkgtIIG_01P`nxgYHfcvbQfsbmVL~RHK%TL7Nq$k` z$;CiL?;MYhzCm7~ESSi`#4GonkBQAB>=5&;VZQS}wOUZ&{{Gz~SD^$)W5~hjWp@Ql zm}c`PjzSsu>s&Z*(8`16bhE42eVqpFhfoQ4hG@h$IUyUGV=y& z?tOQ)<<;01Z13sDnKEocn+|85=2$U zR>*rJc9xvKD9$kx!s$~bmT?i-@LeA&&>K0%F*i+r93*EK6wO~ z8523o6tHXryzsA1OYb2`yKjqp;q>uhF%}z z!dA%pa~_LEQ)nD28k21VmJ4`t+aUFh)@6jRiZT^oC}eIHy4oDhw^W;m|LhSL`{%HB zG(YgJ6F$fQYs`x!27(whriTNQ zxk7Pw(6*6xNHuQ)Dl@H1o{cX;2UfHZ{*EbFH8jmHES$t;duo9tnA!uPz~`YpGp_Gz z231P{3|HtMHc{mFh9C<5CV%7o%;LT5nng!uG|TgPi5OWc-{CpxJ5WQhKs&xE`gDnt zXj8%|c$B(1@82+B&DtTt0@u+KjQ4F3wr=k)`!_exUcGv^S;rX>O31*OkEjDo*qq<) zk8HXB!9qSZ?Pmd0y*ICn#kdlk*IhPe6<#yyoc#$_4mt7;{bxbM;|(j9D>P(W|NN9j zOL=>$!zFX;Z0s9lCDtYOXcTYTgcBIvqbB)IA?ThqTu z@kk2k#Ac4Dwyg~oazKCil;)}Q)Y+G@c=P3YaCU8__w!D9HisfPn~Zy+%Lq_laXD6k z4p0hT}b^WTSV*}m1cmmxC#}EPM}-&4WGsaP~ZQUu)Se)<9Ds3Bdj;Y z#LD2WUHFY6RlmOkpJ*GlRsh1p+sbtHLZ6n-oMUnODvVcR*Xs(6j&K;*GyNZ7vzaWi zaXKhXq{BRj0)Myi5g73JhNgW`GYOUyVWVeIgo-0f-VIsz;ep z3>Ic%2v|U&_QwWSWH?%v4P#osao6*)Vp}JD()lZM0}+ZB>Fz$-Cd%I9ZvMOQxhi}> z`?ujekSFUL_tx4YVrfE;v$6RP6Y)>+qKd6dmfo~=r`K!hZzdg2+o*;G2wI@~&BCCitJjkrifTMErAJllzF?i&ufV9}G_6h%J>fR5)k@zQL-O09-CD7m^$W z#Iu?INZl=uz4CJ&PCaD}I0Uw4T{j`PY_*Dz-rYyYtm{;pGJ;R*Hh&e{lv6-2(LDhq zqmb^<>^0rz7zG^I$V;Ku;+rZx{yl@aMg_L-zp3WgWLLG|Do@{^f2qsfrc2fQs9xz< zTrr?__L zwzs}>hX{X|-e5NY=x?DHQvKqWzb{WsMv(*DSnCbzpC0#Z==emgKn$$TiI(3?YWRfl z`1qf-TOx)$<~0|DPU9x;(%wv*5gU^QMBYg%cf9RGs;pHR)<3712X|4APUCN4I`EY? z34!0p*_@TET*MX&z9TtBh)EEk{DXqPc-z9EU9XeEGKc$kc&z{B1S$citPU=3#NU?@ zeh>-Vc0xX?2Fpwrns53)MOTy`)CS}kR|+?h5I>Xn8eWndhI>6b77*P$YFl@DH9>m< zyh!n=142|1Sz!nAV=DsCd@WM7e{kfIS1nj;mRU;aiC4ht+0b&mqR& z^fU|bY%+$}j;r#2rd(EVe2iLr$XFQ-mf+`LQBM8=R)|ZWMIghHiJ`*Uk3HbG@oJk+ z?3X>kGv`}&3)BBW2Q%C`FFbGEsP!Ymq;sco=5C-W%VfuKqN2D&FU*wCmUU!=F2S$wFX8= zIso(utzzVyviNRl-q(k4F*CTx&FojP#BMydr%N&ep%rG?f2^d6^Io{$hgVD1MVQ!p z#{1+D%W1RKvo^7~6)BqId%U{<@I8#PZuR%FAFY$5IjuVf9I)G3kEza=0~zGsGcp{lR#Yg_$rwd-NZoIv4U z=zCp4Kcrzb9{V4>TvKihYTtY*q{|yUK{ogulU~V*R{P+&fTe4@_(Rm)uDc8VT<%#J zT0*`^xfvu(2>aDmscHDR0d?&2D#e?3AP-!!tCPFH3gAHXN;@V~GH+8X;|z14iqAB- z+vP+$swO@`kDf7*5d1^`QHm&&m0oo4?<>-%Y=8%VGa>X~1&r(K2 znChi>yCqczG6>OB`CR6a31C|xMy25*c`k|xPxsGY1HGfyPkM7#pMaUetEyXS1JcNw zbI7$^KrwUwFJo2vcEjGOyXxb5ngIeAb6*qq&u9id#nPmUONk0gRT&Zjga#AT_(4^s zpo>m}ehbTs8pHY~4J6^84N8&M#W~;jA{eCtBo7uTT~{kDQ6N(eCR(hmC9wCI{XNrq zaCF0HE1U-Qm{whD;CsFGRo@5Jk-0HDwMD=fp5rM1(;P z>t|<3C}h;T59r%-BDV+=#P|Mi7TRYt->{niNJG+k4^Q$i7hh{{Y00yRzRpwR4~Nx3 zBcJzQySlft4Zc$RgcrVlNyM_XM^vP4R-XE3^0;Hx=4fjFLJH}F> z5>JrUo;r#6Z(zUI$<#f+AzX|9-LFbpXv%x~6I9XttLVu-#z8uhZ?04C zB1fq*Ch^w+r78i?mm!&h%Vq&g2FI7(7R}Da zcUXiT_^W#?BbhQhS7wbq%9$Zx3r#v|ds!F&6ltNyqL=m4h%vT5 z-eMU!F3?^hG6lPERVA}OF(H_hT3R~2SY#S2=CVSaSk=kt*O-D981Cf}!8e@WQpK0+ z;ap+Eo9Czq{AdTi>5wXsGBgk}K>8uz^yF*IZwd;q9j;fA*S%^<&0li9?1AiA?6<-z zfAwVgvXc31qO_Al2B6D_Khx?<8CFY#>s!i^1Hc8mh4Ux*73{fa@*CBe1v&X(Pil4n zQ8a5N7q>u6Ys7irtL+qe)MBZKxi-vv_j^=)@&_=h1_}(vGC&ETU#H-gU@bgqwd}_c z`hU<}zALEVx{PcF6BZKStlU2lP~JDG%{7d{zX-C2?c}6hO@Y8ZnW6gfwDU@J#{<|W z8R#3}gXl6?J23R?JJe1$+KC$iIx6WQS_jjYQaN74wmN{VGO!F1N9E^h&`aLoy?VIM zLOa^P>3}F>l#JBE9F>Z-?Vily(l?LrHd*+w|IOECFHSw}*u5B?km%%nb%E0?uUwx% zmiqGVn=mRWaVyy=XH95cny*qG$3$Zgh}m{C2i|uyU6=Zg3UY0qC8%@~b2ebe?JQ!% z7>quVfbMz}v+?tLenW?j1$s4SUvN+a?)YCBketQ1T*lTmFVQ`RDdh6=c^}|;A2@x{ zQ?q@zol!WylhmCu7%uL%Hm?fxR|sIr_niYa-mO2Mb^5iw_xcXmFs%%SIjE4jyFJyC zmyF-}$8_R3<3I1Dea?ceJs$Lk_3z!z2+R`t#sz>?%;p@+^<>YPCzoP3ph%GY`kAwQ zs=TW^lD(XDsS~}62qZfLGp|?~$@2}bzj$@@7r|!e`C&ix@wy_cD6^Jne9Pi>N6}`LRrSkLM&Ej7w>sm+ef3w~o|CTq)j!3`JXlr+PzC2`#l_iWaqns1k)2cRusG1(k zhMIoILXETLKcLgIYR6B&KR`2jr5R4i32O-ZkLcxxnZczeV3fbcn?+P=1cLw`WGBsI z9p=5h7a6*U(Nm)Y@o=9!<9 zCpeW%JX1I|&|b9BNz{*F@_n)9o(!`M;1^mopB5-gEUd~qhbxXIc}22x*_eshz79Wa zA{<+$d!hKlcSe($Y8=pv{5)L|woAh$axPwglBFCrm7@Me5vf{I&Yl2;U#JF#!f>k%JZrkrWJCrb4BgG$7FoCV2 z)_iIuLc(LpQg-1A^M$4>(iB&*tCG_&M(F<(=mcZvsv8aF<$l*}FXZ!1;JKsD2l6kn zAYhDrNql>b$h?%h-lN)GQF><)rtC_&|NgR}tAJ(zsNv|j2BJX5g+-SkCHc~=u@vA@ zAMJ*&2jx@eHBS)(&y-@43BL{%Hul0~^uPz1_fo&=k2k%yTV#~wCD9rXa_MUD@tJWU z!R4Yw8w8OkMYdcj$Km1DHp(OVT8LZiy$nDFwaS*An>oNph35A|3#25vj(J5 z@0WDnXw$)%{SFS8gEcsBvbtCO#xXuN#Kv?*iAK1@qJHN=Gp`<8S(2VD&n8d)rCbHQx^siy< zH0w#E##~HHdSM|&2O4M^n6wGd%^msT`@iMP~v+mm!A=! zCnYdXD` zo>F_!+rrz$p_ubMg5J)ha91Gqi^)jp@B}8tS@_QvpZSszvo}Cj;Ig$B5W=}UYth-x z)xXe7jGJd*~07qwUz@_!SZ^DI0$HacZT>$9<{wV?J#ZZrfUu_*ML!1@Ab%4?it} z#C>SPcS=^`mcW_;?xPAKijRaSJnq3>w6;1bq8AKDEk}2#t^5u<-O{@8j>znqfx`%c zvZyz{9y&7KYHp$QQl7ci6uD7zAhC)6U4@3w>g`OWo@QJ%9s(AQPy!3Gier`@;U?TZ zx<9mCdoR70{x(LeKS1fgTuwrlEdJ~fp%%|b`P#ezN|$2u+9mC4`|;cJy>hj-L-SFY7(PSK{!!u zdIhj8y#fPDUI%Qg-50Y^t?x;4v(i2@GKJ62ExUY0B5ix3(=B$A-nX@Lvu}kmO+G|q zpRmNQxBcg04CDCaTs%0H?5kLZ5AC1rc^6an^)6;V$`U}CmhVF8gJag@lP$%6pMvL9 zkD;&o=GnKL(fM7WjmOJlKYK+_G%ARIt|`(T6N%e%Xb+n;J3h zm9Kr~3>UNnF3ZNIn*W`l_l<@Y`b&8OJd(w0cSYbw&z+@{WvZ~Dq|%Dyk;4Iv0G-8E ziRMlaKE{7M^%LWaCSuill#Iv5UZZmG!mETQzwgffnx7q28cOLis|Lnl6`!+77%4Rz ztD^^7I|~#nf6Sai814Kdt8iwM8ST~cp=B(=ZL~C8uLeOfM=2FA)XX~gUpqTLmk*Z72`0NayUAYSbuwbHU5KOI5m$^;txjq`TaMsR}Koghc^F_5!)6w z!gopiAc$%n(~UI0yB>QWs#9#}6!2-9Y(3naxpm-S9Y#qDMnF)v!|a&@WVjQEfsH5Z zR5?)04A^-ye=r|tATm3xe#)Ug={EN2d#Tyj;SZAYUuQQ6KKPU}T-6)3q+O6bnL`v}4Rodh+}h6UWP zY*POidtba`sMXy17@YNDd+7I_a%g~oEdO5zak8Gk=DPn)W(xWf9|}ld@E?y9HWwJ( zwY+a`kx54eMF-jbsg_N7QDTTzOEr#+*m!m9*>ruMojiZ;K9}tlER*947_W*W<0pp< z&)8Uarn1?tE91?aflO%|aSyliqs7zwNZZ6td+Bk3TF_?p3}6%g@g%0znIc%lXCnkD zQ>U-^Cvwix^5_%+usT1KZ8e4b>Q}f=Gw&YgwgDOrkemZ{n#k?N&8Ykke}eoz{#N@q zc8_a-&p|>7n>RitGcr6S?dQT$zSXtFvE95De>fukW?$;8ycBkf zp7ewbf*uPs%#pk0z$1+KuQepGYz6#V0>DNKu9O?_n$>s7Q~z>7-#Rn`Wc4Kq(k?iHFk6Bxtl8UvD8YpP!fAq?L#S}kaF zwys^M(AveyPB@N0qyBu8t@)-(#M}V3d3uzK6MFEYz>96fH60QY1Dz{r5)zv+fKm7` zC>g{#`6~*wlr#ABb^vw|m4hy;U;qhoTwDcE%mKBjFv@mClcErI51oI`n7x#fXR|KH zYBJ(V_rb|bl$ABKE(#>Y7;eDZH_?^Xsc6Z?nmZ~}c&>Q?6g%yHFORL%sQ18jX>+bb z;D6=!DUW$}cETRQ4L(GWH;q0H`TZ~(d;(#F(Oq`B;X`&}O<91>aD1`gE*=T6Smo9E zPu*e8`*Stu4|Z(Qn9#v%ks0A;Tp+B=>D^AD#8-)&xzx97g$FcUUW`0 z@N{qbc=#a%4XJnq->92rz_9;NB}I)nkM$S3W>rDD7cJ@yqECvd-tm%i%(cUU$VT>k zDOUP&dO*iQZX9zXw{OBajmw9dkMs%13IA{hZ@dTbhADE88Gi*;%%6>*RoWy8=! zK3~i|>X#QjRWU1EYk&=9-I$zQcN_zOtwrto2+coIwoMl4`XCCH0K)QHgXw>zs;6Pg zZRqjR5T=7C2!@Y0+SEb?65SetigO4MGUAxiH(j@{v(zw<6>2J?G)AC@3~+TMQnn>l z8_`e|$oG6s3a&b_?-X_TQBD2}-uPNL1k@f|4kg=bkNs?KTyoYdKUIC?E6clFTqE5aJVAFxCSCpFKO;bm z|4(GZwlZ{YT{BSThc5N$T{#=WDA)A^zx69)T`n&XArV(lbP}X*JBZkq~{QGs*L-X7452IHHUh^ z#NAy7?U1_=2Z^W4)f(G~CDOY7HTA=zdT~1c8-nvSCCf z>)RFJ@ISwmn=t(2(j#=s$gW6yS@4-U48 z%w!13@3qvE%MB5wG>u6Jz(N%|eT(WT4b#GPDTOEVc1Dqz`e}-;{7)XMsIEMKM3YVq zwZr$ri__;&IxYZaYTSHK?E30!P#qk*OV?d^<51zc-Gzh8&*3jd)n}_FG#gg}M_CN; z`h-QNPCmazEY=y#D=5vR$5?yejNFHB&aE?mr;FKowvdT5_MRj>PzeY?b@w_sJtRfl zHGWSZqd2;fGtXN8^Jfs7zbc~Ch}R5n>wWA&=A60!vy^=PpvwS40lJjFYV{Y!7mJGm zUug-dK-qKCKO8U_N(<?si-%^n9o#+{+a4I-$b<%{Bh_kp8G zrIEBowD_a&S$@A35R8j|mM_-0iJYOF#PXbgjjH+^IdnfO#wrcOt@JkanH{v<l(Be^6bO63osBKe)qpg}g%AskK-{$09V_^{4FqWLu za~s1eV>WKJA4`PwJ_(Bi^z)QQWdEDY9)G#E*F!@y0fbtOLeSGC!jy363j`AoO)6Do( zJJA0#x}>MCfqed%E&<$>U$+0MOG=7wngAna=|L`s2(E#hgV`u3yT;9Ii--xo-*NM* zO3q?$m5!Z3%|oC^hH{0TyBqD&6lV-*jHO2jDDCcB**9U9`sXEis#@7316Z`L1nQ9wTvd;bVV%O`ttnP_@b)9<#_V8pul#~AO>6J`7c($^!3+oq zLGhdjhd!|~D-)D<^{ICy!Jzq;xSir|R|Ga$R_&@DiNj45E=a=Cq-WmKjK~25)YrIh zoHT8XA5bK)S}4D<_z;~Et2loSsdeoYA@W(GAO84W{{w|`8Q}4|2emO)9?$!T2Yf_~TzvaI zJAtf5;+(um8#(#DN(VKr%4bfn!V{YrecC=sEXD{Nk{Kj}Vr3zWU%FHYUY-Q9P`vt+ zjoLWo_RW@m2#N@`^#P%NF`vKM8U)F=_Ws61i59#ZrOP2Vt0A}S5__8M2jv%ecm4e& zZBiV66-D(g8suLRn7Y@%%&s9Z^mf@AUi^vq`Rswvd{hRL0ahVryTsmiBl$+kcVMwN z74N|OstDRtaLrv(%@E~UB0GB4+_LqJEj3u{0)>YqDO|Gy`6z)?c6DQb{`eBS9Trto zGBRqlKv^IkxP>8sH#VK7Z-#L<_^Z$b=%_r|BL7CKBDPX9as%5UIlkG$upjJ8ozpVX zN-U7rPSrg~)qVC1lDF#dTFUlh-}1`vYPVQu;+Q$A;6Gh|4&qFC_v6m!8dqy1VPzgY z2^Q-vb+YT<(ZCynz%==b#kJ*42{Ok@bpx!-f9Z+++;PZOeX1L=*8ZZ{Y3Y+(c zZXZ0b)#F;`9!tmOO5das(nZw>UzZvUSw7|bI*s|oBt0%R_-|JYT2$?FK-KdHES zxWiTDb!-Tfh{U7}Ggh&b4VG(6D#+>G@&veTA)BHX%t|rjn>cq1T7;!48&=G&!M< z4!2M2Er252YWgm=^4|Uy9sfaE{3*m+d9F4m-N@w(Q%bxzEI@-W$feZYPYOL-zgGfC z&g|a^=EZnkUDt$GPGQwJDaVf#RiV$>%wOUQM~X8ZwtdV+%6OeWl58c1(r<_>`9s2#Zh|-b!}xKW%%do5#{7JK(kVtwVmzS*t7dM4@DHT z8pUr`;Z1L7*RmBt<=@(O!9^*ZZ|$2PtU|8;%PA=aLAopACzinw=gDlZeBW@fB~y}} zTMi*D?YeVug})ao=oSI4=+O@Qy>x%R)G& z1dD*fT*}^~Wy6(%^#J1C8&}g5dbo~x%_tC)vD!6i_F7>&h7|$Ve~7MY9F#)dY%N6z z`VUMW@n04FHJpch81F9SkrMu$ao)<9_c+$K>BfTX!^f@peZ9;fo>#}(b(F0C=bVP- zf2E70(8L2mi@&RyM7eMf4J{RgbB+M|+WcnEoD1L9#?;p7Curqwvz4E#(muO3p|10T zyZ8B*Z)Zf@YV1Wnf2f1e?GUd$6CTwG)iXyNjKl-EJ-M*r^erw0EK&TXFId;~;8%FO zZdGTU6Xm*V%B%&db`&RbD7DSL-`>9BpRi7R0!UO%Nz(B@)^Oy|a0c(us$~NzfXYV0!yzz@R$@z-9>y>IOTNZ;s03fnddAS_Zgx&Hf-jUx<0t-l$Cte>M_IeAu zc5fVI;gwSViuDzKmcB!d<_+5O_jjYw0fMQWi-d+jv47Kq4wCkq;{o$#_9sJr5r*Aa zohYtUFDSjRJcnCuy0{8HH}@BP%3@nA-7Qp;Z#{!bkEsNdmLiHY702?esferjlk*nq z`Z$Y3bA^87Nq@=k;Ih#_~S0P;@$x zJ7o+*f2I$F6Li=EWyT2 zCcvoo*Xh_JZ0+g^*4ROcgncZ@>xirN)SoaC8PJsA{&zWxX^oUpZ(h4zysO1VCishg z4#`yfd;gfySP`Bteb)oqu-&qvT%fXXB3O`JZ%D2l1pjVv`0oL!C^5Hzdmwn zM_`WBAj_Bog8kAr8CjWr>Da=!XAC%Xm<`*KyY2<`4klWUDt>GO&~}*xacMu}yfG`9 zA8C9b8QI-(3rP3)B0dOPPZ~{d4iPhMkJgT#7F&$MI)tAT>Qe+tSpIFWZCC%13I%g_ zoJQamJTFCs4%2cmEMT9k2=o=P>Py9UCijV;Jo2`B$1Hu_%(mHROgi&edB(<^O?XH> zXthBolA}}eF0P!~d^>&0I-*0}AqBnn+Zhk~&8Lsec~B{+B9ChAYlV040tnXp-Knd| z{#sFh&GgyF0xdu$d_iGn_%gVBq}0QK6gN=<EGwjP$^qwtpLd3v~ zAgKCk^AxeB=+>8hGY|d6f;vmFlPhl8p#^=Fz)BX75N97TfnX0dyv>J{3tJB>sgz6G zOTJE=Y8LL1U3_nM!^QZ81-M_rsOExwstq5=o~z1;vKBXI#@Mu840Bdvvsb1rgTkkP z8s$@)51rKCxyxD`x%=g;Q^|$d&p}ia>duNT6*FB`+1-e3%Vf5hai215Eu2oo=~Fzx zS{agux~_A3cUIHW-;#u=4Nw)5liHfzxb$CnD)Rnp0EdG6yl&b5Mjm=`(mX2G*HPCy zNn)-3gz=Nz7(Zxc;Mya60>gjO{ZNXOlbXr@4Lbux`o!26KaC%Mo* zVz^e|lyG(-(YVtCk0sFPoDilV4d`P)YPAT~+fIFZ1D)TY`hVX0REjy1mQVJVwqc{@ zlSAX1XkuUProz?L+=CE+lJ_+lNiE!Y_OK)Zyuv`@b6hEOXn739N4_`l>w;E5o%2SL z=yWYXRLn8F9zYGSePaH^84%boNzD+VPmhZQe6rwC86N+sx>hnSBXJOUw`*;CD3eXr z0mSuFmDsT#^bNcMplv4|0a*Q#@}WRJvQ0nv3hS5`g)VtBo2{{xOXU18VJvtxBVsj)exByEh!G>nTsd48d*8og$~iA;{={@mYOiGpFAHfn;J<*=e2`SwNyBN zefr&jam~+jAs}s}(NDbgelGXh?GKQz^^tz2m+M$yts1H-o~qj?a4AZPlioC0P)wT8 zdnypNG9WtAs1@+g<8t*7FIPgYNHjI(jz}Vt_|YU&A;LU@gU8fi<&pB6@wOBtOJX1L zw$no2c~}}CzGjDRj1s7dS#?L^(qa6AzQim~R8^x4<$e6VA*p$rL=d=}KeQ}5?Gj00 zzuRPpiB08pGZ`3cSCYUGER}g&E)_uId+vK1o!PG3M&AA#R-_vroqPBYyNdsY;*MfG zX94G6-h`jF$mOQR^AB&$ZW+luG2dPpqz*x$J_>VQSO!lV`MjvUmtGVf!d-Li6_ z{q3S0VYuk@rEA>?4ne;U0at@8_3F3c-33it+Os$uG8Sp`Y>u*3kXp~n4<#U6XEDdX zpAPigo*Xjbkrwt(|?QHCVui;UEQ;nCL>@&oOD zv?LuNZbmcop z?KI5Ykex8l%JtVURGwT5v!1?3vvupLQ{Z8V{|~uFEzDbREb3;T3wQ18adDZB_HAJf3+tm*QgVN1KK2{Z%C0*0qwkyHf{a;cqkfY0P80{) zKVpZOQI2AKuW$kI;+(QjuvAZ4ymG+0OwEA$qbNF@?zS>B4|4&sa@&0v{>Y1IjVgjq z=`l&f`^CmyZ~?nc+P_(w@ibVIkanKU<@=DLpVOHZ>^||Cy^NJtCksr&yrc2s-h4*?aeVmAQ8=vl6J*CaMd9fP)u8$)O7UDVj1Np4 zELDSFb4T{cN+Y|inR97#JQRB1_Tiy}-)6+?(9TU6xAGZKjzzd0ch(r||0EZ=-n8 z9(bL>ywktHUfQC(6z><0uwwn%dhIQ!#>c8=Uz3;;vSA`_-Qy2^KDdi2*azSy3fQk5 zT|Z-a4|Z97qLpd~n7R2lk;Jf|*sk1>cRL0~oG^n_q=O0FBpqSg@mN)pU*PjGXd|8l zq?aJIlU-ZN&L|%t*?R z%RvJgAtw*LezSO6X+NF=!iI829kw8c$(iXBE&C}dw%pr z@g*ycx+jj50LSy<+wP>h3|*>&dhk9!P(u`hQ5K1ReqOKMD1)d4*v~fi*N*0-YGaJ+ zCI!A17ZBR$aa$y;(2o}w`mb>Z2ocQd;rn0H@j2zjC`=0dnPPz_NTVa@FL>3p+KULh+brB*7_!0KBXBq}Y3W@n^Wvi*KGg>nHPtJ9}6%W>RIyj%VUh5(9hjjJELsL_5rzYwE}6WV-12lhVp@?*Hsp z#ZoIz(BD7!Q~gryyKHmXaN+@aL*5MmwYOb@$zMXyX6D>GDXi&`l_AocUG7D+3me^4 zZ_nzG^PwmTy6hcn2fpkhHC|i5`Mn%`vyz*AyAGaS}>yn)V$&HoV*VmrPP=2}2p^;pL8N9YZ-GV!(V zoV{>@erkQHIo@)|b?yQ{Q7;|dPet`R-(BCZ61FHA>8lLv**i;|U8lLM)VqobT&g74 z%~E3V{c#AT$C?GfvGom#owc*J>UJ6-Aefc0uM~fg^7(TzqJre>g2@R3_pWe^>%t~o^S{OBua>xFtvBOv}%!x6{OqV zFzvmYbah68(xuR9RVqH$=clXcHI%&V_sE$0yWmRmSjE9XYhFY7cXx|>MnKUJ>g^ou zTE|y?^pcVdfBH9JW0){LWXc@7)!4lohn!0*<5}PLEv{3wB;@XsB+lnVbml|xF+`b2 zDjC9%hgeDMOp-U6^PNb&5TNCv0;%0Z=KKG1(5u2sYya6WWZ$S1EAnGQ8)s37qYyd6 zavwR=W~12*TS$T8;9kE<7on|`gwuB4OJI9Lh$BIQM3XG+=+^ZF@{<)rpm`m8e7l=!;s@mmf{IYeO&nEjZvItXbjt<*@o z@hrKnLTvp?cv@^h&7VyAjVRfV)>HgicPx37Zsf3I%tceytyHuHplT%EwSzp- z{Dbv=m^WT@l*siZyW6&UJ4xY9PlY3WGEd>SjA!P@DY^Wu=2|8QMoHY@@$oAD>_elGM>u|=x z?(gl8vE=1x=%*cVfpldn{XxzOU{EYYvI-+pn` z7V!-ZdtqPEm4g%}NXs#WD@wwC#so9^`a3MC}ruNm-TE_?wyR==7PL20CrH@ zS+P*T66Sq^0DJ}&iUY#^o2SU)aff7{JPdIGpv^Bi5WNK}MK@NTp#QtJr0WU+-31Xn zX8b-f1nUeVV~!c@mz%_52KX*;UE=Z~#k=z2HbUdaR~VD3@VLql6fZ}KU;SAtUk8Rl zTer#}tl2xKQ^u!aN8b%K`n0p1PTOnXp=8`cJlb-05r)qpKjkj5uZaitFZZLw`KO4T zz;MGCRuLmjIQ9AQl6D@Vf%x@e`Xx`?AI)+oTPd;;hCY-(yaP`k2(j@7;gun{1vsf` z0w@%_X2=1%GDw`nC*GZg(BHUleAnAW@#KFF3VMfgFOrwF9AgZRC|M;F=I3o-^MzdggN2_YqlegL+DQ@2z}!hb%Wi|I08PH%9Jv$&vNVE2XPdSm3kdP*Hc z7Vpj`HALBV@iI=~Ddc2%irfbypwA}3!b{Rv@|o%$t?gT|p8smrOZ4Y{(8jU)w@LeZ zMeUu`c(hrN+;J=wUY;~8=AX~loTn9Ae54E(o~~_Wakx<9j<_W>(n*rQi>b-5K;6!z zLcy80I7DSB8|G zZct5)$ah;2RCa(l>7p?`E|f(J+8U;xJRQH>-CgFuy(=K~gTXa(VJAIV{;vshV!_(e zH8;)HRElOyGXtry32R1kR@{vkslzF{$e0)0s1Xf)l`yp`jeO1LS`qB8#7d*M{lSU9 z4s^A)b{ZlN`>{PY&L1fnMMx6Lt>jcE+}gsIHdv4hV7YdEZ&8G9m4+Ik-NqTC22C|BlT{iaMzC@LWO@$c^_|O zkUlBM*zxZtwPV)Bj}kmiUR=K>9wfh`;MhAtihoHQDdzO(_weCIC9SyWlzEH(&alQ% zLs1L$L?@(x&8c$y%576^S5yovf%Tf0fWNvswEjjX)*$VEgD^wOwl%hm<(q^m5FKs$ z|E|HZTPMVt*G}Nc^tz{UJ0^?FP;uG3^DG6Y={o39;Z=vxi`B>6&jDAGkiY^n3|0Z% zhvZS5Tukki@&11>4IlqGZPu+NC3?Qp8yuV8gEQAPe`cBz6|a!TKZ6rH7buYQt^CD| z3bk9fYoRmwk26;3G;DpMnQ-OyjaPlDEUW=OSJRZ;w4i=4&vO5FeA^xe)az-GOZsjF zbw^oye>*$0QPW!iA5>jFm;s~N+a`N5(kt2NX$=#%=%FZmMzniwRsWoH8|z)F^!AX` zFv?FJ@OMj+!kxJbg?9w>7kt89$?M)}Q1RifYw@q#@S$#H{Zq}1B8+yF;A)(t@X5Qe zyN~)}702M1>kEhP*u09L5|h9&)0%X0^tm#yDMKt4`GVL4DN&iHU&Uo%kpwn7opAhl z))Mic5Qg_v#}2Z+F*emYf!TU8aH5oMPZs70zp{G6A;*uw>zoYjFY%A7Y|&ny)p1@P zUFyT*0ZDIYJqUW)?mk39EgvcEI{cvxj4@6I=1Ilo`{fhfRw0&^mr* z-3lD#p|)7N&qK(>XQNhOdf9y0Npi6=@P(Li$~~_VU~E|!0tA1E6ycbA?ZA(1ZfJQe zX9_zjWxccQ-USZTIL%25f3p)A2aUCV0%81_q2sxa-?09zi67H$%X;WCIQ4q%u3;)_ zeKMHhtrS_{y4D?8zN6!@SPAmI-c;dHBq>&l-^2}o^$;;Nap_IpL|}0C727kDjzh@J za8>n;*c05MMV;CPCfLYB&&)hnRWMIXIM5u*uo9NxC~g86Ry_th2VDyY7VMh>1=y*- zZ{kZ*+ikphQ!PY09Uk{fFd53$v<*j4c4RN?9%UUUg@cCzR?)!2W|NQ#<6S|C?YDA}%h}*m7@eco8A1P+Y%1fVX( z248QZ3Nd=rUE)pS02+nOkaFAdi@1*EuKUCOk~+y>&FS%C;odemhdZMAes*}f4j1(u zXEWh%0)7SluyT5I8e;u(ArnZk+EwtuhWfd|Waj~H!-<@e**uN(MVt0kQ1pcYJBJ`u zNK^x*1(8;4!d`5rc6T-tm;pBUn!b42zfC0Yy^jOnAM}%} zi-=;QPU%M{Vr4e?BMPF3%&>fTK_6-)SKhKCcBO~t3l3(&UeVaX`z!y-mk)iQxI2p& z^~GZov5tReR#8YrHt>AW%3~Yd9+vgOZ@hPOTHwE9&m)Ta!?4fJ`ZKt6tsP}4??xHQ zs?8Lz8ZKxER%n?48ZyxFK`9i`|If0OQgkpMsx7aKSspCXj?)Qrf-SHyy{O$$H#xk6 z>H6=`-s1GOlE{qK`5FcHLcPK>CI1=q+0u_^`dt@qQ_HyKPj^F+AA=!wKHi)gF0pi{ zUrbilZ+@;A@=W{KQ}7>ZS#Olz+P_QEJddCkHV&R2F8CIDc78wzU#AKMAXwgUa|>G4 zxj%@#c{6|sx@+@0R(FaRt?-HeY(f!luqP>eU}*iH#A=Y{MlqMgN9PJh?%ZvV`&`E~ zA1EtV!`Do$n4H^yJF;Wby4Nk|AEhevk}46s517sferBW1VQn)vyL9;==+VZ) zEasgu60nf@EVE&0h$L{+{8D2OBe;v4A@!+E2O7*v7vBIKLN_zTmW zFfaySKY^8qY_--EnpqJDRJIXCPec)4wSQm13AdiHW;Kei?kd8meyUe{p!d4SuYF>y zSxLRRV?o)ndZ+<1ntW*v7#Yt@#{s{9459CBxjCW++ZI=zm=_GvL8-{YAgh`xcYP_E( z{wIo-5g$4@V8}n`^vW52$zroi_)BXXXc6^xqQ8&nFXjT8N2Iv~%;&FHH6)>WRw{o) z-48m&mET+qtynfR2t426sfU``mI>oGss9E&dQ+$k>CrCqT8rVogYFPF2n|4q$7cLQ z;Z4wE=XQ~6hfZvuM7tEgtZ+^xi7zq`D;{`4jIGHulVk&ooi|hEqs3xXD#a>Pej5>U zZqp0KW z-XjGoRCy9>*QaCWHH+PyA1M9D)GVL_%9{H5R(NQh85xb9^CMAV^HY11*dLTnIFELf zprukL`KHxBAS`a{Nb5xiiwUqHrxZvU17YOhB;6#GUWHZ~T4bZLvngT6*|Gp?I8tN% zvE?`A=FHw{a!fBKuMZTid)~+#l-5At467ar*bjH=JpHX( zzrSN@G+2?O^ERF}ySkl6JQmAZ6FkMIgnQww;awsTIO8f(ayh_tpvlW+O3>~NUYZ~p zB@tnE@?lyc`i}J(r!pb^vHAiVKLOo5RZ#{g#bkp($R3^SRDIz`_?SoK#{n7gDHW2 zgC3%hq}RKs9rX16$W)UqbTU%6K&F1er|yVNQ5r!jSyMo$D^(|bg`r{a+U#iTEMbJg zE!bsO56RSVW88KiW@q?lhwq0Uzv1YqMdvGA{tND#2FA|H2aXG#_8+}dfOery$rT&Y zV(p)AEY03A>je}|9u*gU%6^?!Ko1eLuOKZo`Z+t}TGw9H#~@$*&Qg>MjYZ4Z>EW&_ zf}FgunL52NYu1+Rc$0K@{JfdUSu>2+gX(i;GFVzk75!=Q$ktL9XD! zAEA_HRJV4(=^5?ty4f&>Buy4?XV9kYYU#XovM=gyydiBCRl(&8Acoi{zSV#Z`DX8n z5oNCjtsR|cY%f^n40+ULIgAT+wKpX460RumXckS^IizCDicY<1;6Fjb=6%wKE*Rby zG$a~uquy*sC%fGr^ySQoxe?kiiX?URJ*9D4O24K}_EANBc2_MQ*395*V~_1KbN9+g ze^zp_4}G`Uz+t5_IGnY0ydEz1&q}C#W$TkxwTQDo6v-GkFCfF+lxiB}BgK$T&hzmx z14+~2Z^ighZrSLsjxo(52+^=s%QvJ{H-Afz3~ij|_{Z(E>`|qfv%U60|o+qdxI0UrY8*hIU&Jkkowj5hd?4^hB;O=M58InsS z8Kx1gP{=c7z!FIYFM%&zyI7Y8#1{ffmw;CDk;f6;#Dv5NoddBb7S_|B+pxw?crv9b6yPJa zpt+0b^GqiMG?OQFe37`^n_4yqY^C@++};8%$N~o038^>i(gDgle09L6(cAsRtX_h# zvK3xHbT--tGjIQeY|#GHTQcBoptrJd$%l8#Gg-$Wy8EOuExgF#KE?8|3Ru>jIlCUE z)LHtnoEdi?z>`eB}PGXvh-G0`>zS>rTMVzY~?c-pRqwt(SRK|qG5@n4GpM$orPrK zzrBbQIDv@0gDF5X*8Wx^)Un}z7MnskW%IJ)^B??toX z#3^biNja|9hY4B%zfq(Kl&EZ-;bN+vUpGr#*E7cNG2hy6c3YQSTv?+3La2Ou1ZYX; ze@2tsgdq5O=NWQ=7Iu(s**~KC=Lmg>iwFs3J+M^gin8=J!o@3iK-J#&itF*+;&j>{ z!56Mp$IEi(ra`$i_gdTHrL$3a>r=*GNM@*$ifd%)+`pbsg+Ff;Mt@1|)}cc%AYWWQ zebap-3fy6$zb%FNewQ;IC98}jJ?ie;{M)($?S29hm}S%B)nnH$X~r{UIPCI6z#AaV zX!@%QyySPSDedr=R|YkPwk3xA;F>^Qi-PHI{q@%?Wu&E2QBF|t9oSPKIYk7 zbM^&H2O-uhDk4ZU>EO~Xhxy9qVPd|~+_3_4P4XZe zwdw?9dLjx*7$GSb9(*lpOTV)WPF`g(s^YIGW%#-gzBwImVeYayBWmJ-tPk400LB&?* z$)kl4vjvH3bacOg;-b9<0Pr{dJ4fW8rM`;s|D+MwevIMCIO03EPv^crs3E2LIJzSs zdIX_>bBYwywflG~ySECYwaShTga1^2At0}{P&%0f0CtW7kz$1A6`4q|Q$)y1KuI7= zsSiI&B+l8wmU6|LqqPP9A%waki@$1xDQJj_n0d;@JkMW?1g2v>LgNCMS; z0NxV>vM*J*v~3%!v8TrdbX&?18`@HrFzkGly1&?%oTudIch z)-xO~nmmzcU6)Y~BOAt=kkwWnN1bBiaF^BGFU#KIInM(XSF_4Bz6!>tE=i@%@tX|L1BilY2Dcp-9-p}kpX?$u1ZZa+8 zRuXJ8Bv+u^A<*0Evfxeq%LoCfi{O=~@_^TJbhxzoA8KKskYKP0#a(B9NQgq~tohln zP)|j_T$EFXM%SGDPyQR%UeS;gnaB^pb7o{P$&6oiUthlcuhv~mIlaH*l$8X}M%&?u z33A0ltomej!O@HmA#FTErSl7$x>gM`$qR&4g0#NIKXiGGBIpz(1c?_@<16o*B9g!S zo9cr&9tW&83#}=SQtG}AEo;33O@Ce!f?Yc7?xHO^qNF6ymDfTU>46<7n|#6n8qmEl zSs%Y0L*r+2bM*gP#V>anKPhbGi+32RbpAKGq~xg^@V+ePsEB0Q+tCXqsW{23GIjVR z%!uw(v^0})sw;pP^8!z6bGDo@J8q|lO}Rj`?TC_PU3SQ3)H*{X6w1+Zzd^Ja4hSWd(*=8puU68d73O@!jVx^uJ8^I_~ z{q4o#G+XX-q}wrMK+%z3k`f%RgoOPBt0>`;QT5$l17fICA>=qW-@;Cr1N z&&a{9apah^EyFwOdK`dj9wYO^tju76=hAgUhb~-P;LowBo};@kqBG@P^UdRVr7|Q> z9=CDdrH$)jz2spv9nSDF0~;ygQ1^MZk)$HGD^Z+ee&}TicsrB8hCCASA$Ui%PZpfo zu*~VNn9M=%xl`nEJ3lEN4Dj^w;%rpNzw))otfd{GJ7IT?P}3nq$L!v}d*saJ7jE7Z z9R48hKv1OCh&R5e=Y+yVSO_3>!u@^-cq(ch*@F#j+G#!Av)KD0uk_`O;>LWvrAdOW z-1Thw=Onb~@mnhk*{7#RJgyah#T(R4;EG(J)qnY}fXd1CapYZ5E#P>;Kqu>Aj=2M} z{4(a)2NBvypF6@jTqhC8NFIf0c_ibGx`sac@W!@jo% zZ^ON}EA}^c3czFnLt^^oN+QApV~^=`p@ku@V1?Q{_ro{&w#5aBzkqlTM8SSs}TrGmxadC$J{X) zzB|@Rl~FfYPuEEwCXnyLPNB(IQ6>lnIWwIktBVE1_k)t5ABAY{2$a&nk_db6>K4x} z`t{Fzy;ycH$37?DxWlsK5!>T%Q4mOO6m&yLf@Q1CijUoa*0vrjJ`u|jLrVE1FXKxT z=+VTIbo+nh^m(A~v45d1rNZq1BJXakX?tZWtZsBw$5gyzmZ`MUiiRuio@y0iDi z#AdhlG@+J^9gj6l!5)_XV0|HSSe#+NKaXjh)p3t9K|bWf{p=0%_wefAzr@vc&0Dim zJpME&^^TCFsrZ)9fdj38TV)r%+1h*By`~nFLbWg_XjIErV9zD%O`XmA7XiZFncXX? z;_lNKPBRF3z9!f)~=$OnTr4(qPB_-Xo%h$C;jfdatlc^)|z<8@+0$HjkZ zxNdgUAM!wc{EXXBj}$?w5eDRv+N@B&3sngdX6(KF;S5nbE+uHzeL6g3cEy}l@?8~N zmj@D^8Z$GZ=^Jnf*u|wKKx2GPx5O}Iw7!b#v>uC2aQak*{V`191pEg;`o^_qa)Vig zlbpJ?otvKwmrc#>J)%gkdGZhas?nOB_Y&zAj%?3Y@0_Gm>EtQSzZ-Zf4My;Nh9Jf! z5^8CE`6t;jhI%6}vJq?v8mSa8%mUeo6rRlmF%Wy~er?ZjR?KG!3`O@{q`b2h5~dpDEIn8Ng= zId0s27CneD*(q9RB_m*Pk4YX%5hzYj28jBuaSPkGWv42Gq~w$&=8N{QPRd)O#pYgU zA4YdTt@N;Wo@3g7AT_mnO&C(`U3z};1Tly^ULn8MG1PsHob!%G@bXfs;9iAaU6c3U zF1eCuYA3ByPwUrZ2&WQEi_LNyoRGd}Xr{&1%y{@J>VPAAdzYNOWd)Wc;mv@3bJ?C# z^JM^#veeW%IQc{Q_D|g}5Hi+;$Wc?)p$CRh->bkt^X21SrhtHzRZCo!Zz1-pL}bOz z9RSkj+Kz8`_)@RYvVbaw$d${>6Ut-l7))md=7ry&xmL}+*-COv)?r$LB}MJeD^hg1FuwTBB78+KMgiH;UV z(rnFSL0`e_#H~>LPb7_3CH_}yzKbOZk9pMDXSkA58)uWh1$sCU9C5+%nGq|;Dl-JA zFuxk9Tz_5ne6a7r7-FCG`+40Kto21AF9v?I6bi0)v-m2Hf_tz_G~?rOc*?D!{7%r0 z-=Q16lm{?4VhA?3Z1iyQ>x`5k@#6x`T;G~s;YW_m_FX_`6dz`n#3CXy16~U2n^mzg zh2V1%MCwqcqM1Qa72cz*;dPe~s^v&rK+2Yp{~KuHy7a{kh!(u?A1l@x1m=XWP6jj`Z6l zkC`X4_l`+S{TXLCSCfFA{!rfjP%FYe+0v>?i@Np?^M!djdn7uNAacowHu+VmM31;L z=!G!vKNv$$?PS>X#}Uo_*u0IDXJzXZnJ8eg686s^wAg#`1GR0S${YVs-{rG!_A`3$ z7jsUzd?rf5oL~vR?>~tsj&TeVOU1thJ(ZiopNqUSaOnnA?>Z`t2%~{>skbT3yiia3 ztp`sV6=-MfY=3T(&b=LMLq8FJZ9;{N`pA!dnVr;_)+2lKU!y$eL7~?vRx|W=SUmo}5-^0GY#5$Mvz8@);?pbQD;TX_mA1DjuBzFB zj3yO7hDq2))n}$1!Eo#pkwUJM%Bsu%q?bc}nn*nG}TOP6Hu!XCGaxg0!Z9v@#YHkPqavH*!)(} zK*iFYlZAadxtd0BLGV`dg8VnHe2{+NnjwlD03CaDFx>*I!0wQM6tPUASRn@6Bc-x`o z@Uj}g%9Lej8Grw=8zCeck??r)+~%qWgn}B@sTZcWg>n{Mxyi>B`b#^k4XwiyGQyk zU6=cvbr`%69(wP+x`o=}(Uz>j=*t(6rz*F$nY|Jt4gzy}j=l~(f=wdj!K7BsEoh*z zDP1B76r={s=sPg6PW(=Dw8}nC(+Nf?Z;!lK(;GREPrC%uPSmo)u}*F zcn3lMvsWIIOi*=tn{_k)#=2w+Q2Zi#p56Icxbgd9fPYOL04NF3EDR`*QYoFsB0nc_ z>RmOydNv|Zt(lGZ8YP%U_oM5|28tc)qhjR*_SqNly-K-D(rA=q$wwcmimPx-SLXdq?%_etXQe{mv!u zO+KtM?_V_7U_#}APtFwv8B$6sgilz0fXMwfqRK(B!$j0GR+?C^=!Uteb;&iSh(1%` zgHmZb7>C}$b1!oYE__Vt3E&!<^{wc$_(RPnIa;Ais42jxCC2GlZK!vZ4phjH*U*df zC8IeM$XX*?4HfiP)6hF$8WmCDD|cIUkI|Ymm3);3HR`_>e3*l1g=$2$PJrl#C2{X` zJ*2y7W0K%m0)N3kVfS3g7n9FaIlyBLY;W5AX6Db%fe1^~WH_mHnK9ARhj*PkakB5% zT-GHFtW~_89=Z?z6tknA$bk@eYi27kPj^x|P^yoPK>!EKM*<6;;9P|-Ec(jb>o-6w zzmz!cFuBI?ii!Hy{Cj(Nh9+kHxdvO6wfD!scpjiwx6{TTPIwJ(k%p@jw#V)0N=e z4C}D)Sm@ib;Tcjv#pqyv{Xy_s$d_B&g%y^0 zzoR<>-x|EJy_T)@D|r}0B#$0DN5i%rVkjOsFU@PccYUK&x)RVX6+v`p+p5QB#`l42 zh3gV-l(k7E{JT2GffnpN@=H6lt@1eEJ$hKOF@dJijQHTuC<)h%uv$tf7#`v;zP%$= zZZh0BuGGKEvimjhV`t?atB|}+SzU9vyc^%IH2#P0(%%x|^K7ZW}- zn?kJ>-0ZFn_10MBIz^{S;mls37GO?$8YX=`l?c|hQ`6>GQO766nh&Ad@Bm|%$MX1J z3R$*rBkkAdSI+;4^(lY4x0Ryz+Cc~oog5W~7=f1bMTXI(lcV@+*dhP5JCiA{=oRrU zxZ8c~Q-=X3`332*cb-}Qz^ng4lsR$IyHWQra)drXUgtmDz338`Gvtk+rblY4bXqCfQ)jFNBcP~r&B?Y=m4%K~RCA#+ z?Gk0NsNEn+L2WjK`SqSGW&L@zqW#jV^(VS&h9fyy`2oyL>shB;Fzv>z*%vL`23ILw zsk6`8m*5Cu;4F79tP$D6_f;un-PY~AS(*KKEe0W$M&F2={xy^C{6IIU74;TTdqen8 zwbTg|8YZ+5JUZ3RWkh{Ceomy0&iK$Z_QstJr3eaa(X>&&ws|d)P9lG#4(nsz_o~Qt z9+?Sd6D0oDdL(jVwL#b5S^EO=&_w<#tEqp6*iVT5;F^oJx=m)t;aG9(Xq=?UKv}x3 z*vK;HJA5R*wBjo?B`V^M?X!=tf(9bSwQiuWXsF-Yvkx&FX2R)8QH+xBF_hkM-}@UX2gNfv8Qg%TIcV z^v=JZ#k*sb;Js7rmJO{^ZI`XhVjDhC@09D{dge^-FjG2Y?=Pd)`zEq`pV*1^Iu)`P$k7R3*b<1$cer~6znD`_ z=*NR;*X&|rCKtXKaDxfG!> zz&(h>BmuIP4pM$T=mB-%B^au?e-6CM8D^-=mdX`0yk ztSBG44s?R8n;w!zp6usZxJ*Q~9rQ_gVa+U-d0Ew`vU#>Y{6Z)KX0^VU58U-zVRD4g-v z+Z^>+<4u|=C}iL%WJpD(i%Cz~svsjnYu4LE(5XQ++ezEo*1~k+98LJguWgPO%irMc z|2XF0AY#xR_}UZYH%W=?<2rd$K`z*^e&@}5>;OMo6Ucptt9V1Oj&O_qfzAd;SP>00 zS`Vkbu0e|Gqf(p*ql4(QEsB08vdQ-z$5U@z;Pk`aq-eI^6MwzXru1ceH6paTj0rC7 zM4Ybqu077#$h5mbFiy^8nYE z^;)rp(1^h-Kbn$vc7whwn-c?5vWg^U=M}~C92a-UN*n3$u8n!CVfRS?73hdzS_!S80`neQ#8p6b6|JX}$-SfgT-rrDl}zIfI9 zcG2M$W1a0>yg+Ca@j+h$0f7NO>T&Bg!m6w0_H0~lzJGT}2x_)rrQ3t8ZC_!KwPLzO z>&b%M^IMK4mKvAnWr}Byj3Gg@x`2Nc2{iqw$<3TDpg1N<+c>#{0AWUBrajPHB;2PNORJc2j$_1f7)p{A3wFy zzvBU8TsM~sm1gIJeeCGCNSpcJK9nceTO1OYirsFZ)G~p|<6& zeQjAfGdJ_in<1|)^ffzx2AB94h1=~#AD?Z}Ag8p;1K%XN+lRLkC(~C~TKL^Maf@2* z!{db$ANklaR6GIP;alSl?%AWAbkkdVX33wPuXe3X7TXSHylW(f%`w+JifKSU?dZ`A z6DMJg`rTDHpgxIiS!g%zZVvAk3-ZF9qcZYIek~4Xl{rIYdw%qzQ!)eaQb-bOP?__N z2Y}Fuitkg5Dzfrfk?5Jf)rvhSBL0yZ7=fP$-5PQ1bH^s5V<}l+F5*S*n)waO*KCYT z$L1(;E5!Uie4u^|@rYykVHdJa+?SR-51xNv-7z5>D|CU&G&w-(DjB%kr=OU{ zqSKA%71Qj`{RgyX_W+@tRf*ZY-59Z%oUZWNJ1~H@3oX&Z?kUq$bc4mdTW@83VD+rKAoB0Y&Y0LeXiaw3d0{r8xV&4 znYcWqbLrH|SW@DP$LvV@M&A8id=-p=7DiDUi&Xs-vdVyuG<%%G?`;m5H#N(N34(ub z%R$g!;wWw7S3;|k+jTN+)l#K>A$lHiQI7-eEQh)OA$B~G`cTXh0=&mqu{eWRJ?}OK z*85M@s|<8OzyRmQqB(I#`(Jqbw2t{Hu+`f-%36aVi(#W%3SQwWO0#Mi;D7P84s^aTu*& z*IB@h;Or4NRy#DlbbXl}%K(@G>eV4NQb^=RVk4D*y81-ue1Xjxp)8U}N<)g09jJR5U znRO!%JPtU$rKdn94*nM;&-Uq&>-J-_l8vFL(C0M>twJ#ao*Hnk*`B?Hn#ksdtQLi1 z6Rc-^&Oxa^62Pla$`-M_ZXWoYmOlx02HeaA=UCa81WAarfy%2QliS~XH2Q|=?YBb~ z!_SuNioOd`Q>GI}vP>1;jF2IhY%>8L=b=3?-s@G*{>6#e#sl{3*9J6uYM}E)cI$~`P z%6h3xDQW*ze&?(-#(t^&8Et61SXY~dHDnk$p1(Um=*uSd0p)B|dBI~(7h*{K@#gyk zU1trL^~~$iM-jZ0D~iFgTqj^5W_%}j5WD)xx6D%U;9(>^SpaOj(|Jkj zK{GLNp`UZ(;CH|ZaHyg>v{ufEC!@RIj?$FZ0;uP?|CqgcZM7Dp1fr~zKL_pM+JJ{X zepjR-Jh*@DdiIH<=GKXqw5JJ8`zS6n*da2iTy`S{yIXH9@$ADT*$dc zxAZB}#dN469i>R+aB-1^t?ub8lb>PHCUsqTz7tpa3|SX8U`!9EO|TjW^K8^p3-Y-6 z`4K#x%jr*80*5_UAJgSLyrmVqw!^bqOaMD0w$oPe@Id9=rSUc;eL=MHjhiLYHwJnWC zdDUKEY(DRrqHFb_9bVm<(swA#LF>(&mCo1^iDm$qEN^9;cM-0-INyf0jsdpnm ziz@YiC9B2Kh;BDETSk9QTU3EHlYTr+h?)bl&5MRuFrNg*|6?}7aT1Y}E^m;(+SXUF z`i4yr5wy7Iu|tr5gnO1vbi5{nqzxo!oC>0O4j%J3)qq&>(5-*JW|<~!$PBGW^BR(7 z_c#O77L;|y-=lXxIV*W;y7pbvalYB2)bo=_ZP&T}KC=y*H$okdrpa{(9O)Dy&BIw4 z9|a*|SeOcx&h%EE^&amJiB{o}%w4peM9>qYW!O zR>6#W!2ah;>lQiN-sAFo@1JRjHu7OH7>meosQ)4OQ(l#V+3u!i(P1$tCK-f$SCW5s zi_Q>+eh8L@b~H4pwd^j;rM=YO>}h*Ul9%S}jE$b}L|iA)+bwx!3Q0i}q}6-{mQgN; zK~DZQT9gr(N^2QQ%U>7+y`uh0{g?*2ioNAQN%B&ySvMbfnR($8wDP@iOHUZqrbGn_ixB;BDRBI2l#-blN<_JDYtT zJuGL($0}>D7$4(v$X~h-?_pG$%4dP67j{t=?17A1T_0{E>^ObN-)#e{F%GyKKC4<9 z=;Lny=9NEDs*uTw!uNn$va3Tq1YW)Ae|&={cCmQN%QX$rkREU=WX#(}o~O=!eh%B} zroA;pk-n}lWWQF1q0G`1fdgtd7h)Lg@%hJ(qdAeSMnp|^0}4-@2sRv7pb+58^llI? zoltzBFdZaNslSgP6GY?KPcTp`_z#DW&p}n!> zCseb?GSGu{daM`p%nyt1C&>1@_G31Y|NTM8W>swWRN)mur))ybVdw;R}J=F2EV52K(ZPf_dm&pu$=Qwu0&7-MRfj;vJ=C zY|Q_?bW&&7S=dIOo#k^Rk#OZy8iaH|ra5Tu8P#@ZG_h)ZSsNPMx@(7)MSb}x6M%~4 zSSi4vfYm#vrr6Q~^H zhrQ&8(*t*zng!2CR(u@y{==jz#vC0+^pJ4i-_9dI!P**g0E(|8!M+XhiI& zc{0@PydU^wW=JuQ;z!C}4pHNn0y&p=zp}(FCfc%32HTM9S)TUepOn@|;Z)+fTp5uK z0Mt;*i{PJkgns|ruMM?IT*(Gxobk)c@|lXJr++B0014;j&6jTo8OaocVETyhzedab z&=Sm9dB??*W!R zzeTDn56YoB+rbrV53AXGe1$JDi9tU;J~}ZR+#L)laujj9O}hZ4)ABBh?yNNLFO6Uy zdY)PJHY{vlGm-7waQT+@SX;GHxCg z_oF52@twf(-s+yjnU!y7(29ZmQ`jsbH(ZZv^9mLjCWkb7?85X*vb?01kd)r@_rP`X zx2na(1wx|W$LVP38|{Jju8u~Vy-Ntox&?Fw|**_vw;NJ^=v-{ zonE?ITkPxD3w8_qc%ybJA+Wkp?(3hDC7UDFDO{1@?78lvwcq@OOG>Ao_}A8S8t!eH zUn6*UeD8X~5pT+bOB8l*)diuH@8G?LzFdbg@CL5ckG1w9Ef}SQNtdSeVpLK9zR4xH z@-R}C8JIn9a7mw1i!_%hG}+@>`Kd)a4;l}e=@nT1rSc^wH}1rI6F~q)@)~OzC4p~Z z^K*J#_%TTPP=%HWR0>zD@7oRMLako`bOOa9T-g6ft}}UJDuJq|QJc_}Pr|1b1StI& zYoI`w?)Z4HRUqif-fVfg9cUvZHbigSt&k9`0ix%IfGVf3cG{co0{ZBMwQ{d7Z=KoL`LBBM3fgUjLQ)gEvEjafpUodI>sg7)c|yH9AY~6HgYK z0Y9b+wBP^tzHPN>T*vp69xYGQy!GLr27Ndh&j}5|A7Lxvd1jlI{I9GqH{$sDgjn-8 z(6)n zlO5tB9?C)g2LPn>P8Mb0kh}DunLz6jJ?WFjz$xHUJ-++raie}Z@oDM^t$?Lz^;si} zn_{{iEGB7M<8*JFYl#(yE}7|qLWY`d6xJ6Xu@c1(dhZ@iVj;DoHP$E7hq1`TV9d<} zA1&t#Vngj(L@nMzNM&-3%m^Rru*1j~lW5E-=R5iKpV!;t$nB}1H zG(W)+&uEq{wTo-dxt{2siJvOUv2lb5-yB)usdA{LZ%aIKiR14k-Tt9Zxq1^t_5{R1 zVW~X;U8xn%-|yb)cZ1G#*J^NJ@V1zcv(m9XHS9*^3&Qgq<+De8J`4M>K%9hj=D+_Q zUO+l{Htp0LP#QulNv7j?jUrV`-Yfc$UK-IqrdgLk5aTws5*I20(B*??ejcGip7VX|sj{nEeRR=`%bWsWE?oI*e z?rtPS1VmCAq`SL21tgY`_|e_ny>xeXcP!uI`xDs5&di&+bK~4|=pQ@pG@;w5Pa%M# zrW3?+KhC;}`beX9QO7G1>PvynT|)t&d}L@-t`cW5=0bI{Jw{Fz@B(_>bfbOrRRs8r z_4A%kL{F#9XXJ<+VkDnbTxqZ^Fjd|NBnH-RLo*j70~0}K)%gq`I4tDMuxNLrmRcZy zy225z^~09ZM{CAC(n-fp8K)>2i4NB2z$T&Lc2j@lqr8%i)UJ+SS?k39k>2>*!1JPT ztD!jo8u&zk>>f3NH1-PN4F{-Ii@;0Ly5U;1ChPloyIVbm0AiCtXJAY!=dGj4s+vg1 z+(_2Yx1l@9ml{@YB7vFg+7%tr`c%zS!7qgi=nf_0Zv5PjXodEL!)9(-LNG7yqy!m}Hf@zC-t3+dQF0fCG2O9~=9bi~Oq zZa{Adglh2qu3a}uOl&NBfc$_sZ;Rf@U?;MwDt7{Ljk=-cUC@qpI zrYrMicjSo{+IYp+l#nLHs4L;OI-=Zvo__`lUw(6w@s)mlo00|$rf)a4Yq4$~ZGXK9 zvL5%qMsi6!q-*=By?6r^*cEQJUVdWd4H=U`!|Y#GPzu`oo$OYntW{SJ^P*XL*i_9J0=GiQe5%&G(#aGWNo z2MnC*!^?hCfejM0z@>5jF~P4DTN&L3N3zY;(F}P&+qjkaZhMG3j@k9Ko>o9Z6$4oK z0U45#lfFmfH;nXk0QLU1L9%|q{wH-2+vyu%ng^}#m2nbN%9`pK)8dnw`+zjkuNsK= z9eY{Ijrm_gwo76Voz2b@xjsjq!2tE*bp3jYR5fzAVPgL~ldUcGKt%re(g(i6&Te3f zm8MufwY0yaTBn%*CEEgNG29mVPjO0Punz!$Tg1%&NSPg@rnB#J6M>vwA=;fa7R(Z@ zjIX5}=}y|Dfrf@~ir^R6%Ichvn47Xc^Y~Y<`^;da7taK-w)A-7Sd z5WNnkJ%<{(`552<9y@BhGs|=`{HHn_K#VYWRg+AXpSXDyAxJJJF02f#^HGG>b$C)8~i zOk)~@{ITk*o>>P6E7>MX@a8{qVNr8lL#EkEfrHoOKxH7VkWf*$-TVjrqAynn%m!A7 zT3~kL3Y4|0!#l8D1jWJ@*nt+nN(qe#wc7NLH^%zNe?3+_0gh$f&Qjp*+D-W14Ra}; z@fm-&kBD3tBH8PX_1cH{kD16`wC*?XyZi#3?C?S5J}$~+T)GYi@+TXcch~G}>3k3H zZlJJDYj!?I?xzIzgrXFMCrPSGG0(0`j|^5r!QXmmI9cINW2WjMR$^JiXYCLHQQHq3 z#JV>?SHbZLBg<x?9-YAC>GoYY5AACZP7jh-%vg(Qy6WEe&rD#3&#pSs&z_n3EqpA z5Y-G}X{vxr7uSnIa2|vZl4b%1Wcs7N z$XGW>g9uB>zH-{BStBqW&_lk)2QNz?{E{rB`FfoVY}3Kz$+5Pn-M36G!WO&t=Ec0c z%hV$^`R#sPBb(6cGtL0iCtWA`Ha|PWG|7{7( z&S*wjAioslbg$8IgJH#48lYPT3^T7l{#@}^sHWtkU-FD@gso0%TTjyYj`{=r2`p;C z>kE3u=7g+!1YieiR*f~!)zwDrys;LLVzy1Imh9hUW+o*Kl*3qPuX)M-n5SV$u~TGZ z@^3k(Y!Qp&0Ip z1ckj@+-Y9Y9+N_DJdj*Im5+XnuIwZH1bNgRx%ds9v5qeXxMx%tzZLmk(rp49?xXz^ zC(|DyCm~+?ye_w&N5Z*dO8{n-2g^Z^nb4p@m;cBN4ML-DRtzNolc8+Kfk6pAXeI@p zuFrk{dWZ2Am76-_P;0?kCn0E|Z31`jSxJITd?*K3OiUTOsw%g6kWvX|{ zw&z(sjp>z>vi_jZIgM7JNF#ORwzdyVSYjUYQm0 z2<-goYyDcjo}im&D;g6^mj-qk&svzGr9S)q8G8G9hxoAC`7fu^;$$D-_SHjCdRW@o zP=G0ha$sHI-$BraHzs$ala z0v{;BB^90SU$A=~MzH+U%m50)lSa5~m++_FNMoB&d9#8WLb*_B>9HWPZ>HDUPPOtmc_A0?x@N-=&E|>v%Nbw!d+d zHCWzm^3w$M%f?ze%Xj^m1=Now6pbT$WHS)V?<6+GnC}N0v_L!G zyp9=^I2MK`v)dR0h*=T8K6$s~GT3zbr417R|1BQvpdl-0t>Et82j?$wK-xd{6Divw z77|Lu%^d;TF;}0#k(rwMkf|u&p+Q$jU8pAni3^Ag_b2kAk`d+?{tnz^qm^!hA~`?G z$S$~vjI-!z(tHO-o)qBQmb#V?)GSF-S9KumscRx6t4}FKqvNP~z(GAWJc;XciO|O8Cl2JiAC5xJrIfYH7|pIw8;wHC-vHTkP)T zM*b#b8>su1?WGvX=ZF2>g= zK6nrs#fh2#floi*nIF72xPcH`mT%<{J*4ulMK{ zWBP`y6;0wCN0b62MhbwzSwIj9TB<1YIOq>rA%v-3eGM8nenBEsvo zn2v{%FOHR?&Fmo0&}a8`4g-sK9U+u+@1|9@7~F~k2Qe}jO|chF-PWqrRq&81ay@YA z+|#N47D6#X>FY3?M&s!}Hl;9pf*t>~Up}7p+Cr@+`EvarAZO-Es)TD~lV-E9cWI{L z{dc)#GG53cx}2=>M=s_I@EPBVz>emnLLiQRyBByUk^MXM2vUN1@g#kjrG7VD9rK&G zs#VfJ5Gc#E=G==yhC7R=-tH1kCptsy#`1Tj@U_)?k)+ObC*cl7%&-)0m;Z@h@5i|l z_0S8)O8}BmAbnnJZFQR%D>MEw{?>K`?pI;zw7L_fpYz5V>7%sS>5tn1Ab>Vz+LCiQ zWXM>lzk~H88px#?4Hrp+=ALP^Z(^Zw)D0`IR<(b6oRoObqw!BYVrzW_B;xs4R+W|# zeEB{m2!fiqz7$8ITsB*?UeQ){&-t(MWY7LU9ljoQaSctwq+O26K1X1tvI|Ena06)I zbkq@0-Xdu$_PA&blJN$IYAx8VSHaIoZc6SNE-s@u;j`IolbnHq8|0$oqa!XBc4yys zY4_!cL>){}+qr*a88kK~@@n1$UEl#gi;(bwvY;#(fD zbG^!*^1^;v6i!Bb>9h)f3btd4DnM3xQ2Vb=jcYntQuO zyeyWgI}q_;R#RQi2gZ2z89z^kR<8wI9$z**VvVNN$iU;pyYF&^M-TfK`9%h1SF~HG z7mkCEB&>4JgnZ4U4+@_83wh3!Dh)bw04W;yVXNjNBXXE-3zp<-Mt4o}!+xxG!^e`Q z!!BWv`9!=S+iMpq&7>A_BXwHi&ZzXEB6SKbtEv01Jw~&3Z!?xueHx&n7{=jZJY!nS z3r6Vn8wcR|J+8YlF@0P(tfH^khZkkJ>EAn*lKM3=+^2<0}V8_YXvq{s>?e{)<1{W$$92k`836AE!>vr)Dpi3vrgo= zzfy1px%o~XOmF74`YhQ*!z!3B+Q3@By$dQ|eltQV1FHu$@BT|eE+zxUQ3Ex!0l*L< zAf%0WI!U2-fjkwBk$|MWepfQWS|H{||EJ$lI&JDR{@wJ#w`83ToQ7^6BEMvX`|4rC z%-)sjb7ib5yQna|PC32Q3?HmGiLO~?E%e5u!kzAeK06jp`r z$qXMCXlKUhd@K^0-jsVm6=!n5glw~)mpOSq!5q4vx;zs;nKkfdI;E|lZ!l;5yHjDZ z%>4E#Qr>+0(81*J(WvX?$m2^~?(677_2lDjm<3z=r3`NoMmLje~7aOqZ^Bc3AfExiAcx?BL z9pSH_nWqSbU_g40(?Kuic6C>{o>HflzEh8Px5XYY`GtwtMzh7|tLl%u$)uxSjF(`4 z7SZyOjn#N8q8{W3z3NEj9wrNuK9ZgSm!Gu#N!1Dw2|B>e;EZ6h;}{1wQO>D%#Wml$ zkvhnSg-N*}rb6C>MzQ%bm2V&UF25c?&w3mChjw{s9<)gM`Mo?0MR6>4=kElxOuyr?ul z*=6bQ-$Wa>auD5aL&S3SX`>c{E!xSarzaq_BWm*0XfWYDGCcP4T@v0s161#6izK&2 z{hm`n&ggml>w)^3Q+wK0^acBwQ3>)*r+uZ#n)i;ll~Qr5ngZf2A&BdHmi2K3%0saI zxXBPe$eG#>H3bR{H^HQJ#m zn`!@32Q!Vnh1Y1!9mHCpl=D^Gx$pHkcEB@HIW9lV~d#sZEvz8h7zIaJ~4ZginuNOsklT+#*p93ZnJm(hynHSUtz#cq5sErZ<$!F zub6;%3gJ?2a}FN-X5)BIMU;iM5z!2Ie^4_z@WR2skbL_L(7pVF+`!mfWG=8r7gQje zbAhG01R7|RD;+>7Y6X-^rLER3**njxiV{p=n7z4Nu!N&uK0#VXenCGO#X-U zW|b}yyUg78v4z}G^d|trdfdAVlF+)#Y8+Dw%`UqPh%@V5^PkfYf+Q>+aY^I5biq5O zZO_B2ma~Xd8}U?DF&?V|Tv9YfcYbAXz7}^~-5nz)-wewIAd4s&jL(j{J=6T?zB)g` zo!Hzjc1H&OXbm*{eFNH_}k0AUU9=bt4E>+ic zwn1YSpog8Z1oj@h!C7j+>Q~5jDXQkW^6ohK7e~tmv*#R_Wu+&RrBc{Q`oyx;0-JjUXl90oM@U%b8-Jp(6&PZL;f%wS)#nSdtjddPe@#~IRb3@k=m-GjqXt@1hK7<&v zR&GEFr}Gz)qWidchdUE#PpV3=_hq8PJwHIVI~S<5z2{w5@tWKr*RGRwez&I0h+yUe zw?)og1Y8HcG1I35htfte1ps#-Pg^m)FNv)A)U>I zzD7Sa=`=0hWm0-4oNjt8b)xfwg-@Cp?Yc9p8IXm%o-5(nXN2RrXERV8-wFWC)V4SJ z5{#mvDZXOz$ofXbWtWfEE-7Z6XKKKLODDRk6+>{*J7)QS$hXtZtsD~7sty1wfB2Tu z)!t6O1YH0=*sZ#Y1k%O2PjktHO3I>M?qo@fFIu!drS~*OvVQ>Yy=XyI6GJxs<^l%( zjKIv!Y-+#Aqy0YO+u;(%WEUsgw1yfuMKw<6ejClahDZVMYv-rReYgiN2>(-bXr;Jb z)g^Y`aO=Y?bO}^q0N_H4ndV5s83%YQPHtnGCmTwOVj~C(lKPjjf1o9Bp-2E&wnfLm zTD=DSZ?R*l+W5A=xj_`{ps8g;j-QqHv|MYDgP+?#u+@pw%4t_Lf5ER=FL z@c0DCbV!JnQsy6S(GH8MR&8v9oIXF0CXr(Kg?Ud(T`60?F_Ry8Yh=C=IwQx0PVH`6 zyq@2Qyz7R;yUM4;z8Wd0*p~v?l^Fey+YcFh9#>kksI%#`&<4&;F5|)|Ed8<*ieGSn z23P@@Rf9)HY(HGn*uz+6KSazUrfOcr@{~o*h3kL8tGO4><~K!M0BTq6BvMj)CsEGM z*hJ|I0;(RsP!=6;hEF+9VArKXz54_8r+<0;Xpei`hc?^E!X;PA>bXqWEzqU<-C)dh zre}qd9mgyk6&;{G`LgiX49|vvSP`a&2QC~O7-dzteNcI4T>PD$zUnjo`ALa^sWd?1 zRcQEcs07CSxtqE3xAMMi;`o2Msm-L5n><}aELrPVw*N$%q{+-R+eZMA7Qi%0(CUNN zEDl9n%Z8qaT1b{SEH|qwnNhryPk&1TXit7!b{}IB7VAXsAI3sUvcxE!@8>i(??FS=mK7aw z$_!dZj+K<`MB}!w79Gl*0LLEh|4Q^t5JZ4Q5CE1(@AK8Zc2QfWw&q=5=P3=V!e&(m3+Z}UZJ8XowK;xh-)t9EJCf2 zrEJ)9adipOfmJGvff_4dJo8<2wi`Y9tZ-EH@b+B!RF=P#FMoqI`w(eIwb!bSJ6c;E z(xYHLc+Tz}iAv|^Ki)`Ne6W!l9sEcTg>4=20D5~i-gdQbX1uKdoxJMP5r^`h zn4u4}{CDA}`C!Wr`&Y-DZQEJuAJp3FrO*lqSyjvIpvU*!7GCbVtN{wb)NfD)u_vN! zPJadztC(+B@je}nepq;Chk}ASyTxAqM<-}ZQO>iJ5<@=0Re$(h>DzAfW@8p5hhES-A_Go$7k%Q=UZq17BBR>N;1*zhX z*9Jni3y?6;7VF%mHhrrUI)ToV;5s-jHiJQ$>PZ1o@6qz(q z4{Uiok^Zjenf3dt>jQ5H1JJw#p7*R$G|z(_P&r1R_y~!*oo?JUDaRL?Q^W}}s-tnO^gXw(L`K=qKV)c7kH(bZ&hF+qXV`Q| z-$)GqEg5;vg(4V-ll~Jm=WL(rO@(4crT_bB)Om+i076KFjkzhD{!u8MzdrQ?#hFpP z`#+6vU&z*BOiXErppr#YzUNCPLo0-Kd3iBwAyrHO^X=qWS}6$4Inya5G^dkz0#NkG zpt~f!awM3s4cI!N+t!Y0?k|o1Pcx{PA3}KClBO!GSpnuUV`cgJB2~&db_o`J+`_K4 z!<0~>XX*ziaD%=s|KL@92PQmFC}ul#_{+2gC|i9PpJ!2jvCR{VQ`UMS9rvSGz!@1AVjx32A7FaQc&a>4&>= zJU|)$<(N7Wi610nMpLfkSr2L=_VcKJBIN}F*oIF%W{i*fO<)o#B+B56)*hG!I04S* zBGO;nN_Nr5S&|{BK1$@sIRc{!Ko7z7$TdjlrdR&v+jp<5z7zjvOvQijf%%N6n?-A= z`X3hs-iwuvW@G>S1KKW687XL{0c^>Af!muVVX1*OTL)*twsoiIZ}Mptv1P7nAa1Jl z1Q7Y6DoS??3M*r#Mgs=m!V?3zXAD-)O}*~d%!(fZ{k$;(ZE>a)yXfkhsvi=HiGh_P z-tJwV^!2XX-X^7ez&$>B#Oco8#7p|8NZAlb{-G%rj_~zOy4-HSO>VIP#MdQTascb@+ftNUEC$f^j=ph!(DF1J z_uceI@PzLB)!VDE`}J4Ml8=Yeb{Gmkjk;KJ-d_w3DsMnap6$ft+5*8)&ivVTIYvt! zlXTY|eLNW`E_@0pm7@M5r>hK%8C6rkD98vFrS*aC{qBScv5XwRJp|h26?%08577;2 zMyq8N8GcGGfk2I0dkf;=!fZ^&MXthV>pINi0ptdA7ZxBjK0Biigq2JEp~Xan}dVp7LpvFEFXdp9Nb?iq6GsXa{wu zAzHU^+6GXsfbwsDJYplLcX)-1(fLP@%c}s%PDo}3%D{x+1$cKofo^)s%LU>5 z^=*yr7BV|5?6Oy{<3poEUkMTXD zy8h2o^HJvSyjxc{9jgU}Ockf{jfd4lfxs9b-{J74%_RvFl6?FEE=h#8QeKyci?Kyc zQc|La9Xdq~kW=1C9gXb3fzt6f&{L4LwQz8XT0DpUdHRKQ6LSQ0-Fn`+l}30`nFzD~ z->v9?g;2|uGcZ}Py9tiZP%+-y`o&ZhK-cL0B3@8!Dy-ay1G=`;@TN7;R>u0O%ZKFG zW<*dD4!@@6F^I$m_ysr~Q13=7*6ifR$T*hxul+LU{tYfOa{Z*CmLAE2+u15PBW zyg69!rPkw*{0er1&=L#g-)f1aqrhd^YQUzWdCq`E0V$uJ-}++s$6ALnh?gQ2`Zm$YiJ8;JuUj?h#%}nh(q>Ur3Skl zbzWvG3btvwpqJP@0S1RgrfUy7>!4v-{YGM?TdsvyaTZe8+NVPT$s%rsroY#s%ZNK_ zWM6nhKV$rByTNt@;w-l-^HsA0@g0AFXJ^!3>i3QR>y(%Vo!-~0(cOCt!mnbG!c|Hc zSy)McO7L2MK#xJB5qku~V;fM`V;vv+t+-7-zEGlUbQtEVmy3f-ez`9%cs;b~3NRuF zvi;?gsUGG&Ki?tegHZrz*hOZ4W3b|rf=G#y-9$s|fetUjRJNe2>tZ@+yv<4A5jjck zT|P@qaCKkeZx9?VzACd+jgDq?eXhP?1Z91Jl08W4DB;w;IC0%@p9Ut( zzC4SL>f2Nfufx2|nDEx9%>!P#z1pM29dc3DdB!uB8z#^FIK$~z zf9w`dJB>*-z@d;0Hc{ztjAV9IpoiuI*fU}l^`b1<6`1#U6R=pawn6hL#_?GNo?-U5 ztM;V;->%R`y1`$8&|?oOZU$TBl@Ml8%3S*o{c2YaVCoBn7f!fn`w7s5nSl;qwKy+y zNjr@_4YJl9+Ec#uO1tY}vdfw-*}SeX6jBw?j@BK;0G}Gf4_bZ+sU6Mp)R8Xs0knQf zwQotbIbfJP)#9ZAVz1ThEIiDuGodYxd);KKm56zE@=M#H-`eD@mngKjywQ`XIayz> z0EeN3mx9m>cBKsSO{b-9R%i<9?b<`dt2Z7%k=?fi5ZxODHV7jqi?-V-|@u;6Ej$U^K(FwEp=gM{O zbTJoT-pRZkwtO$Vr`}{q=53$6k9ue`LyG^{E(5empRgN+tG>1y55kqX39BZ&6edb@ z)meZU!GsNItBml+vBI*#@vyuSk^m)iHu@m%xoH@iepZ#|=hf+r;AS+fskJ9t(-vAx z2kZ@6OlOFhZW^H&_X4~6wCb72JK2+SynCQ6xQQl9LW#wOao<;_%pcnbQUg z*$a1&c-0|R?8O!VeO>+MC8zoc?znQm2@lm=rY)~Kj=m74_5-TqPCSd@-)KXOud^u& zr;MUveDD0Xjqg(S+ZwVg$RYcfP#g5z;J&+e_9hs5F3L(hy47ESLdHwLrG@$g-ccLQ&>O#v(Kcy{?TBcITmU6 zZ||iGq6hTI@B3Hs6>y+S;mQgvUegbV9$l;n^1MTYwo|CG7GG4%;qTC5;PJWotn?ZmX@=on_opY?%nQ%6^(o|(Tg1Iwpx(;H!i0nTT%vgO@K4qN zN-q5-z`*O!6kPT<@AJVtGFJ3`?6LRJso04&jLg*Dk7hdB%Xu&LG(~L4;yQV$HS2L& zM>XOSX&nD1NWb7Oi}UhvP|$z*z<-`lv`P+_C7Y z=jrhWi(#J&AE${8|8#xAcLusz6D}&<*h!0lZPuQz zvOMkG^|wsE5s}$X`oFoa?BGL7ddU3;y>`Q(970z7+lO@zrU4>!yFoU4(B`dp?3(z) z?i+2t@d<5yluwz7JpP!`({iq9$dA#jpEqyL#KCn)yrf8+LTkvE69zA!RYc(pw`I%> zx9=Cq;;66YmGEa%zZl%v9xIO4H<9ysz9horG(6ja*jQ#qQ&Ub9ePL3l96QIlJnA=z z(J&Gk6fW)N25QWS9@@VR{FgncOy4+_v|^meSbl;${$l%VDJb?MUh>Z@R}LL2 zSK1k=AEp&^K?2L#1s^h@r#HvHYO6YLRN`5CMQDln*eY{!$u?-Ey8xu}f-a1c-+BaI z7yA7)o=Z23*KkMs97^A2=AVoH?O|+&7)1kZeYO?gN z*UiSs=*9e7dL<$5OB!a!bJ#|~?IV(XM4@h7(p?VkN zrT5oy{R}x`#+=6!#8w)$g8G6G&$@iqFFD@29EdBLfe_|(_r1>ZBfxE# z{hw#wc~s;Jp6<021y|u$pTfA)exoz)b9S>q&a|X@{CChKr)#Scl;yF=a zcuau1O4Bc`_vR{D0~6ALIhn(Fp~0?U^6Ih7Ug{+a)virXqg^2}06aY0owRzGdyl zjW$d_mNo49-BZzJFEHP)x22y-*H)kTV)O#t`x1q#t_l&B$8%B|yS_GUf20Q&F=yq# zt+pF8%l@Lq-MBg{F=vBuJ;zqhbtjj_iOJFU@@I7GYUS=>*Xt#TXj7er7*?WX0%hz( z;Ok;+S+~ghcXA{Mg9zl+?LKnu5nLzHf9}pgkKn`_RsJ>HTH9056kOUy2*Oe1TpES zEAndXDZ{q;>)M~$V-o&w4EyeTH8k7#w_I)-W!J4$%LZpHjKuk;uBh*y-`nuub`IHa zfSzUB-SKH&77J#5xJnsTLXb9=T+2u}fGpN`o?D#a=Ib(HEppLmtwO&(`=}dq&NhNI zV+xi@D6t%(kzs&^QVD!6>nHSv9cBhqGry7jpq|?ErvHmdpv^Gg}2N{8WUXES5idCQCWIZVZf!_9u~c=Q6v%D%a{7`v+NB@ii)606Ro(h8~^IDGx z_Bn=;8UBy5VfMvRZSbq&<|K_M6P1D|ZvV}&X$qX%-#Yfm5h?B{g!4~@-@Ad6)Yvck zRDOvxTSWQ^V`;5y;tzk5@z~o5GdnA`WO9IV%LpfuqF|mDtAtoR$?vjnU#ISrx{`Hm z2L4kaC!uWpfa>DjKi@t2s2L+FOI`#ltWl&Zc!s~Zx8!T3I1-{VS`ZJZ)fK^~FN=)q z`sY7phk>&SQm{RST8q1{_4NPwBdTTO+Os;R6@GUFvX%*asoBHrX^$n>Bib?1~UE-gtU2bE7tj%G#7znGk;IDby#U!c? z?4i-l?MMVKNHGkN{vk!=KYgD!dUhA1Ac7AIY{9%Eu^RzcjKHCsxMd3+C_QyQ4ej}8 zZ^)JEZ(b9xkNptY+?R2m+K=TZ^Hling3gf&ZzKpb@X|Y>_T)}$v*7Q;Xp4Zj7)NJS&x^yw4u-sImqK=; z1Dz;a+Zr~2Gw%}JA#l&A5Q5Go~6AbFOncY7Z4NaQ;GEq#m0_m+Z~?0IxPPm$z=g=`!;*Dx z1X0WB1J24D%AyR~&0W#$+K!m{ivz`XVir`6PXL1}!fTuO8a7s_gjfr(3}8flIBYw| zFW)m)ffG5C-HW9;;cgwg1iCzxGuAO`Ws&MoilHyeF|3!Jox(&Yd*Y3w(WtM?GZ|i( zvPQZ>k&O~F-#{IYk@R%5gxz+$BN~0E>4+FK1Rt}MUh8Y^cR0J84f#*Fh#YM2%!7qO zOBfxyA8G?(CFn31N3En2sBln*#7#R@YC#toB2oHU2MdBREas1#tAdeR$5j5X zww}=4j^BKRzhJQtNQ+=xmErH$tJ0YHb4esUH*}CxgDC>5nLHHBHE3keO6Ak@96l~$4ycrf(l0Or*$(u{Mi2FudX|l zB-}1uI_sbIY?4$s&jQ+)PM4r?dd=b7N-h}pki#lEFrvZ`$Y6srRkQM73r#DI1@I9D zmSNEvr*Y$I=d`lai)W>74tt604Tk$@ZC2H9_~Y${9MD|ArLnw6j(I3C0im0z{zstW zbx0M0L-80R-J|lvg`jw)pK=b*=c^GSeG(~V-j1@Jw2q?~q*Wg$FnAqG({I(MpLK>1 zIGsggx}cUc-*%ccTp6iVyb&UlsIvNJr+F!K3Jt$k>0dgWTGmMA*P`qAV|`)%uTsTA zt5e`&Sl=P&)g#w*+PO5bgSno+`=Pv@K~cYk*oqK>Sd99hp)>3AQn85ha}SsSY@s z%_)8p_se4FpxL8?+CV@8jo+QR`xoerP08=-U#^i6P8~B_ORRD{A!s6frb37a%tojN zQS19Qwnd3z2X6*=Cysywiwel`nQ7(1Ov>+x%lzY(JnN50mXZC>FKVR#PIF!7LC|cI zf_@Vn4~)Jw`Z$*bu9;E0+&UFY{QC$nPGvD_C+m6VZ|cVN4vUh({}DR~FzmJ7xKE2! zJ~Wzt!O{@_zD^AW;F#yb5fv`8M+K%PM@2EqL-`= z0oJaX&xUBVGGulwH;zsWL1lqhw&JKNc~#DQ24BtZ8aUSTpyX)A09UbvTv!R1k@RNO z@K(~t!>88S&n_N1S;DIvtJ{%?8is3bQl0?_9vHdaRLRFEc$uh-?LlE!2+`yfU+Ib8 zdM^atqy&mzPnMN@F>ajey9oR=Cc;;QMncNALJifzWCN@&{u|U^M0KfFF%7P0TB5`Z>oRpY^mx*-j zhJQq$w1jl7uZ^F55ZFY3%uh*X!@XG*;Aw=qtesyH|6J3keXGk)#G}D@dWehecqT07 zn-Wll6@FdXR#U+fN4*Cat!)QqMi~T+F?P7Q3&h?li^S!@r?%4p+37&yQ|ut#(_>~N zCqmtt9TVXdDUrvAQpKFXk3|d=k*t2tm>cJpq64T6R#p(O= zpA0pD9sRO*dsN|`wv`!&N%^!A1($tK0rVvNT2DJUt`f6pz%G;rT)XB&9#)#xq3R2jC@o^QQznLfY zS0?qBq;S%(bXVl8e9cg7v?C)$I2F0O{A~ui?EyQC5Ckdvd_f=O{Z3!_0@d;Y{cpH7 z@;hNg#qoVEeO0EY40`nubcP^U`GbS31R++PAE$|DS3X+MoTFFFAi|g@Tpbrjr__`= z+pD;Nm)!OZCsdNk0=U6Ve6U9TJH*{}-eOh$gkp!VV?vWvR0UqdVAU{_9*jUXPVCR} zG(mKopLE=bh45PONTn6?Xcz&M0T9L>%cF47Id^whuAg|EslEyi?WaxTSTF_0N=U#T zOQKXn6q}`AjtzQwR{76=iWO1Kz?|NPAGIXkU!!TZVB2*++?~&Lw8K#VFJu6CxHIrC zJ1dKS7DEbl3^S?y$LP>FB2!_lP9pMZv;oRIF4UsQ6HST@)~!%1*R`iAg#vBe-lG*pR)rWMzbah=@E}-W~p}GQX2*_JJ^NP@(zf zKShqQ<9U}Qt!&)OUSCK*dMGxXyQoh(_Vi0xGQiQ{Poj&51k}>iXgute16cdzd}vn^ zeg=j#X+(O#X0N-lt{L!kN7mR2Edj0ar9V(Zch9t*{?M4;m%h4X-7xwf^}@+If(|a@4>vb~u2iyQu@Zl|+Wods`VgLpZjW+S1! z59D0HXmur-YNTS!oA9TF7L}3Tc?mAg7H>I9sLV{9LN>~}UtZ*>U%mvZ4Xr1-rjc*e zqk>p4GlkpZJy*vXg%N?Y;n01;HYk)}6%D6{icy?GF3l20<#8$Qv*t8x(B8r7gM$w4*x4&hq`oxAr&iv$+gZOv~v!m6VnP)xj*T z&Gk|=}zee=@4m16)M#loCV3RKUFK0THr>3v-oZ0UX9w$@92egduJzIr+qLU9!$J0s4`ahBQ9 z=T=q@_sw|3a3oajrEfOxKbhtH#J(8ccf6e{RfsC_^4?cYPXIa@T+xQ|LJpDXcCP~g z%ln=b$xLK{n+LNUW!u#8Y2?zevEjLDZ(*D=?YFlZa1%FL=z+d*??>OVby^fS(Li-= zDaIe8%dS}0y|)y6Osm&MTN?lRP4&l?-ny>qqbZ&61cOM-Ux^8r$?;G%&AiJ>BJ=q3 zRU_V*sgihfGIG*XNTKyGbQtMd z0~C&rog(ez1K~;E^K7EMfd2drm)?d(=7-#x_?X7)Lgh>&ks~!!+i9Hev?wiJ7gDTS zv$ok6U98A0Kl>`PK0D6Fi8J`VObC0bBAiMOfs9eLZ3ipAx?_tg(}SaJNRWSYqU%0b zd%(gf31ksWiiDh6s=J84efHqLth6B?l}63NM@_%a@%E_$v&K+qFVrm8M{5Bv4I;{R z1Wcjs^U@$9kH+3Yo8wjE5YP8`iY6p?;jxgoD68~)i%-&sKyfYBiTM7baM7g6>Aput zr)C830Zdlmjh7Lwb;V_om1BjA)(&jOE<3rcWEm)Pkqzk zBRIE#7hTzpMle82-kTmP+=DZ@8L^Du4nDT0g0 zcU~pN4+t`zB$%!>IivbH+`!382;=X>uv+JNn|I8GfDv{}B$Ir<0bwG6Ri~UWC(v9l z7u!}0DlKbkI$zf00PM_x=*PG_uW?~o4#jFi$; zY_xLuyqEVijQv0jfay0U{G?zI(mU})Sc_m>B!yp8{($Ki;y$wRPF@BEQucekE2q#g zN!ZS>6WW*6SZIZ($`KY{CoH8@p1J79K{9HyQ%#rv%&~s`nz4PzO9~5t zb}Nh8T~4jeYZ`W2#Xsc&?!wc_p*2=s;21{qIWhRw0zc-yeK*Lp)N&)2=h|rsu!)0` zwzc!$E|>c5XwTMRd7%HkbJLhPr^qkU7iH9689K{eZRGqP;{JI88kArW~NL{nvkvj;$AX4V<5xy8OSxP zDu}uoKlRonClXay_lOu3bktaU7F)Sm%m=_{pB`j~Z%u42^7LmT!k=W@QRTn0jTg5k zjn&9*8$h!40JqZO)0Rk$xO;`Kjk**w{Bug8M-MEhPvmy?3=TlL=oo^TTkK_6sy}wA z2?1OzFsY^L--!=6(UPGiE!j0}DHsGX8nBi~TjMAfX zzB{Uf{#e6kshH5AkTKC)o$Ra!Ou#Xq6dQIV3{o6gGbkTV?cRqe_(DzXIuK|x2c*4w z0e9aHJ{cF+R~O!bF9~*Qve?hZ0mTc)Jg%(=V;ai6C7x zw&#RUEV#Vbp>Ko-#~oEjgEF0%z6>*%FT6x7+5hriYPb`5*^rjkFGc;nyyPq~ro@6V zD>z0FPZC>bG*>A^eY6?Ez}sgekW>W}u>2*QMet^k5y#DCklBmd zi!ivCk5I+`@{`v}wS5V!PdQ4dH}}*N+T{6;k~e9@Msq2bLVsYo>aQIq6}h@9qTfR{ zvVuJYmY&@Tjxw~it(0yJ6>qV$B+~8lK%(s~S2lcw$#Lxm&zQgMh`CDx|9qeD_s^fb zX`%tfq)xK;L`(34d-X*xye(=hAOSI-d?DuP;gR;aJu!`AX=Ng`>iSk0Zb9|-cG6Ti zE1`4UG^4E&8a$Di2;1Xl&=&Ms48?3=I*E13$Nx4}E&FR{f6mR#gSJK0;dkYrG|4s2-RZ=&N>>GQ8hI!Bc;}P6F9BA4QlibuqPXVia)X`4L&dUy{p!nFlJ= z6^%5rX~g{(`SI9NJ)+{1UxMW4vra}|0R!}EA)rnZLc}+rgz6Ea^(IV+v%BIQEw;qO zJ47k5S2VV&*l;C$MzHzH0lqhnPOZOQuHKmysX`_- z$pme7D|14!(X>C-AMnG4It%H1U%h|!o~fY*0Z7@u8#jijl#Jsc^h5Q?7Q(LjL3c6X zeQKk3ZbQl$UJ)_iOd#KfTbrz6c`Abhh#?TAFSPJ?|7=D#s$>8dKI8=(`%KN$@96IM zi)-4Z6uNy6K=f!;M}wx ziDw>aS^y-^@4i#Y@okwvy(J&)sA#k@-Dmq>HQ12yRTP&^Hz+r`EN3i#(H+VYz3M#6kvfttV$raS+& z8Ntdv`jH?dA6_d?i2hCC#9E^c#I4tpCLz>3kk1ryq|d5S@D4beakTtw7TFjo8FtW? zAcThv^vXKjWxlF$Q9OO01s1e9bOEvZVD@+;Y)UYgIRxT!O}=o}Lb$BYHqKr0lMf!N z_F8?Pp|3GWfi1Q*be2ef^N_^OEoZ(-&mn;CwByZj@eUEUuF*T2Ym4rNO- zOs8LN2E#7H#HdG<_$ct_uU@0KZiZjsC=!SzCTN&kKHR7sG~k#=18wexzKY1OSNU5K z;EiX7w*MpvmvW53^L+ev3_KJc^IBGL-}u@6F=p%?e=~9}z$MBjqEwF&^>QWr#d}^k zgb$u{yCIOa&juas>DsP$wLjhNvYmkZkCuj{Mw?oKIR6*Ud*YM-2yn)B!M`YDy9TC* ztO%z+?uz$rybk)YSR!b&bow2cbhwpTl%Dw4f!MTNB<3+l(P=I!6INwZ;iExG1!K+( zA=xzu$eHkR2vkPrN4(Sd#TL>aIMt^}!}-o8#5P}uUu5GZQ!n%G5at>t=WTjleV-1p ztS(2P+V3N%x}JI-(FU9fy@?Y0B~0()0T)QinDudXInfHMPIgdsBpfLwvY^B!$SlKX#@~PI)Yi|#tSaOm+snzmm-B=43d3!Yj#wpSZv_&?rDkHp^KW;?FN3 zl%x%mGm-~o-7P4cFv0And(OwHD!kR&K)b`ozajR@*cmetTKf8K+>r$pU;fiyaaY{R z%=rO-!MetD+%+4Gm){|JyCYE}h{t1+W-Z`&i>{j4?=l=$Ul?-5n=amitT+Z}Px={G z0UPDS1H6F!)UCGbIPCs!DZXtxfZ6=J-J z=JGnAAJ-%9EcnfV5Q5?NRaR4MU9tt;N|1&{^t+oRn&7BKJoE~EiX3MVxn2@Ut4m9b z?y7iR=l*oZhC*K|T1v)vUE}i%HjD&!p^=+^d?%CI3ct|!Y-%_YJaWMW!*!7zEKKd9 zX{8_`EiOjq>Y>v!`cw~1_>7PjxIM*7A;$7w;6oFgrqB_d`M3UI6UxlFjjQcj_`1i^ zb>&sn73{WS6*XcwyWKKu5jT_UHnhJPk0Wt>tKwH|m=sXT;HWUdfyQBVBl~dgqBMIy z_95MQYFv04X0ve~_s7u^YikJOW~7XVSGIlRoG{VBd2pV+sk|(@XLgdvyphU5?k2OI zyKT}b%A2<>)B5RkwfEv#QCt!#88D0xvN|38RTE&L@uEwBA;Mzzh32p;)raE%{UC(k zrxCsAF*KsG0-S~jIK3LJ?Je|Oc^h_SxE;#_N%7c_!ZePz6957TL{Jfd67pG5a(T7oh^-eROS$2PWZAzHe6Y_3h+kgNKJMNwPRq24$OMq z+n?lgDUks+=*Y{6^-dkA!5k1Ia~jah+l>mZKII_ilAL`IyXl)1h|zx175S5PSqyH@ z7=}l4@woont@1+fav`W()tCCN2S`_PdBQYusJ9>E_QbCJ3nXgck@HzuDNt0;MT_i> zS9!mzRN;Xs>2={R0-6meT$ttYRCG_6H&R|2<#eidmYB2S$zz;*6XTAj6n9L1$J2UW zC27_$Vk{bm9gj3lR6cv?D0m`T+6N@SUrj2=7m^!(sgoa!pd1%gE0ycHa2u=?&(s?lXbf5?MAlX#LkOySAsg000YqobqdEfq+M7H=q-Ob_F47}&qDRMVJt%0s1nS}-zTUm}L z$HUj3Bj|$P<3?t)fiI!Fdro#)EqtQ;_h1y;0s5bTaYG?Z)XYCPk6(4p)A`d1_*WQd z=(K^1yI}p)P&G22%JY(){j=gw`2fPLvTd#gFR)$R)R0=qWaq$eqW&`BU*(@Pw)(3( zc;2vR!?VqAgjg!+bT3=HwzB*&MWVe(GO37!t~mm z2kd%?6)PZN1~nX{f#u|BvTL$oQ+muWn17g)TZrHo&M9>@RHn%fd!VXK5%3yxz5S_QSuu>pf-(x&E z2!u!t>byvB{T#mp1>Gu!GSuG=OOer>ag-W1H1K4HcleJfYyW;^8cA{&9Rh zRV0fx0jo&T5RU{FfXB+i!ZD;}^S!I^#Qln+R9@SST7*J+4^?@#K&=#2IX%DvfpnA3 z=xl8zV&5gU+dSLNWGs*7^~cXQnFu?JwzsLjU!HZmOn5Qwe4q{gy!aE}%>R~a^k2eX z3`H{i$4(b3IhM7<1}K=QQc3sgE51z*5%n{Q=!2WIrXU1{Q*zk0mj_N2a|0U(AWcEK z15Sd^tJ|WIx;?kC8NK=23;|M}NN$VKe~a3Wzi0};87@B_`1H23lrP2XXm=6+HDai- zr3RBZxP?NzBpQH2(srj3l4|HfK|_B~%`{2`zFGg9*|YCnavKgv&wkOCYG8y4qi)I8 z3W1ebb#^1u-y=m~6Fz~d$ve8^zt|)riNItpv8qKDt@1IXZmW8&LA32VG|N56?V{0r zizNK#zMM9AyhOmo9J@zx5$uzdB|M1Byp1!fC!vey+5X#cZEZvP)t}O06rV~SaB$Wm zSMytFLjx*wfe-YQeVWr{B-k*z+{svxStvNUNy<*RL&q3YQpdT`wN&xj~9#V#Q0d1bArr|NgU>Mvo#j;~FJpwWyR zlq&x^M4b%KGW7{OJz4U#OeWKBTMyLYD+b;DwLkU8)`y5fv~F6HMKpo!f|(I#>=tQE z`rD7ybkBq-C6DRQ!+{s`DMf@zee1{1zzi4|q#rmo7(QQ`q{p8nuL`=W#+<7zHal)r zV37a78-sI?MlcduUB1pe_yC=`E@UOLx@`t)_hrF*C0iV=pfzTxRY4`VOVn4PWEnNR zPIYG+K_$fOvYH%t~G_=tX$QQ|b2);c{{+=a$24pp<9k@DJjngVx`%BJNr#+N_ zoB74Tsid>|q1LVSND|8-gKhdT7VnIHv`!~yHV;Kfj)FI6*N|MXJAZz`U#cJrr+LZu zpB$J8V-obAm4|%48TL#)*roKh6BZiKgq`}wz1$B1)*D6l{&KgX(dN=pJh6JgspQW# zsmgCmRhbO%-wj603y%-42Yt$C67bDU9CmybzFb|@JTlCMrOxe;<_n3oV-rL%dZ5d^ zg$ZTHpPb{-9B(imPyeNp7e&M@*)-`K7L%#rU=e9@o3ioS{QeG=ItM} z8~RYhHFJ-OYvivm$jsSm7+=5MZ)Ea+Zo`)OinvMP1GjN+LjDgrN%Z4eVfDxYi*VcJ z3fU~7C)}d#DzFORof3kt^iXDhWEt-#zg#&t?P(5Ki@a-S-*FFh@!dyeUIppF9fk16 zX*Igr`AJXvtap0C%MOpI--I4Rx+`7kh{)2a_&|^%yRrannq=OGM0QL$|V(jKi9P(V65r)ZarX{Is(*ArD z-}AW7-TP@&<=65fQeyoF-;z4YBUGKH`8YQar)b3yKxeJJ8XtUv%N0YcdcZD3n4gt+ zuu7J#*e4Gz{>wn>FOrWm@F^2Je4tf6ERsnHZ=nONxA2`70J2x~;vB!U#{E{=WFRq_ zGfj3%jGLJ5-=y)FXb#fJfre+(cZ949Gk!m0Dz+Sjx(?AZEYf!^Ac&6Rfe0@gNj4Dy@3;?}jj$s>EZj5`aPK0oeU zO2+1m#b|s!&oU_PeP_cqZkwjCDf&-v+CnxV*r0oVP=EsK3KVty=js6l>m{3XU*3J~ zlp}9YI0R?vxtX?k`WP{P#pOf54S{*PMfEn26b`!|Al&-Cdv3BNBufdfNja6LMC4Kb z@Hoz{wumjv)Tc{U5q*sQ2qa&sZ1%pO(xtNe(H#c|Z46P4l#Nxq{fcBtx|mtzsO6m*I8;rPi^=50;H$hXo^D>=DCX?Yx@RL~dj{M>gzlR?D(FojSB za+hW9j&5wJ0TvUX2!UYgEb-Mcfvo^hVz+k<%J@1+rH0U+rPWmEfbpTpk^JNM^Q;KP zOWojp?f{u;U-uu_Y6-DKwe4aEb(5h6guBKx zub>8q-v;L7^yOql#Lzsa=sKmo@O|w3P1(JLgnKd0`?69^Yl3&+pQ1+Y2?ZET!RNIEPXz+Aqyec$HxTc<6uuH|K;GHC%>Gm9L&kj&Y3IjsS~2IjVca3q9&x5 z&c@MaY)#4A_wiXIH%_A2dX>R)dr6(aX4^Ihc?6Fi`qQ*tT`in+0~h0~@31LSX=lmm zPyZBw1KPUW;%u?=I*PTt0!@QW)Vy$<3eJ*(_o!hKl>L;f{OkBe&b~vT5ZqyOE+tKcj9I!{^eSD1AWRd8PCOYn@U)f_2pQZcnH? zjdiLCGXbWMdytRXBZ^NmKwJq&m(l-mq6ci2lDN55A3`)r+gO$SFCPVli&>Pkh$~N& zKn1cbIkljUWVA|h#y;(r**Zq7gnZy z(Dpt9YO5^d!@0vx6{_UXDWMQxI+G}AjMM)L%Zb~mCZ3>ssj*yD7})}i;gaF{b=%_t zl6eHOOPBjmSjRef``YgAE*%EjVo3N)i&xAXISzs~wCJ6%7Ipg~U-ZPUoy9<&)2UTD ztoRkpO4^0|EE?R!`0P^{R9LBuk}tY+kL0HBRdA4xt}SkS1IpDQhGGkXw0E}_9Os0z z$|0Q$9aIT#Jmqpl(&4}t$3B8?6FzoMB05AN_5^r<;PF@3!)P*zhpM0(;)pyjD~Mq0 z>(NOr93pS!s@hQ-X`T}4knVS?o#3_P(;~SXjeOzECZiU^2vGlivJ=)m_9er_w?7IE zEry)%GOe=d@s_A3NczR@(EJ2`9SkpO_mvsArQ>G(%zUQ6IeBYYB*yO9QAC&gZSj@D zf5!}^57n@j1r5J{lL-Yd(%;!6E9ZOK`s5l9U}kp&s#lyK(yovszlxxo4MFpTJV!Ga z%hFZ!jnHW=)4NpIzc_T_7v2jInj3CNk2T&y zX3GbT77ZJ-n)-!H9~#Qem>Q&gM7TbDf;*E|n$~W>wcUDoy7fMtP4~Lh{gwY60i2t6 zTwQtV$R(CIf^le;w#2W|?RmJjDrs*qsy|bm-^D&%77byt@SW)NuHs27`DFTM5 zu1_ONW4c0bz|Ot7ma&LjP{}*EQ8{P>#fE*l-FlsH=YrXI>;Aig^7sa#BMprxuP(YDcX&KIvm!W5m3!k^8mr z60x+pd=X(&)-swb^fL;}*MBK@d)^C3kcUQoD5q2`UFWc>8r!OTLS z^|Q#y?e{_z0CU0oE_5EWS@I?>3ZvlG_J1T2qHGu=djgY7=$&jy6-4`piLk>#Zi1%( zN#8Veb+$bEwCqsvjjV8Sr?H(g54}f&IdB|IviM|XaKn?%_SnZREfVPAx0yz?fkiBj z_KI>UHq0ujINyYhmJ^o*JZ9*duBWwoK{D7J_BZH%n}TQ*>}W9x2&F#?JbU$veDH|G zN*g5C4Ffa-uIKo1ik~N#7J2+9@GD-&cirw zYZcrf8h@_gExvQ~Mlw9D&tEBQ|MIdtjsza2r*iFKOHy&C*RXKD;1#RZXhh&ARz> z@mS|~)>9qZL=>CifBGn8y-Fx-_HVbwM|f6m_t}At_aZgxJ{do8vLl|}*IA$DN57c8 zipg8lNXu`ctNZvXU*2b0<-gmXc4VbIIwn6vMR>k1ieFl`PiY~N*4a~DxnIoQGk>kw z1w-=X!i23{D;mO`=a?ORS(Fhs7xNSHk4OCuA2HfI{-v*C!@#=*@ORXbHnkv&vP0+S z!^>+j5JnOvsS-3x@?~PC)I*gN1=QCSUkr%=*3>k0?}v|de&FY-Vu4|O=RX|W^R|JX zVf6BTnKld9NydJu|CElh0kco<-J(+yZ9fxr4es#DE;y9JNdq-rmP=alQJc=|^UBvR z%!)rsoh<=T_GPwy)hZUOLz^4?KmS1J%PFzbm*Sh$jgU8YMeP7Z!hmU~{p=l`_O@?l z_$$p;)RdpEew?40(xS}F2>!#k9~3M&C7J)z9Mk(V2~G#-MD*2O_u?(cCXzrc(wdKh zWvStx33<{({?KE5TCSEA8tEF0wcX14GwamC^T4>LiuCld@6s0+=7b{8jQ%mSn=BJ> zG%B*06AB*smia!L(zAY%DM$TvqDwqF`KFx%RB$E!FYqbFE*UsQc?uXnQns&Z3DEOA z-m9CjfAQ9+S@F&yL+nNO0Qy3*wZ-1dAz0^swgoacjZzI7f=UsMkYBVi$1~`3_ zq4j&p9~rL&$aVv9sV~OmD~u*DwO6|9T7o0NMZ!FP-3b3a0y~9ai8go3%LMB5R)(;7 zhTCTgvs#N1e&|M+TbDS(PDp)BY6YDLl8wMu6{Q&g{o z@r9KXGG*Pa(vP^xcUv-ltbIn&+t^?5O&U?r17?(Z5*yv6u{n9v}4hD`Hr|p6uXX9hTWXFkX)f7pf-!8 zPxv@e${oEnqPRnq#N4Ho#1F=gI(M90@B4#6R4}{rqdx}VhvC9C>!w=O#_iiMT#P4} zf8tr4ThnrL^HL+r>?{aHm0+iMFO^^tafML=HTuAY!Hq2*N1Xfz)UPYQI?!^VEs6@q zzji-8a($ZS$+l}Xl}V!Z1$d>*m+Q5O8I<(=4_B+1eFK4lr==xb}v4 z$osVceyn*pq^{#Rs?ERl`x*Wt0dP*txF9GX{!UVMX}X!!fA;cg!BR>p^*Qm&qI9Ki z;=(Ov3#?psR5r?hrSv-cEyGb*UPg9`S9vQO&_%${ceVM{K~Coynw@9&OAu#01b6Mt z&J*9^B6ZAvYMwE04-Y}J<3{s;0r{Gogf2VHNm{P6g|^iU?ovNW_+{1VXjoj&2=Bb?JOQ-Bnc3m{1)+K)??+MQq2Ndw1Rd|Rba2~_WKslaJ8y1#@Ds|daKaaNCIHn({N z%h)T)j$eu_zek7noKT!6(n}phn@I<@@goA(isK_&KjGxS!NK)rKOP9R`4vAWA)4NP zH}woFhfw>FpEA9a#40P*H{KX;Vd=9oP|hdJbp1ugpX>B%ca(Qo8hWXF?eT(q5uGTB zWZ_ONM4K42&N%*v+J~|VOd;!}KAa}v7cJXQE$*-9mJW}s&Rrk^NVOvcyudlu)}`&Y z??*}YH?IURVJ$;~@!~{B zp{SVw*3wQI5Bxl_{C@4CrPAQPSZ`=G0iKVVPcF`_?o=t{A&@y{$dJxCS>sL5f4fA) z`={2t^4^jul@Ptl$IpL8L^{-ZhnluKMBRLFN846?gbe6*5=HNtE94FONRK;9ra@KG zmgUP7JAaMz%e~##ss|J=_X5+wI>rJ0fdTvc1R210yObuAK70gyR1SBA-Ec7iV0MPb z_)Sr_4^wkwpFCKne)t4X=2j4o9Fg3M;eL5??9R=OZ10|LalSchKsOSl2ugA{T$- zoRT0naIkBuLs9&zY^0aBQ~>_gkQuB6bjQkw#fQ`wh`^@CV`NDsY`Yvci}ewx5M^;y zaY|mG+xJ?N1DYsf=Slc%uHZW0F*e{Zy&h8N^h2|@AYpyN^SwzJ{F;mh{m~>5FCvv+k!)@a>=sgc;T*hlC0A zD|4i=ZO;iz6oh7X6nEPCum{b*pF3A;^aGNV?TXS~6zG6way)%8o8K%%?%UJXA?nYJ zfv~J9h7|h{Awa!@C=DEqDzoHJEBO)I@&k0u7hS-@-XmDdFA+ZaK%ddgCgVXiiMk=V zgu?415HbR+UDwmX4h_>os9*Dhm;P+B;OL?@^yxQiTUERshN=F=*Nqc)2-Td~ad;7ew8` ze0DGSc2^!v4_Cf8vDn_k=1P#{Y5J3`8KvyI-h_RR1UfTl_*VW@tY=mCgI9?6sx3-c zc)45mrI%)?&wI29Sq-*@VqzKVTxS<|gE1B~Y%kyx!(#uu^zK)@gqHp82b6%R^g|g) zUO#uH=&ef`ydhEElhY;6kM(fe@oycFZR%ja(R)TwoW`v`=>5%R0)R+fL6pR}61-F@ zQ6m>yaNXbWymt`-Sr3HhuDTn@P50aDoyAse`eOgQ>!&m^gAEAtRaw_0*7GdL%WDl-1ua&`(qQAR2r~M!cXE#H=9-v&w&@5&-;adF=Nus`lQL zBR!ua3j<1d>ZZ{7Yu9ygik>qdthjyon#`}Zm$Eq3^ETa5l=^kt*_M{2qz`W?J7IZ` zrQeMbBXgwc=YeeVQXU#fj|GtKQ9Rm%_47I~{m=NzJ#)~&5;httNUTo&U5U?dOK`Vm z;{-$b7*dmm*JtuWe|XwEMtSdtbPxPr7h1n_r?#=pIF{+)N(N-C*3F z+ncFhCQOe>hlu@@$C0Uyzlqht^gKC=BgA{Mm?ThnkLK0|tqfl!r6Kgj_H96RjkV;o zY@)?X>f4g-i+4C6;(O>y{uhyurH0Q_4+2p#DcGef5>BPGMG+^CNKePgqYr>-QBBz5 zT$|N|-m-soW2mB5F(zdk5`^PU(CerWz)#X_^qQKw44d@X0eOkZUsS=L^MG0dW+cuk zRHxJu^3#sMAC}VIQ~7wK9li6B=bi-mC8|+`Mkd|)xwE_N=O}M&r84|Ne}^cBBz|y} zaNF?9-)%sI(zfGz9=V^|CjB*x%Qn|r_ESy*%0~}W)___0hM))C_3p9vc7EB;r{KzX zjiG0sp(f;N>!&96Uvj~n4k$SbK6%$USp7c5&OEM+AQZxC_UKMZ)mrUr)Tl!Jmm=UV zUr;Mnrg==g$;QWLVZ;%MY=O712$W;zT>5qb!N36{UkQ6MZ#Sc8Mwmwx;WAOLVh01@ zqo!mC5e(_ZvW_2B{S-+!7YfwguyeER$ypjlWn|xUvIcr)c)Q=$y?TTg65o#`opDt0 zg7YPWT3vQR>9F-ztqHi4F=UANPgC)_?%1=#mm&LKF(AK(e|5!hoR5FQ3^65Km&0Pp zKb`_hY$!f5U*Ev@reIdv3iT06&NR{HdD zbteUjTD`5(00}xSE>`iL3$c!vD zWQYTg2KU>?*0@}ZmT&Bw!5LEK)uP~wMtXbl3lTs4;HAI;phvRHR{!CA zumBn0rjlt|8yhS!6?LC|6Mo25)Mgl>^&S1#*n8cf54Bzoy*8tHChS{_pv#EQL>#s* zdnqf*|0qV?lDeS#zN&uph{Q7b_lo6aLrvBJ(s*`VBA7BEl>O18*fYLpD4xCe;jQB0 zyR{TCYFz(vi{Zj^xwwYkOK*uQ790#xy@#&YXiBQ(LGpC3o5@~#{k#xb>6KVBKLt=Z z#w52Rt4A}dC7)7cV%VXfc8DIk`NPK{FZys^)+;-P(+K0(Q>JmI+ZBKQ$mu z`>cIYfH?h;$gpVxz=DsN8{JQA_I6^~rxOER-_9+lG|+tACyLbDy-i6u34 zNQ-kKnH15L5tUT^3y4q((k%Zd;AOqbzl;P6wBoC4J-uH-BNL_GAYegu%8>+l5l2?a z+B~%c`PgM@RZm@G%1wY40@LgwO;H#3js*ztS3bk!cQ2=1e%FWC&lJ@@^~AkE&(#J2 zBOAf4ArW zv&zHS^(8WWfs1-i+3&Xc0Sti=IJZu%!o>|W*{(9susue3= z61S_3bwQ)`2B1+fH`7lzlL#dX{~?62q7~f_pF{sS5EhSl@s5!J_3So+z5{=Ziz#6P zm8M=Bqbb1K4aCaWj^a7dJ#-(=#TxhZ(g!|3d(qh9{Vir2HF1kxWzZ}~m1L%KPNC$> zN0UD-2E^9S2A7Y)!zz);MdPnvs4TbSm>)L@`h~Z~xvO9tDK-SwYJRYLlP{3=-q;Vo z8TM<;VNb8}W8o~oN8EpP^CozsYkhRg>G6xX)YhwQjzckZgZ4u!L5lH&uY}}!%@)O? zO~J=v)Klhr`>eDW;aC564%ebgj|6%zg>3T(F25k{*kqM@U*6Mm&X=s!MroSZPap)l#wJv)#n-i90X^OmjP`irVR z?&vFhQ1)%lvi3|Y^p}syi+)Y4*2@GM@r$k1Bg0|*I&=oAGVx%ERWLhIFp4ps+Y+Z^ zY*nJyfIeXLYeR;nfv!;j{}$C|+IRCJ{1pP?!T)iphpG1FrFQ?Y)Ee3w^#d3oy#Jb! z>iqb>ri#7f*9!8_;>C~HOoUrm!xgj9&(JfP!YhuutYNmZ4y?1$b8I<%f5M79FZ3_h z0dldye(L(I-UGD&cyFh)b#^!o)!^HR;Hp%M}pXr!nwxL(sC9G*`!ycqUzM`Rm>suXBl(4-D{808cQ zfeGfgwT`ayYnUn3VNjAH^prs5Vi%ToNp6 z$u}cIMmO6}{+gVq!V0;Z%F8h_V~dLF<|$|Ts-8n?mr(F ziM-AG3ifCfe&dBt#Ay5oeKK;(kx>DARojpOU%eZp`g_Ij5*e^JYjvJ2g;%!{ldgci zKa$BL&K|UxSlGgF?JWG#t4X169)xzO<;vN*oq=t`-zNH`pDh2l&Gc%m?Zp9#**|-C zwydnNF!IiI16#T=LGMqif17u8)GYRWCp?VBV`1w?`t!IcV3O6`M#Cq^|0z9*Yx1W1 zn$Zgz`DxV#&HYjn_Z+BN^9L{m80XNb?d>;i&?<%d~M{77%2ky&P7S5?6@scD(YAxu8`vqk@@T~Til;E`v)h@EfoPvb%IxWA6Z%hU`;4&FpwG<9xy*yMK4fP!hM7Tax7#G5{n8{D5{fT|CO(^Y?K+B# zLk8gVds;)I8}KGOv39C~IE>V`gK0*CcPr1%K8Ow2v^CsIG!%=M~L;QAazYx7&t2E>Oy zSF3&O)?jnt*2(Kn3OUKzolcM7R`J@5S8zepvoZhphsBrYFxqXb1T*eP-fc96Az9j; z!s4T3gri82@2@S*PFqA1GR6CL;|N8su_{WR9k-3l*?7?BwmT!{zdsGvc+3j9&jIJ% zrj-gd7^l9fcMqU=LfbR?@6vP`z*OE%rHAF}z@Xh<=l`&;-lE6lNE{v?ZG)^-8$d-yfC2E z5v~7|ScbCS&W|$}=Is>)yKPP^*vd`(82;h`gl)es144`ay*DM(V}i|pN^ zR8S?J;J$gmQ}sqii^c188C@Cp4R=npG&~noRZ_=CZ;EEQJz;IzkDxo48+=Z#Mu~AU zw^*JQ0zvr43Q1QoeptQJi1+}e#(fa@?GT^Q60RvEnlB#a9zi*#NTDY;3iYahKIlfa zFbu4Y1mt17LF?|bc`rAJ8fLG~R#X0I?qBV9w`Cb$Naprb=vbLYIs1kdVom13h1I~? zz=H+NVQpOV#?@=O91T{`9x?JBLHezg6)$CTMkk)R*QP!3ysY--oQ&&2(HBzxIkJ?m zWIXqMY@xH~L1r|?$!FAd*U6(#8o`k;ku|K5oQqa;+%kB`Bxlq$ zCXI4f?I0A7sJ$s?4_5o$^T^o`BetH)8HT}L>|%59ELBy5nPhZLQ7e$GK7H+$4bf&g zFLZ5j9PB|8iJTfwsMs_S6_-DGOY@~^Drz~cBs@r#eF9H>TDd&*LrR^e$c!Dd)I}J* z46Ns~&ne4B?ekAUcJ@PLr7G`O-@m2La=iuPydK+S`DnV)w2O%6EKz0GT=Ceqx^)xh zZ($N+{4WoRs``!?IcUFmuvu2kaAd{d7UqA}L*B(_y%vsG+)M$)g!y+nIW?r;N~0Xm zE8=q~PmGUmFt4&b^b+gmTbE0K8#E61W*!IomC(z-tly*~T`#^4ahrNaD{e~RVo&%^ zH)yP2|MQ%k`WRkX6Rl%YHzpL&_M>ap`0I{F0|RqU4=*$4<2#PTg(U~HM<^K|cRtDU zTNNYQ>8TKU)~uJ@Zh;!9w7n%)i{N95gvkjW$0ANLp_E6_06m~9?6sJ0tM0+tl^6z-9SFO4BQaDlJb4wJ0m6;QU8FgLe zy!UlHwV?%n`HxW7?|2nZEm1mJ=G)Z$6l4x8-b!{h;oglwi0EO8in}WqG)AQV!#TLJ zE!*46;8Pv4;hBmHX~P{7Pu*pW$?)dbD%WVS0}kt3z494CS=VR7b^YsQya1wUR~L~X zt5sA!@i^QStN)UoqGXxKVoj^vCLX;q+TWO6jdgqbrgEXq(5duEy@($G zBC3Hkk+;n0+X^+yN#^IGPIJHPYgK~v7}t$Z0)}&P_|J*$kz+dS%agBD`lCOhDfEaQ zT_dXo={?i@K`Ir{`Q(HRX`|@B?HHpu>OKGccS+vOv#%o2V1gQRv~go*9!#8jEdI+% zcYA)udLPF9*TpgnTrDrnw*KZ7d~s>$4N3%kU4EAvvZgenJ+Tt!_1 zvfgt>V5EmMiojQ~1Knpt_S%^DlIaYEtPM6PvWFoMS_~v-;SE1MV}2|%33hsvzJkk0 z5Cg<=c%LKQ{Knh@Q$wBfT`$U$IL_v6 zK7o3|18wWMiBURp;232Tbw_Up;hFGsX)ZI07C$AcDD?{Lb6N2&=lo5+^~tXiywI(f z14;Djx1d^40R}p_cKeyv|KsSI1L}OgcrDwuTej;iuEnKgZOgX3Y%JH!*0Ni+ZDZMW zL&iUXg>Q}>m^Eo0-C2N1Cy^pPrrhK-*qF<9y1fE)0TYJf*0NkTN ze`8LahlRoGA1BVodgMvNa~wFSDbK+DkY&3wFN`7)jHB@A-@nORe^o`Q_FCJ@^8qM| z1p8;_he9F|(~dvsQv-ZglaNpxI_nO|=%btKq+NR2?!Kb&3&fW(sdvP1-~rJ!*zZ9V zXvl1`Q^K=s6e$m6q2W!YJ++MbT5hI`p@k1;@oUUd&hVWe;UODy-E?x0qXse9r&^Y9 z0xjp&TCawSf6g@S8cC1jKxsSdMpCe<6=ub$6ZszxP&HYYQVbJQg^~LW+8}qy1>$8@ zvOJ&8)?ilu{SuDETq{DjU$R*Xg+EljsUL^!X;?wD@R{)HY!;>oa9mI?5bNEz+x2sOPCCO117t%yJ_hew zqj;DJdiZ}HUzKw9){g#emjtAa08=ouxWRl2%&s|PEIaEbHw>U;v7U$!N1GA>+uZ0s zH$aJMxKGvlo|@y!JS#%uKI)B@2DJ$cWvvm37>v=d<2s9_m=4u@izCi>!4tr{SLRKDlf+h zBMdJXyqmAkzeDpw`e!MRMuF_I>K6~o9(6bC)B-6E4pk}2+adJyhoGrd0=QWH>_T<% zOVH@f_lmuJg3ne9{XqVgf;>J1JzZVWUuyBKTVn2+t5o`+^hMh2?WOR|MM85k{RY}Y zrdJ@R+yjw%J&v`~IQK`^WOOms%VhtkDd}7IYh)LW6)P4U;BG4ysA1B})CXl1hf%Dj z`uT-BU~wT0ZX?T()#{>%2N;F4RX^3$SCy1hf=%UY;n1YB%&x%Ub}Z>@ZXn=rUx#hR z6k>FYJg_|jPH%%=hh5QUbX{Z1CKKfWF!|lOPVka0lW|?)xNOUVLm#Gu2_=9!gFl_n zv7DfY^10WC1?U%TW>i0X4tpDS|^j=x^i|&HVG8Qjf4?J0`K5p)MqnlcafPGnSr_-4cK>) zeAfY-iSq%XZ5z@Z^l=h=tY8!p@e{myS^#x5Np}=EA;>&TSasl~bcdcD=C^UccuqDs zS+<7qc&CYw1?&$PU(Nj^6<1?FEb zf1eQJ5ZniJMvg2i9~Mo_lb4?sxyqc*30|7y@ngKnx?HxbG>ey$>~T9rB7l@ zFyRd>najzVqwBL`qqCn~bc!*c$af+D%YtX~m8qam-VpGzJxmA36Bu*j#7L4?1qK5f z_IP*T`J=H8pb!vP4~8QuZRQVLd#Yti2E-Ckj}g)qmYD^QH~9yQZSG;;(z=?#T#V6H z5HFB3{DMW;xrQ$4uTxmu2dTKfGPJCEk><85A$ILdP2golU$b8?JDS7uy2BS24>;*b4k>* zoQ-34{lHORWH2{2j~IGv3|x$uJId8KL@$@y$U1tRihRi#@0DE!bWkwR^m$U*rrw&Y z2Di2&xWv&+#Y`eNEX{JzzZE0#R&3x7@aG_YioXwEfcQ0n0b(&-tiYFB{My7;F;8u@ zB2emPYi!?aYW869T6`m5ULl5CaEmLRK(RXKcgmz?bY6Iqu{di3D*WL-)1(35#~MWE zbf_4UiS|O<1}42a+^n|kE9KsbxCC5ct}+WTMM-0|WGJ{x6na3r z*&%Os)uGmRy}kM=!=C`&8djI9wZnd?*gzPo3ElGi3qZ_S5mKsnN75GILngo z)Q^@fEv^N>zO*&sp+8$EE)rc=&{@qmx_!|Pd{9|qaUyt(?)0keBeu+82!BozF&j9k zZ!LZIx-tbp5KFD_FEo#THUk9Lu9RcVoDo;a>2ol_Z|j07*o8iqznvb@Q}UmJ5|huX>kbJt#o)-#-^ISoxYS)vzU+Hxq-$mi|L08f z8hQ~h!+cUe+Yhb=@uj;iWogRvIRHid)y$V?+htgvG_@foJsyXqpH2{31mhO%|NoRh z-dPRF=FBd{R^}5y!BqMt=RCL1IOR{KSMIEm&!@n7%8qsG=5mKsB|;N>Jky)raXQc58o@n43rZplTT zdaPiEgZ2T}SWf`9M-o$L+II4JuNN4=P}mo**$(GE5C{(A?V%`zK`s06u@$^qkfl-L zbiOEa{NW3SX)&b>oqxo+;0Er9)4#10yXwv_G{;`Q;KBXx)^}M-J=MWy3WzjCz9J&2 zkfbm2O~EN4Gz$aeBZ)-Sz3FSv(x2X3k2hwTbomH3Q@uOEXJiSerK|144}M>=bSLCF zfx_pt#zlv)oT@xhsy$qH(9&NbHlzCVXUxlTlQ|pSUm`g5bmgugFt?WVB@59&waqF#^+YPllE@>jeO)+KoOyjh1wIFNUdcig7DDKA}icaNeYJAUn8H?hk_W1JU3#? z6u@W2N0?Zl?(nswD@Rl{Zuw>B&(n5>lvK=xWZsKI{RT#TfpXZGekZG*(t_e3yBOStCjFJUSa_rz) zB7UjyDqv4jy@*f7vh#H5nwUNhoS=Hd7@N;;E2Z;>IB)4`9}|YyBiQr2ioxiG+kN*H zLYX{13lS0Sr7AdL21Vbg2r%bZ%AHCJ$yuUQL5FNY*woV<0XY+w5t-^L%#$Rfh<

iYS=KIN5Sh|g>87l7O<4X~uIb6r!*G9Y?9syN> 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 L@WL8=3km6ewHp#0 diff --git a/resources/archives/inconnu.php b/resources/archives/inconnu.php deleted file mode 100644 index 0141e9ebd7..0000000000 --- a/resources/archives/inconnu.php +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - -

{{Inconnu ...}}

- - - - -

{{Ci-dessous la liste des informations inconnues remontant du reseau zigbee et de ce fait non gérées par Abeille.}}

-

{{Collecter ces informations permettrait d'améliorer le code d'Abeille.}}

-

-------------------------------------

-\n"; - } -} -?> -

-------------------------------------

- - diff --git a/resources/archives/modelesPage.php b/resources/archives/modelesPage.php deleted file mode 100644 index 8ef17a01b3..0000000000 --- a/resources/archives/modelesPage.php +++ /dev/null @@ -1,152 +0,0 @@ -getTimeout() . "\n"; -// var_dump( $abeille ); - -// $abeilleTemplate = new AbeilleTemplateEq; - -// $uniqId = $abeilleTemplate->uniqIdUsedByAnAbeille($logicalId); -// var_dump( $abeilleTemplate->getEqLogicsByTemplateUniqId('5c07c76620sdsfs8a7') ); -// var_dump( $abeilleTemplate->getJsonFileNameForUniqId('5c07c76620sdsfs8a7') ); -// var_dump( $abeilleTemplate->getJsonForUniqId( '5c07c76620sdsfs8a7' ) ); -// var_dump( $abeilleTemplate->getNameJeedomFromTemplate('5c07c76620sdsfs8a7') ); - -// echo $abeille->getTimeout() . ' <-> ' . $abeilleTemplate->getTimeOutFromTemplate($uniqId) . "\n"; - - - -// '5c07c76620sdsfs8a7' -// Abeille1/3EFE - -// $eqLogicalIdRef = 'Abeille1/3EFE'; -// $logicalId = '0000-01-0004'; - -// $abeille = Abeille::byLogicalId( $logicalId, 'Abeille', false ); - -// echo $abeille->getTimeout() . "\n"; -// var_dump( $abeille ); - -// $abeilleCmdTemplate = new AbeilleCmdTemplate; - -// $uniqId = AbeilleTemplateCmd::uniqIdUsedByAnAbeilleCmd($eqLogicalIdRef, $logicalId); - -// echo "uniqId: ".$uniqId."\n"; -// var_dump( AbeilleCmdTemplate::getCmdByTemplateUniqId($uniqId) ); - -// var_dump( AbeilleTemplateCommon::getJsonFileNameForUniqId($uniqId) ); - -// var_dump( $abeilleTemplate->getJsonForUniqId( '5c07c76620sdsfs8a7' ) ); -// var_dump( $abeilleTemplate->getNameJeedomFromTemplate('5c07c76620sdsfs8a7') ); - -// echo $abeille->getTimeout() . ' <-> ' . $abeilleTemplate->getTimeOutFromTemplate($uniqId) . "\n"; - -if (0) { - var_dump(AbeilleTemplateCmd::getMainParamFromTemplate($uniqId, 'name')); - var_dump(AbeilleTemplateCmd::getMainParamFromTemplate($uniqId, 'configuration')); - - var_dump(AbeilleTemplateCmd::getConfigurationFromTemplate($uniqId, 'visibilityCategory')); - -} - -// Need to change those value base on your installation -$uniqIdEq = '5c07c76620sdsfs8a7'; // device: WS2812_light_controller.json -$uniqIdCmd = '5c07c76623554'; // Cmd: etat.json -$eqLogicalIdRef = 'Abeille1/3EFE'; -$logicalId = '0000-01-0005'; -$param = 'name'; -$item = 'repeatEventManagement'; - -// Process the test requested -switch ($testToRun) { - // Generic answer - case '-help': - case '--help': - echo "File to test functions on class AbeilleTemplateCmd and AbeilleTemplateCommon\n"; - echo "php AbeilleTemplateCmdTest.php testId\n"; - break; - - // AbeilleTemplateCommon Tests Area - case 010: - echo "File for uniqId:\n"; - echo AbeilleTemplateCommon::getJsonFileNameForUniqId($uniqIdEq)."\n"; - break; - case 011: - echo "List all uniqId.\n"; - var_dump(AbeilleTemplateCommon::getJsonForUniqId()); - break; - case 012: - echo "List all uniqId.\n"; - var_dump(AbeilleTemplateCommon::getAllUniqId()); - break; - case 013: - echo "Check if we have uniqId doublon dans tous les templates JSON.\n"; - AbeilleTemplateCommon::duplicatedUniqId(); - break; - - // AbeilleTemplateCmd Tests Area - case 100: - echo "Return the Template (uniqId) used by a Cmd for specific Abeille:\n"; - echo AbeilleTemplateCmd::uniqIdUsedByAnAbeilleCmd($eqLogicalIdRef, $logicalId)."\n"; - break; - case 101: - echo "Return all Cmd with a specific template (uniqId):\n"; - var_dump(AbeilleTemplateCmd::getCmdByTemplateUniqId($uniqIdCmd)); - break; - case 102: - echo "Return the 'main' parameter for the device stored in the template:\n"; - var_dump(AbeilleTemplateCmd::getMainParamFromTemplate( $uniqIdCmd, $param) ); - break; - case 103: - echo "Return the ".$item." parameter for the device stored in the template:\n"; - var_dump(AbeilleTemplateCmd::getConfigurationFromTemplate( $uniqIdCmd, $item ) ); - break; - case 104: - // Ce cas est utilisé pour afficher le modale Modele. - echo "{{Affiche les differences trouvées entre les modèles et les équipements dans Abeille.}}
"; - echo "{{Une différence peut provenir d une modification faite par l utilisateur, ou une evolution du modele.}}
"; - echo "{{Difference ne veut pas dire que cela ne fonctionne pas.}}
"; - echo "{{Pour l instant c est un audit pour les developpeurs. L idée a terme estU de pouvoir mettre a jour les equipements si le modele evolue.}}
"; - echo "{{Actuellement le meilleur moyen pour mettre à jour un equipement si son modele change est de le supprimer de le re-créer.}}
"; - AbeilleTemplateCommon::compareTemplateHtmlEntete(); - foreach ( Abeille::byType('Abeille') as $abeille ) { - // Don't proceed with Ruche as specific template - if (strpos($abeille->getLogicalId(), 'Ruche')>1) continue; - AbeilleTemplateEq::compareAllParamWithTemplate($abeille); - AbeilleTemplateCmd::compareAllCmdWithTemplate($abeille); - } - AbeilleTemplateCommon::compareTemplateHtmlPiedDePage(); - - break; -} - - - -// TODO compare topic et payload - -?> diff --git a/resources/archives/prog_jennic/JennicModuleProgrammerRPI3 b/resources/archives/prog_jennic/JennicModuleProgrammerRPI3 deleted file mode 100644 index 4f82594e6a314eb4b5d66fe10563158a8ae83dd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24016 zcmeHvdw5jGm1o`V)&o6I3xuu6GF)sC%eEx0Kwz0*yCsBd958JJn2gzJHR=}XaZBCq zZefwIiG*ar#3+^r;}9EG?Tp7uJZwTH%#8DJtk_QCI3^}Bv%?VM^n*(W_QTV0=6zOr3W6k!F2s1=0PmMNkMsrnK8 zaf!Spp^9lJn=P(pc{I5|h~xsrh=m|wbjg^Hly#dx$*7_NW1cK`B3%o3E!t)L0ANPe z2ik~8WKIzW(H0}?vy?O?w=p`5m~aU36e8PYIkKV><&`LBJOh}K<(7<5Fo~jV#x~#? zt+KoIL;&C)1=e>Xu0grI{a*sd$oiCRemJygemGDc4)yg9)ca$-J>3oQNW(%D88qZU zy4&wsN0gvGC^G|jR3H+^^1Tl!D_nDDUUTZ{Cptb>@aj*V?CaV+4`rmc^#0Jg){=^r zd0B_{mH$$x4XdhX6pIR7Pu7A)XyS(!Z-V4+1?rQ1DnKN!X^2IL#fYVd<%kS35Gm6v z#48awR#k|z5mm%%5U)k7L8NSdDtr)y*CBrWp#xuh;9sBErd<2mr+mjpUjNFC_swcq zwSU|EyKedQG5rM|KkDoJ+D9Q`stgytII#OZ`+k;x4f4tdm{%* z1{LXZ7J!s``B4u17dh~e9QXzsKi2QhDZe78oVH>G(m#bb*y1q8v0PLd<6$qqKBqqQ zZ3Wiev&&5?(;Wd+v9^qUHVJEkC0zMVPn zeL3*$Iq=yWxHgCXXL8E_J_r724!j@mPMdyObIQMy1E+G}59PpfbKr01zyiLbi{4_f z2o8i2A{vavA~DhD?~BC4!C+KG`x9{y4~BzX3E|%qi6ull5lckEVVR2FUVl_{b;pB= zP&^t821IYL7l82jz^X6e3rD*AiBP0ZB)Wk1ClWCc3;GSRuHGoP1S0(jR_cmwHF@@j zMa&_^$!BTWT5DO)OXrVjYAMX)e;fPT? z$VO4YXw>H$h;H^lc%z5DnCR~613yFZh$*>M2*y+ki2bpIuh$>y6I;5Yu~1*48%3LY zBYm>SCvIQ4qIH>XK|_9LbFv~7f}3;*kF>FU9*3BPJm+Tx94Y5j zMVV1GN?S-}(zxRNQHa5YmnWtAx=N)1yu+ghfo5Oqw^qQ(@?x``uMDHfhirZa^IFug*E z9;R3T!c5`pqfASLNHD!hhykY4h1kXv3(O$XO7x#87KWWntA*Ib^lBl-m_mtTY0Z7 ze}^savE`d>dCiuuwdGY?zS5R=+wz6Bys+iZ|N4SF=WO{iwtUK#KW@t(wdG&7pe;XO%SUbb9$UWCmfv8@du{nUY6v&?OxPh1U|o;oIDYi{I?+e*U8DE zU!ne&K#O|Wgd6gD$YW4v8~cDSK^w4YL~r&OWJqZHb)mfuxFh==)EDk2^f206Binlp z?d^Xbemj9LwDCJSIe8JkFH3$Z_}wb`eIEQOt{q34Pv|afyZ#L1bxBwNewzJ9*|`^> zfAqnLK2t}9+AjSr@Oa~zasAkWalJ$x*3XF-(vO4wrS0Iyeu}+DzYe3_gf^O~R!1|1 z?#J~Fn6JX?&0w9bQoyTP?AJdA+@r1Ix&=Q0I1l<(#b`$Lj_Ng@QN0T75l8xnt(;|~ znPDq`2<0Vct5ADfS42k|<6Y!3^I3R>6LpSp{SWU!|DYki>+>KJ#=yrhz&MqtCjPWA z@gD)c7I@PBgVV%y0!N-4E4b(rwHUkObH{ZD+WRotyHSWwy(-~b0K-NepO7%^rL}f@ zhO~#u$MfpI>!32OABRl0Pn^`-#Yug6>ZIUZlX{DKQunw|>WX*t z%r?~d9_qN<)b-t2xcH(1jL}uHKX9E@1!^*F$^M9x9d=*UhPqkQ#Zy`K@X^uCxrd)S z(&x;J!z@5vlAMr0=@N zb=dOR^GLsi)G^Pb#WGT)%rkZH4(h#u^5;-~Tp%^%N@b4&epMUSt6+Py4WaGUCs6)* z_8I+T+XqqpAzS%VD1TDce;MVRzh5N1oWDC!{&B#Zzi&ZLDXb-Jnj$t}L^V*5%%RsubhpQn8kadW`?L?wY8F4PcI;pC5(X z2N5+q6l^R~#8GVCD}b+1$91RnaLS?X{t2Eov$H4XD+BLMp6z6N*w<8prW!niwk(xT zd!3yBh#NS=c0oIHa(;RkGEpvu8uz$fLwa{hs---cesa!G>YMIEY4Xjj$2wL$H`e1y z58F9r@OBSASNUViOGV?@y`%#^vkUaKhAd+S4VtUUV4NzYJimuskEbo;L!#)hk~P_1!xqarVQ-#f+CiK1Ce!EtfIeV7!4{~9>kMsg5#%5a+mb1q zkho&tTo^~RW%$c{iHF=X6_IqZeNX4OuA^^Dk!FzsZ^)$qhR)8`Aw7w-7AbX5gY@5! zioycnX)P1#lLbP&02_k#zK>|>$!D17>(y375j?r3~5dz<^4S?cY|TVKpNu74r>y<3N~#p(;$5_JT6 z9XV5|jp&XWp)0Wmb&}a%pq+g5-knU zuCX13&&GNv)@5DV@JyHXqLXygy$7@|ZB&0o(wce|MJ4cK8gxtBecUKZW-VL=aC;=~ zmyl)FTI{0{H)1Y%5Z_OpM=l|c1M)a7Adi>Y_KL7f|#`L?e?}-T4XK!|ncQEtxEy#P5PdYmXQ{P&XOwZ}e&p12VQ+qYk zy?Z#Nj3u*!6SMRWbb}7_IDcYS+A)|+yD=6*9W}JY6KS`?%f=KX-=vwgNeys%4#Lwf)}`V)$DeqfNj~15F8d<0(Mj zOjsn-KSSB@n^!I4JU9nC;ykUOt~|+fspJD&n~6t`s*>nv2J;{r@Fugx8u&yj^b)~3Px8JD^|<#O*x6@bqz zvR&aBNrKNa3khpudNKU%zr&|F!1vtHb7#n(Dfha|f4nMFeivk#fbaiijqXTdo{phC z6?4fmsw-Msrg-9rZpbj0OmBs()Tm(C+ddLsqQa>;v{X+4C6R;zK8O`Yq9! zOc$#dEA|`w^3>K;o;I8+bVKi`8>DaU+yUKsvu9C{Jc_ZuaC#q1ImEg&9{rw~6zjP! zei7^M>s&A3%YUF~LoYIq^}Xs1j0OA?#&t~=9;t|JDWVlTVLRHgjN<+e`uVhS=*AR$ zJLvAszUxWOd<}W0)|zpny}0)C(=*(VQGG>kR`%;o$Skz)>gAr3`uMw(Z@+{#I2NtY zSIrRQ>)e_81LV2^dwORSep=g^aZEsW+9y*5s7s%Mu}Z7u`}HCLyMzu4wIlj2@G69S z4)MthZI3e6f@TNsN@@piqnQGfPfu-6aZD8TKlJI4-7!&T$liL}XeQs#-)P3E?l64O zdlSp_1oYU{xL>DD3HT+Biw3xE?tXm)Wvv_|j=4x?p@Xw-*zAlqS7kV#gy-(eY{)hT zk-k@j409$%Gqa(O3d}FqK4b?^MDpg`UI6=Of)D(PvpT4K_s|FgK7)&)tBy5;}K7*O1YLn2-L=fvoh`HQ+T5<1n}L zh<=Uth<>f-i2m17{yelX2lA_spFU!?IH}hj9nEl^q}*2i|E1iRH}5O=y*YB1{3qlV zS}IFl#Wk-&8`8PI;QaiUvM&9sFnm}t%W-#M+_~=2hrthI-QE$M^;qA9{WVAWE!Tje>S73c7E$bb{7~U`Iz@L5fCBT@c*)oiA9%!bE5%kS$(`svz8|wwix}=<^ zP*2$SyKVfV;P(+pcLH=y*aLlKf!mo`wt#cnnNjNatiL_$tlge2K_3g!%ng949AfE&nZUFfX<0mcX(FcttZuSz0^zp?ZDWr$@00g82eGYf-6!0 zb4^l^xAau04QJ?w;fu0v=<0U%zcZPBx(sWc)Mce-IO9Uwq-jInNM8mz`WoU$Pk*!F z_vYI0bNE%#TYM`xPLeO5#|~j{A<*|I`aQ`0t9N7F7De;}^qCIG-$8ol4fC&(?T|nB za9^|Oh3l6xmP|hkpUgU95OnS#_*SHltBLX)@@8(ud=~D{>gSvAd@pSp_Bv(L3Tzxc ztLP29d{Oy;1c95 zza!v#N>I1LGpf&nEF%@;dLiU$hX3&(-iN&|`&R+knqg-j#8~3BV%2K+_l=-E)cJb4 zSsc+1X+KE+Q{?&69^|)lPM*fIQyO$du!Zcff^o+99a0~`d|Z<*2EG7%xc=Jv;8H(} z=cqk;A^Mm4-Q?RCm#O~YYf8$aaXmV!8~uS_Z3bL|)auJp<%rIH80$CMtwVnf&oujU z%Quhcw<6w#=t1N&iJ0(a-h>S7S3TtU5%OaT`TVm!js6xb0)Og{x|`CQd-M$3V4Lh) z8QSp5HWoo&mfo(Gdc%A&_`AU$bFZrDZ~4q;z6*hMov6h-roTg9*%zx{>?iwWwZrwn z8m9uZcYemjW8`34o!-pfgTDuTDMVWbkgw1_t84HD8sK5{$KLL6?=^N znpM%}O@M2V)*c$ws|QE*x-q;n()Q?so!mopz+RW73R1~5zP&s?h_%p(cQ>)lpPzo0 zd!JNtw~|T@S5NHGYv6xe6Z=w1>eC?k%WS2}bvc=>Ih;(_?8W;>^rI5};CrIQ(Ifgz zh;w0A>fnAIdvV?49(}8Mg6px__Zr|UCr;`mfSWx>^qUVI(U*)J(LV&8FYP>{-;z3_ zPhcMzKpV7I%$us4uwN>IjIg&Vf%jDTo{<#yUb|f)^ zsBh^n5QVKgGOpvb{#oiS=K1+!nE&Zww8b&!yer385{Ld{Zy3$un_*Eko(qfdyl?|} zv2VataV%Yj9zuUQvY#myDeMc3{(K+r^Q`_%1Hb9AeW$n=`&+!z@FdfCW?q7KQfECF zgGuzAK8tcvhJ4BbJZ1SA^hp_JVNXsRb>a}CsX{3S76C&J$`FP=*=_>Qj=%Wr`%Cyda>z;~mAc(&5Z(*w7rr z?a&wOJ~IdUo{hQA{hB~@yWtmMvxOemEh6XobNcMT%Zo2Yaa32DhSR&?%ceIEr%RR&r@24kJ7Kh6ekbaeP8`#xi(}Bs zF}=)v40RvWOKP^KMf3KwBIyNi(@O@nR=q1z(pwpi-c1Ak}9ZRwTo(((j#33=Sd^a2&KLoNk+a7aBQF_$>b zF0@mHc3hsv^mp-oIS+j>>Y;uC>Xx9MrDwh`$5_u=4gMT&ygxhfD*RC+>hm39Dda1G zeA6LcnUoLj*K_4dbC0Bew*zhPU8NK9ah%wWB_GGU9{7fdV|pEE=7Y8eyg2Um@l=E} zb!{{D0!_mifjxn<5o-kM7UCUSBkC+jVSG`4A^2dgn#mn!r(2n-ui#xP>(fTu7_*xp zV>9Y50gn%%K4s)Saj6)|%x*O8nKrPf^O)WQy2YTo33Rl9TC{J`RAcNdJD?2>L07bA z+A?k0vgd?~xg>2`>RQM9k*ZS2Q3BfO;9UlK%CP}H!_ouC9p8ScI3`%5Pqe}Jy?TD~ z?Y~1iOOgL)8V>+Kb_}%OW;4AR167S3nyFG-qJ|}VOB`yiveu*oVxG~`NN?b_d z27%ixakofZ6u3`IT#LkY0{7PvcaOw*fg6#ygv5D(`-H@8lQ<2yj{-+sd=@GD?m=Hy zB5p)Hj5vW<*Pw_n;vvMs`Opy}pKD4){agIbZ9YTt9R&QScm%eBc?AE?zVo@kmD+!* z5GkKuc&0$X9-r^-6GALe;LGpBKF1--(_zdb_id4M`TPi;uUb=cw0LG%8+HrG>-@#T zSPGNrp)x!ps-H^@m3dS}<`v|Jrc3;E;ALJxeyCL9OM#bp1^J;8i7x?O<`v|JiY2}n zc$rs_A1ab~tkR0iE65K`llW=C%e;d8P@%*Z0x$Cl@RA9U z^9u6tzx?i!hRtBlnViWy$7_zdDWf^eGIMQB&BS}4vwVidceo-a=F1?Sk2W9{HH}LIP3(nnczT>>36W`Rmcy{i5IF;u`>}*ddgV-C5;T^q z=RWydA=b^T;u*m+>7G;5V1L%TM1HSv;ThvM@B^SbQ;UNwDk9tDISroC;7QAMEo;{L zf*rxcnzbFZ*Dq1mu2{Wn)$PmI3WQ6Rb>x(_tzGlJ_3UM`-lPmG`nn>$Q5_jYT%c{JmsiR3~57k>zY}-ok*{-uhrH)V z8tl6;vfWTWWxi0(gJviX2W>c>eKT>ZQ5)kmWf>$?zc<*Ih%aFq7*Dl6uGZJb zF_``^L58Ig3>cPqtJ-0fnxJ93jf)zZ)LuivIyKm^xj~(e()o!*e143TQDezVU#xTp$aBxd7+@NCqz+}*Qe{ZC}FQG=d)j)7l|7JDR zhuPC>oDgilSQ~gPO9q@F(g^ie4J{AM@x2kExM0+FWXZQjV1vPN_k)n^RSNAe87)6Fot7b7)JhVWD^A zQoqI2BPO1~^b&u}>7s^uG3roaw~B*`U7_w!Fi@vL<*dmzjB?fLL@@AxKdu@U28R=g z#c*~rywy;tU>o(lXt&qjWovKgs+MJHi#e^?CF+zYYo;5+MaO0ck?4VY!+&}sn?RJr zs(?~D47EEJ=`}TCw$FLj)C^zUcVA!Rfj)B{-fYgtrsg}fM%b}Q^A{KLn6UJk$d*VyhFX>*g zWyKQjlHMg;Q|Pnl(`eGt18@yOzc9GQ`anbHT!F?6A7$2w=agE!EdOu%3H!WN>!E^R z*L~3LCj15gOGIBljYb{_#)?E+Fahg>mX~4SlYYx)YsMO+E!ePR-v9Pbk?82}>cX-k zdV=97{UyfFbTY`>T!fJGfZfB%Wx7HktobVIVd4mZDIm0l#cFMA(c;DhP1m#R@Een# zP?)(KE^FYj1}ipd~zK;tRA`UTuk%wT%wuZjqnwt4QY8fPP-wUF~cb~B3<#kB6^T^ z&T)tVq(6JL(Dd*x(g_12)(TIBJ9AfCp@F zH{cP#R@j2fE?ar8RbWeRU$$(CTD!&{k8TS2`_#n^3mdfh#^xJi(NN=!cq4anf8+Hg zR$ZVq-lX9zsc2~c1AoxJDI}B{Wb+n_{QN>?no{JL;hL#bD6^C+ot4T5lqyHHa?J&K zY|RSZyTITywPW0aV8W(7j7^mr7Ak1dW;w0iv}qHjrJJ^H!nAlC^pLjb6!?mPKwD*S z8rEytvi>hH0^4tPTHKWHl_J$@vgzX-%Fh8FL#jYO zq~~wP%us2-{LX8JGU2eYK(K$MfGvB$=^sNMhi&@8fkI)ymOhW$%GsY&HnX!O{0)*B%ET9}ED%x+R zcKW6dTuk3=gQtU@@KYeM#`|R&wGm8t-mt-xcjBsx%a7V%mN(D6xO~tCv%F$z9W&>* zaqih@&-76d7nhN8L%}zGaRL&9k3P1FNKDz^@~D`-k7GPX)I32f&AzXs#`CSYqk z-58&@bLfAc16P_`UZY3sPhAe|vB4_JSKDCH`*PqdfN5{X8)bW8z}ydT{8)bgu)V!O z!1nR|H0#^i-v`)!=hYVgUzjhI;;VqUpF9sa$p3l3PucA8HNZ(5d=fC%Gs;i;bAYWt zeU;?se*)#ahoBH;v~LyVN$6Vz%<*po%>AZ0zLmlQc%Kbk4cL;G_Hi#@?msO3YzEA` z53KrI0UP^gIUha+*b0;Ij{Dubk|5C+Wu|#7-MAQUCjsMTVECgm<{&3j$K+u1mue;ySmRG zi}|q_4m z91mHA&-pmnBH{b{gYiT|l+`p5k|aDgup%%8u4!2{l{XHx3D5;^4<<}Hvv#9smnZbl zmi6V|*B!uRX3bWK@bw2mTjHUG&~t;#`r`M6qCTKCUjm|tcu%Ms7nudN^agz4z5!4M z!`;Sdq=rZby5A0Imiw09)dtm@<6z}4Qbs`d+CFku%c>R2KxHd2t``%&+gGk`ZCUAC z-QJEfhrYEftt*$4opA$MSG?aC1M@;OkLSX5V}VVZeOtW7on$L8l9n1)`McyX9(f#c zg?SK$*Qxn@#!DPue+XSPuUZS+S^9jN;_<1Q%|bX&Bac_`=!cz9-m_*$OG;3IBy7n>c!DQ1wRbROY>Nc8n=wurC0W+s}I%{l~$UR(Ym{2NHQ2 zNM2}XXJJ;O`Pnajvs0KC&e<{M1#@?bCuLJd= zfM_7pgL9XnA+WU%{LB=0O&TRQDP}kWJAfM?8)7(`3VJgW4JSl{VOb4{-~jSm{7@7z zJXJ%>npF+xbYMU<1bfVt&m=b&J(JwZ|5X>bgR{Rk)CCbD;AV1xhZPN2dwFVC7(977 zWoT1B794Aj^q)!jJqX(?!ADQNTVD$RS2s=tmN8t5$n6v9%=?FhP?5KSwe{t>ON);0 z;>W#f27E_<7<3yEtt~z282OI37?JJrdz2f`bb|o6RRy_0!~HbB zfuP8sm> z$S(n;TM4?AlFs7CK5)N0j7YjxM1C^}lMX_Wj&I&Ax?RXqR<^^v?JiX2w>&G5j^UGt z7M=O+3-8v5kb!iJe}ibz@!4P_KIk3CU7J?0`0*LoqT@4k(+#HFxpegCsc6>IuwcHh#U*jnfG#ExRV7 z=d5f3Ec@Q)`+cA9kNf)jzAqL5W!vz>N49=qclt|Dd~;Tj;D3H(kW~pb9gZA^0U4r? z;xEy2``rftHpyKB88VI$ypn79l9y;7G}`ZH2LeKi*){W7g#N#w5>_9GXlwFl02vG+^3be9Ga-;q{)|+ z4R?GTuUNazb5rCE$fC~7_oJAx5BOKnzf=b5z-JK+=a>=sn2;(QAexKrlURIKS`?by-F-8%P;zgIQ1%~= zc7rxVP}<7{>yOB4da9vZcPB@W(&>RzWLzpq<+X=bucc2PGJF04eZ3cAr!A33r$QDa??`q5m`3{sz zTY7ZsQVMrkF>S$?L!;;C3}B|EdH;*B$0R?Irf??=5B>i46*z_Pep>M-jv z>J_1Zcezzh`CpMV8;8R?Jyu-KSQ(1>9CwqlV zPb5ktuJJ7KRN~F!4t%@!A3B$DuZa;H_}o$uL{F@k^GwT9*_K~*;7=b9u4$(XB=Uw+)G6U%*Z(SSol7MEUUGZc$8#09PjPd`HRBfl*G&f0}edK@T7g1 zycx-%2`5<M?N%)+_^HY?V)@G@g24&48eJ*`F znec&L-V2LsV~+-5ue{@~jxG(QnP{L3M6{u7M1Bf1)k7TkDk>xzpBJ0kZf%Bke*;>1 zZgk0kX~8+NcJP-=f|b6->b6<2QJXr@Jy5_Lxai_JqJV=zNL)xxc>dD>mPO%#lyIB@T=MP7a%IMopJK5(Ai;pabZMfv~r7bR*LGMkJo; zh-nP~iV@p|UJ&3Nf=U~N>u}sb^jtI@J!zgS>f9!6?55+Str2;F$OTc8t5^$QaXiy6 zk@kY<=XL=r-#$1rS&ycB%i5{BoKMN5^5Y58@j7BYSV!{?LZM7#2xiC%lsGYK^(4@Z~k)m6G0=xN8-8T0RXI9XN-{$kRHT*UOp%1f}Gq zu@AqF?QX^7LW43kBvPcsA$ya~|JAtqt$${Ip;kLal=|Cg?oR6WS33|5JAi4)tWC}H#E&n^izI$&=pJ?q(#rmstRJCTs z-%sJpv5LSL`HTS7I_|t%?F>Rn z*|>zO9R;cjDr9~G)q(~h*Li?yhk})J^&C5sdl{STj8CzSG`FW(Ac7;GfF~W}PSjNk z2BaeW!mdEY{e}qm6+X(WmNDcxo#(^PIm6zjgq77sn??x!WQvKP7g3N31Z&o$G*8l(j diff --git a/resources/archives/resources/prog_jennic-0.7/build/Makefile b/resources/archives/resources/prog_jennic-0.7/build/Makefile deleted file mode 100644 index c82de30f23..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/build/Makefile +++ /dev/null @@ -1,68 +0,0 @@ -############################################################################ -# -# This software is owned by NXP B.V. and/or its supplier and is protected -# under applicable copyright laws. All rights are reserved. We grant You, -# and any third parties, a license to use this software solely and -# exclusively on NXP products [NXP Microcontrollers such as JN5148, JN5142, JN5139]. -# You, and any third parties must reproduce the copyright and warranty notice -# and any other legend of ownership on each copy or partial copy of the -# software. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# Copyright NXP B.V. 2012. All rights reserved -# -############################################################################ - -source := uart.c JN51xx_BootLoader.c Firmware.c main.c - -CFLAGS = -Wall -O2 - -# Define to trace bootloader comms -# CFLAGS += -DDEBUG_BOOTLOADER - -# Define to trace firmware image info -# CFLAGS += -DDEBUG_FIRMWARE - -# Define to trace serial comms -# CFLAGS += -DDEBUG_UART - - -# OBJ := $(source:.c=.o) -BUILDDIR = ../../../tmp/JennicBuildDir/ -OBJ := $(addprefix $(BUILDDIR), $(source:.c=.o)) - -PROJ_CFLAGS += -I../source/ -DDBG_ENABLE -PROJ_CFLAGS += -DVERSION="\"$(shell if [ -f version.txt ]; then cat version.txt; else svnversion ../source; fi)\"" - -vpath %.c ../source - -TARGET = ../../../tmp/JennicModuleProgrammer - -all: $(BUILDDIR) $(TARGET) - -$(TARGET): $(OBJ) - $(CC) $^ $(LDFLAGS) $(PROJ_LDFLAGS) -o $@ - -$(BUILDDIR)%.o: %.c - $(CC) -I. $(CFLAGS) $(PROJ_CFLAGS) -c $< -o $@ - -install: - mkdir -p $(DESTDIR)/usr/bin/ - cp $(TARGET) $(DESTDIR)/usr/bin/ - -clean: - rm -f $(OBJ) $(TARGET) - -$(BUILDDIR): - mkdir -p $(BUILDDIR) diff --git a/resources/archives/resources/prog_jennic-0.7/build/version.txt b/resources/archives/resources/prog_jennic-0.7/build/version.txt deleted file mode 100644 index aa8b127197..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/build/version.txt +++ /dev/null @@ -1 +0,0 @@ -56124 diff --git a/resources/archives/resources/prog_jennic-0.7/source/ChipID.h b/resources/archives/resources/prog_jennic-0.7/source/ChipID.h deleted file mode 100644 index cae9b71231..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/ChipID.h +++ /dev/null @@ -1,126 +0,0 @@ -/***************************************************************************** - * - * MODULE: Chip ID's - * - * COMPONENT: $RCSfile: ChipID.h,v $ - * - * VERSION: $Name: $ - * - * REVISION: $Revision: 1.25 $ - * - * DATED: $Date: 2009/07/15 08:16:39 $ - * - * STATUS: $State: Exp $ - * - * AUTHOR: Lee Mitchell - * - * DESCRIPTION: - * - * - * LAST MODIFIED BY: $Author: lmitch $ - * $Modtime: $ - * - **************************************************************************** - * - * This software is owned by Jennic and/or its supplier and is protected - * under applicable copyright laws. All rights are reserved. We grant You, - * and any third parties, a license to use this software solely and - * exclusively on Jennic products. You, and any third parties must reproduce - * the copyright and warranty notice and any other legend of ownership on - * each copy or partial copy of the software. - * - * THIS SOFTWARE IS PROVIDED "AS IS". JENNIC MAKES NO WARRANTIES, WHETHER - * EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, - * ACCURACY OR LACK OF NEGLIGENCE. JENNIC SHALL NOT, IN ANY CIRCUMSTANCES, - * BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, SPECIAL, - * INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON WHATSOEVER. - * - * Copyright Jennic Ltd 2005, 2006. All rights reserved - * - ***************************************************************************/ - -#ifndef CHIP_ID_H_INCLUDED -#define CHIP_ID_H_INCLUDED - -#if defined __cplusplus -extern "C" { -#endif - -/****************************************************************************/ -/*** Include Files ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Macro Definitions ***/ -/****************************************************************************/ - -/* Jennic/NXP Chip ID's */ -#define CHIP_ID_MANUFACTURER_ID_MASK 0x00000fff -#define CHIP_ID_PART_MASK 0x003ff000 -#define CHIP_ID_MASK_VERSION_MASK 0x0fc00000 -#define CHIP_ID_REV_MASK 0xf0000000 - -#define CHIP_ID_JN5121_REV1A 0x00000000 /* ZED001 JN5121 Development */ -#define CHIP_ID_JN5121_REV2A 0x10000000 /* ZED002 JN5121 Development */ -#define CHIP_ID_JN5121_REV3A 0x20000000 /* ZED003 JN5121 Production */ - -#define CHIP_ID_JN5131_REV1A 0x00001000 /* Alberich Never Produced */ - -#define CHIP_ID_JN5139_REV1A 0x00002000 /* BAL01 JN5139R */ -#define CHIP_ID_JN5139_REV2A 0x10002000 /* BAL02A JN5139R1 */ -#define CHIP_ID_JN5139_REV2B 0x10002000 /* BAL02B Test Chip Only */ -#define CHIP_ID_JN5139_REV2C 0x10802000 /* BAL02C (Trent ROM) JN5139T01 & JN5139J01 */ - -#define CHIP_ID_JN5147_REV1A 0x00004686 /* */ - -#define CHIP_ID_JN5148_REV2A 0x10004686 /* JAG02A JN5148 */ -#define CHIP_ID_JN5148_REV2B 0x10404686 /* JAG02B JN5148 */ -#define CHIP_ID_JN5148_REV2C 0x10804686 /* JAG02C JN5148 */ -#define CHIP_ID_JN5148_REV2D 0x10C04686 /* JAG02D (Trent2 ROM)JN5148T01 & JN5148J01 */ -#define CHIP_ID_JN5148_REV2E 0x11004686 /* JAG02E (JAG03A?) JN5148Z01 */ - -#define CHIP_ID_JN5142_REV1A 0x00005686 /* PUM01A JN5142 */ -#define CHIP_ID_JN5142_REV1B 0x00425686 /* PUM01B JN5142 */ -#define CHIP_ID_JN5142_REV1C 0x00845686 /* PUM01C JN5142J01 */ - -#define CHIP_ID_COG03 0x00006686 /* Cougar COG03 */ -#define CHIP_ID_COG04 0x00007686 /* Cougar COG04 */ -#define CHIP_ID_JN5168 0x00008686 /* Cougar COG05 */ -#define CHIP_ID_JN5168_COG07A 0x10008686 /* Cougar COG07A */ -#define CHIP_ID_JN5168_COG07B 0x10408686 /* Cougar COG07B */ - -#define CHIP_ID_JN5169 0x6000B686 /* Cougar COG05 */ - - -/* Macro to get just the Part ID from the chip ID */ -#define CHIP_ID_PART(a) (a & CHIP_ID_PART_MASK) - - -/* SPI Flash device ID's */ -#define FLASH_ST_M25P10 0x1010 /* ST microelectronics M25P10 */ -#define FLASH_ST_M25P40 0x1212 /* ST microelectronics M25P40 */ -#define FLASH_SST_SST25VF010A 0xbf49 /* SST SST25VF010A */ -#define FLASH_INTERNAL 0xccee /* Internal on-chip flash */ - -/****************************************************************************/ -/*** Type Definitions ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Exported Functions ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Exported Variables ***/ -/****************************************************************************/ - -#if defined __cplusplus -} -#endif - -#endif /* CHIP_ID_H_INCLUDED */ - -/****************************************************************************/ -/*** END OF FILE ***/ -/****************************************************************************/ diff --git a/resources/archives/resources/prog_jennic-0.7/source/Firmware.c b/resources/archives/resources/prog_jennic-0.7/source/Firmware.c deleted file mode 100644 index fd4e603a1e..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/Firmware.c +++ /dev/null @@ -1,287 +0,0 @@ -/**************************************************************************** - * - * MODULE: Firmware - * - * COMPONENT: $RCSfile: Firmware.c,v $ - * - * VERSION: $Name: $ - * - * REVISION: $Revision: 1.2 $ - * - * DATED: $Date: 2009/03/02 13:33:44 $ - * - * STATUS: $State: Exp $ - * - * AUTHOR: Matt Redfearn - * - * DESCRIPTION: - * - * - * LAST MODIFIED BY: $Author: lmitch $ - * $Modtime: $ - * - **************************************************************************** - * - * This software is owned by NXP B.V. and/or its supplier and is protected - * under applicable copyright laws. All rights are reserved. We grant You, - * and any third parties, a license to use this software solely and - * exclusively on NXP products [NXP Microcontrollers such as JN5148, JN5142, JN5139]. - * You, and any third parties must reproduce the copyright and warranty notice - * and any other legend of ownership on each copy or partial copy of the - * software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - - * Copyright NXP B.V. 2012. All rights reserved - * - ***************************************************************************/ - -/****************************************************************************/ -/*** Include files ***/ -/****************************************************************************/ - -#include -#ifdef __linux__ -#include -#endif -#include -#include -#include -#include -#include -#include - -#include "Firmware.h" -#include "JN51xx_BootLoader.h" -#include "dbg.h" - - -/****************************************************************************/ -/*** Macro Definitions ***/ -/****************************************************************************/ - -#ifdef DEBUG_FIRMWARE -#define TRACE_FIRMWARE TRUE -#else -#define TRACE_FIRMWARE FALSE -#endif - -/****************************************************************************/ -/*** Type Definitions ***/ -/****************************************************************************/ - - -typedef struct -{ - uint8_t u8ConfigByte0; - uint8_t u8ConfigByte1; - uint16_t u16SpiScrambleIndex; - uint32_t u32TextStartAddress; - uint32_t u32TextLength; - uint32_t u32ROMVersion; - uint32_t u32Unused1; - uint32_t u32BssStartAddress; - uint32_t u32BssLength; - uint32_t u32WakeUpEntryPoint; - uint32_t u32ResetEntryPoint; - uint8_t au8OadData[12]; - uint8_t u8TextDataStart; -} __attribute__ ((packed)) tsBL_BinHeaderV1; - - -typedef struct -{ - uint32_t u32ROMVersion; - uint32_t au32BootImageRecord[4]; - uint64_t u64MacAddress; - uint32_t au32EncryptionInitialisationVector[4]; - uint32_t u32DataSectionInfo; - uint32_t u32BssSectionInfo; - uint32_t u32WakeUpEntryPoint; - uint32_t u32ResetEntryPoint; - uint8_t u8TextDataStart; -} __attribute__ ((packed)) tsBL_BinHeaderV2; - - -/****************************************************************************/ -/*** Local Function Prototypes ***/ -/****************************************************************************/ - -/** Get information from firmare. - * \param[out] ppu8Firmware Pointer to location to store mapped file. - * \param[in] pcFirmwareFile Filename to open - * \return E_FW_OK on success - */ -static teFWStatus iFW_GetInfo(uint8_t *pu8Firmware, tsFW_Info *psFW_Info); - -/****************************************************************************/ -/*** Exported Variables ***/ -/****************************************************************************/ - -extern int iVerbosity; - -/****************************************************************************/ -/*** Local Variables ***/ -/****************************************************************************/ - -static int firmware_fd = 0; -static uint8_t* pu8Firmware = NULL; - -/****************************************************************************/ -/*** Exported Functions ***/ -/****************************************************************************/ - - -/**************************************************************************** - * - * NAME: iFW_Open - * - * DESCRIPTION: - * Reads required information from the binary image - * - * PARAMETERS: Name RW Usage - * pu8Firmware R Pointer to firmware image to analyse - * psFW_Info W Pointer to Info structure to be filled in - * - * RETURNS: - * int 0 if success - * -1 if an error occured - * - ****************************************************************************/ -teFWStatus iFW_Open(tsFW_Info *psFW_Info, char *pcFirmwareFile) -{ - struct stat sb; - - firmware_fd = open(pcFirmwareFile, O_RDONLY); - if (firmware_fd < 0) - { - fprintf(stderr, "Could not open firmware file\n"); - return E_FW_INVALID_FILE; - } - - if (fstat(firmware_fd, &sb) == -1) /* To obtain file size */ - { - perror("Could not stat file"); - return -1; - } - - psFW_Info->u32ImageLength = (uint32_t)sb.st_size; - - /* Copy-on-write, changes are not written to the underlying file. */ - pu8Firmware = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, firmware_fd, 0); - - if (pu8Firmware == MAP_FAILED) - { - perror("Could not mmap file"); - return E_FW_ERROR; - } - - if (iVerbosity > 2) - { - printf("Opened firmware file size %d\n", (int)sb.st_size); - } - - return iFW_GetInfo(pu8Firmware, psFW_Info); -} - - - -/**************************************************************************** - * - * NAME: iFW_GetInfo - * - * DESCRIPTION: - * Reads required information from the binary image - * - * PARAMETERS: Name RW Usage - * pu8Firmware R Pointer to firmware image to analyse - * psFW_Info W Pointer to Info structure to be filled in - * - * RETURNS: - * int 0 if success - * -1 if an error occured - * - ****************************************************************************/ -teFWStatus iFW_GetInfo(uint8_t *pu8Firmware, tsFW_Info *psFW_Info) -{ - tsBL_BinHeaderV2 *psHeader = (tsBL_BinHeaderV2 *)pu8Firmware; - - // JN5148-J01 onwards uses multiimage bootloader - check for it's magic number. - if ((ntohl(psHeader->au32BootImageRecord[0]) == 0x12345678) && - (ntohl(psHeader->au32BootImageRecord[1]) == 0x11223344) && - (ntohl(psHeader->au32BootImageRecord[2]) == 0x55667788)) - { - if (iVerbosity > 2) - { - printf("Module uses Bootloader v2 Header\n"); - } - - psFW_Info->u32ROMVersion = ntohl(psHeader->u32ROMVersion); - - psFW_Info->u32TextSectionLoadAddress = 0x04000000 + (((ntohl(psHeader->u32DataSectionInfo)) >> 16) * 4); - psFW_Info->u32TextSectionLength = (((ntohl(psHeader->u32DataSectionInfo)) & 0x0000FFFF) * 4); - psFW_Info->u32BssSectionLoadAddress = 0x04000000 + (((ntohl(psHeader->u32BssSectionInfo)) >> 16) * 4); - psFW_Info->u32BssSectionLength = (((ntohl(psHeader->u32BssSectionInfo)) & 0x0000FFFF) * 4); - - psFW_Info->u32ResetEntryPoint = psHeader->u32ResetEntryPoint; - psFW_Info->u32WakeUpEntryPoint = psHeader->u32WakeUpEntryPoint; - - /* Pointer to and length of image for flash */ - psFW_Info->pu8ImageData = (uint8_t*)&(psHeader->au32BootImageRecord[0]); - - psFW_Info->u32MacAddressLocation = 0x10; - - /* Pointer to text section in image for RAM */ - psFW_Info->pu8TextData = &(psHeader->u8TextDataStart); - } - else - { - tsBL_BinHeaderV1 *psHeader = (tsBL_BinHeaderV1 *)pu8Firmware; - if (iVerbosity > 2) - { - printf("Module uses Bootloader v1 Header\n"); - } - - psFW_Info->u32ROMVersion = ntohl(psHeader->u32ROMVersion); - - psFW_Info->u32TextSectionLoadAddress = ntohl(psHeader->u32TextStartAddress); - psFW_Info->u32TextSectionLength = ntohl(psHeader->u32TextLength); - psFW_Info->u32BssSectionLoadAddress = ntohl(psHeader->u32BssStartAddress); - psFW_Info->u32BssSectionLength = ntohl(psHeader->u32BssLength); - - psFW_Info->u32ResetEntryPoint = psHeader->u32ResetEntryPoint; - psFW_Info->u32WakeUpEntryPoint = psHeader->u32WakeUpEntryPoint; - - /* Pointer to and length of image for flash */ - psFW_Info->pu8ImageData = &(psHeader->u8ConfigByte0); - //psFW_Info->u32ImageLength = sizeof(tsBL_BinHeaderV1) + psFW_Info->u32TextSectionLength; - - psFW_Info->u32MacAddressLocation = 0x30; - - /* Pointer to text section in image for RAM */ - psFW_Info->pu8TextData = &(psHeader->u8TextDataStart); - - } - - DBG_vPrintf(TRACE_FIRMWARE, "u32ROMVersion: 0x%08x\n", psFW_Info->u32ROMVersion); - DBG_vPrintf(TRACE_FIRMWARE, "u32DataSectionInfo: 0x%08x\n", ntohl(psHeader->u32DataSectionInfo)); - DBG_vPrintf(TRACE_FIRMWARE, "u32TextSectionLength: 0x%08x\n", (((ntohl(psHeader->u32DataSectionInfo)) & 0x0000FFFF) * 4)); - - return E_FW_OK; -} - - -/****************************************************************************/ -/*** END OF FILE ***/ -/****************************************************************************/ - diff --git a/resources/archives/resources/prog_jennic-0.7/source/Firmware.h b/resources/archives/resources/prog_jennic-0.7/source/Firmware.h deleted file mode 100644 index 5d66077105..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/Firmware.h +++ /dev/null @@ -1,138 +0,0 @@ -/**************************************************************************** - * - * MODULE: Firmware - * - * COMPONENT: $RCSfile: Firmware.c,v $ - * - * VERSION: $Name: $ - * - * REVISION: $Revision: 1.2 $ - * - * DATED: $Date: 2009/03/02 13:33:44 $ - * - * STATUS: $State: Exp $ - * - * AUTHOR: Matt Redfearn - * - * DESCRIPTION: - * - * - * LAST MODIFIED BY: $Author: lmitch $ - * $Modtime: $ - * - **************************************************************************** - * - * This software is owned by NXP B.V. and/or its supplier and is protected - * under applicable copyright laws. All rights are reserved. We grant You, - * and any third parties, a license to use this software solely and - * exclusively on NXP products [NXP Microcontrollers such as JN5148, JN5142, JN5139]. - * You, and any third parties must reproduce the copyright and warranty notice - * and any other legend of ownership on each copy or partial copy of the - * software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - - * Copyright NXP B.V. 2012. All rights reserved - * - ***************************************************************************/ - -#ifndef FIRMWARE_H_INCLUDED -#define FIRMWARE_H_INCLUDED - -#if defined __cplusplus -extern "C" { -#endif - -/****************************************************************************/ -/*** Include files ***/ -/****************************************************************************/ - -#include - -/****************************************************************************/ -/*** Macro Definitions ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Type Definitions ***/ -/****************************************************************************/ - - -typedef enum -{ - E_FW_OK, - E_FW_ERROR, - E_FW_INVALID_FILE, -} teFWStatus; - - -/** Abstracted firmware information common across bootloaders. */ -typedef struct -{ - uint32_t u32ROMVersion; /**< ROM Version that the FW was built for */ - uint32_t u32TextSectionLoadAddress; /**< Address to load .text section */ - uint32_t u32TextSectionLength; /**< Length (bytes) of .text section */ - uint32_t u32BssSectionLoadAddress; /**< Address of start of .bss section */ - uint32_t u32BssSectionLength; /**< Length (bytes) of .bss section */ - uint32_t u32WakeUpEntryPoint; /**< Address of wake up (warm start) entry point */ - uint32_t u32ResetEntryPoint; /**< Address of rest (cold start) entry point */ - - uint8_t* pu8ImageData; /**< Pointer to loaded image data for Flash */ - uint32_t u32ImageLength; /**< Length (bytes) of image for Flash */ - - uint32_t u32MacAddressLocation; /**< Offset in file of MAC address */ - uint8_t* pu8TextData; /**< Pointer to loaded .text section for RAM */ -} tsFW_Info; - - -/****************************************************************************/ -/*** Local Function Prototypes ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Exported Variables ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Local Variables ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Exported Functions ***/ -/****************************************************************************/ - - -/** Open a firmware file. - * \param[out] psFW_Info Pointer to location to store firmware file infrmation - * \param[in] pcFirmwareFile Filename to open - * \return E_FW_OK on success - */ -teFWStatus iFW_Open(tsFW_Info *psFW_Info, char *pcFirmwareFile); - - -/****************************************************************************/ -/*** Local Functions ***/ -/****************************************************************************/ - -#if defined __cplusplus -} -#endif - -#endif /* FIRMWARE_H_INCLUDED */ - -/****************************************************************************/ -/*** END OF FILE ***/ -/****************************************************************************/ - - - diff --git a/resources/archives/resources/prog_jennic-0.7/source/FlashProgrammerExtension_JN5168.bin.h b/resources/archives/resources/prog_jennic-0.7/source/FlashProgrammerExtension_JN5168.bin.h deleted file mode 100644 index eb56f896bb..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/FlashProgrammerExtension_JN5168.bin.h +++ /dev/null @@ -1,210 +0,0 @@ -#ifndef FLASHPROGRAMMEREXTENSION_JN5168_BIN_H -#define FLASHPROGRAMMEREXTENSION_JN5168_BIN_H - -static const unsigned char FlashProgrammerExtension_JN5168_bin[] = { - 0x0a, 0x14, 0x2a, 0x54, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x47, 0xa4, 0x40, 0x05, 0x45, 0x04, 0xa6, 0x04, - 0xc7, 0x38, 0xe0, 0x10, 0x8c, 0xe0, 0x17, 0x08, 0x00, 0x40, 0x38, 0xe0, - 0x0a, 0x8c, 0xe0, 0x38, 0x00, 0x00, 0x80, 0x2c, 0x01, 0x20, 0x0d, 0x40, - 0x2c, 0xe1, 0x60, 0x00, 0xf8, 0x2c, 0xe1, 0x20, 0x2c, 0xe1, 0x60, 0x38, - 0x40, 0xe3, 0xd3, 0x04, 0x74, 0xff, 0x98, 0xe0, 0xa2, 0x00, 0x80, 0x00, - 0x8c, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x98, 0xe0, 0xe3, 0x01, 0x00, 0x00, 0x8c, 0xe0, 0x00, 0x00, 0x00, 0x80, - 0xd8, 0xe0, 0xc2, 0x20, 0x8c, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x38, 0xe0, - 0xe2, 0x8c, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x6c, 0xe3, 0x20, 0x08, 0xe4, - 0x6c, 0x67, 0x20, 0x2d, 0x03, 0x00, 0x2c, 0xc3, 0x20, 0x2c, 0xa3, 0x10, - 0x2d, 0x43, 0x30, 0x98, 0xe0, 0x04, 0x01, 0x00, 0x00, 0x8c, 0xe0, 0x10, - 0x00, 0x00, 0x80, 0xd8, 0xe0, 0xc3, 0x08, 0x8c, 0xe0, 0x00, 0x00, 0x00, - 0x80, 0x8c, 0xe0, 0x50, 0x00, 0x00, 0x80, 0x94, 0xe7, 0xff, 0xfe, 0x00, - 0x00, 0x41, 0x07, 0x2f, 0x00, 0x48, 0x8c, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x8c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x98, 0xe0, 0xe3, 0x01, 0x00, 0x00, - 0x8c, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x38, 0xe0, 0xa2, 0x8c, 0xe0, 0x00, - 0x00, 0x00, 0x80, 0x8c, 0x00, 0x10, 0x00, 0x00, 0x80, 0x8c, 0x00, 0x38, - 0x00, 0x00, 0x80, 0x8c, 0x00, 0x17, 0x08, 0x00, 0x40, 0x00, 0xea, 0x8c, - 0xe0, 0x00, 0x00, 0x00, 0x80, 0x8c, 0xe3, 0x40, 0x08, 0x00, 0x80, 0xd2, - 0xce, 0x8f, 0x40, 0x8c, 0xe3, 0x60, 0x08, 0x00, 0x80, 0xd2, 0xce, 0x6a, - 0x40, 0x8c, 0xe3, 0x50, 0x08, 0x00, 0x80, 0xd2, 0xce, 0x5d, 0x80, 0x8c, - 0xe3, 0x70, 0x08, 0x00, 0x80, 0x60, 0xe7, 0x52, 0x3e, 0x07, 0x3c, 0x60, - 0xe0, 0x3d, 0x6c, 0xe7, 0xf9, 0x60, 0x67, 0x12, 0x0c, 0x80, 0x00, 0x60, - 0x47, 0xb4, 0x40, 0x00, 0x47, 0xa8, 0x00, 0x00, 0x60, 0x98, 0x80, 0x00, - 0x00, 0xc0, 0x00, 0xa4, 0x00, 0x83, 0x60, 0x00, 0x00, 0x00, 0x60, 0x98, - 0x80, 0x00, 0x00, 0x80, 0x00, 0xa4, 0x00, 0xe3, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x98, 0x80, 0x00, 0x00, 0x40, 0x00, 0xa4, 0x00, 0x9d, 0x60, 0x00, - 0x00, 0x47, 0xc8, 0x00, 0xa4, 0x40, 0x34, 0x00, 0x00, 0x00, 0xa4, 0x40, - 0x53, 0xff, 0xff, 0xff, 0x04, 0xc3, 0x24, 0xa3, 0x00, 0x24, 0xe3, 0x80, - 0x6c, 0xe7, 0x10, 0x08, 0xa7, 0x24, 0x63, 0xc0, 0x6c, 0x63, 0x18, 0x24, - 0xe6, 0x40, 0x6c, 0xe7, 0x08, 0x08, 0x67, 0x08, 0x65, 0x47, 0xd2, 0x48, - 0x47, 0xaa, 0x41, 0x98, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x84, - 0xc0, 0x3e, 0xb0, 0x00, 0x20, 0x41, 0x06, 0xd0, 0x00, 0x80, 0x98, 0x60, - 0x00, 0x00, 0x80, 0x00, 0xa4, 0x00, 0x16, 0x60, 0x00, 0x00, 0x38, 0x60, - 0x10, 0x00, 0x88, 0xa4, 0x00, 0x8f, 0xc0, 0x00, 0x00, 0x98, 0xe0, 0x8d, - 0xb0, 0x00, 0x20, 0x8c, 0xe0, 0x2c, 0x0c, 0x00, 0x40, 0x98, 0xe0, 0xfe, - 0xb0, 0x00, 0x20, 0x8c, 0xe0, 0x1c, 0x0c, 0x00, 0x40, 0x0e, 0xf0, 0x98, - 0xe0, 0x05, 0x61, 0x80, 0x00, 0xd3, 0xda, 0x71, 0x00, 0x01, 0xb8, 0x0e, - 0x30, 0x84, 0xe0, 0x3e, 0xb0, 0x00, 0x20, 0x3c, 0x27, 0x00, 0x00, 0xe8, - 0x64, 0xe0, 0x3a, 0x80, 0xe0, 0x3e, 0xb0, 0x00, 0x20, 0x98, 0x80, 0x00, - 0x00, 0x80, 0x00, 0x00, 0x60, 0x41, 0x07, 0xd0, 0x00, 0x80, 0x98, 0x60, - 0x00, 0x00, 0x80, 0x00, 0xa4, 0x00, 0x10, 0x60, 0x00, 0x00, 0x01, 0xa0, - 0x00, 0x60, 0xa4, 0x00, 0x37, 0x60, 0x00, 0x00, 0x34, 0x63, 0x80, 0x40, - 0x03, 0x1d, 0x00, 0x60, 0xa4, 0x00, 0xc4, 0xe0, 0x00, 0x00, 0x05, 0x63, - 0x05, 0x43, 0x01, 0x80, 0x0c, 0x88, 0x01, 0xb8, 0x00, 0x60, 0xa4, 0x00, - 0x33, 0x60, 0x00, 0x00, 0x34, 0x63, 0x80, 0x41, 0x03, 0xb0, 0x98, 0xc0, - 0xf9, 0x61, 0x80, 0x00, 0xd3, 0x8c, 0xd5, 0x7f, 0x98, 0xe0, 0x05, 0x61, - 0x80, 0x00, 0xd2, 0xda, 0x71, 0x00, 0x01, 0x60, 0x0d, 0xe0, 0x00, 0x60, - 0xa4, 0x00, 0xd7, 0x60, 0x00, 0x00, 0xd8, 0xe1, 0x10, 0x40, 0x08, 0xec, - 0xc0, 0x67, 0x3f, 0x7f, 0x60, 0x6a, 0x1a, 0x3e, 0x03, 0x50, 0x01, 0x98, - 0x01, 0xa0, 0xd3, 0x56, 0xc7, 0xdf, 0x44, 0x8b, 0x59, 0x41, 0x0a, 0xe9, - 0x00, 0xef, 0x20, 0xe1, 0xa0, 0xc4, 0xe1, 0x20, 0x80, 0x38, 0xc0, 0xe4, - 0xd2, 0x8e, 0x6e, 0xd8, 0xd3, 0xce, 0x6d, 0x80, 0x38, 0xc0, 0x84, 0xd2, - 0x8e, 0x62, 0xd8, 0x38, 0xc0, 0xa4, 0xd2, 0x8e, 0x68, 0x28, 0x38, 0xc0, - 0xf8, 0xd2, 0xce, 0x6f, 0xd8, 0x0f, 0x42, 0x38, 0xc0, 0x6c, 0xd2, 0x8e, - 0x65, 0x30, 0xd3, 0xce, 0x6b, 0x00, 0x38, 0xc0, 0x4c, 0xd2, 0xce, 0x6d, - 0x58, 0x0f, 0x6c, 0x38, 0xc0, 0x1c, 0xd2, 0x8e, 0x6b, 0x00, 0x38, 0xc0, - 0x16, 0xd2, 0xce, 0x6d, 0x98, 0x0f, 0x0a, 0x38, 0xe0, 0x9c, 0x20, 0xe1, - 0x20, 0x38, 0xe0, 0x28, 0xd2, 0xd6, 0x76, 0x98, 0xc5, 0x61, 0xe0, 0x80, - 0x6d, 0x6b, 0x18, 0xc4, 0xe1, 0x10, 0x80, 0x6c, 0xe7, 0x08, 0x61, 0x6b, - 0x39, 0xc4, 0xe1, 0x50, 0x80, 0x61, 0x6b, 0x39, 0xc5, 0x41, 0xd0, 0x80, - 0x6d, 0x4a, 0x18, 0xc4, 0xe1, 0x30, 0x80, 0x6c, 0xe7, 0x08, 0x61, 0x4a, - 0x39, 0xc4, 0xe1, 0x70, 0x80, 0x61, 0x4a, 0x39, 0xc4, 0xc1, 0xf0, 0x80, - 0x6c, 0xc6, 0x18, 0xc4, 0xe1, 0x08, 0x80, 0x6c, 0xe7, 0x08, 0x60, 0xc6, - 0x39, 0xc4, 0xe1, 0x48, 0x80, 0x60, 0xc6, 0x39, 0xc4, 0xa1, 0xc8, 0x80, - 0x6c, 0xa5, 0x18, 0xc4, 0xe1, 0x28, 0x80, 0x6c, 0xe7, 0x08, 0x60, 0xa5, - 0x39, 0xc4, 0xe1, 0x68, 0x80, 0x60, 0xa5, 0x39, 0xc5, 0x21, 0xa8, 0x80, - 0x6d, 0x29, 0x10, 0xc4, 0x41, 0x88, 0x80, 0x6c, 0x42, 0x10, 0xc4, 0xe1, - 0xb0, 0x80, 0x6c, 0xe7, 0x10, 0xc5, 0x01, 0x90, 0x80, 0x6d, 0x08, 0x10, - 0xc4, 0x61, 0xa0, 0x80, 0xc4, 0x81, 0x60, 0x80, 0x60, 0xa9, 0x29, 0x60, - 0xc2, 0x31, 0x60, 0xe7, 0x51, 0x61, 0x08, 0x59, 0xa4, 0x00, 0x2d, 0x3f, - 0xff, 0xff, 0xd0, 0x60, 0x33, 0xf0, 0x0e, 0xe0, 0x38, 0xe0, 0xec, 0x20, - 0xe1, 0x20, 0xd0, 0x70, 0xb0, 0xf0, 0xc4, 0xc1, 0xa0, 0x80, 0x00, 0x68, - 0x41, 0x06, 0xa0, 0x00, 0x60, 0xa4, 0x00, 0x7a, 0xc0, 0x00, 0x00, 0x20, - 0x01, 0xa0, 0x0c, 0x6c, 0x38, 0xe0, 0xcc, 0x20, 0xe1, 0x20, 0x20, 0x01, - 0x60, 0x20, 0x01, 0xe0, 0x30, 0xe0, 0x61, 0x20, 0xe1, 0x10, 0x20, 0xe1, - 0x90, 0x20, 0x01, 0xa0, 0x00, 0x86, 0x0d, 0xf4, 0x38, 0xe0, 0x04, 0x20, - 0xe1, 0x20, 0xd8, 0x61, 0xa0, 0x80, 0xa4, 0x00, 0x4d, 0xbf, 0xff, 0xff, - 0x05, 0x83, 0xc5, 0x41, 0x90, 0x80, 0x30, 0x61, 0x60, 0x04, 0x8c, 0x04, - 0xaa, 0xa4, 0x00, 0xd9, 0x1f, 0xff, 0xdf, 0x30, 0x8a, 0x40, 0x20, 0x01, - 0xa0, 0x0e, 0xa4, 0x38, 0xe0, 0x64, 0x20, 0xe1, 0x20, 0x00, 0x82, 0x01, - 0x80, 0xd0, 0x50, 0xb9, 0x10, 0xa4, 0x00, 0xce, 0x1f, 0xff, 0xdf, 0x3e, - 0x03, 0x1a, 0x41, 0x03, 0x50, 0x00, 0xe7, 0x20, 0xe1, 0xa0, 0x0e, 0x80, - 0x20, 0x01, 0xa0, 0x6c, 0xe3, 0x11, 0x20, 0xe1, 0x60, 0x20, 0x61, 0xe0, - 0x00, 0x82, 0x0d, 0x18, 0x38, 0xe0, 0x96, 0x20, 0xe1, 0x20, 0x00, 0x8a, - 0x01, 0x80, 0x41, 0x4b, 0x1a, 0xa4, 0x00, 0x62, 0x80, 0x00, 0x00, 0x41, - 0x03, 0x50, 0x00, 0xe7, 0x20, 0xe1, 0xa0, 0x0e, 0x80, 0x20, 0x01, 0xa0, - 0x6c, 0xe3, 0x09, 0x20, 0xe1, 0x60, 0x6c, 0xe3, 0x11, 0x20, 0xe1, 0xe0, - 0x20, 0x61, 0x10, 0x00, 0x8a, 0x0f, 0xd0, 0x38, 0xe0, 0x14, 0x20, 0xe1, - 0x20, 0x0d, 0x4b, 0xd8, 0x61, 0xa0, 0x80, 0xa4, 0x00, 0x84, 0xbf, 0xff, - 0xff, 0x05, 0x83, 0x38, 0xe0, 0x44, 0x20, 0xe1, 0x20, 0x20, 0x01, 0xa0, - 0x00, 0x84, 0x0c, 0x20, 0x30, 0xe7, 0x01, 0x20, 0xe1, 0x20, 0x00, 0x88, - 0x0c, 0x80, 0x00, 0x84, 0x01, 0x80, 0x30, 0xe4, 0x80, 0x3e, 0x07, 0x30, - 0x00, 0xa0, 0x30, 0x41, 0x20, 0x0e, 0xc0, 0x60, 0xe2, 0x2c, 0x24, 0xe7, - 0x00, 0x60, 0xc6, 0x3a, 0x00, 0xb8, 0xd3, 0x48, 0x5a, 0xff, 0xd8, 0xe1, - 0x10, 0x40, 0x08, 0xe5, 0xc0, 0xc7, 0x3f, 0xbf, 0x31, 0x44, 0x80, 0x00, - 0x60, 0xa4, 0x00, 0xa6, 0x20, 0x00, 0x00, 0x34, 0x63, 0x04, 0x40, 0x03, - 0xaf, 0x00, 0x60, 0x3e, 0x0a, 0x20, 0xa4, 0x00, 0x5e, 0x20, 0x00, 0x00, - 0x01, 0x60, 0x0c, 0x90, 0x00, 0x60, 0xa4, 0x00, 0x12, 0x20, 0x00, 0x00, - 0x34, 0x63, 0x04, 0x40, 0x03, 0xaf, 0xd8, 0xe1, 0x10, 0x40, 0x08, 0xeb, - 0x00, 0x60, 0xc4, 0x87, 0x3f, 0xbf, 0xa4, 0x00, 0x6a, 0x20, 0x00, 0x00, - 0x01, 0x78, 0xd3, 0x54, 0xb7, 0xbf, 0x00, 0x60, 0xa4, 0x00, 0x44, 0x20, - 0x00, 0x00, 0x34, 0x63, 0x04, 0x40, 0x03, 0xaf, 0xc4, 0xe1, 0x20, 0x80, - 0x38, 0xc0, 0x84, 0xd2, 0xce, 0x68, 0x4b, 0x98, 0x60, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x80, 0xa4, 0x00, 0xa8, 0xc0, 0x00, 0x00, 0x98, 0x60, 0x00, - 0x00, 0x40, 0x00, 0x00, 0x80, 0xa4, 0x00, 0xe0, 0xc0, 0x00, 0x00, 0x98, - 0xe0, 0x04, 0x85, 0xe0, 0x00, 0x0c, 0x40, 0xcc, 0xe1, 0x60, 0x40, 0x00, - 0xff, 0xcc, 0xe1, 0x20, 0x40, 0xcc, 0xe1, 0x60, 0x40, 0x41, 0x07, 0x4f, - 0x47, 0xd2, 0x60, 0x00, 0x10, 0x46, 0xc7, 0x3f, 0x00, 0x60, 0xa4, 0x40, - 0xc1, 0xc0, 0x00, 0x00, 0x84, 0x60, 0xbe, 0xb0, 0x00, 0x20, 0xa4, 0x40, - 0xee, 0xc0, 0x00, 0x00, 0x47, 0xa8, 0x00, 0xa4, 0x00, 0x99, 0xc0, 0x00, - 0x00, 0xa4, 0x00, 0xe5, 0xc0, 0x00, 0x00, 0x41, 0x03, 0x5f, 0xa4, 0x00, - 0x29, 0xc0, 0x00, 0x00, 0x47, 0xb8, 0x00, 0x47, 0xa2, 0x00, 0xa4, 0x00, - 0x6b, 0xff, 0xff, 0xff, 0x38, 0x60, 0xf9, 0xa4, 0x00, 0x9b, 0xff, 0xff, - 0xff, 0x00, 0x60, 0xa4, 0x00, 0x8b, 0xff, 0xff, 0xff, 0x05, 0x83, 0x00, - 0x60, 0xa4, 0x00, 0xe3, 0xff, 0xff, 0xff, 0x05, 0x63, 0x00, 0x60, 0xa4, - 0x00, 0xbd, 0xff, 0xff, 0xff, 0x05, 0x43, 0xa4, 0x00, 0x85, 0xff, 0xff, - 0xff, 0x6d, 0x6b, 0x10, 0x61, 0x4a, 0x59, 0x6d, 0x8c, 0x08, 0x60, 0x6a, - 0x61, 0x47, 0xb2, 0x00, 0x47, 0xa4, 0x40, 0x05, 0x44, 0x3e, 0x03, 0x38, - 0x2c, 0x01, 0x00, 0x00, 0x60, 0x00, 0x80, 0x00, 0xa0, 0x00, 0xc0, 0x01, - 0x00, 0xa4, 0x00, 0xd6, 0x40, 0x00, 0x00, 0x81, 0x40, 0xbe, 0xb0, 0x00, - 0x20, 0x47, 0xb4, 0x40, 0xd8, 0xa5, 0x00, 0xff, 0x6c, 0x63, 0x20, 0x6c, - 0xe4, 0x41, 0x08, 0x67, 0x6c, 0x63, 0x40, 0x60, 0x84, 0x23, 0x34, 0x84, - 0xc0, 0x08, 0x64, 0x8c, 0x60, 0x21, 0x00, 0x00, 0x80, 0x00, 0xec, 0x8c, - 0xe0, 0x01, 0x00, 0x00, 0x80, 0x8c, 0xa0, 0x11, 0x00, 0x00, 0x80, 0x47, - 0xd2, 0x48, 0xcc, 0xf0, 0x7a, 0x01, 0x34, 0xc7, 0xe0, 0x41, 0x03, 0x88, - 0x84, 0xe0, 0x7e, 0xb0, 0x00, 0x20, 0x00, 0xf8, 0x80, 0xe0, 0x7e, 0xb0, - 0x00, 0x20, 0x90, 0xe6, 0x00, 0x20, 0x00, 0x20, 0x24, 0xe7, 0x00, 0x8c, - 0xe0, 0x29, 0x00, 0x00, 0x80, 0x3c, 0x26, 0xc0, 0x98, 0xe0, 0x00, 0x80, - 0x80, 0x00, 0x64, 0xe0, 0x3a, 0x8c, 0xe0, 0x09, 0x00, 0x00, 0x80, 0x84, - 0xe0, 0x7e, 0xb0, 0x00, 0x20, 0x3c, 0x07, 0x00, 0x00, 0x68, 0x64, 0x60, - 0x1a, 0x47, 0xd2, 0x48, 0x80, 0x00, 0x7e, 0xb0, 0x00, 0x20, 0x6c, 0x63, - 0x60, 0x8c, 0x60, 0x21, 0x00, 0x00, 0x80, 0x00, 0xe6, 0x8c, 0xe0, 0x01, - 0x00, 0x00, 0x80, 0x8c, 0xe0, 0x47, 0xf0, 0x00, 0x80, 0x94, 0xe7, 0x00, - 0x00, 0x00, 0x08, 0x40, 0x07, 0x2f, 0x98, 0xe0, 0x00, 0x00, 0x00, 0x08, - 0x8c, 0xe0, 0x17, 0xf0, 0x00, 0x80, 0x8c, 0x00, 0x29, 0x00, 0x00, 0x80, - 0x47, 0xd2, 0x48, 0x47, 0xaa, 0x00, 0x05, 0xa3, 0x05, 0x44, 0x05, 0x85, - 0x41, 0x85, 0x84, 0x38, 0xe0, 0x8c, 0x20, 0xe4, 0xd0, 0x38, 0xe0, 0x82, - 0x20, 0xe4, 0x30, 0x20, 0x04, 0xb0, 0x20, 0x04, 0x70, 0x00, 0x60, 0xa4, - 0x00, 0xda, 0xff, 0xff, 0xff, 0x00, 0x80, 0x0c, 0x20, 0x38, 0xe0, 0x9a, - 0x20, 0xe4, 0xb0, 0x38, 0xe0, 0x64, 0x20, 0xe4, 0x70, 0x00, 0x84, 0x60, - 0xe4, 0x54, 0x31, 0x67, 0xd0, 0x05, 0x44, 0x0d, 0xa0, 0x30, 0x8a, 0xd0, - 0x04, 0x6d, 0x3e, 0x04, 0x20, 0xc4, 0xab, 0xff, 0xff, 0xa4, 0x00, 0xff, - 0x7f, 0xff, 0xff, 0x01, 0x58, 0x01, 0x78, 0x44, 0xca, 0x57, 0x41, 0x0c, - 0x70, 0x04, 0x6d, 0x47, 0xca, 0x00, 0xa4, 0x40, 0x46, 0xff, 0xff, 0xff, - 0x47, 0xba, 0x00, 0x47, 0xa6, 0x10, 0x05, 0xc3, 0x01, 0xa0, 0x01, 0x80, - 0x3e, 0x0d, 0x50, 0x41, 0x8e, 0x2c, 0x00, 0x60, 0xa4, 0x00, 0x7f, 0x7f, - 0xff, 0xff, 0x8d, 0x80, 0x21, 0x00, 0x00, 0x80, 0x00, 0xea, 0x8c, 0xe0, - 0x01, 0x00, 0x00, 0x80, 0x00, 0xe0, 0x8c, 0x00, 0x11, 0x00, 0x00, 0x80, - 0x00, 0xf8, 0x38, 0xc0, 0x08, 0xd2, 0xce, 0x6a, 0xff, 0x04, 0x6a, 0xa4, - 0x00, 0x84, 0xff, 0xff, 0xff, 0x0c, 0x4c, 0x00, 0x68, 0xa4, 0x00, 0xb3, - 0x7f, 0xff, 0xff, 0x8d, 0x80, 0x21, 0x00, 0x00, 0x80, 0x38, 0xe0, 0x50, - 0x8c, 0xe0, 0x01, 0x00, 0x00, 0x80, 0x8c, 0xe0, 0x71, 0x00, 0x00, 0x80, - 0x2c, 0xe1, 0x00, 0x8c, 0xe0, 0x71, 0x00, 0x00, 0x80, 0x2c, 0xe1, 0x20, - 0x8c, 0xe0, 0x71, 0x00, 0x00, 0x80, 0x2c, 0xe1, 0x10, 0x8c, 0xe0, 0x71, - 0x00, 0x00, 0x80, 0x2c, 0xe1, 0x30, 0x41, 0x03, 0x90, 0x8c, 0x00, 0x29, - 0x00, 0x00, 0x80, 0x31, 0x61, 0x08, 0x04, 0x6b, 0x04, 0x81, 0x38, 0xa0, - 0x08, 0xa4, 0x00, 0xcf, 0x2f, 0xff, 0xdf, 0x24, 0xe1, 0xd8, 0x38, 0xc0, - 0x8c, 0xd2, 0xce, 0x63, 0x60, 0x2c, 0xe1, 0x78, 0x94, 0xe7, 0x00, 0xff, - 0xff, 0xff, 0x98, 0xc0, 0x00, 0x64, 0x9a, 0x82, 0xd2, 0xce, 0x69, 0xa0, - 0x24, 0xe1, 0x98, 0x38, 0xc0, 0x30, 0xd2, 0x8e, 0x6f, 0x20, 0x38, 0xe0, - 0x30, 0x20, 0xe1, 0x98, 0x2c, 0xe1, 0x48, 0x00, 0xf8, 0x2c, 0xe1, 0x08, - 0x04, 0x6a, 0x04, 0x8b, 0x00, 0xa8, 0xa4, 0x00, 0xa3, 0x7f, 0xff, 0xff, - 0x04, 0x6a, 0x38, 0x80, 0x90, 0x38, 0xa0, 0x30, 0xa4, 0x00, 0x20, 0x7f, - 0xff, 0xff, 0x2c, 0xc1, 0x48, 0x8d, 0x80, 0x21, 0x00, 0x00, 0x80, 0x00, - 0xea, 0x8c, 0xe0, 0x01, 0x00, 0x00, 0x80, 0x8c, 0xc0, 0x11, 0x00, 0x00, - 0x80, 0x04, 0x6a, 0x04, 0x8b, 0x00, 0xa0, 0xa4, 0x00, 0x29, 0x7f, 0xff, - 0xff, 0x01, 0xb8, 0x31, 0x8c, 0x02, 0x38, 0xe0, 0xfc, 0xd2, 0xda, 0x7d, - 0xf7, 0x47, 0xb6, 0x10, 0xcc, 0xf0, 0x40, 0x05, 0x60, 0xe7, 0x21, 0x60, - 0x63, 0x1b, 0x60, 0xe7, 0x18, 0xcc, 0xf0, 0x00, 0x05, 0x47, 0xd2, 0x48, - 0xcc, 0xf0, 0x60, 0x05, 0x60, 0xe7, 0x19, 0x60, 0x84, 0x23, 0x60, 0xe7, - 0x20, 0xcc, 0xf0, 0x20, 0x05, 0x47, 0xd2, 0x48, 0x47, 0xac, 0x00, 0x05, - 0x45, 0x05, 0x66, 0x04, 0xa7, 0x24, 0x41, 0xf0, 0xcc, 0xf0, 0x40, 0x01, - 0x38, 0xe7, 0x08, 0xcc, 0xf0, 0x00, 0x01, 0xd1, 0xd0, 0x32, 0xc0, 0x40, - 0x03, 0x68, 0xcc, 0xf0, 0x40, 0x09, 0x6c, 0xe7, 0x89, 0x34, 0xe7, 0xc0, - 0x3d, 0xe3, 0x38, 0x64, 0xe3, 0x3a, 0x3e, 0x07, 0x18, 0xcc, 0xd0, 0x40, - 0x09, 0x6c, 0xe3, 0x88, 0x94, 0xe7, 0x00, 0x00, 0x60, 0x00, 0x94, 0xc6, - 0xff, 0xff, 0x9f, 0xff, 0x60, 0xe7, 0x31, 0xcc, 0xf0, 0x00, 0x09, 0x3c, - 0x02, 0x00, 0xd8, 0xe0, 0x00, 0x08, 0x64, 0xc0, 0x3a, 0x40, 0x04, 0x30, - 0x98, 0xe6, 0x00, 0x20, 0x00, 0x00, 0x3e, 0x07, 0x32, 0x38, 0xe6, 0x20, - 0x3c, 0x2a, 0x00, 0x64, 0xc7, 0x32, 0x38, 0xe6, 0x40, 0x3c, 0x2b, 0x00, - 0x64, 0xc7, 0x32, 0xcc, 0xd0, 0x20, 0x00, 0x00, 0xee, 0xcc, 0xf0, 0x28, - 0x00, 0x3e, 0x08, 0x3c, 0x60, 0xe0, 0x3d, 0x6c, 0xe7, 0xf9, 0xcc, 0xf0, - 0x08, 0x00, 0xcc, 0xb0, 0x10, 0x00, 0x47, 0xbc, 0x00, 0xcc, 0x70, 0x30, - 0x00, 0x47, 0xd2, 0x48, 0xcc, 0x90, 0x00, 0x00, 0xcc, 0xf0, 0x60, 0x00, - 0x6c, 0x63, 0xc0, 0x38, 0x63, 0x80, 0x94, 0x63, 0x9f, 0x00, 0x00, 0x00, - 0x94, 0xe7, 0x60, 0xff, 0xff, 0xff, 0x60, 0x63, 0x39, 0xcc, 0x70, 0x20, - 0x00, 0x47, 0xd2, 0x48, 0x04, 0x83, 0x00, 0x6e, 0xa4, 0x40, 0x1b, 0xff, - 0xff, 0xff, 0xcc, 0x70, 0x40, 0x00, 0x3e, 0x03, 0x18, 0x47, 0xd2, 0x48, - 0xcc, 0x70, 0x60, 0x00, 0x34, 0x63, 0x80, 0x47, 0xd2, 0x48, 0x00, 0xe0, - 0xd1, 0xe0, 0x3f, 0x80, 0x6c, 0xe3, 0x40, 0x90, 0xe7, 0x10, 0x20, 0x00, - 0x20, 0x2c, 0xe7, 0x40, 0x6c, 0xe7, 0x40, 0xd8, 0xe7, 0x28, 0x0d, 0x08, - 0xf0, 0x2c, 0xe7, 0x40, 0x3e, 0x07, 0x38, 0x04, 0x67, 0x47, 0xd2, 0x48, - 0xd1, 0xe0, 0x33, 0x80, 0x6c, 0xe3, 0x40, 0x90, 0xe7, 0x10, 0x20, 0x00, - 0x20, 0x2c, 0xe7, 0x40, 0x6c, 0xe7, 0x40, 0xd8, 0xe7, 0x00, 0x0d, 0x08, - 0xf0, 0x2c, 0x87, 0x00, 0x47, 0xd2, 0x48, 0x00, 0xe0, 0xd1, 0xe0, 0x3f, - 0x80, 0x6c, 0xe3, 0x40, 0x90, 0xe7, 0x10, 0x20, 0x00, 0x20, 0x2c, 0xe7, - 0x40, 0x6c, 0xe7, 0x40, 0xd8, 0xe7, 0x00, 0x0d, 0x08, 0xf0, 0x2c, 0xe7, - 0x40, 0x3e, 0x07, 0x38, 0x04, 0x67, 0x47, 0xd2, 0x48, 0x47, 0xa4, 0x00, - 0x31, 0x41, 0x10, 0x04, 0xc3, 0x0c, 0xc0, 0x24, 0xe4, 0x00, 0x20, 0xe6, - 0x00, 0x00, 0xd8, 0x00, 0x98, 0x00, 0xbf, 0xd0, 0x7e, 0x52, 0xff, 0x47, - 0xb4, 0x00 -}; - -#endif /* FLASHPROGRAMMEREXTENSION_JN5168_BIN_H */ diff --git a/resources/archives/resources/prog_jennic-0.7/source/JN51xx_BootLoader.c b/resources/archives/resources/prog_jennic-0.7/source/JN51xx_BootLoader.c deleted file mode 100644 index 694f78fe4a..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/JN51xx_BootLoader.c +++ /dev/null @@ -1,1656 +0,0 @@ -/**************************************************************************** - * - * MODULE: JN51xx_BootLoader - * - * COMPONENT: $RCSfile: JN51xx_BootLoader.c,v $ - * - * VERSION: $Name: $ - * - * REVISION: $Revision: 1.2 $ - * - * DATED: $Date: 2009/03/02 13:33:44 $ - * - * STATUS: $State: Exp $ - * - * AUTHOR: Lee Mitchell - * - * DESCRIPTION: - * - * - * LAST MODIFIED BY: $Author: lmitch $ - * $Modtime: $ - * - **************************************************************************** - * - * This software is owned by NXP B.V. and/or its supplier and is protected - * under applicable copyright laws. All rights are reserved. We grant You, - * and any third parties, a license to use this software solely and - * exclusively on NXP products [NXP Microcontrollers such as JN5148, JN5142, JN5139]. - * You, and any third parties must reproduce the copyright and warranty notice - * and any other legend of ownership on each copy or partial copy of the - * software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - - * Copyright NXP B.V. 2012. All rights reserved - * - ***************************************************************************/ - -/****************************************************************************/ -/*** Include files ***/ -/****************************************************************************/ - -#include -#ifdef __linux__ -#include -#endif -#include -#include -#include -#include - -#include "uart.h" -#include "JN51xx_BootLoader.h" -#include "FlashProgrammerExtension_JN5168.bin.h" -#include "ChipID.h" -#include "dbg.h" - -/****************************************************************************/ -/*** Macro Definitions ***/ -/****************************************************************************/ - -#ifdef DEBUG_BOOTLOADER -#define TRACE_BOOTLOADER TRUE -#else -#define TRACE_BOOTLOADER FALSE -#endif - - -#define BL_MAX_CHUNK_SIZE 248 - -#define BL_TIMEOUT_1S 1000000 -#define BL_TIMEOUT_10S 10000000 - - -/* JN513x / JN514x definitions */ -#define JN514X_ROM_ID_ADDR 0x00000004 -#define JN514X_MAC_ADDRESS_LOCATION 0x00000010 - - -/* JN516x definitions */ - -/* Location of MAC address in Index sector */ -#define JN516X_MAC_INDEX_SECTOR_PAGE 5 -#define JN516X_MAC_INDEX_SECTOR_WORD 7 - -/* Location of MAC address in memory map */ -#define JN516X_CUSTOMER_MAC_ADDRESS_LOCATION 0x01001570 -#define JN516X_MAC_ADDRESS_LOCATION 0x01001580 - -/* Location of bootloader information in memory map */ -#define JN516X_BOOTLOADER_VERSION_ADDRESS 0x00000062 -#define JN516X_BOOTLOADER_ENTRY 0x00000066 - -/* Location of device configuration in memory map */ -#define JN516X_INDEX_SECTOR_DEVICE_CONFIG_ADDR 0x01001500 - -/* Location of Customer Settings in memory map */ -#define JN516X_INDEX_CUSTOMER_SETTINGS_ADDR 0x01001510 - -/****************************************************************************/ -/*** Type Definitions ***/ -/****************************************************************************/ - -typedef enum -{ - E_BL_MSG_TYPE_FLASH_ERASE_REQUEST = 0x07, - E_BL_MSG_TYPE_FLASH_ERASE_RESPONSE = 0x08, - E_BL_MSG_TYPE_FLASH_PROGRAM_REQUEST = 0x09, - E_BL_MSG_TYPE_FLASH_PROGRAM_RESPONSE = 0x0a, - E_BL_MSG_TYPE_FLASH_READ_REQUEST = 0x0b, - E_BL_MSG_TYPE_FLASH_READ_RESPONSE = 0x0c, - E_BL_MSG_TYPE_FLASH_SECTOR_ERASE_REQUEST = 0x0d, - E_BL_MSG_TYPE_FLASH_SECTOR_ERASE_RESPONSE = 0x0e, - E_BL_MSG_TYPE_FLASH_WRITE_STATUS_REGISTER_REQUEST = 0x0f, - E_BL_MSG_TYPE_FLASH_WRITE_STATUS_REGISTER_RESPONSE = 0x10, - E_BL_MSG_TYPE_RAM_WRITE_REQUEST = 0x1d, - E_BL_MSG_TYPE_RAM_WRITE_RESPONSE = 0x1e, - E_BL_MSG_TYPE_RAM_READ_REQUEST = 0x1f, - E_BL_MSG_TYPE_RAM_READ_RESPONSE = 0x20, - E_BL_MSG_TYPE_RAM_RUN_REQUEST = 0x21, - E_BL_MSG_TYPE_RAM_RUN_RESPONSE = 0x22, - E_BL_MSG_TYPE_FLASH_READ_ID_REQUEST = 0x25, - E_BL_MSG_TYPE_FLASH_READ_ID_RESPONSE = 0x26, - E_BL_MSG_TYPE_SET_BAUD_REQUEST = 0x27, - E_BL_MSG_TYPE_SET_BAUD_RESPONSE = 0x28, - E_BL_MSG_TYPE_FLASH_SELECT_TYPE_REQUEST = 0x2c, - E_BL_MSG_TYPE_FLASH_SELECT_TYPE_RESPONSE = 0x2d, - - E_BL_MSG_TYPE_GET_CHIPID_REQUEST = 0x32, - E_BL_MSG_TYPE_GET_CHIPID_RESPONSE = 0x33, - /* Flash programmer extension commands */ - E_BL_MSG_TYPE_PDM_ERASE_REQUEST = 0x36, - E_BL_MSG_TYPE_PDM_ERASE_RESPONSE = 0x37, - E_BL_MSG_TYPE_PROGRAM_INDEX_SECTOR_REQUEST = 0x38, - E_BL_MSG_TYPE_PROGRAM_INDEX_SECTOR_RESPONSE = 0x39, - E_BL_MSG_TYPE_EEPROM_READ_REQUEST = 0x3A, - E_BL_MSG_TYPE_EEPROM_READ_RESPONSE = 0x3B, - E_BL_MSG_TYPE_EEPROM_WRITE_REQUEST = 0x3C, - E_BL_MSG_TYPE_EEPROM_WRITE_RESPONSE = 0x3D, -} __attribute ((packed)) teBL_MessageType; - - -typedef enum -{ - E_BL_RESPONSE_OK = 0x00, - E_BL_RESPONSE_NOT_SUPPORTED = 0xff, - E_BL_RESPONSE_WRITE_FAIL = 0xfe, - E_BL_RESPONSE_INVALID_RESPONSE = 0xfd, - E_BL_RESPONSE_CRC_ERROR = 0xfc, - E_BL_RESPONSE_ASSERT_FAIL = 0xfb, - E_BL_RESPONSE_USER_INTERRUPT = 0xfa, - E_BL_RESPONSE_READ_FAIL = 0xf9, - E_BL_RESPONSE_TST_ERROR = 0xf8, - E_BL_RESPONSE_AUTH_ERROR = 0xf7, - E_BL_RESPONSE_NO_RESPONSE = 0xf6, - E_BL_RESPONSE_ERROR = 0xf0, -} __attribute__ ((packed)) teBL_Response; - - -typedef struct -{ - uint16_t u16FlashId; - uint8_t u8FlashType; - char *pcFlashName; -} tsBL_FlashDevice; - -/****************************************************************************/ -/*** Local Function Prototypes ***/ -/****************************************************************************/ - -static int iBL_ReadChipId(int iUartFd, uint32_t *pu32ChipId); -static int iBL_ReadFlashId(int iUartFd, uint16_t *pu16FlashId); -static int iBL_SelectFlashDevice(int iUartFd, uint16_t u16FlashId); -static int iBL_WriteStatusRegister(int iUartFd, uint8_t u8StatusReg); - -static int iBL_RunRAM(int iUartFd, uint32_t u32Address); -static int iBL_ReadRAM(int iUartFd, uint32_t u32Address, uint8_t u8Length, uint8_t *pu8Buffer); -static int iBL_WriteRAM(int iUartFd, uint32_t u32Address, uint8_t u8Length, uint8_t *pu8Buffer); - -static int iBL_EraseFlash(int iUartFd); -static int iBL_ReadFlash(int iUartFd, uint32_t u32Address, uint8_t u8Length, uint8_t *pu8Buffer); -static int iBL_WriteFlash(int iUartFd, uint32_t u32Address, uint8_t u8Length, uint8_t *pu8Buffer); - -static teBL_Response eBL_Request(int iUartFd, int iTimeoutMicroseconds, teBL_MessageType eTxType, uint8_t u8HeaderLen, uint8_t *pu8Header, uint8_t u8TxLength, uint8_t *pu8TxData, teBL_MessageType *peRxType, uint8_t *pu8RxLength, uint8_t *pu8RxData); - -static int iBL_WriteMessage(int iUartFd, teBL_MessageType eType, uint8_t u8HeaderLength, uint8_t *pu8Header, uint8_t u8Length, uint8_t *pu8Data); -static teBL_Response eBL_ReadMessage(int iUartFd, int iTimeoutMicroseconds, teBL_MessageType *peType, uint8_t *pu8Length, uint8_t *pu8Data); - - -/****************************************************************************/ -/*** Exported Variables ***/ -/****************************************************************************/ - -extern int iVerbosity; - -/****************************************************************************/ -/*** Local Variables ***/ -/****************************************************************************/ - -tsBL_FlashDevice asFlashDevices[] = { - { - .u16FlashId = 0x0505, - .u8FlashType = 4, - .pcFlashName = "ST M25P05-A" - }, - - { - .u16FlashId = 0x1010, - .u8FlashType = 0, - .pcFlashName = "ST M25P10-A" - }, - - { - .u16FlashId = 0x1111, - .u8FlashType = 5, - .pcFlashName = "ST M25P20-A" - }, - - { - .u16FlashId = 0x1212, - .u8FlashType = 3, - .pcFlashName = "ST M25P40" - }, - - { - .u16FlashId = 0xbf49, - .u8FlashType = 1, - .pcFlashName = "SST 25VF010A" - }, - - { - .u16FlashId = 0x1f60, - .u8FlashType = 2, - .pcFlashName = "Atmel 25F512" - }, - - { - .u16FlashId = 0xccee, - .u8FlashType = 8, - .pcFlashName = "JN516x" - }, - -}; - - -/****************************************************************************/ -/*** Exported Functions ***/ -/****************************************************************************/ -/**************************************************************************** - * - * NAME: BL_eGetChipId - * - * DESCRIPTION: - * Gets the ChipID - * - * PARAMETERS: Name RW Usage - * iUartFd R Uart file descriptor - * psChipDetails W Pointer to chip details structure - * - * RETURNS: - * teStatus E_STATUS_OK if success - * - ****************************************************************************/ -teStatus BL_eGetChipId(int iUartFd, tsChipDetails *psChipDetails) -{ - uint8_t au8Buffer[6]; - - DBG_vPrintf(TRACE_BOOTLOADER, "Get Chip ID\n"); - - if(psChipDetails == NULL) - { - return E_STATUS_NULL_PARAMETER; - } - - psChipDetails->u32CustomerSettings = 0xFFFFFFFF; - - /* Send chip id request */ - if(iBL_ReadChipId(iUartFd, &psChipDetails->u32ChipId) < 0) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error reading chip id\n"); - - /* That failed so it might be an old device that doesn't support the command, try reading it directly */ - if (iBL_ReadRAM(iUartFd, 0x100000FC, 4, au8Buffer) < 0) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error Reading processor ID register\n"); - return E_STATUS_ERROR; - } - else - { - psChipDetails->u32ChipId = au8Buffer[0] << 24; - psChipDetails->u32ChipId |= au8Buffer[1] << 16; - psChipDetails->u32ChipId |= au8Buffer[2] << 8; - psChipDetails->u32ChipId |= au8Buffer[3] << 0; - } - } - - if (CHIP_ID_PART(psChipDetails->u32ChipId) == CHIP_ID_PART(CHIP_ID_JN5168)) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Reading 6x data\n"); - - if (iBL_ReadRAM(iUartFd, JN516X_BOOTLOADER_VERSION_ADDRESS, 4, au8Buffer) < 0) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error Reading bootloader version\n"); - return E_STATUS_ERROR; - } - else - { - psChipDetails->u32BootloaderVersion = au8Buffer[0] << 24; - psChipDetails->u32BootloaderVersion |= au8Buffer[1] << 16; - psChipDetails->u32BootloaderVersion |= au8Buffer[2] << 8; - psChipDetails->u32BootloaderVersion |= au8Buffer[3] << 0; - - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x Bootloader version 0x%08x\n", psChipDetails->u32BootloaderVersion); - } - - if (iBL_ReadRAM(iUartFd, JN516X_INDEX_SECTOR_DEVICE_CONFIG_ADDR, 4, au8Buffer) < 0) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error Reading config from flash index sector\n"); - return E_STATUS_ERROR; - } - else - { - psChipDetails->u32RamSize = (au8Buffer[3] & 0x07) >> 0; - psChipDetails->u32FlashSize = (au8Buffer[3] & 0x30) >> 4; - - psChipDetails->u32SupportedFirmware = ( - (psChipDetails->u32FlashSize << 16) | - (psChipDetails->u32RamSize << 24) | - (0x08)); - - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x RAM size %dk\n", (psChipDetails->u32RamSize * 8) + 8); - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x Flash size %dk\n", (psChipDetails->u32FlashSize * 32) + 32); - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x Bootloader version 0x%08x\n", psChipDetails->u32BootloaderVersion); - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x Supported firmware 0x%08x\n", psChipDetails->u32SupportedFirmware); - } - } - else if (CHIP_ID_PART(psChipDetails->u32ChipId) == CHIP_ID_PART(CHIP_ID_JN5169)) - { - - psChipDetails->u32BootloaderVersion = 0; - int bFlashLoad = 1; - int bFlashEnc = 1; - int iCRPLevel = 3; - int iVBOThr = 7; - int bCPUJTAG = 1; - - if (iBL_ReadRAM(iUartFd, JN516X_INDEX_CUSTOMER_SETTINGS_ADDR, 4, au8Buffer) < 0) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error Reading Customer Settings\n"); - return E_STATUS_ERROR; - } - else - { - bFlashLoad = (au8Buffer[3] >> 7) & 0x01; - bFlashEnc = (au8Buffer[3] >> 6) & 0x01; - iCRPLevel = (au8Buffer[3] >> 4) & 0x03; - iVBOThr = (au8Buffer[3] >> 1) & 0x07; - bCPUJTAG = (au8Buffer[3] >> 0) & 0x01; - - psChipDetails->u32CustomerSettings = au8Buffer[0] << 24; - psChipDetails->u32CustomerSettings |= au8Buffer[1] << 16; - psChipDetails->u32CustomerSettings |= au8Buffer[2] << 8; - psChipDetails->u32CustomerSettings |= au8Buffer[3] << 0; - - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x FLASH_LOAD %d (If 0 then loading firmware from external Flash is disabled)\n", bFlashLoad); - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x FLASH_ENC %d (If 0 then the contents of external Flash are decrypted as they are loaded into internal Flash memory)\n", bFlashEnc); - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x CRP_LEVEL %d\n", iCRPLevel); - DBG_vPrintf(TRACE_BOOTLOADER, "\t0 = CRP level 2 (no programming allowed via UART)\n"); - DBG_vPrintf(TRACE_BOOTLOADER, "\t1 = CRP level 1 (Flash read protection)\n"); - DBG_vPrintf(TRACE_BOOTLOADER, "\t2 = CRP level 2 (no programming allowed via UART)\n"); - DBG_vPrintf(TRACE_BOOTLOADER, "\t3 = CRP level 0 (no protection))\n"); - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x VBO_THR %d\n", iVBOThr); - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x CPU_JTAG %d (If 0 then CPU JTAG access is disabled)\n", bCPUJTAG); - } - - if (iBL_ReadRAM(iUartFd, JN516X_INDEX_SECTOR_DEVICE_CONFIG_ADDR, 4, au8Buffer) < 0) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error Reading config from flash index sector\n"); - return E_STATUS_ERROR; - } - else - { - psChipDetails->u32RamSize = (au8Buffer[3] & 0x07) >> 0; - psChipDetails->u32FlashSize = (au8Buffer[3] & 0x30) >> 4; - - psChipDetails->u32RamSize = 32/8-1; //!!! - psChipDetails->u32FlashSize = 512/32-1; //!!! - - psChipDetails->u32SupportedFirmware = ( - (psChipDetails->u32FlashSize << 16) | - (psChipDetails->u32RamSize << 24) | - (0x08)); - psChipDetails->u32SupportedFirmware = 0x0f03000b; //!!! - - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x RAM size %dk\n", (psChipDetails->u32RamSize * 8) + 8); - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x Flash size %dk\n", (psChipDetails->u32FlashSize * 32) + 32); - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x Bootloader version 0x%08x\n", psChipDetails->u32BootloaderVersion); - DBG_vPrintf(TRACE_BOOTLOADER, "JN516x Supported firmware 0x%08x\n", psChipDetails->u32SupportedFirmware); - } - } - else - { - if (iBL_ReadRAM(iUartFd, JN514X_ROM_ID_ADDR, 4, au8Buffer) < 0) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error Reading ROM ID\n"); - return E_STATUS_ERROR; - } - else - { - psChipDetails->u32SupportedFirmware = au8Buffer[0] << 24; - psChipDetails->u32SupportedFirmware |= au8Buffer[1] << 16; - psChipDetails->u32SupportedFirmware |= au8Buffer[2] << 8; - psChipDetails->u32SupportedFirmware |= au8Buffer[3] << 0; - } - } - - return E_STATUS_OK; -} - - -/**************************************************************************** - * - * NAME: BL_eGetMacAddress - * - * DESCRIPTION: - * Reads the MAC address - * - * PARAMETERS: Name RW Usage - * iUartFd R Uart file descriptor - * psChipDetails W Pointer to chip details structure - * - * RETURNS: - * teStatus E_STATUS_OK if success - * - ****************************************************************************/ -teStatus BL_eGetMacAddress(int iUartFd, tsChipDetails *psChipDetails) -{ - - int iRetval; - uint8_t au8InvalidMac[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - if(psChipDetails == NULL) - { - return E_STATUS_NULL_PARAMETER; - } - - switch(CHIP_ID_PART(psChipDetails->u32ChipId)) - { - case CHIP_ID_PART(CHIP_ID_JN5148_REV2A): - iRetval = iBL_ReadFlash(iUartFd, JN514X_MAC_ADDRESS_LOCATION, 8, psChipDetails->au8MacAddress); - break; - - case CHIP_ID_PART(CHIP_ID_JN5168): - case CHIP_ID_PART(CHIP_ID_JN5169): - /* First we read the customer specific MAC address, and if its not all F's, we use that */ - iRetval = iBL_ReadRAM(iUartFd, JN516X_CUSTOMER_MAC_ADDRESS_LOCATION, 8, psChipDetails->au8MacAddress); - - /* If its all F's, read factory assigned MAC */ - if(memcmp(psChipDetails->au8MacAddress, au8InvalidMac, 8) == 0) - { - DBG_vPrintf(TRACE_BOOTLOADER, "No customer MAC address - using factory\n"); - iRetval = iBL_ReadRAM(iUartFd, JN516X_MAC_ADDRESS_LOCATION, 8, psChipDetails->au8MacAddress); - } - break; - - default: - return E_STATUS_ERROR; - - } - - return (iRetval < 0) ? E_STATUS_ERROR : E_STATUS_OK; -} - - -/**************************************************************************** - * - * NAME: BL_eGetChipDetails - * - * DESCRIPTION: - * Get details of the device - * - * PARAMETERS: Name RW Usage - * iUartFd R Uart file descriptor - * psChipDetails W Pointer to chip details structure - * - * RETURNS: - * int E_STATUS_OK if success - * - ****************************************************************************/ -teStatus BL_eGetChipDetails(int iUartFd, tsChipDetails *psChipDetails) -{ - teStatus eStatus; - - eStatus = BL_eGetChipId(iUartFd, psChipDetails); - if (eStatus != E_STATUS_OK) - { - return eStatus; - } - - eStatus = BL_eGetMacAddress(iUartFd, psChipDetails); - if (eStatus != E_STATUS_OK) - { - return eStatus; - } - return E_STATUS_OK; -} - - -/**************************************************************************** - * - * NAME: BL_iReprogram - * - * DESCRIPTION: - * Reprograms the device - * - * PARAMETERS: Name RW Usage - * pu8Firmware R Pointer to firmware image to download - * pu64Address R Pointer to MAC Address. If NULL, read from flash. - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -teStatus BL_eReprogram(int iUartFd, tsChipDetails *psChipDetails, tsFW_Info *psFWImage) -{ - - int n; - uint16_t u16FlashId; - uint8_t u8ChunkSize; - uint8_t au8Buffer1[BL_MAX_CHUNK_SIZE + 1]; - uint8_t au8Buffer2[BL_MAX_CHUNK_SIZE + 1]; - - if (memcmp(&psFWImage->u32ROMVersion, &psChipDetails->u32SupportedFirmware, 4) != 0) - { - printf("Incompatible firmware (Built for 0x%08x, Device is 0x%08x)\n", psFWImage->u32ROMVersion, psChipDetails->u32SupportedFirmware); - return E_STATUS_INCOMPATIBLE; - } - - /* First, depending on chip type, we may need to copy the MAC address into the firmware image - * Also, some images have a 4 byte header in the binary that needs stripping off, so do that here - * by adjusting start point and length to suit */ - switch(CHIP_ID_PART(psChipDetails->u32ChipId)) - { - - case CHIP_ID_PART(CHIP_ID_JN5148_REV2A): - memcpy(&psFWImage->pu8ImageData[JN514X_MAC_ADDRESS_LOCATION], psChipDetails->au8MacAddress, 8); - break; - - case CHIP_ID_PART(CHIP_ID_JN5168): - case CHIP_ID_PART(CHIP_ID_JN5169): - break; - - default: - printf("Unsupported chip type 0x%08x\n", psChipDetails->u32ChipId); - return E_STATUS_ERROR; - break; - } -#if 0 - /* Dump the file contents in hex */ - DBG_vPrintf(TRACE_BOOTLOADER, "Dumping %d bytes\n", psFWImage->u32ImageLength); - for(n = 0; n < psFWImage->u32ImageLength; n++) - { - - if((n % 16) == 0) - { - DBG_vPrintf(TRACE_BOOTLOADER, "\n%08x: ", n); - } - - DBG_vPrintf(TRACE_BOOTLOADER, " %02x", psFWImage->pu8ImageData[n]); - - } - DBG_vPrintf(TRACE_BOOTLOADER, "\n"); -#endif - - - /* Get the flash Id */ - if(iBL_ReadFlashId(iUartFd, &u16FlashId) == -1) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error getting flash id...\n"); - return E_STATUS_ERROR; - } - DBG_vPrintf(TRACE_BOOTLOADER, "FlashId: %04x\n", u16FlashId); - - /* Set the flash type */ - if(iBL_SelectFlashDevice(iUartFd, u16FlashId) == -1) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error setting flash type...\n"); - return E_STATUS_ERROR; - } - - /* If its not internal flash, we need to enable write access */ - if(u16FlashId != FLASH_INTERNAL) - { - if(iBL_WriteStatusRegister(iUartFd, 0x00) == -1) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error writing to flash status register...\n"); - return E_STATUS_ERROR; - } - } - - /* Erase the flash memory */ - if (iVerbosity > 0) - { - printf("Erasing: 0%%\n"); - } - if(iBL_EraseFlash(iUartFd) == -1) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error erasing flash...\n"); - return E_STATUS_ERROR; - } - - if((psChipDetails->u32CustomerSettings&0x30) != 0x30){ - DBG_vPrintf(TRACE_BOOTLOADER, "Cannot check for Flash blankess, because of CRP\n"); - }else{ - /* Ensure that flash is erased */ - DBG_vPrintf(TRACE_BOOTLOADER, "Checking flash is blank...\n"); - memset(au8Buffer2, 0xFF, 64); - - if (iBL_ReadFlash(iUartFd, 0, 64, au8Buffer1) == -1) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error reading Flash at address 0x%08x\n", 0); - return E_STATUS_ERROR; - } - else - { - if (memcmp(au8Buffer1, au8Buffer2, 64)) - { - printf("Failed to erase Flash: not blank!\n"); -#if 0 - { - /* Dump the contents in hex */ - DBG_vPrintf(TRACE_BOOTLOADER, "Dumping %d bytes\n", 64); - for(n = 0; n < 64; n++) - { - - if((n % 16) == 0) - { - DBG_vPrintf(TRACE_BOOTLOADER, "\n%08x: ", n); - } - - DBG_vPrintf(TRACE_BOOTLOADER, " %02x", au8Buffer1[n]); - - } - DBG_vPrintf(TRACE_BOOTLOADER, "\n"); - - } -#endif - - return E_STATUS_ERROR; - } - else - { - DBG_vPrintf(TRACE_BOOTLOADER, "Flash erase success\n"); - - if (iVerbosity > 0) - { - printf("%c[AErasing: 100%%\n", 0x1B); - } - } - } - } - - if (iVerbosity > 0) - { - printf("Writing Program to Flash\n\n"); - } - - for(n = 0; n < psFWImage->u32ImageLength;) - { - if((psFWImage->u32ImageLength - n) > 128) - { - u8ChunkSize = 128; - } - else - { - u8ChunkSize = psFWImage->u32ImageLength - n; - } - - if(iBL_WriteFlash(iUartFd, n, u8ChunkSize, psFWImage->pu8ImageData + n) == -1) - { - printf("Failed to write at address 0x%08x\n", n); - return E_STATUS_ERROR; - } - - n += u8ChunkSize; - - if (iVerbosity > 0) - { - printf("%c[AWriting: %3d%%\n", 0x1B, (n * 100) / psFWImage->u32ImageLength); - } - } - - if((psChipDetails->u32CustomerSettings&0x30) != 0x30) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Cannot verify Flash, because of CRP\n"); - } - else - { - if (iVerbosity > 0) - { - printf("Verifying Program in Flash\n\n"); - } - - for(n = 0; n < psFWImage->u32ImageLength;) - { - if((psFWImage->u32ImageLength - n) > 128) - { - u8ChunkSize = 128; - } - else - { - u8ChunkSize = psFWImage->u32ImageLength - n; - } - - if (iBL_ReadFlash(iUartFd, n, u8ChunkSize, au8Buffer1) == -1) - { - printf("Error reading at address 0x%08x\n", n); - return E_STATUS_ERROR; - } - else - { - if (memcmp(psFWImage->pu8ImageData + n, au8Buffer1, u8ChunkSize)) - { - printf("Verify failed at address 0x%08x!\n", n); - return E_STATUS_ERROR; - } - } - - n += u8ChunkSize; - - if (iVerbosity > 0) - { - printf("%c[AVerifying: %3d%%\n", 0x1B, (n * 100) / psFWImage->u32ImageLength); - } - } - } - - return E_STATUS_OK; -} - - -teStatus BL_eSetBaudrate(int iUartFd, uint32_t u32Baudrate) -{ - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - uint8_t u8RxDataLen = 0; - uint8_t au8Buffer[6]; - uint32_t u32Divisor; - - // Divide 1MHz clock bu baudrate to get the divisor, round to closest - u32Divisor = (1000000+u32Baudrate/2) / u32Baudrate; - - DBG_vPrintf(TRACE_BOOTLOADER, "%s: Actual baud rate set %d\n", __FUNCTION__, 1000000/u32Divisor); - - au8Buffer[0] = (uint8_t)u32Divisor; - au8Buffer[1] = 0; - au8Buffer[2] = 0; - au8Buffer[3] = 0; - au8Buffer[4] = 0; - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_SET_BAUD_REQUEST, 1, au8Buffer, 0, NULL, &eRxType, &u8RxDataLen, au8Buffer); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_SET_BAUD_RESPONSE) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%s: Response %02x\n", __FUNCTION__, eResponse); - return E_STATUS_ERROR; - } - return E_STATUS_OK; -} - -teStatus BL_EEPROMErase(int iUartFd, uint32_t iEraseAll) -{ - - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - uint8_t au8CmdBuffer[1]; - uint8_t u8RxDataLen = 0; - uint8_t au8Buffer[6]; - - au8CmdBuffer[0] = (uint8_t)(iEraseAll) & 0xff; - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_PDM_ERASE_REQUEST, 1, au8CmdBuffer, 0, NULL, &eRxType, &u8RxDataLen, au8Buffer); - if(eResponse != E_BL_RESPONSE_OK) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%s: Response %02x\n", __FUNCTION__, eResponse); - return E_STATUS_ERROR; - } - - return E_STATUS_OK; -} - -#if 0 -/**************************************************************************** - * - * NAME: iBL_DownloadFirmwareToRam - * - * DESCRIPTION: - * Downloads the given firmware to the module's RAM. - * see \ZED-TL\Sw\Source\boot.c for details - * - * PARAMETERS: Name RW Usage - * pu8Firmware R Pointer to firmware image to download - * pu64Address R Pointer to MAC Address. If NULL, read from flash. - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -int iBL_DownloadFirmwareToRam(tsFW_Info *psFW_Info, uint64_t *pu64MAC_Address) -{ - int n; - uint8_t u8ChunkSize; - -// if(psBinHeader->u8ConfigByte0 == 0xff && psBinHeader->u8ConfigByte1 == 0xff && psBinHeader->u16SpiScrambleIndex == 0xffff) -// { -// DBG_vPrintf(TRACE_BOOTLOADER, "\nFlash image is invalid, aborting."); -// return(-1); -// } - - DBG_vPrintf(TRACE_BOOTLOADER, "\nText Start 0x%08x - Len %d bytes", psFW_Info->u32TextSectionLoadAddress, psFW_Info->u32TextSectionLength); - DBG_vPrintf(TRACE_BOOTLOADER, "\nBSS Start 0x%08x - Len %d bytes", psFW_Info->u32BssSectionLoadAddress, psFW_Info->u32BssSectionLength); - DBG_vPrintf(TRACE_BOOTLOADER, "\nReset entry point 0x%08x", ntohl(psFW_Info->u32ResetEntryPoint)); - DBG_vPrintf(TRACE_BOOTLOADER, "\nWake entry point 0x%08x", ntohl(psFW_Info->u32WakeUpEntryPoint)); - - printf("\nHeader is at %p\n", psFW_Info->pu8ImageData); - printf("Text Start at %p\n", psFW_Info->pu8TextData); - -#if 0 - if (pu64MAC_Address) - { - uint64_t u64Temp; - u64Temp = htobe64(*pu64MAC_Address); - memset(au8Buffer, 0, 12); - memcpy(au8Buffer, &u64Temp, sizeof(uint64_t)); - } - else - { - DBG_vPrintf(TRACE_BOOTLOADER, "Reading module MAC address from flash.\n"); - /* Read out the module's MAC address & license key, we need to write them back to RAM */ - if(iBL_ReadFlash(MAC_ADDR_LOCATION, 12, au8Buffer) != 12) - { - DBG_vPrintf(TRACE_BOOTLOADER, "\nFailed to read module's MAC address"); - return(-1); - } - } -#endif -// DBG_vPrintf(TRACE_BOOTLOADER, "\nLoading .text\n"); - /* Download text segment */ - for(n = 0; n < psFW_Info->u32TextSectionLength;) - { - if((psFW_Info->u32TextSectionLength - n) > BL_MAX_CHUNK_SIZE) - { - u8ChunkSize = BL_MAX_CHUNK_SIZE; - } - else - { - u8ChunkSize = psFW_Info->u32TextSectionLength - n; - } - - if(iBL_WriteRAM(psFW_Info->u32TextSectionLoadAddress + n, u8ChunkSize, psFW_Info->pu8TextData + n) == -1) - { - DBG_vPrintf(TRACE_BOOTLOADER, "\nProblem writing chunk"); - return(-1); - } - - printf("Wrote chunk length %d at address 0x%08x: 0x%08x\n", u8ChunkSize, psFW_Info->u32TextSectionLoadAddress + n, ntohl(*((uint32_t*)(psFW_Info->pu8TextData + n)))); - - if (1) - { - uint8_t au8Buffer[BL_MAX_CHUNK_SIZE + 1]; - if (iBL_ReadRAM(psFW_Info->u32TextSectionLoadAddress + n, u8ChunkSize, au8Buffer) == -1) - { - printf("Error reading at address 0x%08x\n", psFW_Info->u32TextSectionLoadAddress + n); - return -1; - } - else - { - if (memcmp(psFW_Info->pu8TextData + n, au8Buffer, u8ChunkSize)) - { - printf("Data read at address 0x%08x is incorrect\n", psFW_Info->u32TextSectionLoadAddress + n); - return -1; - } - } - } - - n += u8ChunkSize; - - //DBG_vPrintf(TRACE_BOOTLOADER, "Loading: %3d%%\n%c[A", (n * 100) / psFW_Info->u32TextSectionLength, 0x1B); - DBG_vPrintf(TRACE_BOOTLOADER, "Loading: %3d%%\n", (n * 100) / psFW_Info->u32TextSectionLength); - } - - /* Write back MAC address & license key */ -// if(iBL_WriteRAM(psFW_Info->u32TextSectionLoadAddress, 12, au8Buffer) == -1) -// { -// DBG_vPrintf(TRACE_BOOTLOADER, "\nProblem writing chunk"); -// return(-1); -// } -#if 1 - DBG_vPrintf(TRACE_BOOTLOADER, "\nLoading .bss \n"); - - /* Download BSS segment */ - { - uint8_t au8Buffer[127]; - memset(au8Buffer, 0, sizeof(au8Buffer)); - for(n = 0; n < psFW_Info->u32BssSectionLength;) - { - if((psFW_Info->u32BssSectionLength - n) > sizeof(au8Buffer)) - { - u8ChunkSize = sizeof(au8Buffer); - } - else - { - u8ChunkSize = psFW_Info->u32BssSectionLength - n; - } - if(iBL_WriteRAM(psFW_Info->u32BssSectionLoadAddress + n, u8ChunkSize, au8Buffer) == -1) - { - DBG_vPrintf(TRACE_BOOTLOADER, "\nProblem writing BSS"); - return(-1); - } - - n += u8ChunkSize; - - DBG_vPrintf(TRACE_BOOTLOADER, "Loading: %3d%%\n%c[A", (n * 100) / psFW_Info->u32BssSectionLength, 0x1B); - } - } -#endif - - DBG_vPrintf(TRACE_BOOTLOADER, "\nStarting module application"); - iBL_RunRAM(psFW_Info->u32ResetEntryPoint); - - return(0); -} -#endif - - - - - - - - - -/**************************************************************************** - * - * NAME: iBL_ReadChipId - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -static int iBL_ReadChipId(int iUartFd, uint32_t *pu32ChipId) -{ - - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - uint8_t u8RxDataLen = 0; - uint8_t au8Buffer[256]; // Was 6 bytes, but chip ID response is 11 bytes!!! As the length is given in a byte, this should always work. - - if(pu32ChipId == NULL) - { - return(-1); - } - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_GET_CHIPID_REQUEST, 0, NULL, 0, NULL, &eRxType, &u8RxDataLen, au8Buffer); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_GET_CHIPID_RESPONSE) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%s: Response %02x\n", __FUNCTION__, eResponse); - return(-1); - } - - *pu32ChipId = au8Buffer[0] << 24; - *pu32ChipId |= au8Buffer[1] << 16; - *pu32ChipId |= au8Buffer[2] << 8; - *pu32ChipId |= au8Buffer[3] << 0; - - return(0); -} - - -/**************************************************************************** - * - * NAME: iBL_ReadFlashId - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -static int iBL_ReadFlashId(int iUartFd, uint16_t *pu16FlashId) -{ - - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - uint8_t u8RxDataLen = 0; - uint8_t au8Buffer[6]; - - if(pu16FlashId == NULL) - { - return(-1); - } - - *pu16FlashId = 0x0000; - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_FLASH_READ_ID_REQUEST, 0, NULL, 0, NULL, &eRxType, &u8RxDataLen, au8Buffer); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_FLASH_READ_ID_RESPONSE) - { - /* Failed to read Flash ID */ - DBG_vPrintf(TRACE_BOOTLOADER, "Could not read Flash type!\n"); - return -1; - } - - *pu16FlashId = au8Buffer[0] << 8; - *pu16FlashId |= au8Buffer[1] << 0; - - return 0; -} - - -/**************************************************************************** - * - * NAME: iBL_ReadFlashId - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -static int iBL_SelectFlashDevice(int iUartFd, uint16_t u16FlashId) -{ - int n; - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - uint8_t u8RxDataLen = 0; - uint8_t au8Buffer[6]; - - /* Search for flash type given flash device id code */ - for(n = 0; n < sizeof(asFlashDevices) / sizeof(tsBL_FlashDevice); n++) - { - /* If we found a match, send command to select this flash device type */ - if(asFlashDevices[n].u16FlashId == u16FlashId) - { - - DBG_vPrintf(TRACE_BOOTLOADER, "Flash type is %s\n", asFlashDevices[n].pcFlashName); - - au8Buffer[0] = asFlashDevices[n].u8FlashType; - au8Buffer[1] = 0; - au8Buffer[2] = 0; - au8Buffer[3] = 0; - au8Buffer[4] = 0; - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_FLASH_SELECT_TYPE_REQUEST, 5, au8Buffer, 0, NULL, &eRxType, &u8RxDataLen, au8Buffer); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_FLASH_SELECT_TYPE_RESPONSE) - { - /* Failed to select flash type */ - DBG_vPrintf(TRACE_BOOTLOADER, "Could not select Flash type!\n"); - return -1; - } - - return 0; - - } - } - - /* Flash type not found */ - return -1; - -} - - -/**************************************************************************** - * - * NAME: iBL_WriteStatusRegister - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -static int iBL_WriteStatusRegister(int iUartFd, uint8_t u8StatusReg) -{ - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - uint8_t u8RxDataLen = 0; - uint8_t au8Buffer[6]; - - DBG_vPrintf(TRACE_BOOTLOADER, "Writing %02x to flash status register\n", u8StatusReg); - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_FLASH_WRITE_STATUS_REGISTER_REQUEST, 1, &u8StatusReg, 0, NULL, &eRxType, &u8RxDataLen, au8Buffer); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_FLASH_WRITE_STATUS_REGISTER_RESPONSE) - { - /* Failed to write to flash status register */ - DBG_vPrintf(TRACE_BOOTLOADER, "Could not write to status register!\n"); - return -1; - } - - return 0; -} - - -/**************************************************************************** - * - * NAME: iBL_RunRAM - * - * DESCRIPTION: - * Starts the module executing code from a given address - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -static int iBL_RunRAM(int iUartFd, uint32_t u32Address) -{ - uint8_t u8RxDataLen = 0; - uint8_t au8CmdBuffer[4]; - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - - au8CmdBuffer[3] = (uint8_t)(u32Address >> 0) & 0xff; - au8CmdBuffer[2] = (uint8_t)(u32Address >> 8) & 0xff; - au8CmdBuffer[1] = (uint8_t)(u32Address >> 16) & 0xff; - au8CmdBuffer[0] = (uint8_t)(u32Address >> 24) & 0xff; - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_RAM_RUN_REQUEST, 4, au8CmdBuffer, 0, NULL, &eRxType, &u8RxDataLen, NULL); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_RAM_RUN_RESPONSE) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%s: Response %02x\n", __FUNCTION__, eResponse); - return(-1); - } - - return(0); -} - - -/**************************************************************************** - * - * NAME: iBL_ReadRAM - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -static int iBL_ReadRAM(int iUartFd, uint32_t u32Address, uint8_t u8Length, uint8_t *pu8Buffer) -{ - uint8_t u8RxDataLen = 0; - uint8_t au8CmdBuffer[6]; - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - - if(u8Length > 0xfc || pu8Buffer == NULL) - { - return -1; - } - - au8CmdBuffer[0] = (uint8_t)(u32Address >> 0) & 0xff; - au8CmdBuffer[1] = (uint8_t)(u32Address >> 8) & 0xff; - au8CmdBuffer[2] = (uint8_t)(u32Address >> 16) & 0xff; - au8CmdBuffer[3] = (uint8_t)(u32Address >> 24) & 0xff; - au8CmdBuffer[4] = u8Length; - au8CmdBuffer[5] = 0; - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_RAM_READ_REQUEST, 6, au8CmdBuffer, 0, NULL, &eRxType, &u8RxDataLen, pu8Buffer); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_RAM_READ_RESPONSE) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%s: @%08x Response %02x\n", __FUNCTION__, u32Address, eResponse); - return -1; - } - - return(u8RxDataLen); -} - -/**************************************************************************** - * - * NAME: iBL_WriteRAM - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -static int iBL_WriteRAM(int iUartFd, uint32_t u32Address, uint8_t u8Length, uint8_t *pu8Buffer) -{ - uint8_t u8RxDataLen = 0; - uint8_t au8CmdBuffer[6]; - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - - if(u8Length > 0xfc || pu8Buffer == NULL) - { - return(-1); - } - - au8CmdBuffer[0] = (uint8_t)(u32Address >> 0) & 0xff; - au8CmdBuffer[1] = (uint8_t)(u32Address >> 8) & 0xff; - au8CmdBuffer[2] = (uint8_t)(u32Address >> 16) & 0xff; - au8CmdBuffer[3] = (uint8_t)(u32Address >> 24) & 0xff; - au8CmdBuffer[4] = u8Length; - au8CmdBuffer[5] = 0; - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_RAM_WRITE_REQUEST, 4, au8CmdBuffer, u8Length, pu8Buffer, &eRxType, &u8RxDataLen, pu8Buffer); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_RAM_WRITE_RESPONSE) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%s: Response %02x\n", __FUNCTION__, eResponse); - return(-1); - } - - return(u8Length); -} - - -/**************************************************************************** - * - * NAME: iBL_EraseFlash - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -static int iBL_EraseFlash(int iUartFd) -{ - uint8_t u8RxDataLen = 0; - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - uint8_t au8Buffer[64]; - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_10S, E_BL_MSG_TYPE_FLASH_ERASE_REQUEST, 0, NULL, 0, NULL, &eRxType, &u8RxDataLen, au8Buffer); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_FLASH_ERASE_RESPONSE) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%s: Response %02x\n", __FUNCTION__, eResponse); - return(-1); - } - - return(u8RxDataLen); -} - - -/**************************************************************************** - * - * NAME: iBL_ReadFlash - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -static int iBL_ReadFlash(int iUartFd, uint32_t u32Address, uint8_t u8Length, uint8_t *pu8Buffer) -{ - uint8_t u8RxDataLen = 0; - uint8_t au8CmdBuffer[6]; - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - - if(u8Length > 0xfc || pu8Buffer == NULL) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Parameter error\n"); - return -1; - } - - au8CmdBuffer[0] = (uint8_t)(u32Address >> 0) & 0xff; - au8CmdBuffer[1] = (uint8_t)(u32Address >> 8) & 0xff; - au8CmdBuffer[2] = (uint8_t)(u32Address >> 16) & 0xff; - au8CmdBuffer[3] = (uint8_t)(u32Address >> 24) & 0xff; - au8CmdBuffer[4] = u8Length; - au8CmdBuffer[5] = 0; - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_FLASH_READ_REQUEST, 6, au8CmdBuffer, 0, NULL, &eRxType, &u8RxDataLen, pu8Buffer); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_FLASH_READ_RESPONSE) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%s: Response %02x\n", __FUNCTION__, eResponse); - return -1; - } - - return u8RxDataLen; -} - - -/**************************************************************************** - * - * NAME: iBL_WriteFlash - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -static int iBL_WriteFlash(int iUartFd, uint32_t u32Address, uint8_t u8Length, uint8_t *pu8Buffer) -{ - uint8_t u8RxDataLen = 0; - uint8_t au8CmdBuffer[6]; - teBL_Response eResponse = 0; - teBL_MessageType eRxType = 0; - - if(u8Length > 0xfc || pu8Buffer == NULL) - { - return -1; - } - - au8CmdBuffer[0] = (uint8_t)(u32Address >> 0) & 0xff; - au8CmdBuffer[1] = (uint8_t)(u32Address >> 8) & 0xff; - au8CmdBuffer[2] = (uint8_t)(u32Address >> 16) & 0xff; - au8CmdBuffer[3] = (uint8_t)(u32Address >> 24) & 0xff; - au8CmdBuffer[4] = u8Length; - au8CmdBuffer[5] = 0; - - eResponse = eBL_Request(iUartFd, BL_TIMEOUT_1S, E_BL_MSG_TYPE_FLASH_PROGRAM_REQUEST, 4, au8CmdBuffer, u8Length, pu8Buffer, &eRxType, &u8RxDataLen, pu8Buffer); - if(eResponse != E_BL_RESPONSE_OK || eRxType != E_BL_MSG_TYPE_FLASH_PROGRAM_RESPONSE) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%s: Response %02x\n", __FUNCTION__, eResponse); - return -1; - } - - return u8Length; -} - - - -/****************************************************************************/ -/*** Local Functions ***/ -/****************************************************************************/ -/**************************************************************************** - * - * NAME: eBL_Request - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * void - ****************************************************************************/ -static teBL_Response eBL_Request(int iUartFd, int iTimeoutMicroseconds, teBL_MessageType eTxType, uint8_t u8HeaderLen, uint8_t *pu8Header, uint8_t u8TxLength, uint8_t *pu8TxData, - teBL_MessageType *peRxType, uint8_t *pu8RxLength, uint8_t *pu8RxData) -{ - /* Check data is not too long */ - if(u8TxLength > 0xfd) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Data too long\n"); - return(E_BL_RESPONSE_ERROR); - } - - /* Send message */ - if(iBL_WriteMessage(iUartFd, eTxType, u8HeaderLen, pu8Header, u8TxLength, pu8TxData) == -1) - { - return(E_BL_RESPONSE_ERROR); - } - /* Get the response to the request */ - return(eBL_ReadMessage(iUartFd, iTimeoutMicroseconds, peRxType, pu8RxLength, pu8RxData)); -} - - -/**************************************************************************** - * - * NAME: iBL_WriteMessage - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * int 0 if success - * -1 if an error occured - * - ****************************************************************************/ -static int iBL_WriteMessage(int iUartFd, teBL_MessageType eType, uint8_t u8HeaderLength, uint8_t *pu8Header, uint8_t u8Length, uint8_t *pu8Data) -{ - uint8_t u8CheckSum = 0; - int n; - - uint8_t au8Msg[256]; - - /* total message length cannot be > 255 bytes */ - if(u8HeaderLength + u8Length >= 0xfe) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Length too big\n"); - return(-1); - } - - /* Message length */ - au8Msg[0] = u8HeaderLength + u8Length + 2; - - /* Message type */ - au8Msg[1] = (uint8_t)eType; - - /* Message header */ - memcpy(&au8Msg[2], pu8Header, u8HeaderLength); - - /* Message payload */ - memcpy(&au8Msg[2 + u8HeaderLength], pu8Data, u8Length); - - DBG_vPrintf(TRACE_BOOTLOADER, "\nSend Data :"); - for(n = 0; n < u8HeaderLength + u8Length + 2; n++) - { - u8CheckSum ^= au8Msg[n]; - DBG_vPrintf(TRACE_BOOTLOADER, "%02x ", au8Msg[n]); - } - DBG_vPrintf(TRACE_BOOTLOADER, "%02x \r\n",u8CheckSum); - /* Message checksum */ - au8Msg[u8HeaderLength + u8Length + 2] = u8CheckSum; - - /* Write whole message to UART */ - UART_eWrite(iUartFd, au8Msg, u8HeaderLength + u8Length + 3); - - return(0); - -} - - -/**************************************************************************** - * - * NAME: eBL_ReadMessage - * - * DESCRIPTION: - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * void - ****************************************************************************/ -static teBL_Response eBL_ReadMessage(int iUartFd, int iTimeoutMicroseconds, teBL_MessageType *peType, uint8_t *pu8Length, uint8_t *pu8Data) -{ - - int n; - teStatus eStatus; - uint8_t au8Msg[256]; - uint8_t u8CalculatedCheckSum = 0; - uint8_t u8Length = 0; - teBL_Response eResponse = E_BL_RESPONSE_OK; - int iAttempts = 0; - int iBytesRead = 0; - int iTotalBytesRead = 0; - - /* Get the length byte */ - if((UART_eRead(iUartFd, iTimeoutMicroseconds, 1, &u8Length, &iBytesRead) != E_STATUS_OK) || (iBytesRead != 1)) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error getting length\n"); - return(E_BL_RESPONSE_NO_RESPONSE); - } - - DBG_vPrintf(TRACE_BOOTLOADER, "Got length %d\n", u8Length); - - /* Add length to checksum */ - u8CalculatedCheckSum ^= u8Length; - - do - { - /* Get the rest of the message */ - eStatus = UART_eRead(iUartFd, iTimeoutMicroseconds, u8Length - iTotalBytesRead, &au8Msg[iTotalBytesRead], &iBytesRead); - if(eStatus != E_STATUS_OK) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Error reading message from UART\n"); - return(E_BL_RESPONSE_NO_RESPONSE); - } - - iTotalBytesRead += iBytesRead; - iAttempts++; - - } while((iTotalBytesRead < u8Length) && (iBytesRead > 0 || iAttempts < 256)); // Right now we are receiving the chars one by one. - - if(iTotalBytesRead != u8Length) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Got %d bytes but expected %d after %d attempts: ", iTotalBytesRead, u8Length, iAttempts); - for(n = 0; n < iTotalBytesRead; n++) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%02x ", au8Msg[n]); - } - DBG_vPrintf(TRACE_BOOTLOADER, "\n"); - - return(E_BL_RESPONSE_NO_RESPONSE); - } - - /* Add rest of message to checksum */ - DBG_vPrintf(TRACE_BOOTLOADER, "Got Data "); - for(n = 0; n < u8Length; n++) - { - DBG_vPrintf(TRACE_BOOTLOADER, "%02x ", au8Msg[n]); - u8CalculatedCheckSum ^= au8Msg[n]; - } - DBG_vPrintf(TRACE_BOOTLOADER, "\n"); - - if(u8CalculatedCheckSum != 0x00) - { - DBG_vPrintf(TRACE_BOOTLOADER, "Checksum bad, got %02x expected %02x\n", u8CalculatedCheckSum, 0); - return(E_BL_RESPONSE_CRC_ERROR); - } - - *peType = au8Msg[0]; - *pu8Length = u8Length - 3; - eResponse = au8Msg[1]; - memcpy(pu8Data, &au8Msg[2], *pu8Length); - - return(eResponse); - -} - -#if 0 -/**************************************************************************** - * - * NAME: pcGetName - * - * DESCRIPTION: Lookup name representing an ID. - * - * PARAMETERS: Name RW Usage - * - * RETURNS: - * void - ****************************************************************************/ -static const char *pcGetName (tsIDNameLookup *psIDNameLookup, int iID) -{ - uint32_t i; - for (i = 0; i < psIDNameLookup->u32Length; i++) - { - if (psIDNameLookup->asPairs[i].iID == iID) - { - return psIDNameLookup->asPairs[i].pcName; - } - } - return "Unknown"; -} -#endif - - -/**************************************************************************** - * - * NAME: BL_DownloadExtensionToRamBeforeErase - * - * DESCRIPTION: - * - * - * - * PARAMETERS: Name RW Usage - * pu8Firmware R Pointer to firmware image to download - * pu64Address R Pointer to MAC Address. If NULL, read from flash. - * - * RETURNS: - * int 0 if success - * -1 if an error occurred - * - ****************************************************************************/ -int BL_DownloadExtensionToRamBeforeErase(int iUartFd, tsFW_Info *psFW_Info) -{ - int n; - uint8_t u8ChunkSize; - - - DBG_vPrintf(TRACE_BOOTLOADER, "\nText Start 0x%08x - Len %d bytes", psFW_Info->u32TextSectionLoadAddress, psFW_Info->u32TextSectionLength); - DBG_vPrintf(TRACE_BOOTLOADER, "\nBSS Start 0x%08x - Len %d bytes", psFW_Info->u32BssSectionLoadAddress, psFW_Info->u32BssSectionLength); - DBG_vPrintf(TRACE_BOOTLOADER, "\nReset entry point 0x%08x", ntohl(psFW_Info->u32ResetEntryPoint)); - DBG_vPrintf(TRACE_BOOTLOADER, "\nWake entry point 0x%08x", ntohl(psFW_Info->u32WakeUpEntryPoint)); - - for(n = 0; n < 0x0000097c;) - { - if((0x0000097c - n) > 128) - { - u8ChunkSize = 128; - } - else - { - u8ChunkSize = 0x0000097c - n; - } - - if(iBL_WriteRAM(iUartFd,0x04000400 + n, u8ChunkSize, (uint8_t*)FlashProgrammerExtension_JN5168_bin + n) == -1) - { - DBG_vPrintf(TRACE_BOOTLOADER, "\nProblem writing chunk"); - return(-1); - } - - DBG_vPrintf(TRACE_BOOTLOADER,"Wrote chunk length %d at address 0x%08x: 0x%08x\n", u8ChunkSize, 0x04000400 + n, ntohl(*((uint32_t*)(FlashProgrammerExtension_JN5168_bin + n)))); - - if (1) - { - uint8_t au8Buffer[128 + 1]; - if (iBL_ReadRAM(iUartFd,0x04000400 + n, u8ChunkSize, au8Buffer) == -1) - { - printf("Error reading at address 0x%08x\n", 0x04000400 + n); - return -1; - } - else - { - if (memcmp(FlashProgrammerExtension_JN5168_bin + n, au8Buffer, u8ChunkSize)) - { - printf("Data read at address 0x%08x is incorrect\n", 0x04000400 + n); - return -1; - } - } - } - - n += u8ChunkSize; - - DBG_vPrintf(TRACE_BOOTLOADER, "Loading: %3d%%\n", (n * 100) / 0x0000097c); - } - DBG_vPrintf(TRACE_BOOTLOADER, "\nStarting module application"); - iBL_RunRAM(iUartFd, 0x24050004); - BL_eSetBaudrate(iUartFd, 38400); - BL_EEPROMErase(iUartFd,1); - DBG_vPrintf(TRACE_BOOTLOADER, "\nErase OK"); - iBL_RunRAM(iUartFd, 0x66000000); - - return(0); -} - - -/****************************************************************************/ -/*** END OF FILE ***/ -/****************************************************************************/ - diff --git a/resources/archives/resources/prog_jennic-0.7/source/JN51xx_BootLoader.h b/resources/archives/resources/prog_jennic-0.7/source/JN51xx_BootLoader.h deleted file mode 100644 index 6604d9b1a5..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/JN51xx_BootLoader.h +++ /dev/null @@ -1,125 +0,0 @@ -/**************************************************************************** - * - * MODULE: JN51xx_BootLoader - * - * COMPONENT: $RCSfile: JN51xx_BootLoader.h,v $ - * - * VERSION: $Name: $ - * - * REVISION: $Revision: 1.1 $ - * - * DATED: $Date: 2008/10/17 10:22:11 $ - * - * STATUS: $State: Exp $ - * - * AUTHOR: Lee Mitchell - * - * DESCRIPTION: - * - * LAST MODIFIED BY: $Author: lmitch $ - * $Modtime: $ - * - * - **************************************************************************** - * - * This software is owned by NXP B.V. and/or its supplier and is protected - * under applicable copyright laws. All rights are reserved. We grant You, - * and any third parties, a license to use this software solely and - * exclusively on NXP products [NXP Microcontrollers such as JN5148, JN5142, JN5139]. - * You, and any third parties must reproduce the copyright and warranty notice - * and any other legend of ownership on each copy or partial copy of the - * software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - - * Copyright NXP B.V. 2012. All rights reserved - * - ***************************************************************************/ - -#ifndef JN51XX_BOOTLOADER_H_INCLUDED -#define JN51XX_BOOTLOADER_H_INCLUDED - -#if defined __cplusplus -extern "C" { -#endif - -/****************************************************************************/ -/*** Include files ***/ -/****************************************************************************/ - -#include - -#include "Firmware.h" -#include "common.h" - -/****************************************************************************/ -/*** Macro Definitions ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Type Definitions ***/ -/****************************************************************************/ - -/** Structure Contatining Imformation about connected device */ -typedef struct -{ - uint32_t u32ChipId; - uint32_t u32SupportedFirmware; - - uint32_t u32RamSize; - uint32_t u32FlashSize; - - uint32_t u32BootloaderVersion; - - uint32_t u32CustomerSettings; - - uint8_t au8MacAddress[8]; -} tsChipDetails; - -/****************************************************************************/ -/*** Local Function Prototypes ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Exported Variables ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Local Variables ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Exported Functions ***/ -/****************************************************************************/ - -teStatus BL_eGetChipDetails(int iUartFd, tsChipDetails *psChipDetails); -teStatus BL_eReprogram(int iUartFd, tsChipDetails *psChipDetails, tsFW_Info *psFWImage); -teStatus BL_eSetBaudrate(int iUartFd, uint32_t u32Baudrate); -teStatus BL_EEPROMErase(int iUartFd, uint32_t iEraseAll); - -int BL_DownloadExtensionToRamBeforeErase(int iUartFd,tsFW_Info *psFW_Info); - -/****************************************************************************/ -/*** Local Functions ***/ -/****************************************************************************/ - -#if defined __cplusplus -} -#endif - -#endif /* JN51XX_BOOTLOADER_H_INCLUDED */ - -/****************************************************************************/ -/*** END OF FILE ***/ -/****************************************************************************/ - diff --git a/resources/archives/resources/prog_jennic-0.7/source/common.h b/resources/archives/resources/prog_jennic-0.7/source/common.h deleted file mode 100644 index c7f4ce4afc..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/common.h +++ /dev/null @@ -1,109 +0,0 @@ -/**************************************************************************** - * - * MODULE: Jennic Module Programmer - * - * COMPONENT: Common Include - * - * VERSION: $Name: $ - * - * REVISION: $Revision: 1.2 $ - * - * DATED: $Date: 2009/03/02 13:33:44 $ - * - * STATUS: $State: Exp $ - * - * AUTHOR: Matt Redfearn - * - * DESCRIPTION: - * - * - * LAST MODIFIED BY: $Author: lmitch $ - * $Modtime: $ - * - **************************************************************************** - * - * This software is owned by NXP B.V. and/or its supplier and is protected - * under applicable copyright laws. All rights are reserved. We grant You, - * and any third parties, a license to use this software solely and - * exclusively on NXP products [NXP Microcontrollers such as JN5148, JN5142, JN5139]. - * You, and any third parties must reproduce the copyright and warranty notice - * and any other legend of ownership on each copy or partial copy of the - * software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - - * Copyright NXP B.V. 2012. All rights reserved - * - ***************************************************************************/ - -#ifndef COMMON_H_INCLUDED -#define COMMON_H_INCLUDED - -#if defined __cplusplus -extern "C" { -#endif - -/****************************************************************************/ -/*** Include Files ***/ -/****************************************************************************/ - -#include - -/****************************************************************************/ -/*** Macro Definitions ***/ -/****************************************************************************/ - -#define FALSE 0 -#define TRUE 1 - -#define PUBLIC -#define PRIVATE static - -#define MAX_ERROR_STRING_LEN - -/****************************************************************************/ -/*** Type Definitions ***/ -/****************************************************************************/ - -typedef enum -{ - E_STATUS_OK, - E_STATUS_ERROR, - E_STATUS_ERROR_WRITING, - E_STATUS_ERROR_READING, - E_STATUS_FAILED_TO_OPEN_FILE, - E_STATUS_BAD_PARAMETER, - E_STATUS_NULL_PARAMETER, - E_STATUS_INCOMPATIBLE, -} teStatus; - - - - -/****************************************************************************/ -/*** Exported Functions ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Exported Variables ***/ -/****************************************************************************/ - -#if defined __cplusplus -} -#endif - -#endif /* COMMON_H_INCLUDED */ - -/****************************************************************************/ -/*** END OF FILE ***/ -/****************************************************************************/ diff --git a/resources/archives/resources/prog_jennic-0.7/source/dbg.h b/resources/archives/resources/prog_jennic-0.7/source/dbg.h deleted file mode 100644 index 751905954b..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/dbg.h +++ /dev/null @@ -1,271 +0,0 @@ -/***************************************************************************** - * - * MODULE: Debug tracing - * - * COMPONENT: dbg.h - * - * AUTHOR: MRR - * - * DESCRIPTION: Provide printf style debug tracing - * - * $HeadURL: http://svn/sware/Projects/Cortex/Modules/DBG/Tags/CORTEX_DBG_1v2_RC1/Include/dbg.h $ - * - * $Revision: 21882 $ - * - * $LastChangedBy: mwild $ - * - * $LastChangedDate: 2009-11-13 13:30:19 +0000 (Fri, 13 Nov 2009) $ - * - * $Id: dbg.h 21882 2009-11-13 13:30:19Z mwild $ - * - ***************************************************************************** - * - * This software is owned by Jennic and/or its supplier and is protected - * under applicable copyright laws. All rights are reserved. We grant You, - * and any third parties, a license to use this software solely and - * exclusively on Jennic products. You, and any third parties must reproduce - * the copyright and warranty notice and any other legend of ownership on each - * copy or partial copy of the software. - * - * THIS SOFTWARE IS PROVIDED "AS IS". JENNIC MAKES NO WARRANTIES, WHETHER - * EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, - * ACCURACY OR LACK OF NEGLIGENCE. JENNIC SHALL NOT, IN ANY CIRCUMSTANCES, - * BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, SPECIAL, - * INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON WHATSOEVER. - * - * Copyright Jennic Ltd. 2007 All rights reserved - * - ****************************************************************************/ - -#ifndef DBG_H_ -#define DBG_H_ - -/****************************************************************************/ -/*** Include Files ***/ -/****************************************************************************/ - -#include "common.h" - -#if defined __cplusplus -extern "C" { -#endif - -/****************************************************************************/ -/*** Macro Definitions ***/ -/****************************************************************************/ - -#ifdef __GNUC__ - -#ifdef DBG_VERBOSE -/* note - a warning will be issued if ASSERTION evaluates to FALSE at - * compile time */ -#define DBG_vAssert(STREAM, ASSERTION) \ - do { \ - const bool_t bAssertion = (ASSERTION); \ - typedef char DBG_STATIC_ASSERT_FAILED[bAssertion ? 0 : -1]; \ - bool_t bEval = ((STREAM) && !bAssertion) ? \ - dbg_vAssertImpl(__FILE__, \ - __LINE__, \ - #ASSERTION), TRUE : FALSE; \ - bEval = bEval; \ - } while(0) -#else -/* note - a warning will be issued if ASSERTION evaluates to FALSE at - * compile time */ -#define DBG_vAssert(STREAM, ASSERTION) \ - do { \ - const bool_t bAssertion = (ASSERTION); \ - typedef char DBG_STATIC_ASSERT_FAILED[bAssertion ? 0 : -1]; \ - bool_t bEval = ((STREAM) && !bAssertion) ? \ - dbg_vAssertImpl("", \ - 0, \ - #ASSERTION), TRUE : FALSE; \ - bEval = bEval; \ - } while(0) -#endif - -/* need to write this in such a way that FORMAT doesn't get linked in - * if STREAM isn't enabled, but all the ARGS still get evaluated in - * case they may cause side effects - * (may still need work to make this portable to non GCC compilers) */ -#ifdef DBG_VERBOSE -#define DBG_vPrintf(STREAM, FORMAT, ARGS...) \ - do { \ - const char *pccFormatIn = (FORMAT); \ - const char *pccFormat = (STREAM) ? \ - pccFormatIn : NULL; \ - dbg_vPrintfImpl(__FILE__, __LINE__, pccFormat, ## ARGS); \ - } while(0) -#else -#define DBG_vPrintf(STREAM, FORMAT, ARGS...) \ - do { \ - const char *pccFormatIn = (FORMAT); \ - const char *pccFormat = (STREAM) ? \ - pccFormatIn : NULL; \ - (STREAM) ? \ - dbg_vPrintfImpl("",0, pccFormat, ## ARGS) : \ - dbg_vPrintfNullImpl("",0, pccFormat, ## ARGS); \ - } while(0) -#endif - -/* define empty functions as inline, so they - * 1) don't take up any space - * 2) don't attempt to link to the library functions */ -#define DBG_INLINE static inline __attribute__((always_inline)) - -/* set up printf style warnings */ -#define DBG_FORMAT_PRINTF(A, B) -//__attribute__((format (__printf__, A, B))) - -#else - -#ifdef DBG_VERBOSE -/* note - a warning will be issued if ASSERTION evaluates to FALSE at - * compile time */ -#define DBG_vAssert(STREAM, ASSERTION) \ - do { \ - const bool_t bAssertion = (ASSERTION); \ - bool_t bEval = ((STREAM) && !bAssertion) ? \ - dbg_vAssertImpl(__FILE__, \ - __LINE__, \ - #ASSERTION), TRUE : FALSE; \ - bEval = bEval; \ - } while(0) -#else -/* note - a warning will be issued if ASSERTION evaluates to FALSE at - * compile time */ -#define DBG_vAssert(STREAM, ASSERTION) \ - do { \ - const bool_t bAssertion = (ASSERTION); \ - bool_t bEval = ((STREAM) && !bAssertion) ? \ - dbg_vAssertImpl("", \ - 0, \ - #ASSERTION), TRUE : FALSE; \ - bEval = bEval; \ - } while(0) -#endif - -/* need to write this in such a way that FORMAT doesnt get linked in - * if STREAM isnt enabled, but all the ARGS still get evaluated in - * case they may cause side effects - * (may still need work to make this portable to non GCC compilers) */ -#ifdef DBG_VERBOSE -#define DBG_vPrintf \ - dbg_vSetFileLine(__FILE__, __LINE__); \ - dbg_vPrintfImpl2 -#else -#define DBG_vPrintf \ - dbg_vSetFileLine("",0); \ - dbg_vPrintfImpl2 -#endif - -#define DBG_INLINE static -#define DBG_FORMAT_PRINTF(A, B) -#endif - -/****************************************************************************/ -/*** Type Definitions ***/ -/****************************************************************************/ - -typedef struct -{ - void (*prInitHardwareCb)(void); - void (*prPutchCb) (char c); - void (*prFlushCb) (void); - void (*prFailedAssertCb)(void); - -} tsDBG_FunctionTbl; - - -/****************************************************************************/ -/*** Exported Functions ***/ -/****************************************************************************/ - -#if defined(DBG_ENABLE) || defined(DBG_C_) - -PUBLIC void DBG_vInit(tsDBG_FunctionTbl *psFunctionTbl); - -PUBLIC void DBG_vReset(void); - -void DBG_vDumpStack(void); - -#ifndef __GNUC__ -PUBLIC void dbg_vSetFileLine(const char *pcFileName, - uint32_t u32LineNumber); - -DBG_FORMAT_PRINTF(3, 4) -PUBLIC void dbg_vPrintfImpl2(bool_t bStream, - const char *pcFormat, - ...); -#endif - -DBG_FORMAT_PRINTF(3, 4) -PUBLIC void dbg_vPrintfImpl(const char *Private_pcSrcFileName, - uint32_t Private_u32SrcLineNumber, - const char *pcFormat, - ...); - -PUBLIC void dbg_vAssertImpl(const char *Private_pcSrcFileName, - uint32_t Private_u32SrcLineNumber, - const char *pcAssertionString); -#else /* defined(DBG_ENABLE) || defined(DBG_C_) */ - -/* need to make sure the parameters are still evaluated in a safe scope */ -#define DBG_vInit(psFunctionTbl) ((void)(psFunctionTbl)) - -#define DBG_vReset() ((void)0) - -#define DBG_vDumpStack() ((void)0) - -#ifndef __GNUC__ -DBG_INLINE -PUBLIC void dbg_vSetFileLine(const char *pcFileName, - uint32_t u32LineNumber){} - -DBG_FORMAT_PRINTF(3, 4) -DBG_INLINE -PUBLIC void dbg_vPrintfImpl2(bool_t bStream, - const char *pcFormat, - ...){} -#endif - -DBG_FORMAT_PRINTF(3, 4) -DBG_INLINE -PUBLIC void dbg_vPrintfImpl(const char *Private_pcSrcFileName, - uint32_t Private_u32SrcLineNumber, - const char *pcFormat, - ...){} - -DBG_INLINE -PUBLIC void dbg_vAssertImpl(const char *Private_pcSrcFileName, - uint32_t Private_u32SrcLineNumber, - const char *pcAssertionString){} -#endif /* defined(DBG_ENABLE) || defined(DBG_C_) */ - -DBG_INLINE -PUBLIC void dbg_vPrintfNullImpl(const char *Private_pcSrcFileName, - uint32_t Private_u32SrcLineNumber, - const char *pcFormat, - ...){} - -DBG_INLINE -PUBLIC void dbg_vAssertNullImpl(const char *Private_pcSrcFileName, - uint32_t Private_u32SrcLineNumber, - const char *pcAssertionString){} - -/****************************************************************************/ -/*** Exported Variables ***/ -/****************************************************************************/ - -extern const char DBG_gszVERSION[]; - -#if defined __cplusplus -}; -#endif - -#endif /*DBG_H_*/ - -/****************************************************************************/ -/*** END OF FILE ***/ -/****************************************************************************/ diff --git a/resources/archives/resources/prog_jennic-0.7/source/main.c b/resources/archives/resources/prog_jennic-0.7/source/main.c deleted file mode 100644 index 6e45719f05..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/main.c +++ /dev/null @@ -1,342 +0,0 @@ -/**************************************************************************** - * - * MODULE: Jennic Module Programmer - * - * COMPONENT: Main file - * - * VERSION: $Name: $ - * - * REVISION: $Revision: 1.2 $ - * - * DATED: $Date: 2009/03/02 13:33:44 $ - * - * STATUS: $State: Exp $ - * - * AUTHOR: Matt Redfearn - * - * DESCRIPTION: - * - * - * LAST MODIFIED BY: $Author: lmitch $ - * $Modtime: $ - * - **************************************************************************** - * - * This software is owned by NXP B.V. and/or its supplier and is protected - * under applicable copyright laws. All rights are reserved. We grant You, - * and any third parties, a license to use this software solely and - * exclusively on NXP products [NXP Microcontrollers such as JN5148, JN5142, JN5139]. - * You, and any third parties must reproduce the copyright and warranty notice - * and any other legend of ownership on each copy or partial copy of the - * software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - - * Copyright NXP B.V. 2012. All rights reserved - * - ***************************************************************************/ - - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "JN51xx_BootLoader.h" -#include "Firmware.h" -#include "uart.h" -#include "ChipID.h" -#include "dbg.h" - -#define vDelay(a) usleep(a * 1000) - -int iVerbosity = 1; - -#ifndef VERSION -#error Version is not defined! -#else -const char *Version = "0.7(r" VERSION ")-Abeille"; -#endif - - -const char *cpSerialDevice = NULL; -const char *pcFirmwareFile = NULL; - -char *pcMAC_Address = NULL; -uint64_t u64MAC_Address; -uint64_t *pu64MAC_Address = NULL; - - -int iInitialSpeed=38400; -int iProgramSpeed=1000000; - - -void print_usage_exit(char *argv[]) -{ - fprintf(stderr, "Usage: %s\n", argv[0]); - fprintf(stderr, " Arguments:\n"); - fprintf(stderr, " -s --serial Serial device for 15.4 module, e.g. /dev/tts/1\n"); - fprintf(stderr, " Options:\n"); - fprintf(stderr, " -V --verbosity Verbosity level. Increses amount of debug information. Default 0.\n"); - fprintf(stderr, " -I --initialbaud Set initial baud rate\n"); - fprintf(stderr, " -P --programbaud Set programming baud rate\n"); - fprintf(stderr, " -e --erase Erase EEProm.\n"); - fprintf(stderr, " -f --firmware Load module flash with the given firmware file.\n"); - fprintf(stderr, " -v --verify Verify image. If specified, verify the image programmedwas loaded correctly.\n"); - fprintf(stderr, " -m --mac Set MAC address of device. If this is not specified, the address is read from flash.\n"); - exit(EXIT_FAILURE); -} - - -int main(int argc, char *argv[]) -{ - tsChipDetails sChipDetails; - int iUartFd; - struct termios sUartOptions; - - tsFW_Info sFW_Info; - // int iVerify = 0; // Tcharp38: unused - int iErase = 0; - printf("JennicModuleProgrammer Version: %s\n", Version); - - { - static struct option long_options[] = - { - {"help", no_argument, NULL, 'h'}, - {"verbosity", required_argument, NULL, 'V'}, - {"initialbaud", required_argument, NULL, 'I'}, - {"programbaud", required_argument, NULL, 'P'}, - {"serial", required_argument, NULL, 's'}, - {"erase", no_argument, NULL, 'e'}, - {"firmware", required_argument, NULL, 'f'}, - {"verify", no_argument, NULL, 'v'}, - {"mac", required_argument, NULL, 'm'}, - { NULL, 0, NULL, 0} - }; - signed char opt; - int option_index; - - while ((opt = getopt_long(argc, argv, "hs:V:f:vI:P:m:e", long_options, &option_index)) != -1) - { - switch (opt) - { - case 0: - - case 'h': - print_usage_exit(argv); - break; - case 'V': - iVerbosity = atoi(optarg); - break; - case 'v': - // iVerify = 1; - break; - case 'e': - iErase = 1; - break; - case 'I': - { - char *pcEnd; - errno = 0; - iInitialSpeed = strtoul(optarg, &pcEnd, 0); - if (errno) - { - printf("= ERROR: Initial baud rate '%s' cannot be converted to 32 bit integer (%s)\n", optarg, strerror(errno)); - print_usage_exit(argv); - } - if (*pcEnd != '\0') - { - printf("= ERROR: Initial baud rate '%s' contains invalid characters\n", optarg); - print_usage_exit(argv); - } - break; - } - case 'P': - { - char *pcEnd; - errno = 0; - iProgramSpeed = strtoul(optarg, &pcEnd, 0); - if (errno) - { - printf("= ERROR: Program baud rate '%s' cannot be converted to 32 bit integer (%s)\n", optarg, strerror(errno)); - print_usage_exit(argv); - } - if (*pcEnd != '\0') - { - printf("= ERROR: Program baud rate '%s' contains invalid characters\n", optarg); - print_usage_exit(argv); - } - break; - } - case 's': - cpSerialDevice = optarg; - break; - case 'f': - pcFirmwareFile = optarg; - break; - case 'm': - pcMAC_Address = optarg; - u64MAC_Address = strtoll(pcMAC_Address, (char **) NULL, 16); - pu64MAC_Address = &u64MAC_Address; - break; - - default: /* '?' */ - print_usage_exit(argv); - } - } - } - - if ((!cpSerialDevice)) - { - /* Missing parameters */ - print_usage_exit(argv); - } - - fflush(stdout); - - if (UART_eInitialise((char *)cpSerialDevice, iInitialSpeed, &iUartFd, &sUartOptions) != E_STATUS_OK) - { - fprintf(stderr, "= ERROR opening serial port\n"); - return -1; - } - - UART_eSetRTS(iUartFd, 1); // nRESET - UART_eSetDTR(iUartFd, 1); // nPROG - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = 100000000; // 100 ms - nanosleep(&ts, NULL); - UART_eSetRTS(iUartFd, 0); // nRESET - ts.tv_sec = 0; - ts.tv_nsec = 100000000; // 100 ms - nanosleep(&ts, NULL); - UART_eSetDTR(iUartFd, 0); // nPROG - - /* Read module details at initial baud rate */ - if (BL_eGetChipDetails(iUartFd, &sChipDetails) != E_STATUS_OK) - { - fprintf(stderr, "= ERROR: Failed to read chip ID.\n"); - fprintf(stderr, "= Check Zigate GPIO control (flash mode set + reset pulse required) !\n"); - return -1; - } - - - if (iVerbosity > 0) - { - const char *pcPartName; - - switch (sChipDetails.u32ChipId) - { - case (CHIP_ID_JN5148_REV2A): pcPartName = "JN5148"; break; - case (CHIP_ID_JN5148_REV2B): pcPartName = "JN5148"; break; - case (CHIP_ID_JN5148_REV2C): pcPartName = "JN5148"; break; - case (CHIP_ID_JN5148_REV2D): pcPartName = "JN5148J01"; break; - case (CHIP_ID_JN5148_REV2E): pcPartName = "JN5148Z01"; break; - - case (CHIP_ID_JN5142_REV1A): pcPartName = "JN5142"; break; - case (CHIP_ID_JN5142_REV1B): pcPartName = "JN5142"; break; - case (CHIP_ID_JN5142_REV1C): pcPartName = "JN5142J01"; break; - - case (CHIP_ID_JN5168): - case (CHIP_ID_JN5168_COG07A): - case (CHIP_ID_JN5168_COG07B): - pcPartName = "JN5168"; break; - - case (CHIP_ID_JN5169): pcPartName = "JN5169"; break; - - default: pcPartName = "Unknown"; break; - } - - printf("- Detected Chip: %s\n", pcPartName); - if (!strcmp(pcPartName, "Unknown")) - printf("- u32ChipId=0x%08x\n", sChipDetails.u32ChipId); - printf("- MAC Address : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", - sChipDetails.au8MacAddress[0] & 0xFF, sChipDetails.au8MacAddress[1] & 0xFF, sChipDetails.au8MacAddress[2] & 0xFF, sChipDetails.au8MacAddress[3] & 0xFF, - sChipDetails.au8MacAddress[4] & 0xFF, sChipDetails.au8MacAddress[5] & 0xFF, sChipDetails.au8MacAddress[6] & 0xFF, sChipDetails.au8MacAddress[7] & 0xFF); - } - - - if (iInitialSpeed != iProgramSpeed) - { - if (iVerbosity > 1) - { - printf("Setting baudrate: %d\n", iProgramSpeed); - } - - /* Talking at initial speed - change bootloader to programming speed */ - if (BL_eSetBaudrate(iUartFd, iProgramSpeed) != E_STATUS_OK) - { - printf("= ERROR setting bootloader baudrate\n"); - return -1; - } - /* change local port to programming speed */ - if (UART_eSetBaudRate(iUartFd, &sUartOptions, iProgramSpeed) != E_STATUS_OK) - { - printf("= ERROR setting UART baudrate\n"); - return -1; - } - } - - - if (pcFirmwareFile) - { - /* Have file to program */ - - if (iFW_Open(&sFW_Info, (char *)pcFirmwareFile)) - { - /* Error with file. FW module has displayed error so just exit. */ - return -1; - } - - if (BL_eReprogram(iUartFd, &sChipDetails, &sFW_Info) != E_STATUS_OK) - { - return -1; - } - } - - if (iErase) - { - - /*if (iFW_Open(&sFW_Info, (char *)"FlashProgrammerExtension_JN5168.bin")) - { - printf("= ERROR opening FlashProgrammerExtension_JN5168.bin \n"); - return -1; - }*/ - BL_DownloadExtensionToRamBeforeErase(iUartFd,&sFW_Info); - - printf("Erase EEPROM \n"); - } - - printf("= Success\n"); - return 0; -} - - -void dbg_vPrintfImpl(const char *pcFile, uint32_t u32Line, const char *pcFormat, ...) -{ - va_list argp; - va_start(argp, pcFormat); -#ifdef DBG_VERBOSE - printf("%s:%d ", pcFile, u32Line); -#endif /* DBG_VERBOSE */ - vprintf(pcFormat, argp); - return; -} - diff --git a/resources/archives/resources/prog_jennic-0.7/source/uart.c b/resources/archives/resources/prog_jennic-0.7/source/uart.c deleted file mode 100644 index 36c29e4a76..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/uart.c +++ /dev/null @@ -1,523 +0,0 @@ - -/**************************************************************************** - * - * MODULE: Jennic Module Programmer - * - * COMPONENT: Serial port handling - * - * VERSION: $Name: $ - * - * REVISION: $Revision: 1.2 $ - * - * DATED: $Date: 2009/03/02 13:33:44 $ - * - * STATUS: $State: Exp $ - * - * AUTHOR: Matt Redfearn - * - * DESCRIPTION: - * - * - * LAST MODIFIED BY: $Author: lmitch $ - * $Modtime: $ - * - **************************************************************************** - * - * This software is owned by NXP B.V. and/or its supplier and is protected - * under applicable copyright laws. All rights are reserved. We grant You, - * and any third parties, a license to use this software solely and - * exclusively on NXP products [NXP Microcontrollers such as JN5148, JN5142, JN5139]. - * You, and any third parties must reproduce the copyright and warranty notice - * and any other legend of ownership on each copy or partial copy of the - * software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - - * Copyright NXP B.V. 2012. All rights reserved - * - ***************************************************************************/ -/****************************************************************************/ -/*** Include files ***/ -/****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#ifdef __linux__ -#include -#elif defined(__MACH__) && defined(__APPLE__) -#include -#endif - -#include "uart.h" -#include "common.h" -#include "dbg.h" - -/****************************************************************************/ -/*** Macro Definitions ***/ -/****************************************************************************/ - -#ifdef DEBUG_UART -#define TRACE_UART TRUE -#else -#define TRACE_UART FALSE -#endif - -/****************************************************************************/ -/*** Type Definitions ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Local Function Prototypes ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Exported Variables ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Local Variables ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Exported Functions ***/ -/****************************************************************************/ -/**************************************************************************** - * - * NAME: UART_eInitialise - * - * DESCRIPTION: - * Initialise a UART - * - * RETURNS: - * teStatus - * - ****************************************************************************/ -teStatus UART_eInitialise(char *pcDevice, int iBaudRate, int *piFileDescriptor, struct termios *psOptions) -{ - - DBG_vPrintf(TRACE_UART, "Using UART device %s\n", pcDevice); - - //open the device(com port) to be non-blocking (read will return immediately) - *piFileDescriptor = open(pcDevice, O_RDWR | O_NOCTTY);// | O_NONBLOCK | O_NDELAY); - if (*piFileDescriptor < 0) - { - DBG_vPrintf(TRACE_UART, "Failed to open device!\n", pcDevice); - return E_STATUS_FAILED_TO_OPEN_FILE; - } - - if (tcgetattr(*piFileDescriptor, psOptions) == -1) - { - DBG_vPrintf(TRACE_UART, "Failed to get port settings!\n"); - return E_STATUS_ERROR; - } - -#ifdef __linux__ - psOptions->c_iflag &= ~(INPCK | ISTRIP | INLCR | IGNCR | ICRNL | IUCLC | IXON | IXANY | IXOFF); -#elif defined(__MACH__) && defined(__APPLE__) - psOptions->c_iflag &= ~(INPCK | ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXANY | IXOFF); -#else -#error "No support for this architecture (yet)" -#endif - - psOptions->c_iflag = IGNBRK | IGNPAR; -#ifdef __linux__ - psOptions->c_oflag &= ~(OPOST | OLCUC | ONLCR | OCRNL | ONOCR | ONLRET); -#elif defined(__MACH__) && defined(__APPLE__) - psOptions->c_oflag &= ~(OPOST | ONLCR | OCRNL | ONOCR | ONLRET); -#else -#error "No support for this architecture (yet)" -#endif - - psOptions->c_cflag &= ~(CSIZE | CSTOPB | PARENB | CRTSCTS); - psOptions->c_cflag |= CS8 | CREAD | HUPCL | CLOCAL; - psOptions->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN); - - fcntl(*piFileDescriptor, F_SETFL, O_NONBLOCK); - - return UART_eSetBaudRate(*piFileDescriptor, psOptions, iBaudRate); - -} - - -/**************************************************************************** - * - * NAME: UART_eClose - * - * DESCRIPTION: - * Close the specified UART - * - * RETURNS: - * teStatus - * - ****************************************************************************/ -teStatus UART_eClose(int iFileDescriptor) -{ - - close(iFileDescriptor); - - return E_STATUS_OK; -} - - -/**************************************************************************** - * - * NAME: UART_eSetBaudRate - * - * DESCRIPTION: - * Sets the baud rate of the specified UART - * - * RETURNS: - * teStatus - * - ****************************************************************************/ -teStatus UART_eSetBaudRate(int iFileDescriptor, struct termios *psOptions, int iBaudRate) -{ - int iBaud; - -#if (defined(__MACH__) && defined(__APPLE__)) - int bSetNonPOSIXBaudRate = 0; -#endif - - DBG_vPrintf(TRACE_UART, "Changing baud rate to %d\n", iBaudRate); - - switch (iBaudRate) - { - - case 38400: iBaud = B38400; - break; - - case 115200: iBaud = B115200; - break; - - case 230400: iBaud = B230400; - break; - -#ifdef B460800 - case 460800: iBaud = B460800; - break; -#endif - -#ifdef B500000 - case 500000: iBaud = B500000; - break; -#endif - -#ifdef B921600 - case 921600: iBaud = B921600; - break; -#endif - -#ifdef B1000000 - case 1000000: iBaud = B1000000; - break; -#endif - - default: -#if !(defined(__MACH__) && defined(__APPLE__)) - DBG_vPrintf(TRACE_UART, "Unsupported baud rate: %d\n", iBaudRate); - return E_STATUS_BAD_PARAMETER; -#else - bSetNonPOSIXBaudRate = 1; - iBaud = B38400; -#endif - } - - if(tcflush(iFileDescriptor, TCIOFLUSH) == -1) - { - DBG_vPrintf(TRACE_UART, "Error flushing uart\n"); - return E_STATUS_ERROR; - } - - if(cfsetispeed(psOptions, iBaud) == -1) - { - DBG_vPrintf(TRACE_UART, "Error setting input speed\n"); - return E_STATUS_ERROR; - } - - if(cfsetospeed(psOptions, iBaud) == -1) - { - DBG_vPrintf(TRACE_UART, "Error setting output speed\n"); - return E_STATUS_ERROR; - } - - if(tcsetattr(iFileDescriptor, TCSANOW, psOptions) == -1) - { - DBG_vPrintf(TRACE_UART, "Error changing port settings\n"); - return E_STATUS_ERROR; - } - -#if defined(__MACH__) && defined(__APPLE__) - - if(bSetNonPOSIXBaudRate) - { - DBG_vPrintf(TRACE_UART, "Trying to set non-POSIX baud rate: %d\n", iBaudRate); - // The IOSSIOSPEED ioctl can be used to set arbitrary baud rates - // other than those specified by POSIX. The driver for the underlying serial hardware - // ultimately determines which baud rates can be used. This ioctl sets both the input - // and output speed. - - speed_t speed = iBaudRate; - if(ioctl(iFileDescriptor, IOSSIOSPEED, &speed) == -1) - { - DBG_vPrintf(TRACE_UART, "Error calling ioctl(..., IOSSIOSPEED, ...) %s(%d).\n", strerror(errno), errno); - return E_STATUS_BAD_PARAMETER; - } - } - -#endif - - return E_STATUS_OK; -} - -/**************************************************************************** - * - * NAME: UART_eSetRTS - * - * DESCRIPTION: - * Set or clear the RTS signal for the specified UART - * - * RETURNS: - * teStatus - * - ****************************************************************************/ -teStatus UART_eSetRTS(int iFileDescriptor, int bValue) -{ - - int status; - - if(ioctl(iFileDescriptor, TIOCMGET, &status) == -1) - { - perror("UART_eSetRTS(): TIOCMGET"); - return E_STATUS_ERROR; - } - if(bValue) - { - status |= TIOCM_RTS; - } - else - { - status &= ~TIOCM_RTS; - } - if(ioctl(iFileDescriptor, TIOCMSET, &status) == -1) - { - perror("UART_eSetRTS(): TIOCMSET"); - return E_STATUS_ERROR; - } - - return E_STATUS_OK; -} - -/**************************************************************************** - * - * NAME: UART_eSetDTR - * - * DESCRIPTION: - * Set or clear the DTR signal for the specified UART - * - * RETURNS: - * teStatus - * - ****************************************************************************/ -teStatus UART_eSetDTR(int iFileDescriptor, int bValue) -{ - - int status; - - if(ioctl(iFileDescriptor, TIOCMGET, &status) == -1) - { - perror("UART_eSetDTR(): TIOCMGET"); - return E_STATUS_ERROR; - } - if (bValue) - { - status |= TIOCM_DTR; - } - else - { - status &= ~TIOCM_DTR; - } - if(ioctl(iFileDescriptor, TIOCMSET, &status) == -1) - { - perror("UART_eSetDTR(): TIOCMSET"); - return E_STATUS_ERROR; - } - - return E_STATUS_OK; -} - -/**************************************************************************** - * - * NAME: UART_eFlush - * - * DESCRIPTION: - * Flush the specified UART - * - * RETURNS: - * teStatus - * - ****************************************************************************/ -teStatus UART_eFlush(int iFileDescriptor) -{ - uint8_t u8Data; - int iBytesRead; - - if(tcflush(iFileDescriptor, TCIOFLUSH) != 0) - { - return E_STATUS_ERROR; - } - - do - { - UART_eRead(iFileDescriptor, 100, 1, &u8Data, &iBytesRead); - } while(iBytesRead > 0); - - - return E_STATUS_OK; - -} - - -/**************************************************************************** - * - * NAME: UART_eRead - * - * DESCRIPTION: - * Reads from the specified UART - * - * RETURNS: - * teStatus - * - ****************************************************************************/ -teStatus UART_eRead(int iFileDescriptor, int iTimeoutMicroseconds, int iBufferLen, uint8_t *pu8Buffer, int *piBytesRead) -{ - int iResult = -1; - struct timeval sTimeout; - fd_set sDescriptors; - int iMaxFd; - char acErrorString[MAX_ERROR_STRING_LEN] = {0}; - - if(pu8Buffer == NULL) - { - return E_STATUS_NULL_PARAMETER; - } - - *piBytesRead = 0; - - sTimeout.tv_usec = iTimeoutMicroseconds % 1000000; - sTimeout.tv_sec = iTimeoutMicroseconds / 1000000; - - FD_ZERO(&sDescriptors); - iMaxFd = iFileDescriptor; - FD_SET(iFileDescriptor, &sDescriptors); - - iResult = select(iMaxFd + 1, &sDescriptors, NULL, NULL, &sTimeout); - if (iResult < 0) - { - strerror_r(errno, acErrorString, sizeof(acErrorString)); - DBG_vPrintf(TRACE_UART, "Error reading from UART: %s\n", acErrorString); - return E_STATUS_ERROR; - } - else if (iResult == 0) - { - DBG_vPrintf(TRACE_UART, "Timeout reading from UART\n"); - } - else - { - if (FD_ISSET(iFileDescriptor, &sDescriptors)) - { - iResult = read(iFileDescriptor, (uint8_t*)pu8Buffer, iBufferLen); - if (iResult > 0) - { -// DBG_vPrintf(TRACE_UART, "Got 0x%02x %c (iResult=%d)\n", *pu8Data, *pu8Data, iResult); -// DBG_vPrintf(TRACE_UART, "[URX%d]", iResult); - - *piBytesRead = iResult; - } - else - { -// DBG_vPrintf(TRACE_UART, "[URX0]"); - - iResult = 0; - } - } - else - { - DBG_vPrintf(TRACE_UART, "FD_ISn't set!\n"); - } - } - - return E_STATUS_OK; - -} - - -/**************************************************************************** - * - * NAME: UART_eWrite - * - * DESCRIPTION: - * Write to the specified UART - * - * RETURNS: - * teStatus - * - ****************************************************************************/ -teStatus UART_eWrite(int iFileDescriptor, uint8_t *pu8Data, int iLength) -{ - - int iBytesWritten; - int iTotalBytesWritten = 0; - - do - { - iBytesWritten = write(iFileDescriptor, &pu8Data[iTotalBytesWritten], iLength - iTotalBytesWritten); - if(iBytesWritten < 0) - { - if(errno != EAGAIN) - { - DBG_vPrintf(TRACE_UART, "Could not write to UART!\n"); - return E_STATUS_ERROR_WRITING; - } - } - else - { - iTotalBytesWritten += iBytesWritten; - } - } while(iTotalBytesWritten < iLength); - - return E_STATUS_OK; - -} - - -/****************************************************************************/ -/*** Local Functions ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** END OF FILE ***/ -/****************************************************************************/ diff --git a/resources/archives/resources/prog_jennic-0.7/source/uart.h b/resources/archives/resources/prog_jennic-0.7/source/uart.h deleted file mode 100644 index efd37f2b9c..0000000000 --- a/resources/archives/resources/prog_jennic-0.7/source/uart.h +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** - * - * MODULE: Jennic Module Programmer - * - * COMPONENT: Serial port handling - * - * VERSION: $Name: $ - * - * REVISION: $Revision: 1.2 $ - * - * DATED: $Date: 2009/03/02 13:33:44 $ - * - * STATUS: $State: Exp $ - * - * AUTHOR: Matt Redfearn - * - * DESCRIPTION: - * - * - * LAST MODIFIED BY: $Author: lmitch $ - * $Modtime: $ - * - **************************************************************************** - * - * This software is owned by NXP B.V. and/or its supplier and is protected - * under applicable copyright laws. All rights are reserved. We grant You, - * and any third parties, a license to use this software solely and - * exclusively on NXP products [NXP Microcontrollers such as JN5148, JN5142, JN5139]. - * You, and any third parties must reproduce the copyright and warranty notice - * and any other legend of ownership on each copy or partial copy of the - * software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - - * Copyright NXP B.V. 2012. All rights reserved - * - ***************************************************************************/ - -#ifndef UART_H_INCLUDED -#define UART_H_INCLUDED - -#if defined __cplusplus -extern "C" { -#endif - -/****************************************************************************/ -/*** Include Files ***/ -/****************************************************************************/ - -#include -#include "common.h" - -/****************************************************************************/ -/*** Macro Definitions ***/ -/****************************************************************************/ - -#define UART_USES_SELECT - -/****************************************************************************/ -/*** Type Definitions ***/ -/****************************************************************************/ - -/****************************************************************************/ -/*** Exported Functions ***/ -/****************************************************************************/ - -teStatus UART_eInitialise(char *pcDevice, int iBaudRate, int *piFileDescriptor, struct termios *psOptions); -teStatus UART_eClose(int iFileDescriptor); -teStatus UART_eSetBaudRate(int iFileDescriptor, struct termios *psOptions, int iBaudRate); -teStatus UART_eSetRTS(int iFileDescriptor, int bValue); -teStatus UART_eSetDTR(int iFileDescriptor, int bValue); -teStatus UART_eFlush(int iFileDescriptor); -teStatus UART_eRead(int iFileDescriptor, int iTimeoutMicroseconds, int iBufferLen, uint8_t *pu8Buffer, int *piBytesRead); -teStatus UART_eWrite(int iFileDescriptor, uint8_t *pu8Data, int iLength); - -/****************************************************************************/ -/*** Exported Variables ***/ -/****************************************************************************/ - -#if defined __cplusplus -} -#endif - -#endif /* UART_H_INCLUDED */ - -/****************************************************************************/ -/*** END OF FILE ***/ -/****************************************************************************/ diff --git a/resources/archives/upload.php b/resources/archives/upload.php deleted file mode 100644 index 0226e5d297..0000000000 --- a/resources/archives/upload.php +++ /dev/null @@ -1,56 +0,0 @@ -"; - $uploadOk = 1; - } else { - echo "Le fichier choisi n'est pas une image PNG.
"; - $uploadOk = 0; - } - } - - // Check if file already exists, in my case I don't let the choise I also write on the previous one. - /* - if (file_exists($target_file)) { - echo "Sorry, file already exists."; - $uploadOk = 0; - } - */ - // Check file size - if ($_FILES["fileToUpload"]["size"] > 5000000) { - echo "Désolé. Votre image est trop grande.
"; - $uploadOk = 0; - } - - // Allow certain file formats - // if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { - if( $imageFileType != "png" ) { - echo "Désolé. Seule le format 'PNG' est supporté.
"; - $uploadOk = 0; - } - - // Check if $uploadOk is set to 0 by an error - if ($uploadOk == 0) { - // echo "Sorry, your file was not uploaded.
"; - // if everything is ok, try to upload file - } else { - if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { - echo "Le fichier ". basename( $_FILES["fileToUpload"]["name"]). " a été installé.
"; - } else { - echo "Désolé. Une erreur a eu lieu pendant le transfert.
"; - } - } - echo "La page devrait se rafraichir dans 5 secondes avec le graph du reseau.
"; - echo "Si ca n'est pas le cas il vous faudra la recharger manuellement.
"; - - header("Refresh:5; url=NetworkGraph.php"); -?> diff --git a/resources/archives/usbreset/README.txt b/resources/archives/usbreset/README.txt deleted file mode 100644 index 93f110079e..0000000000 --- a/resources/archives/usbreset/README.txt +++ /dev/null @@ -1,19 +0,0 @@ -Based on https://askubuntu.com/questions/645/how-do-you-reset-a-usb-device-from-the-command-line - - - -The run the following commands in terminal: - -Compile the program: - -$ cc usbreset.c -o usbreset -Get the Bus and Device ID of the USB device you want to reset: - -$ lsusb -Bus 002 Device 003: ID 0fe9:9010 DVICO -Make our compiled program executable: - -$ chmod +x usbreset -Execute the program with sudo privilege; make necessary substitution for and ids as found by running the lsusb command: - -$ sudo ./usbreset /dev/bus/usb/002/003 \ No newline at end of file diff --git a/resources/archives/usbreset/makefile b/resources/archives/usbreset/makefile deleted file mode 100644 index f7774cc09f..0000000000 --- a/resources/archives/usbreset/makefile +++ /dev/null @@ -1,24 +0,0 @@ - -source := usbreset.c - -CFLAGS = -Wall -O2 - -# OBJ := $(source:.c=.o) -BUILDDIR = ../../tmp/usbreset_builddir/ -OBJ := $(addprefix $(BUILDDIR), $(source:.c=.o)) - -TARGET = ../../tmp/usbreset - -all: $(BUILDDIR) $(TARGET) - -$(TARGET): $(OBJ) - $(CC) $^ $(LDFLAGS) $(PROJ_LDFLAGS) -o $@ - -$(BUILDDIR)%.o: %.c - $(CC) -I. $(CFLAGS) $(PROJ_CFLAGS) -c $< -o $@ - -clean: - rm -f $(OBJ) $(TARGET) - -$(BUILDDIR): - mkdir -p $(BUILDDIR) diff --git a/resources/archives/usbreset/usbreset.c b/resources/archives/usbreset/usbreset.c deleted file mode 100644 index 76c30c060b..0000000000 --- a/resources/archives/usbreset/usbreset.c +++ /dev/null @@ -1,40 +0,0 @@ -/* usbreset -- send a USB port reset to a USB device */ - -#include -#include -#include -#include -#include - -#include - - -int main(int argc, char **argv) -{ - const char *filename; - int fd; - int rc; - - if (argc != 2) { - fprintf(stderr, "Usage: usbreset device-filename\n"); - return 1; - } - filename = argv[1]; - - fd = open(filename, O_WRONLY); - if (fd < 0) { - perror("Error opening output file"); - return 1; - } - - printf("Resetting USB device %s\n", filename); - rc = ioctl(fd, USBDEVFS_RESET, 0); - if (rc < 0) { - perror("Error in ioctl"); - return 1; - } - printf("Reset successful\n"); - - close(fd); - return 0; -} diff --git a/resources/archives/verification.php b/resources/archives/verification.php deleted file mode 100644 index cf6086080a..0000000000 --- a/resources/archives/verification.php +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/resources/archives/verification.sh b/resources/archives/verification.sh deleted file mode 100644 index fe05cac12e..0000000000 --- a/resources/archives/verification.sh +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env bash - -MOSQUITTO_SUB=$(which mosquitto_sub) -MOSQUITTO_PUB=$(which mosquitto_pub) -MOSQUITTO_BIN=$(which mosquitto) -HOST=localhost -IDENTSUB="AbeilleSubVerif" -IDENTPUB="AbeillePubVerif" -PORT=1883 - -USER="jeedom" -PASS="jeedom" - -FIFO=/tmp/AbeilleDeamonInput -MLOG=/var/log/mosquitto/mosquitto.log - - - - -## Zigate tests -KEY="OK, au moins un port USB found sur lequel peut être la zigate." -[[ -e $(ls -l /dev/ttyUSB* ) ]] && KEY="WARN: Missing Zigate USB Key" -echo $KEY -ls -l /dev/ttyUSB* - -GRP="OK, www-data belongs to dialout" -[[ $(groups www-data | grep -c dialout ) -eq 0 ]] && GRP="ERROR: www-data does not belong to dial-out" -echo $GRP - - -## Up Link -#Verifier la presence du fichier pipe -PIPE="ERROR, File $FIFO was not found" -[[ -e ${FIFO} ]] && PIPE="OK, File $FIFO was found" -echo $PIPE - -## les demons qui tournent -DEMON_NB="Ok, 4 demons tournent" -[[ $(ps -ef | grep "plugins/Abeille" | grep -v grep | wc -l) -ne 4 ]] && DEMON_NB="Error, nous n'avons pas nos 4 demons qui tournent" -echo $DEMON - - -## MQTT -MSQTT="OK, mosquitto_sub programm found" -[[ -z $(which mosquitto_sub) ]] && MQSTT="ERROR: mosquitto_sub programm not found" -echo $MSQTT - -MSQTT="OK, mosquitto_pub programm found" -[[ -z $(which mosquitto_pub) ]] && MQSTT="ERROR: mosquitto_pub programm not found" -echo $MSQTT - - - -MSQTT="OK, Service mosquitto is running" -[[ $(/etc/init.d/mosquitto status | egrep -ic "not|fail") -ne 0 ]] && MQSTT="ERROR, mosquitto service is not running" -echo $MQSTT - - - -##--------------------------------------------------------------------------------------------- -echo -e "\nChecking connection to mosquitto" - -TOPIC="Abeille/Verif" -MESSAGE="c est moi, timestamp: $(date +%s)" - -[[ -f sub1.log ]] && rm sub1.log - -## nohup $MOSQUITTO_SUB -h $HOST -i $IDENTSUB -p $PORT -t $TOPIC -u $USER -P $PASS -q 0 -C 1 >sub1.log 2>&1 & -nohup mosquitto_sub -h localhost -i tutu -p 1883 -t $TOPIC -u jeedom -P jeedom -q 0 -C 1 >sub1.log 2>&1 & -SUBPID=$! - -sleep 3 - -$MOSQUITTO_PUB -h $HOST -i $IDENTPUB -t $TOPIC -u $USER -P $PASS -m "$MESSAGE" -q 0 -d - -n=5 -while [[ $n -gt 0 ]] - do - cat sub1.log - sleep 1 - echo $n seconds - let n-- - [[ $(wc -l < sub1.log) -gt 0 ]] && break - done; - -MSG="ERROR, message was improperly transmitted or not at all" -[[ $(wc -l < sub1.log) -eq 1 ]] && [[ $(cat sub1.log) == "$MESSAGE" ]] && MSG="OK, message was properly transmitted" -echo "$MSG // expected: $MESSAGE //transmitted: $(cat sub1.log) " - -##--------------------------------------------------------------------------------------------- -## Test lien mosquitto->zigate->mosquitto - -echo -e "\nChecking connection mosquitto->zigate->mosquitto" -[[ -f sub2.log ]] && rm sub2.log - -TOPIC="Abeille/0000/SW-SDK" -##nohup $MOSQUITTO_SUB -h $HOST -i $IDENTSUB -p $PORT -t $TOPIC -u $USER -P $PASS -q 0 -C 1 >sub.log 2>&1 & -nohup mosquitto_sub -h localhost -i toto -p 1883 -t $TOPIC -u jeedom -P jeedom -q 0 -C 1 >sub2.log 2>&1 & -SUBPID=$! - -sleep 3 - -TOPIC="CmdAbeille/0000/getZgVersion" -MESSAGE="Version" -$MOSQUITTO_PUB -h $HOST -i $IDENTPUB -t $TOPIC -u $USER -P $PASS -m "$MESSAGE" -q 0 -d - -n=5 -while [[ $n -gt 0 ]] - do - cat sub2.log - sleep 1 - echo $n seconds - let n-- - [[ $(wc -l < sub2.log) -gt 0 ]] && break - done; - -MSG="ERROR, on ne parvient pas a dialoguer avec la zigate" -[[ $(wc -l < sub2.log) -eq 1 ]] && [[ $(cat sub2.log) == "030D" ]] && MSG="OK, la zigate repond" -echo "$MSG // zigate version expected: 030D // zigate version received: $(cat sub2.log) " - -##--------------------------------------------------------------------------------------------- - - -## On ne peut pas faire le tail sur le log, on n'a pas les droits -##echo -e "\n Mosquitto log" -##tail -5 /var/log/mosquitto/mosquitto.log - -##--------------------------------------------------------------------------------------------- -## As 1 msg should have received, the sub should have terminate itself. -##MSG="OK, no remaining $MOSQUITTO_SUB to kill" -##[[ ! -z $(ps h -o pid -p $SUBPID) ]] && MSG="ERROR, killing remaining $MOSQUITTO_SUB PID $SUBPID" && kill $SUBPID -##echo $MSG - -## COMMENT: transmission aleatoire du message, a investiguer..... -##--------------------------------------------------------------------------------------------- - -## -## -echo "Qui utilise les ports ttyUSB*" -fuser /dev/ttyUSB* -echo "Qui utilise les pipe" -fuser $FIFO -echo "Liste des processus appartenant a www-data" -ps -ef | grep www-data - - - -# -#Envoyer a Mosquitto un demande de version et verifier qu on a un reponse amosquitto -# -#Envoyer par jeedom un message a mosquitto et verifier qu on le recoit -# -#envoyer un messaege de jeedom a mosquitto et verifier qu il revient diff --git a/resources/archives/xmlhttpConfChange.php b/resources/archives/xmlhttpConfChange.php deleted file mode 100644 index 57168cfc1b..0000000000 --- a/resources/archives/xmlhttpConfChange.php +++ /dev/null @@ -1,14 +0,0 @@ -'.$_GET['payload'].'<- vers ->'.$_GET['topic'].'<-'; - - $parameters_info = Abeille::getParameters(); - - Abeille::CmdAffichage($_GET['topic'],$_GET['payload']); - - // echo "Ending - "; - - ?> diff --git a/resources/archives/xmlhttpMQTTSend.php b/resources/archives/xmlhttpMQTTSend.php deleted file mode 100644 index bc666d327f..0000000000 --- a/resources/archives/xmlhttpMQTTSend.php +++ /dev/null @@ -1,52 +0,0 @@ -'.$_GET['payload'].'<- vers ->'.$_GET['topic'].'<-'; - - $queueKeyXmlToAbeille = msg_get_queue(queueKeyXmlToAbeille); - // $queueKeyXmlToCmd = msg_get_queue(queueKeyXmlToCmd); - $queueKeyXmlToCmd = msg_get_queue($abQueues['xToCmd']['id']); - /* - $parameters_info = Abeille::getParameters(); - - $publish = new Mosquitto\Client(); - - $publish->setCredentials( $parameters_info['AbeilleUser'], $parameters_info['AbeillePass'] ); - - $publish->connect( $parameters_info['AbeilleAddress'], $parameters_info['AbeillePort'], 60 ); - - $publish->publish( substr($parameters_info["AbeilleTopic"],0,-1).str_replace('_','/',$_GET['topic']), $_GET['payload'], $parameters_info["AbeilleQos"], 0); - for ($i = 0; $i < 100; $i++) { - // Loop around to permit the library to do its work - $publish->loop(1); - } - $publish->disconnect(); - unset($publish); -*/ - - $msg = array( - 'topic' => str_replace('_','/',$_GET['topic']), - 'payload' => $_GET['payload'], - ); - - if (msg_send( $queueKeyXmlToAbeille, 1, json_encode($msg), false, false)) { - echo "(fichier xmlhttpMQQTSend) added to queue: ".json_encode($msg); - // print_r(msg_stat_queue($queue)); - } - else { - echo "debug","(fichier xmlhttpMQQTSend) could not add message to queue"; - } - - if (msg_send($queueKeyXmlToCmd, 1, json_encode($msg), false, false)) { - echo "(fichier xmlhttpMQQTSend) added to queue: ".json_encode($msg); - // print_r(msg_stat_queue($queue)); - } - else { - echo "debug","(fichier xmlhttpMQQTSend) could not add message to queue"; - } - - echo "Ending - "; -?>